summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/comments/activity/extension.php23
-rw-r--r--apps/comments/l10n/cs_CZ.js2
-rw-r--r--apps/comments/l10n/cs_CZ.json2
-rw-r--r--apps/comments/l10n/da.js15
-rw-r--r--apps/comments/l10n/da.json15
-rw-r--r--apps/comments/l10n/de.js2
-rw-r--r--apps/comments/l10n/de.json2
-rw-r--r--apps/comments/l10n/de_DE.js2
-rw-r--r--apps/comments/l10n/de_DE.json2
-rw-r--r--apps/comments/l10n/el.js9
-rw-r--r--apps/comments/l10n/el.json9
-rw-r--r--apps/comments/l10n/fi_FI.js2
-rw-r--r--apps/comments/l10n/fi_FI.json2
-rw-r--r--apps/comments/l10n/fil.js6
-rw-r--r--apps/comments/l10n/fil.json4
-rw-r--r--apps/comments/l10n/fr.js2
-rw-r--r--apps/comments/l10n/fr.json2
-rw-r--r--apps/comments/l10n/he.js2
-rw-r--r--apps/comments/l10n/he.json2
-rw-r--r--apps/comments/l10n/is.js2
-rw-r--r--apps/comments/l10n/is.json2
-rw-r--r--apps/comments/l10n/it.js2
-rw-r--r--apps/comments/l10n/it.json2
-rw-r--r--apps/comments/l10n/nl.js2
-rw-r--r--apps/comments/l10n/nl.json2
-rw-r--r--apps/comments/l10n/pt_BR.js2
-rw-r--r--apps/comments/l10n/pt_BR.json2
-rw-r--r--apps/comments/l10n/pt_PT.js2
-rw-r--r--apps/comments/l10n/pt_PT.json2
-rw-r--r--apps/comments/l10n/ru.js2
-rw-r--r--apps/comments/l10n/ru.json2
-rw-r--r--apps/comments/l10n/sl.js2
-rw-r--r--apps/comments/l10n/sl.json2
-rw-r--r--apps/comments/l10n/sq.js2
-rw-r--r--apps/comments/l10n/sq.json2
-rw-r--r--apps/comments/l10n/sv.js2
-rw-r--r--apps/comments/l10n/sv.json2
-rw-r--r--apps/comments/l10n/tr.js16
-rw-r--r--apps/comments/l10n/tr.json16
-rw-r--r--apps/dav/appinfo/app.php6
-rw-r--r--apps/dav/appinfo/application.php15
-rw-r--r--apps/dav/appinfo/database.xml21
-rw-r--r--apps/dav/appinfo/info.xml2
-rw-r--r--apps/dav/appinfo/install.php1
-rw-r--r--apps/dav/appinfo/update.php1
-rw-r--r--apps/dav/appinfo/v1/caldav.php2
-rw-r--r--apps/dav/lib/caldav/birthdayservice.php28
-rw-r--r--apps/dav/lib/caldav/caldavbackend.php9
-rw-r--r--apps/dav/lib/caldav/calendar.php40
-rw-r--r--apps/dav/lib/carddav/addressbook.php55
-rw-r--r--apps/dav/lib/carddav/card.php45
-rw-r--r--apps/dav/lib/carddav/carddavbackend.php11
-rw-r--r--apps/dav/lib/connector/legacydavacl.php15
-rw-r--r--apps/dav/lib/connector/sabre/auth.php90
-rw-r--r--apps/dav/lib/connector/sabre/file.php4
-rw-r--r--apps/dav/lib/connector/sabre/filesplugin.php37
-rw-r--r--apps/dav/lib/connector/sabre/lockplugin.php2
-rw-r--r--apps/dav/lib/connector/sabre/principal.php5
-rw-r--r--apps/dav/lib/connector/sabre/serverfactory.php9
-rw-r--r--apps/dav/lib/connector/sabre/sharesplugin.php177
-rw-r--r--apps/dav/lib/connector/sabre/sharetypelist.php87
-rw-r--r--apps/dav/lib/server.php3
-rw-r--r--apps/dav/tests/unit/caldav/calendartest.php60
-rw-r--r--apps/dav/tests/unit/carddav/addressbooktest.php65
-rw-r--r--apps/dav/tests/unit/connector/sabre/auth.php199
-rw-r--r--apps/dav/tests/unit/connector/sabre/file.php69
-rw-r--r--apps/dav/tests/unit/connector/sabre/filesplugin.php2
-rw-r--r--apps/dav/tests/unit/connector/sabre/sharesplugin.php259
-rw-r--r--apps/encryption/l10n/da.js4
-rw-r--r--apps/encryption/l10n/da.json4
-rw-r--r--apps/encryption/l10n/de_DE.js4
-rw-r--r--apps/encryption/l10n/de_DE.json4
-rw-r--r--apps/encryption/l10n/zh_TW.js2
-rw-r--r--apps/encryption/l10n/zh_TW.json2
-rw-r--r--apps/federatedfilesharing/l10n/da.js1
-rw-r--r--apps/federatedfilesharing/l10n/da.json1
-rw-r--r--apps/federatedfilesharing/l10n/tr.js1
-rw-r--r--apps/federatedfilesharing/l10n/tr.json1
-rw-r--r--apps/federation/backgroundjob/getsharedsecret.php25
-rw-r--r--apps/federation/backgroundjob/requestsharedsecret.php23
-rw-r--r--apps/federation/l10n/ca.js15
-rw-r--r--apps/federation/l10n/ca.json13
-rw-r--r--apps/federation/l10n/da.js15
-rw-r--r--apps/federation/l10n/da.json13
-rw-r--r--apps/federation/l10n/el.js6
-rw-r--r--apps/federation/l10n/el.json6
-rw-r--r--apps/federation/l10n/is.js5
-rw-r--r--apps/federation/l10n/is.json5
-rw-r--r--apps/federation/l10n/tr.js5
-rw-r--r--apps/federation/l10n/tr.json5
-rw-r--r--apps/federation/tests/backgroundjob/getsharedsecrettest.php27
-rw-r--r--apps/federation/tests/backgroundjob/requestsharedsecrettest.php26
-rw-r--r--apps/files/appinfo/application.php4
-rw-r--r--apps/files/controller/apicontroller.php55
-rw-r--r--apps/files/css/files.css20
-rw-r--r--apps/files/js/file-upload.js1
-rw-r--r--apps/files/js/filelist.js5
-rw-r--r--apps/files/l10n/ar.js1
-rw-r--r--apps/files/l10n/ar.json1
-rw-r--r--apps/files/l10n/ast.js1
-rw-r--r--apps/files/l10n/ast.json1
-rw-r--r--apps/files/l10n/az.js1
-rw-r--r--apps/files/l10n/az.json1
-rw-r--r--apps/files/l10n/bg_BG.js1
-rw-r--r--apps/files/l10n/bg_BG.json1
-rw-r--r--apps/files/l10n/bs.js1
-rw-r--r--apps/files/l10n/bs.json1
-rw-r--r--apps/files/l10n/ca.js1
-rw-r--r--apps/files/l10n/ca.json1
-rw-r--r--apps/files/l10n/cs_CZ.js2
-rw-r--r--apps/files/l10n/cs_CZ.json2
-rw-r--r--apps/files/l10n/da.js7
-rw-r--r--apps/files/l10n/da.json7
-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/l10n/el.js1
-rw-r--r--apps/files/l10n/el.json1
-rw-r--r--apps/files/l10n/en_GB.js1
-rw-r--r--apps/files/l10n/en_GB.json1
-rw-r--r--apps/files/l10n/eo.js1
-rw-r--r--apps/files/l10n/eo.json1
-rw-r--r--apps/files/l10n/es.js2
-rw-r--r--apps/files/l10n/es.json2
-rw-r--r--apps/files/l10n/es_AR.js1
-rw-r--r--apps/files/l10n/es_AR.json1
-rw-r--r--apps/files/l10n/es_MX.js1
-rw-r--r--apps/files/l10n/es_MX.json1
-rw-r--r--apps/files/l10n/et_EE.js1
-rw-r--r--apps/files/l10n/et_EE.json1
-rw-r--r--apps/files/l10n/eu.js1
-rw-r--r--apps/files/l10n/eu.json1
-rw-r--r--apps/files/l10n/fa.js1
-rw-r--r--apps/files/l10n/fa.json1
-rw-r--r--apps/files/l10n/fi_FI.js2
-rw-r--r--apps/files/l10n/fi_FI.json2
-rw-r--r--apps/files/l10n/fil.js7
-rw-r--r--apps/files/l10n/fil.json7
-rw-r--r--apps/files/l10n/fr.js2
-rw-r--r--apps/files/l10n/fr.json2
-rw-r--r--apps/files/l10n/gl.js1
-rw-r--r--apps/files/l10n/gl.json1
-rw-r--r--apps/files/l10n/he.js2
-rw-r--r--apps/files/l10n/he.json2
-rw-r--r--apps/files/l10n/hr.js1
-rw-r--r--apps/files/l10n/hr.json1
-rw-r--r--apps/files/l10n/hu_HU.js1
-rw-r--r--apps/files/l10n/hu_HU.json1
-rw-r--r--apps/files/l10n/id.js1
-rw-r--r--apps/files/l10n/id.json1
-rw-r--r--apps/files/l10n/is.js2
-rw-r--r--apps/files/l10n/is.json2
-rw-r--r--apps/files/l10n/it.js2
-rw-r--r--apps/files/l10n/it.json2
-rw-r--r--apps/files/l10n/ja.js1
-rw-r--r--apps/files/l10n/ja.json1
-rw-r--r--apps/files/l10n/ko.js1
-rw-r--r--apps/files/l10n/ko.json1
-rw-r--r--apps/files/l10n/lt_LT.js1
-rw-r--r--apps/files/l10n/lt_LT.json1
-rw-r--r--apps/files/l10n/lv.js1
-rw-r--r--apps/files/l10n/lv.json1
-rw-r--r--apps/files/l10n/nb_NO.js3
-rw-r--r--apps/files/l10n/nb_NO.json3
-rw-r--r--apps/files/l10n/nl.js2
-rw-r--r--apps/files/l10n/nl.json2
-rw-r--r--apps/files/l10n/oc.js1
-rw-r--r--apps/files/l10n/oc.json1
-rw-r--r--apps/files/l10n/pl.js1
-rw-r--r--apps/files/l10n/pl.json1
-rw-r--r--apps/files/l10n/pt_BR.js2
-rw-r--r--apps/files/l10n/pt_BR.json2
-rw-r--r--apps/files/l10n/pt_PT.js2
-rw-r--r--apps/files/l10n/pt_PT.json2
-rw-r--r--apps/files/l10n/ro.js1
-rw-r--r--apps/files/l10n/ro.json1
-rw-r--r--apps/files/l10n/ru.js2
-rw-r--r--apps/files/l10n/ru.json2
-rw-r--r--apps/files/l10n/sk_SK.js1
-rw-r--r--apps/files/l10n/sk_SK.json1
-rw-r--r--apps/files/l10n/sl.js2
-rw-r--r--apps/files/l10n/sl.json2
-rw-r--r--apps/files/l10n/sq.js2
-rw-r--r--apps/files/l10n/sq.json2
-rw-r--r--apps/files/l10n/sr.js1
-rw-r--r--apps/files/l10n/sr.json1
-rw-r--r--apps/files/l10n/sr@latin.js1
-rw-r--r--apps/files/l10n/sr@latin.json1
-rw-r--r--apps/files/l10n/sv.js1
-rw-r--r--apps/files/l10n/sv.json1
-rw-r--r--apps/files/l10n/th_TH.js1
-rw-r--r--apps/files/l10n/th_TH.json1
-rw-r--r--apps/files/l10n/tr.js3
-rw-r--r--apps/files/l10n/tr.json3
-rw-r--r--apps/files/l10n/uk.js1
-rw-r--r--apps/files/l10n/uk.json1
-rw-r--r--apps/files/l10n/zh_CN.js1
-rw-r--r--apps/files/l10n/zh_CN.json1
-rw-r--r--apps/files/l10n/zh_TW.js1
-rw-r--r--apps/files/l10n/zh_TW.json1
-rw-r--r--apps/files/service/tagservice.php13
-rw-r--r--apps/files/templates/appnavigation.php2
-rw-r--r--apps/files/tests/controller/apicontrollertest.php56
-rw-r--r--apps/files_external/3rdparty/.gitignore1
-rw-r--r--apps/files_external/3rdparty/composer.json4
-rw-r--r--apps/files_external/3rdparty/composer.lock29
-rw-r--r--apps/files_external/3rdparty/composer/ClassLoader.php8
-rw-r--r--apps/files_external/3rdparty/composer/autoload_classmap.php19
-rw-r--r--apps/files_external/3rdparty/composer/autoload_real.php15
-rw-r--r--apps/files_external/3rdparty/composer/installed.json29
-rw-r--r--apps/files_external/3rdparty/icewind/smb/README.md2
-rw-r--r--apps/files_external/3rdparty/icewind/smb/composer.json2
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/NativeShare.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/NativeStream.php19
-rw-r--r--apps/files_external/3rdparty/icewind/streams-dummy/composer.json7
-rw-r--r--apps/files_external/3rdparty/icewind/streams/.travis.yml7
-rw-r--r--apps/files_external/3rdparty/icewind/streams/LICENCE21
-rw-r--r--apps/files_external/3rdparty/icewind/streams/README.md1
-rw-r--r--apps/files_external/3rdparty/icewind/streams/composer.json3
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/CallbackWrapper.php67
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/DirectoryFilter.php60
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/DirectoryWrapper.php88
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/File.php2
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/IteratorDirectory.php4
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/NullWrapper.php15
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/Path.php104
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/RetryWrapper.php66
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/SeekableWrapper.php92
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/Url.php64
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/UrlCallBack.php121
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/Wrapper.php31
-rw-r--r--apps/files_external/3rdparty/icewind/streams/tests/CallbackWrapper.php72
-rw-r--r--apps/files_external/3rdparty/icewind/streams/tests/IteratorDirectory.php130
-rw-r--r--apps/files_external/3rdparty/icewind/streams/tests/NullWrapper.php59
-rw-r--r--apps/files_external/3rdparty/icewind/streams/tests/Wrapper.php105
-rw-r--r--apps/files_external/3rdparty/icewind/streams/tests/bootstrap.php9
-rw-r--r--apps/files_external/3rdparty/icewind/streams/tests/phpunit.xml6
-rw-r--r--apps/files_external/js/statusmanager.js2
-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.js2
-rw-r--r--apps/files_external/l10n/de.json2
-rw-r--r--apps/files_external/l10n/de_DE.js5
-rw-r--r--apps/files_external/l10n/de_DE.json5
-rw-r--r--apps/files_external/l10n/el.js1
-rw-r--r--apps/files_external/l10n/el.json1
-rw-r--r--apps/files_external/l10n/es.js4
-rw-r--r--apps/files_external/l10n/es.json4
-rw-r--r--apps/files_external/l10n/fil.js4
-rw-r--r--apps/files_external/l10n/fil.json4
-rw-r--r--apps/files_external/l10n/is.js47
-rw-r--r--apps/files_external/l10n/is.json47
-rw-r--r--apps/files_external/l10n/mk.js1
-rw-r--r--apps/files_external/l10n/mk.json1
-rw-r--r--apps/files_external/l10n/tr.js8
-rw-r--r--apps/files_external/l10n/tr.json8
-rw-r--r--apps/files_external/lib/dropbox.php10
-rw-r--r--apps/files_external/lib/ftp.php5
-rw-r--r--apps/files_external/lib/google.php58
-rw-r--r--apps/files_external/lib/sftp.php4
-rw-r--r--apps/files_external/lib/smb.php22
-rw-r--r--apps/files_external/service/globalstoragesservice.php2
-rw-r--r--apps/files_external/service/legacystoragesservice.php2
-rw-r--r--apps/files_external/service/storagesservice.php4
-rw-r--r--apps/files_external/service/userstoragesservice.php2
-rw-r--r--apps/files_sharing/api/share20ocs.php25
-rw-r--r--apps/files_sharing/api/sharees.php17
-rw-r--r--apps/files_sharing/appinfo/routes.php3
-rw-r--r--apps/files_sharing/js/share.js60
-rw-r--r--apps/files_sharing/js/sharedfilelist.js10
-rw-r--r--apps/files_sharing/l10n/da.js2
-rw-r--r--apps/files_sharing/l10n/da.json2
-rw-r--r--apps/files_sharing/l10n/fil.js4
-rw-r--r--apps/files_sharing/l10n/fil.json4
-rw-r--r--apps/files_sharing/l10n/sv.js48
-rw-r--r--apps/files_sharing/l10n/sv.json48
-rw-r--r--apps/files_sharing/l10n/tr.js6
-rw-r--r--apps/files_sharing/l10n/tr.json6
-rw-r--r--apps/files_sharing/templates/settings-admin.php2
-rw-r--r--apps/files_sharing/templates/settings-personal.php4
-rw-r--r--apps/files_sharing/tests/api/share20ocstest.php121
-rw-r--r--apps/files_sharing/tests/api/shareestest.php84
-rw-r--r--apps/files_sharing/tests/js/shareSpec.js33
-rw-r--r--apps/files_trashbin/lib/trashbin.php2
-rw-r--r--apps/files_trashbin/tests/storage.php4
-rw-r--r--apps/files_trashbin/tests/trashbin.php33
-rw-r--r--apps/files_versions/tests/versions.php15
-rw-r--r--apps/systemtags/l10n/da.js13
-rw-r--r--apps/systemtags/l10n/da.json13
-rw-r--r--apps/systemtags/l10n/el.js1
-rw-r--r--apps/systemtags/l10n/el.json1
-rw-r--r--apps/systemtags/l10n/pl.js12
-rw-r--r--apps/systemtags/l10n/pl.json12
-rw-r--r--apps/systemtags/l10n/tr.js14
-rw-r--r--apps/systemtags/l10n/tr.json14
-rw-r--r--apps/updatenotification/l10n/da.js7
-rw-r--r--apps/updatenotification/l10n/da.json7
-rw-r--r--apps/updatenotification/l10n/de.js2
-rw-r--r--apps/updatenotification/l10n/de.json2
-rw-r--r--apps/updatenotification/l10n/de_DE.js4
-rw-r--r--apps/updatenotification/l10n/de_DE.json4
-rw-r--r--apps/updatenotification/l10n/el.js2
-rw-r--r--apps/updatenotification/l10n/el.json2
-rw-r--r--apps/updatenotification/l10n/fr.js1
-rw-r--r--apps/updatenotification/l10n/fr.json1
-rw-r--r--apps/updatenotification/l10n/pl.js6
-rw-r--r--apps/updatenotification/l10n/pl.json6
-rw-r--r--apps/updatenotification/l10n/tr.js4
-rw-r--r--apps/updatenotification/l10n/tr.json4
-rw-r--r--apps/user_ldap/l10n/da.js1
-rw-r--r--apps/user_ldap/l10n/da.json1
-rw-r--r--apps/user_ldap/l10n/de.js2
-rw-r--r--apps/user_ldap/l10n/de.json2
-rw-r--r--apps/user_ldap/l10n/de_DE.js4
-rw-r--r--apps/user_ldap/l10n/de_DE.json4
-rw-r--r--apps/user_ldap/l10n/fil.js1
-rw-r--r--apps/user_ldap/l10n/fil.json1
-rw-r--r--apps/user_ldap/l10n/is.js30
-rw-r--r--apps/user_ldap/l10n/is.json30
-rw-r--r--apps/user_ldap/templates/part.settingcontrols.php2
-rw-r--r--apps/user_ldap/templates/part.wizardcontrols.php2
322 files changed, 3323 insertions, 988 deletions
diff --git a/apps/comments/activity/extension.php b/apps/comments/activity/extension.php
index b65f1911d17..6bf7cae5882 100644
--- a/apps/comments/activity/extension.php
+++ b/apps/comments/activity/extension.php
@@ -105,7 +105,7 @@ class Extension implements IExtension {
public function getTypeIcon($type) {
switch ($type) {
case self::APP_NAME:
- return false;
+ return 'icon-comment';
}
return false;
@@ -150,6 +150,9 @@ class Extension implements IExtension {
switch ($text) {
case self::ADD_COMMENT_SUBJECT:
+ if ($this->authorIsCurrentUser($params[0])) {
+ return (string) $l->t('You commented');
+ }
return (string) $l->t('%1$s commented', $params);
case self::ADD_COMMENT_MESSAGE:
return $this->convertParameterToComment($params[0], 120);
@@ -168,6 +171,9 @@ class Extension implements IExtension {
switch ($text) {
case self::ADD_COMMENT_SUBJECT:
+ if ($this->authorIsCurrentUser($params[0])) {
+ return (string) $l->t('You commented on %2$s', $params);
+ }
return (string) $l->t('%1$s commented on %2$s', $params);
case self::ADD_COMMENT_MESSAGE:
return $this->convertParameterToComment($params[0]);
@@ -177,6 +183,21 @@ class Extension implements IExtension {
}
/**
+ * Check if the author is the current user
+ *
+ * @param string $user Parameter e.g. `<user display-name="admin">admin</user>`
+ * @return bool
+ */
+ protected function authorIsCurrentUser($user) {
+ try {
+ return strip_tags($user) === $this->activityManager->getCurrentUserId();
+ } catch (\UnexpectedValueException $e) {
+ // FIXME this is awkward, but we have no access to the current user in emails
+ return false;
+ }
+ }
+
+ /**
* The extension can define the type of parameters for translation
*
* Currently known types are:
diff --git a/apps/comments/l10n/cs_CZ.js b/apps/comments/l10n/cs_CZ.js
index 4a18c2911ee..1b4e03102d4 100644
--- a/apps/comments/l10n/cs_CZ.js
+++ b/apps/comments/l10n/cs_CZ.js
@@ -2,7 +2,9 @@ OC.L10N.register(
"comments",
{
"<strong>Comments</strong> for files" : "<strong>Komentáře</strong> souborů",
+ "You commented" : "Okomentoval jste",
"%1$s commented" : "%1$s okomentován",
+ "You commented on %2$s" : "Okomentoval jste %2$s",
"%1$s commented on %2$s" : "%1$s okomentoval %2$s",
"Comments" : "Komentáře",
"Type in a new comment..." : "Zadat nový komentář...",
diff --git a/apps/comments/l10n/cs_CZ.json b/apps/comments/l10n/cs_CZ.json
index 438fe7208bc..5ca994542bf 100644
--- a/apps/comments/l10n/cs_CZ.json
+++ b/apps/comments/l10n/cs_CZ.json
@@ -1,6 +1,8 @@
{ "translations": {
"<strong>Comments</strong> for files" : "<strong>Komentáře</strong> souborů",
+ "You commented" : "Okomentoval jste",
"%1$s commented" : "%1$s okomentován",
+ "You commented on %2$s" : "Okomentoval jste %2$s",
"%1$s commented on %2$s" : "%1$s okomentoval %2$s",
"Comments" : "Komentáře",
"Type in a new comment..." : "Zadat nový komentář...",
diff --git a/apps/comments/l10n/da.js b/apps/comments/l10n/da.js
index 60574894c35..5725a7b57c6 100644
--- a/apps/comments/l10n/da.js
+++ b/apps/comments/l10n/da.js
@@ -1,8 +1,23 @@
OC.L10N.register(
"comments",
{
+ "<strong>Comments</strong> for files" : "<strong>Kommentarer</strong> til filer",
+ "You commented" : "Du kommenterede",
+ "%1$s commented" : "%1$s kommenterede",
+ "You commented on %2$s" : "Du kommenterede %2$s",
+ "%1$s commented on %2$s" : "%1$s kommenterede %2$s",
+ "Comments" : "Kommentarer",
+ "Type in a new comment..." : "Indtast en ny kommentar...",
+ "Delete comment" : "Slet kommentar",
+ "Post" : "Indlæg",
"Cancel" : "Annullér",
+ "Edit comment" : "Rediger kommentar",
+ "[Deleted user]" : "[Deleted user]",
+ "No other comments available" : "Ingen andre kommentarer tilgængelige",
+ "More comments..." : "Flere kommentarer...",
"Save" : "Gem",
+ "Allowed characters {count} of {max}" : "Tilladte tegn {count} af {max}",
+ "{count} unread comments" : "{count} ulæste kommentarer",
"Comment" : "Kommentér"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/comments/l10n/da.json b/apps/comments/l10n/da.json
index 7524d5675ba..a7b12851157 100644
--- a/apps/comments/l10n/da.json
+++ b/apps/comments/l10n/da.json
@@ -1,6 +1,21 @@
{ "translations": {
+ "<strong>Comments</strong> for files" : "<strong>Kommentarer</strong> til filer",
+ "You commented" : "Du kommenterede",
+ "%1$s commented" : "%1$s kommenterede",
+ "You commented on %2$s" : "Du kommenterede %2$s",
+ "%1$s commented on %2$s" : "%1$s kommenterede %2$s",
+ "Comments" : "Kommentarer",
+ "Type in a new comment..." : "Indtast en ny kommentar...",
+ "Delete comment" : "Slet kommentar",
+ "Post" : "Indlæg",
"Cancel" : "Annullér",
+ "Edit comment" : "Rediger kommentar",
+ "[Deleted user]" : "[Deleted user]",
+ "No other comments available" : "Ingen andre kommentarer tilgængelige",
+ "More comments..." : "Flere kommentarer...",
"Save" : "Gem",
+ "Allowed characters {count} of {max}" : "Tilladte tegn {count} af {max}",
+ "{count} unread comments" : "{count} ulæste kommentarer",
"Comment" : "Kommentér"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/comments/l10n/de.js b/apps/comments/l10n/de.js
index be0c332740f..0e51b02662a 100644
--- a/apps/comments/l10n/de.js
+++ b/apps/comments/l10n/de.js
@@ -2,7 +2,9 @@ OC.L10N.register(
"comments",
{
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien",
+ "You commented" : "Du hast kommentiert",
"%1$s commented" : "%1$s kommentierte",
+ "You commented on %2$s" : "Du hast %2$s kommentiert",
"%1$s commented on %2$s" : "%1$s kommentierte %2$s",
"Comments" : "Kommentare",
"Type in a new comment..." : "Bitte gib einen neuen Kommentar ein...",
diff --git a/apps/comments/l10n/de.json b/apps/comments/l10n/de.json
index 5981609711e..8dc0bdb0427 100644
--- a/apps/comments/l10n/de.json
+++ b/apps/comments/l10n/de.json
@@ -1,6 +1,8 @@
{ "translations": {
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien",
+ "You commented" : "Du hast kommentiert",
"%1$s commented" : "%1$s kommentierte",
+ "You commented on %2$s" : "Du hast %2$s kommentiert",
"%1$s commented on %2$s" : "%1$s kommentierte %2$s",
"Comments" : "Kommentare",
"Type in a new comment..." : "Bitte gib einen neuen Kommentar ein...",
diff --git a/apps/comments/l10n/de_DE.js b/apps/comments/l10n/de_DE.js
index 33d448c56ef..424ae79e10e 100644
--- a/apps/comments/l10n/de_DE.js
+++ b/apps/comments/l10n/de_DE.js
@@ -2,7 +2,9 @@ OC.L10N.register(
"comments",
{
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien",
+ "You commented" : "Durch dich kommentiert",
"%1$s commented" : "%1$s kommentiert",
+ "You commented on %2$s" : "Sie haben %2$s kommentiert",
"%1$s commented on %2$s" : "%1$s kommentierte %2$s",
"Comments" : "Kommentare",
"Type in a new comment..." : "Neuer Kommentar...",
diff --git a/apps/comments/l10n/de_DE.json b/apps/comments/l10n/de_DE.json
index a99a1663f50..4fd810c7006 100644
--- a/apps/comments/l10n/de_DE.json
+++ b/apps/comments/l10n/de_DE.json
@@ -1,6 +1,8 @@
{ "translations": {
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien",
+ "You commented" : "Durch dich kommentiert",
"%1$s commented" : "%1$s kommentiert",
+ "You commented on %2$s" : "Sie haben %2$s kommentiert",
"%1$s commented on %2$s" : "%1$s kommentierte %2$s",
"Comments" : "Kommentare",
"Type in a new comment..." : "Neuer Kommentar...",
diff --git a/apps/comments/l10n/el.js b/apps/comments/l10n/el.js
index ea0442757a3..1ca7886fdc5 100644
--- a/apps/comments/l10n/el.js
+++ b/apps/comments/l10n/el.js
@@ -1,14 +1,23 @@
OC.L10N.register(
"comments",
{
+ "<strong>Comments</strong> for files" : "<strong>Σχόλια</strong> για αρχεία",
+ "You commented" : "Σχολιάσατε",
+ "%1$s commented" : "%1$s σχολίασε",
+ "You commented on %2$s" : "Σχολιάσατε στο %2$s",
+ "%1$s commented on %2$s" : "%1$s σχολίασε στο %2$s",
"Comments" : "Σχόλια",
"Type in a new comment..." : "Αυτό είναι ένα νέο σχόλιο...",
"Delete comment" : "Διαγραφή σχολίου",
+ "Post" : "Δημοσίευση",
"Cancel" : "Άκυρο",
"Edit comment" : "Επεξεργασία σχολίου",
"[Deleted user]" : "[Διαγραφή χρήστη]",
+ "No other comments available" : "Δεν υπάρχουν άλλα διαθέσιμα σχόλια",
"More comments..." : "Περισσότερα σχόλια...",
"Save" : "Αποθήκευση",
+ "Allowed characters {count} of {max}" : "Επιτρεπόμενοι χαρακτήρες {count} από {max}",
+ "{count} unread comments" : "{count} μη αναγνωσμένα σχόλια",
"Comment" : "Σχόλιο"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/comments/l10n/el.json b/apps/comments/l10n/el.json
index 157445191a4..234f6b79045 100644
--- a/apps/comments/l10n/el.json
+++ b/apps/comments/l10n/el.json
@@ -1,12 +1,21 @@
{ "translations": {
+ "<strong>Comments</strong> for files" : "<strong>Σχόλια</strong> για αρχεία",
+ "You commented" : "Σχολιάσατε",
+ "%1$s commented" : "%1$s σχολίασε",
+ "You commented on %2$s" : "Σχολιάσατε στο %2$s",
+ "%1$s commented on %2$s" : "%1$s σχολίασε στο %2$s",
"Comments" : "Σχόλια",
"Type in a new comment..." : "Αυτό είναι ένα νέο σχόλιο...",
"Delete comment" : "Διαγραφή σχολίου",
+ "Post" : "Δημοσίευση",
"Cancel" : "Άκυρο",
"Edit comment" : "Επεξεργασία σχολίου",
"[Deleted user]" : "[Διαγραφή χρήστη]",
+ "No other comments available" : "Δεν υπάρχουν άλλα διαθέσιμα σχόλια",
"More comments..." : "Περισσότερα σχόλια...",
"Save" : "Αποθήκευση",
+ "Allowed characters {count} of {max}" : "Επιτρεπόμενοι χαρακτήρες {count} από {max}",
+ "{count} unread comments" : "{count} μη αναγνωσμένα σχόλια",
"Comment" : "Σχόλιο"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/comments/l10n/fi_FI.js b/apps/comments/l10n/fi_FI.js
index e94f9ab2191..741dea8252b 100644
--- a/apps/comments/l10n/fi_FI.js
+++ b/apps/comments/l10n/fi_FI.js
@@ -2,7 +2,9 @@ OC.L10N.register(
"comments",
{
"<strong>Comments</strong> for files" : "<strong>Kommentit</strong> tiedostoille",
+ "You commented" : "Kommentoit",
"%1$s commented" : "%1$s kommentoi",
+ "You commented on %2$s" : "Kommentoit %2$s",
"%1$s commented on %2$s" : "%1$s kommentoi kohdetta %2$s",
"Comments" : "Kommentit",
"Type in a new comment..." : "Kirjoita uusi kommentti...",
diff --git a/apps/comments/l10n/fi_FI.json b/apps/comments/l10n/fi_FI.json
index 513a9ce75dd..52a9f1955ef 100644
--- a/apps/comments/l10n/fi_FI.json
+++ b/apps/comments/l10n/fi_FI.json
@@ -1,6 +1,8 @@
{ "translations": {
"<strong>Comments</strong> for files" : "<strong>Kommentit</strong> tiedostoille",
+ "You commented" : "Kommentoit",
"%1$s commented" : "%1$s kommentoi",
+ "You commented on %2$s" : "Kommentoit %2$s",
"%1$s commented on %2$s" : "%1$s kommentoi kohdetta %2$s",
"Comments" : "Kommentit",
"Type in a new comment..." : "Kirjoita uusi kommentti...",
diff --git a/apps/comments/l10n/fil.js b/apps/comments/l10n/fil.js
new file mode 100644
index 00000000000..e3734cb6ceb
--- /dev/null
+++ b/apps/comments/l10n/fil.js
@@ -0,0 +1,6 @@
+OC.L10N.register(
+ "comments",
+ {
+ "Cancel" : "I-cancel"
+},
+"nplurals=2; plural=(n > 1);");
diff --git a/apps/comments/l10n/fil.json b/apps/comments/l10n/fil.json
new file mode 100644
index 00000000000..a368f5adea8
--- /dev/null
+++ b/apps/comments/l10n/fil.json
@@ -0,0 +1,4 @@
+{ "translations": {
+ "Cancel" : "I-cancel"
+},"pluralForm" :"nplurals=2; plural=(n > 1);"
+} \ No newline at end of file
diff --git a/apps/comments/l10n/fr.js b/apps/comments/l10n/fr.js
index 514ba843f3e..fc065bd0db0 100644
--- a/apps/comments/l10n/fr.js
+++ b/apps/comments/l10n/fr.js
@@ -2,7 +2,9 @@ OC.L10N.register(
"comments",
{
"<strong>Comments</strong> for files" : "<strong>Commentaires</strong> pour les fichiers",
+ "You commented" : "Vous avez commenté",
"%1$s commented" : "%1$s a commenté",
+ "You commented on %2$s" : "Vous avez commenté %2$s",
"%1$s commented on %2$s" : "%1$s a commenté %2$s",
"Comments" : "Commentaires",
"Type in a new comment..." : "Écrire un nouveau commentaire...",
diff --git a/apps/comments/l10n/fr.json b/apps/comments/l10n/fr.json
index ace5e14a14c..d69887540f9 100644
--- a/apps/comments/l10n/fr.json
+++ b/apps/comments/l10n/fr.json
@@ -1,6 +1,8 @@
{ "translations": {
"<strong>Comments</strong> for files" : "<strong>Commentaires</strong> pour les fichiers",
+ "You commented" : "Vous avez commenté",
"%1$s commented" : "%1$s a commenté",
+ "You commented on %2$s" : "Vous avez commenté %2$s",
"%1$s commented on %2$s" : "%1$s a commenté %2$s",
"Comments" : "Commentaires",
"Type in a new comment..." : "Écrire un nouveau commentaire...",
diff --git a/apps/comments/l10n/he.js b/apps/comments/l10n/he.js
index 641d13861a7..640ec297dd3 100644
--- a/apps/comments/l10n/he.js
+++ b/apps/comments/l10n/he.js
@@ -2,7 +2,9 @@ OC.L10N.register(
"comments",
{
"<strong>Comments</strong> for files" : "<strong>תגובות</strong> לקבצים",
+ "You commented" : "הערות שלך",
"%1$s commented" : "התקבלו תגובות %1$s",
+ "You commented on %2$s" : "הערות שלך ב- %2$s",
"%1$s commented on %2$s" : "התקבלו תגובות %1$s ב- %2$s ",
"Comments" : "תגובות",
"Type in a new comment..." : "יש להכניס תגובה חדשה...",
diff --git a/apps/comments/l10n/he.json b/apps/comments/l10n/he.json
index dc10680e96a..0f79918c472 100644
--- a/apps/comments/l10n/he.json
+++ b/apps/comments/l10n/he.json
@@ -1,6 +1,8 @@
{ "translations": {
"<strong>Comments</strong> for files" : "<strong>תגובות</strong> לקבצים",
+ "You commented" : "הערות שלך",
"%1$s commented" : "התקבלו תגובות %1$s",
+ "You commented on %2$s" : "הערות שלך ב- %2$s",
"%1$s commented on %2$s" : "התקבלו תגובות %1$s ב- %2$s ",
"Comments" : "תגובות",
"Type in a new comment..." : "יש להכניס תגובה חדשה...",
diff --git a/apps/comments/l10n/is.js b/apps/comments/l10n/is.js
index 750222f4bcd..c55ebf7ef85 100644
--- a/apps/comments/l10n/is.js
+++ b/apps/comments/l10n/is.js
@@ -2,7 +2,9 @@ OC.L10N.register(
"comments",
{
"<strong>Comments</strong> for files" : "<strong>Athugasemdir</strong> við skrár",
+ "You commented" : "Þú settir inn athugasemd",
"%1$s commented" : "%1$s setti inn athugasemd",
+ "You commented on %2$s" : "Þú settir inn athugasemd við %2$s",
"%1$s commented on %2$s" : "%1$s setti inn athugasemd um %2$s",
"Comments" : "Athugasemdir",
"Type in a new comment..." : "Skrifaðu inn nýja athugasemd...",
diff --git a/apps/comments/l10n/is.json b/apps/comments/l10n/is.json
index ab2c8f838e3..1a73471addf 100644
--- a/apps/comments/l10n/is.json
+++ b/apps/comments/l10n/is.json
@@ -1,6 +1,8 @@
{ "translations": {
"<strong>Comments</strong> for files" : "<strong>Athugasemdir</strong> við skrár",
+ "You commented" : "Þú settir inn athugasemd",
"%1$s commented" : "%1$s setti inn athugasemd",
+ "You commented on %2$s" : "Þú settir inn athugasemd við %2$s",
"%1$s commented on %2$s" : "%1$s setti inn athugasemd um %2$s",
"Comments" : "Athugasemdir",
"Type in a new comment..." : "Skrifaðu inn nýja athugasemd...",
diff --git a/apps/comments/l10n/it.js b/apps/comments/l10n/it.js
index fcf739c5572..56660b5a779 100644
--- a/apps/comments/l10n/it.js
+++ b/apps/comments/l10n/it.js
@@ -2,7 +2,9 @@ OC.L10N.register(
"comments",
{
"<strong>Comments</strong> for files" : "<strong>Commenti</strong> sui file",
+ "You commented" : "Hai commentato",
"%1$s commented" : "%1$s ha commentato",
+ "You commented on %2$s" : "Hai commentato su %2$s",
"%1$s commented on %2$s" : "%1$s ha commentato %2$s",
"Comments" : "Commenti",
"Type in a new comment..." : "Digita un nuovo commento...",
diff --git a/apps/comments/l10n/it.json b/apps/comments/l10n/it.json
index a3cf02c91ef..8d113baa6e4 100644
--- a/apps/comments/l10n/it.json
+++ b/apps/comments/l10n/it.json
@@ -1,6 +1,8 @@
{ "translations": {
"<strong>Comments</strong> for files" : "<strong>Commenti</strong> sui file",
+ "You commented" : "Hai commentato",
"%1$s commented" : "%1$s ha commentato",
+ "You commented on %2$s" : "Hai commentato su %2$s",
"%1$s commented on %2$s" : "%1$s ha commentato %2$s",
"Comments" : "Commenti",
"Type in a new comment..." : "Digita un nuovo commento...",
diff --git a/apps/comments/l10n/nl.js b/apps/comments/l10n/nl.js
index d168c0658db..eb9faf55e1a 100644
--- a/apps/comments/l10n/nl.js
+++ b/apps/comments/l10n/nl.js
@@ -2,7 +2,9 @@ OC.L10N.register(
"comments",
{
"<strong>Comments</strong> for files" : "<strong>Reacties</strong> voor bestanden",
+ "You commented" : "U heeft gereageerd",
"%1$s commented" : "%1$s heeft gereageerd",
+ "You commented on %2$s" : "U heeft gereageerd op %2$s",
"%1$s commented on %2$s" : "%1$s heeft gereageerd op %2$s",
"Comments" : "Reacties",
"Type in a new comment..." : "Type een nieuwe reactie...",
diff --git a/apps/comments/l10n/nl.json b/apps/comments/l10n/nl.json
index 74050c7f816..d2a811207f6 100644
--- a/apps/comments/l10n/nl.json
+++ b/apps/comments/l10n/nl.json
@@ -1,6 +1,8 @@
{ "translations": {
"<strong>Comments</strong> for files" : "<strong>Reacties</strong> voor bestanden",
+ "You commented" : "U heeft gereageerd",
"%1$s commented" : "%1$s heeft gereageerd",
+ "You commented on %2$s" : "U heeft gereageerd op %2$s",
"%1$s commented on %2$s" : "%1$s heeft gereageerd op %2$s",
"Comments" : "Reacties",
"Type in a new comment..." : "Type een nieuwe reactie...",
diff --git a/apps/comments/l10n/pt_BR.js b/apps/comments/l10n/pt_BR.js
index d7f61e4f161..9d143822a99 100644
--- a/apps/comments/l10n/pt_BR.js
+++ b/apps/comments/l10n/pt_BR.js
@@ -2,7 +2,9 @@ OC.L10N.register(
"comments",
{
"<strong>Comments</strong> for files" : "<strong>Comentários</strong> por arquivos",
+ "You commented" : "Você comentou",
"%1$s commented" : "%1$s comentado",
+ "You commented on %2$s" : "Você comentou em %2$s",
"%1$s commented on %2$s" : "%1$s comentado em %2$s",
"Comments" : "Comentários",
"Type in a new comment..." : "Digite um novo comentário...",
diff --git a/apps/comments/l10n/pt_BR.json b/apps/comments/l10n/pt_BR.json
index 728a7e458ce..10b32799a54 100644
--- a/apps/comments/l10n/pt_BR.json
+++ b/apps/comments/l10n/pt_BR.json
@@ -1,6 +1,8 @@
{ "translations": {
"<strong>Comments</strong> for files" : "<strong>Comentários</strong> por arquivos",
+ "You commented" : "Você comentou",
"%1$s commented" : "%1$s comentado",
+ "You commented on %2$s" : "Você comentou em %2$s",
"%1$s commented on %2$s" : "%1$s comentado em %2$s",
"Comments" : "Comentários",
"Type in a new comment..." : "Digite um novo comentário...",
diff --git a/apps/comments/l10n/pt_PT.js b/apps/comments/l10n/pt_PT.js
index 821afec0c50..5c874329fcd 100644
--- a/apps/comments/l10n/pt_PT.js
+++ b/apps/comments/l10n/pt_PT.js
@@ -2,7 +2,9 @@ OC.L10N.register(
"comments",
{
"<strong>Comments</strong> for files" : "<strong>Comentários</strong> para ficheiros",
+ "You commented" : "Comentou",
"%1$s commented" : "%1$s comentou",
+ "You commented on %2$s" : "Comentou %2$s",
"%1$s commented on %2$s" : "%1$s comentou %2$s",
"Comments" : "Comentários",
"Type in a new comment..." : "Escreva um novo comentário...",
diff --git a/apps/comments/l10n/pt_PT.json b/apps/comments/l10n/pt_PT.json
index d5a5edc8c7e..f5fc1d7070b 100644
--- a/apps/comments/l10n/pt_PT.json
+++ b/apps/comments/l10n/pt_PT.json
@@ -1,6 +1,8 @@
{ "translations": {
"<strong>Comments</strong> for files" : "<strong>Comentários</strong> para ficheiros",
+ "You commented" : "Comentou",
"%1$s commented" : "%1$s comentou",
+ "You commented on %2$s" : "Comentou %2$s",
"%1$s commented on %2$s" : "%1$s comentou %2$s",
"Comments" : "Comentários",
"Type in a new comment..." : "Escreva um novo comentário...",
diff --git a/apps/comments/l10n/ru.js b/apps/comments/l10n/ru.js
index 0c7c966d707..755ca9e5d58 100644
--- a/apps/comments/l10n/ru.js
+++ b/apps/comments/l10n/ru.js
@@ -2,7 +2,9 @@ OC.L10N.register(
"comments",
{
"<strong>Comments</strong> for files" : "<strong>Комментарии</strong> к файлам",
+ "You commented" : "Вы откомментировали",
"%1$s commented" : "%1$s откомментировано",
+ "You commented on %2$s" : "Вы откомментировали в %2$s",
"%1$s commented on %2$s" : "%1$s откомментировано на %2$s",
"Comments" : "Коментарии",
"Type in a new comment..." : "Запишите новый комментарий...",
diff --git a/apps/comments/l10n/ru.json b/apps/comments/l10n/ru.json
index e6e352c1916..7c5d8aa10cc 100644
--- a/apps/comments/l10n/ru.json
+++ b/apps/comments/l10n/ru.json
@@ -1,6 +1,8 @@
{ "translations": {
"<strong>Comments</strong> for files" : "<strong>Комментарии</strong> к файлам",
+ "You commented" : "Вы откомментировали",
"%1$s commented" : "%1$s откомментировано",
+ "You commented on %2$s" : "Вы откомментировали в %2$s",
"%1$s commented on %2$s" : "%1$s откомментировано на %2$s",
"Comments" : "Коментарии",
"Type in a new comment..." : "Запишите новый комментарий...",
diff --git a/apps/comments/l10n/sl.js b/apps/comments/l10n/sl.js
index 331382f4f5b..79d8fc8e977 100644
--- a/apps/comments/l10n/sl.js
+++ b/apps/comments/l10n/sl.js
@@ -2,7 +2,9 @@ OC.L10N.register(
"comments",
{
"<strong>Comments</strong> for files" : "<strong>Opombe</strong> datotek",
+ "You commented" : "Vaša opomba",
"%1$s commented" : "%1$s opomb",
+ "You commented on %2$s" : "Napisali ste opombo na %2$s",
"%1$s commented on %2$s" : "%1$s opomb ob %2$s",
"Comments" : "Opombe",
"Type in a new comment..." : "Vpis nove opombe ...",
diff --git a/apps/comments/l10n/sl.json b/apps/comments/l10n/sl.json
index 54f77cfe571..1e71acbec39 100644
--- a/apps/comments/l10n/sl.json
+++ b/apps/comments/l10n/sl.json
@@ -1,6 +1,8 @@
{ "translations": {
"<strong>Comments</strong> for files" : "<strong>Opombe</strong> datotek",
+ "You commented" : "Vaša opomba",
"%1$s commented" : "%1$s opomb",
+ "You commented on %2$s" : "Napisali ste opombo na %2$s",
"%1$s commented on %2$s" : "%1$s opomb ob %2$s",
"Comments" : "Opombe",
"Type in a new comment..." : "Vpis nove opombe ...",
diff --git a/apps/comments/l10n/sq.js b/apps/comments/l10n/sq.js
index cf18a031b0e..fdb47e2425a 100644
--- a/apps/comments/l10n/sq.js
+++ b/apps/comments/l10n/sq.js
@@ -2,7 +2,9 @@ OC.L10N.register(
"comments",
{
"<strong>Comments</strong> for files" : "<strong>Komente</strong> për kartela",
+ "You commented" : "Komentuat",
"%1$s commented" : "%1$s komentoi",
+ "You commented on %2$s" : "Komentuat te %2$s",
"%1$s commented on %2$s" : "%1$s komentoi te %2$s",
"Comments" : "Komente",
"Type in a new comment..." : "Shtypni një koment të ri…",
diff --git a/apps/comments/l10n/sq.json b/apps/comments/l10n/sq.json
index aa92903ab60..deaeceac8ce 100644
--- a/apps/comments/l10n/sq.json
+++ b/apps/comments/l10n/sq.json
@@ -1,6 +1,8 @@
{ "translations": {
"<strong>Comments</strong> for files" : "<strong>Komente</strong> për kartela",
+ "You commented" : "Komentuat",
"%1$s commented" : "%1$s komentoi",
+ "You commented on %2$s" : "Komentuat te %2$s",
"%1$s commented on %2$s" : "%1$s komentoi te %2$s",
"Comments" : "Komente",
"Type in a new comment..." : "Shtypni një koment të ri…",
diff --git a/apps/comments/l10n/sv.js b/apps/comments/l10n/sv.js
index db3cfe589ae..6c3b17555bc 100644
--- a/apps/comments/l10n/sv.js
+++ b/apps/comments/l10n/sv.js
@@ -2,7 +2,9 @@ OC.L10N.register(
"comments",
{
"<strong>Comments</strong> for files" : "<strong>Kommentarer</strong> till filer",
+ "You commented" : "Du kommenterade",
"%1$s commented" : "%1$s har kommenterat",
+ "You commented on %2$s" : "Du kommenterade %2$s",
"%1$s commented on %2$s" : "%1$s kommenterade på %2$s",
"Comments" : "Kommentarer",
"Type in a new comment..." : "Skriv en ny kommentar",
diff --git a/apps/comments/l10n/sv.json b/apps/comments/l10n/sv.json
index 7547cfe69e2..6b2e9b7b71d 100644
--- a/apps/comments/l10n/sv.json
+++ b/apps/comments/l10n/sv.json
@@ -1,6 +1,8 @@
{ "translations": {
"<strong>Comments</strong> for files" : "<strong>Kommentarer</strong> till filer",
+ "You commented" : "Du kommenterade",
"%1$s commented" : "%1$s har kommenterat",
+ "You commented on %2$s" : "Du kommenterade %2$s",
"%1$s commented on %2$s" : "%1$s kommenterade på %2$s",
"Comments" : "Kommentarer",
"Type in a new comment..." : "Skriv en ny kommentar",
diff --git a/apps/comments/l10n/tr.js b/apps/comments/l10n/tr.js
index d098f212de6..ff5bbca4081 100644
--- a/apps/comments/l10n/tr.js
+++ b/apps/comments/l10n/tr.js
@@ -1,21 +1,23 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "Dosyalar için <strong>Yorumlar</strong>",
+ "<strong>Comments</strong> for files" : "Dosyalar için <strong>yorumlar</strong>",
+ "You commented" : "Yorum yaptınız",
"%1$s commented" : "%1$s yorumlanmış",
- "%1$s commented on %2$s" : "%1$s yorumlanmış %2$s",
+ "You commented on %2$s" : "%2$s için yorum yaptınız",
+ "%1$s commented on %2$s" : "%1$s, %2$s için yorum yaptı",
"Comments" : "Yorumlar",
- "Type in a new comment..." : "Yeni bir yorum yazın",
- "Delete comment" : "Yorumu silin",
+ "Type in a new comment..." : "Yeni bir yorum yazın...",
+ "Delete comment" : "Yorumu sil",
"Post" : "Gönder",
"Cancel" : "İptal",
- "Edit comment" : "Yorumu düzenleyin",
+ "Edit comment" : "Yorumu düzenle",
"[Deleted user]" : "[Silinmiş kullanıcı]",
"No other comments available" : "Mevcut başka yorum yok",
"More comments..." : "Daha fazla yorum...",
"Save" : "Kaydet",
- "Allowed characters {count} of {max}" : "İzin verilen karakterler {count} {max}",
- "{count} unread comments" : "{count} okunmamış yorumlar",
+ "Allowed characters {count} of {max}" : "İzin verilen karakterler {count}/{max}",
+ "{count} unread comments" : "{count} okunmamış yorum",
"Comment" : "Yorum"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/comments/l10n/tr.json b/apps/comments/l10n/tr.json
index 8b644c82ee1..724670c53ae 100644
--- a/apps/comments/l10n/tr.json
+++ b/apps/comments/l10n/tr.json
@@ -1,19 +1,21 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "Dosyalar için <strong>Yorumlar</strong>",
+ "<strong>Comments</strong> for files" : "Dosyalar için <strong>yorumlar</strong>",
+ "You commented" : "Yorum yaptınız",
"%1$s commented" : "%1$s yorumlanmış",
- "%1$s commented on %2$s" : "%1$s yorumlanmış %2$s",
+ "You commented on %2$s" : "%2$s için yorum yaptınız",
+ "%1$s commented on %2$s" : "%1$s, %2$s için yorum yaptı",
"Comments" : "Yorumlar",
- "Type in a new comment..." : "Yeni bir yorum yazın",
- "Delete comment" : "Yorumu silin",
+ "Type in a new comment..." : "Yeni bir yorum yazın...",
+ "Delete comment" : "Yorumu sil",
"Post" : "Gönder",
"Cancel" : "İptal",
- "Edit comment" : "Yorumu düzenleyin",
+ "Edit comment" : "Yorumu düzenle",
"[Deleted user]" : "[Silinmiş kullanıcı]",
"No other comments available" : "Mevcut başka yorum yok",
"More comments..." : "Daha fazla yorum...",
"Save" : "Kaydet",
- "Allowed characters {count} of {max}" : "İzin verilen karakterler {count} {max}",
- "{count} unread comments" : "{count} okunmamış yorumlar",
+ "Allowed characters {count} of {max}" : "İzin verilen karakterler {count}/{max}",
+ "{count} unread comments" : "{count} okunmamış yorum",
"Comment" : "Yorum"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/dav/appinfo/app.php b/apps/dav/appinfo/app.php
index 17596ffecbb..d85a3583bf1 100644
--- a/apps/dav/appinfo/app.php
+++ b/apps/dav/appinfo/app.php
@@ -46,6 +46,8 @@ $eventDispatcher->addListener('OCP\Federation\TrustedServerEvent::remove',
$cm = \OC::$server->getContactsManager();
$cm->register(function() use ($cm, $app) {
- $userId = \OC::$server->getUserSession()->getUser()->getUID();
- $app->setupContactsProvider($cm, $userId);
+ $user = \OC::$server->getUserSession()->getUser();
+ if (!is_null($user)) {
+ $app->setupContactsProvider($cm, $user->getUID());
+ }
});
diff --git a/apps/dav/appinfo/application.php b/apps/dav/appinfo/application.php
index 1dae3d4efbf..d06daf97f54 100644
--- a/apps/dav/appinfo/application.php
+++ b/apps/dav/appinfo/application.php
@@ -210,4 +210,19 @@ class Application extends App {
$this->getContainer()->getServer()->getLogger()->logException($ex);
}
}
+
+ public function generateBirthdays() {
+ try {
+ /** @var BirthdayService $migration */
+ $migration = $this->getContainer()->query('BirthdayService');
+ $userManager = $this->getContainer()->getServer()->getUserManager();
+
+ $userManager->callForAllUsers(function($user) use($migration) {
+ /** @var IUser $user */
+ $migration->syncUser($user->getUID());
+ });
+ } catch (\Exception $ex) {
+ $this->getContainer()->getServer()->getLogger()->logException($ex);
+ }
+ }
}
diff --git a/apps/dav/appinfo/database.xml b/apps/dav/appinfo/database.xml
index b0a7ad4f2a8..71dec639064 100644
--- a/apps/dav/appinfo/database.xml
+++ b/apps/dav/appinfo/database.xml
@@ -31,18 +31,22 @@ CREATE TABLE addressbooks (
<field>
<name>principaluri</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>displayname</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>uri</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>description</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>synctoken</name>
@@ -102,6 +106,7 @@ CREATE TABLE cards (
<field>
<name>uri</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>lastmodified</name>
@@ -150,6 +155,7 @@ CREATE TABLE addressbookchanges (
<field>
<name>uri</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>synctoken</name>
@@ -219,6 +225,7 @@ CREATE TABLE calendarobjects (
<field>
<name>uri</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>calendarid</name>
@@ -246,6 +253,7 @@ CREATE TABLE calendarobjects (
<field>
<name>componenttype</name>
<type>text</type>
+ <length>8</length>
</field>
<field>
<name>firstoccurence</name>
@@ -260,6 +268,7 @@ CREATE TABLE calendarobjects (
<field>
<name>uid</name>
<type>text</type>
+ <length>255</length>
</field>
<index>
<name>calobjects_index</name>
@@ -304,14 +313,17 @@ CREATE TABLE calendarobjects (
<field>
<name>principaluri</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>displayname</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>uri</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>synctoken</name>
@@ -323,6 +335,7 @@ CREATE TABLE calendarobjects (
<field>
<name>description</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>calendarorder</name>
@@ -342,6 +355,7 @@ CREATE TABLE calendarobjects (
<field>
<name>components</name>
<type>text</type>
+ <length>20</length>
</field>
<field>
<name>transparent</name>
@@ -387,6 +401,7 @@ CREATE TABLE calendarobjects (
<field>
<name>uri</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>synctoken</name>
@@ -456,10 +471,12 @@ CREATE TABLE calendarobjects (
<field>
<name>principaluri</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>source</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>displayname</name>
@@ -541,6 +558,7 @@ CREATE TABLE calendarobjects (
<field>
<name>principaluri</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>calendardata</name>
@@ -549,6 +567,7 @@ CREATE TABLE calendarobjects (
<field>
<name>uri</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>lastmodified</name>
@@ -658,10 +677,12 @@ CREATE TABLE calendarobjects (
<field>
<name>principaluri</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>type</name>
<type>text</type>
+ <length>255</length>
</field>
<field>
<name>access</name>
diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml
index 4f1e805d99e..b7c7267dce8 100644
--- a/apps/dav/appinfo/info.xml
+++ b/apps/dav/appinfo/info.xml
@@ -5,7 +5,7 @@
<description>ownCloud WebDAV endpoint</description>
<licence>AGPL</licence>
<author>owncloud.org</author>
- <version>0.2.1</version>
+ <version>0.2.3</version>
<default_enable/>
<types>
<filesystem/>
diff --git a/apps/dav/appinfo/install.php b/apps/dav/appinfo/install.php
index a7a3220b90f..dc5ae39226e 100644
--- a/apps/dav/appinfo/install.php
+++ b/apps/dav/appinfo/install.php
@@ -25,3 +25,4 @@ $app = new Application();
$app->setupCron();
$app->migrateAddressbooks();
$app->migrateCalendars();
+$app->generateBirthdays();
diff --git a/apps/dav/appinfo/update.php b/apps/dav/appinfo/update.php
index aaa36052cd2..fbd41d25f49 100644
--- a/apps/dav/appinfo/update.php
+++ b/apps/dav/appinfo/update.php
@@ -23,3 +23,4 @@ use OCA\Dav\AppInfo\Application;
$app = new Application();
$app->setupCron();
+$app->generateBirthdays();
diff --git a/apps/dav/appinfo/v1/caldav.php b/apps/dav/appinfo/v1/caldav.php
index e9b6e3759ab..ac46b13025b 100644
--- a/apps/dav/appinfo/v1/caldav.php
+++ b/apps/dav/appinfo/v1/caldav.php
@@ -24,11 +24,11 @@
// Backends
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\Connector\LegacyDAVACL;
+use OCA\DAV\CalDAV\CalendarRoot;
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(),
diff --git a/apps/dav/lib/caldav/birthdayservice.php b/apps/dav/lib/caldav/birthdayservice.php
index 7e1df189c4e..274341949b3 100644
--- a/apps/dav/lib/caldav/birthdayservice.php
+++ b/apps/dav/lib/caldav/birthdayservice.php
@@ -50,8 +50,7 @@ class BirthdayService {
$book = $this->cardDavBackEnd->getAddressBookById($addressBookId);
$principalUri = $book['principaluri'];
- $calendarUri = self::BIRTHDAY_CALENDAR_URI;
- $calendar = $this->ensureCalendarExists($principalUri, $calendarUri, []);
+ $calendar = $this->ensureCalendarExists($principalUri);
$objectUri = $book['uri'] . '-' . $cardUri. '.ics';
$calendarData = $this->buildBirthdayFromContact($cardData);
$existing = $this->calDavBackEnd->getCalendarObject($calendar['id'], $objectUri);
@@ -77,32 +76,27 @@ class BirthdayService {
public function onCardDeleted($addressBookId, $cardUri) {
$book = $this->cardDavBackEnd->getAddressBookById($addressBookId);
$principalUri = $book['principaluri'];
- $calendarUri = self::BIRTHDAY_CALENDAR_URI;
- $calendar = $this->ensureCalendarExists($principalUri, $calendarUri, []);
+ $calendar = $this->ensureCalendarExists($principalUri);
$objectUri = $book['uri'] . '-' . $cardUri. '.ics';
$this->calDavBackEnd->deleteCalendarObject($calendar['id'], $objectUri);
}
/**
* @param string $principal
- * @param string $id
- * @param array $properties
* @return array|null
* @throws \Sabre\DAV\Exception\BadRequest
*/
- public function ensureCalendarExists($principal, $id, $properties) {
- $properties = array_merge([
- '{DAV:}displayname' => 'Contact birthdays',
- '{http://apple.com/ns/ical/}calendar-color' => '#FFFFCA',
- ], $properties);
-
- $book = $this->calDavBackEnd->getCalendarByUri($principal, $id);
+ public function ensureCalendarExists($principal) {
+ $book = $this->calDavBackEnd->getCalendarByUri($principal, self::BIRTHDAY_CALENDAR_URI);
if (!is_null($book)) {
return $book;
}
- $this->calDavBackEnd->createCalendar($principal, $id, $properties);
+ $this->calDavBackEnd->createCalendar($principal, self::BIRTHDAY_CALENDAR_URI, [
+ '{DAV:}displayname' => 'Contact birthdays',
+ '{http://apple.com/ns/ical/}calendar-color' => '#FFFFCA',
+ ]);
- return $this->calDavBackEnd->getCalendarByUri($principal, $id);
+ return $this->calDavBackEnd->getCalendarByUri($principal, self::BIRTHDAY_CALENDAR_URI);
}
/**
@@ -161,7 +155,9 @@ class BirthdayService {
* @param string $user
*/
public function syncUser($user) {
- $books = $this->cardDavBackEnd->getAddressBooksForUser('principals/users/'.$user);
+ $principal = 'principals/users/'.$user;
+ $this->ensureCalendarExists($principal);
+ $books = $this->cardDavBackEnd->getAddressBooksForUser($principal);
foreach($books as $book) {
$cards = $this->cardDavBackEnd->getCards($book['id']);
foreach($cards as $card) {
diff --git a/apps/dav/lib/caldav/caldavbackend.php b/apps/dav/lib/caldav/caldavbackend.php
index bb50100d9a2..f0f236de3ff 100644
--- a/apps/dav/lib/caldav/caldavbackend.php
+++ b/apps/dav/lib/caldav/caldavbackend.php
@@ -138,6 +138,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
* @return array
*/
function getCalendarsForUser($principalUri) {
+ $principalUriOriginal = $principalUri;
$principalUri = $this->convertPrincipal($principalUri, true);
$fields = array_values($this->propertyMap);
$fields[] = 'id';
@@ -184,7 +185,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$stmt->closeCursor();
// query for shared calendars
- $principals = $this->principalBackend->getGroupMembership($principalUri);
+ $principals = $this->principalBackend->getGroupMembership($principalUriOriginal, true);
$principals[]= $principalUri;
$fields = array_values($this->propertyMap);
@@ -194,6 +195,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$fields[] = 'a.components';
$fields[] = 'a.principaluri';
$fields[] = 'a.transparent';
+ $fields[] = 's.access';
$query = $this->db->getQueryBuilder();
$result = $query->select($fields)
->from('dav_shares', 's')
@@ -221,6 +223,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
'{' . Plugin::NS_CALDAV . '}supported-calendar-component-set' => new SupportedCalendarComponentSet($components),
'{' . Plugin::NS_CALDAV . '}schedule-calendar-transp' => new ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'),
'{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $row['principaluri'],
+ '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only' => (int)$row['access'] === Backend::ACCESS_READ,
];
foreach($this->propertyMap as $xmlName=>$dbName) {
@@ -702,7 +705,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
*
* This default may well be good enough for personal use, and calendars
* that aren't very large. But if you anticipate high usage, big calendars
- * or high loads, you are strongly adviced to optimize certain paths.
+ * or high loads, you are strongly advised to optimize certain paths.
*
* The best way to do so is override this method and to optimize
* specifically for 'common filters'.
@@ -1296,7 +1299,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
}
if ($componentType === 'VEVENT' && $component->DTSTART) {
$firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp();
- // Finding the last occurence is a bit harder
+ // Finding the last occurrence is a bit harder
if (!isset($component->RRULE)) {
if (isset($component->DTEND)) {
$lastOccurence = $component->DTEND->getDateTime()->getTimeStamp();
diff --git a/apps/dav/lib/caldav/calendar.php b/apps/dav/lib/caldav/calendar.php
index 1e87f9b4333..5072d96107e 100644
--- a/apps/dav/lib/caldav/calendar.php
+++ b/apps/dav/lib/caldav/calendar.php
@@ -86,7 +86,31 @@ class Calendar extends \Sabre\CalDAV\Calendar implements IShareable {
}
function getACL() {
- $acl = parent::getACL();
+ $acl = [
+ [
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
+ ]];
+ $acl[] = [
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
+ ];
+ if ($this->getOwner() !== parent::getOwner()) {
+ $acl[] = [
+ 'privilege' => '{DAV:}read',
+ 'principal' => parent::getOwner(),
+ 'protected' => true,
+ ];
+ if ($this->canWrite()) {
+ $acl[] = [
+ 'privilege' => '{DAV:}write',
+ 'principal' => parent::getOwner(),
+ 'protected' => true,
+ ];
+ }
+ }
/** @var CalDavBackend $calDavBackend */
$calDavBackend = $this->caldavBackend;
@@ -94,11 +118,7 @@ class Calendar extends \Sabre\CalDAV\Calendar implements IShareable {
}
function getChildACL() {
- $acl = parent::getChildACL();
-
- /** @var CalDavBackend $calDavBackend */
- $calDavBackend = $this->caldavBackend;
- return $calDavBackend->applyShareAcl($this->getResourceId(), $acl);
+ return $this->getACL();
}
function getOwner() {
@@ -137,4 +157,12 @@ class Calendar extends \Sabre\CalDAV\Calendar implements IShareable {
}
parent::propPatch($propPatch);
}
+
+ private function canWrite() {
+ if (isset($this->calendarInfo['{http://owncloud.org/ns}read-only'])) {
+ return !$this->calendarInfo['{http://owncloud.org/ns}read-only'];
+ }
+ return true;
+ }
+
}
diff --git a/apps/dav/lib/carddav/addressbook.php b/apps/dav/lib/carddav/addressbook.php
index bb9d13b981e..8b1b600ec3d 100644
--- a/apps/dav/lib/carddav/addressbook.php
+++ b/apps/dav/lib/carddav/addressbook.php
@@ -21,6 +21,7 @@
namespace OCA\DAV\CardDAV;
use OCA\DAV\DAV\Sharing\IShareable;
+use Sabre\CardDAV\Card;
use Sabre\DAV\Exception\Forbidden;
use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\PropPatch;
@@ -70,39 +71,31 @@ class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareable {
}
function getACL() {
- $acl = parent::getACL();
- if ($this->getOwner() === 'principals/system/system') {
- $acl[] = [
- 'privilege' => '{DAV:}read',
- 'principal' => '{DAV:}authenticated',
- 'protected' => true,
+ $acl = [
+ [
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
+ ]];
+ $acl[] = [
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
];
- }
-
- // add the current user
- if (isset($this->addressBookInfo['{http://owncloud.org/ns}owner-principal'])) {
- $owner = $this->addressBookInfo['{http://owncloud.org/ns}owner-principal'];
- $acl[] = [
+ if ($this->getOwner() !== parent::getOwner()) {
+ $acl[] = [
'privilege' => '{DAV:}read',
- 'principal' => $owner,
+ 'principal' => parent::getOwner(),
'protected' => true,
];
- if ($this->addressBookInfo['{http://owncloud.org/ns}read-only']) {
+ if ($this->canWrite()) {
$acl[] = [
'privilege' => '{DAV:}write',
- 'principal' => $owner,
+ 'principal' => parent::getOwner(),
'protected' => true,
];
}
}
-
- /** @var CardDavBackend $carddavBackend */
- $carddavBackend = $this->carddavBackend;
- return $carddavBackend->applyShareAcl($this->getResourceId(), $acl);
- }
-
- function getChildACL() {
- $acl = parent::getChildACL();
if ($this->getOwner() === 'principals/system/system') {
$acl[] = [
'privilege' => '{DAV:}read',
@@ -116,12 +109,19 @@ class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareable {
return $carddavBackend->applyShareAcl($this->getResourceId(), $acl);
}
+ function getChildACL() {
+ return $this->getACL();
+ }
+
function getChild($name) {
- $obj = $this->carddavBackend->getCard($this->getResourceId(), $name);
+
+ $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'], $name);
if (!$obj) {
throw new NotFound('Card not found');
}
+ $obj['acl'] = $this->getChildACL();
return new Card($this->carddavBackend, $this->addressBookInfo, $obj);
+
}
/**
@@ -172,4 +172,11 @@ class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareable {
return $cardDavBackend->collectCardProperties($this->getResourceId(), 'CATEGORIES');
}
+
+ private function canWrite() {
+ if (isset($this->addressBookInfo['{http://owncloud.org/ns}read-only'])) {
+ return !$this->addressBookInfo['{http://owncloud.org/ns}read-only'];
+ }
+ return true;
+ }
}
diff --git a/apps/dav/lib/carddav/card.php b/apps/dav/lib/carddav/card.php
deleted file mode 100644
index d848f2e28ec..00000000000
--- a/apps/dav/lib/carddav/card.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?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\CardDAV;
-
-class Card extends \Sabre\CardDAV\Card {
-
- function getACL() {
- $acl = parent::getACL();
- if ($this->getOwner() === 'principals/system/system') {
- $acl[] = [
- 'privilege' => '{DAV:}read',
- 'principal' => '{DAV:}authenticated',
- 'protected' => true,
- ];
- }
-
- /** @var CardDavBackend $carddavBackend */
- $carddavBackend = $this->carddavBackend;
- return $carddavBackend->applyShareAcl($this->getBookId(), $acl);
- }
-
- private function getBookId() {
- return $this->addressBookInfo['id'];
- }
-
-}
diff --git a/apps/dav/lib/carddav/carddavbackend.php b/apps/dav/lib/carddav/carddavbackend.php
index bfb6ea82ad7..28d5ed1ae99 100644
--- a/apps/dav/lib/carddav/carddavbackend.php
+++ b/apps/dav/lib/carddav/carddavbackend.php
@@ -62,10 +62,6 @@ class CardDavBackend implements BackendInterface, SyncSupport {
'BDAY', 'UID', 'N', 'FN', 'TITLE', 'ROLE', 'NOTE', 'NICKNAME',
'ORG', 'CATEGORIES', 'EMAIL', 'TEL', 'IMPP', 'ADR', 'URL', 'GEO', 'CLOUD');
- const ACCESS_OWNER = 1;
- const ACCESS_READ_WRITE = 2;
- const ACCESS_READ = 3;
-
/** @var EventDispatcherInterface */
private $dispatcher;
@@ -103,6 +99,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
* @return array
*/
function getAddressBooksForUser($principalUri) {
+ $principalUriOriginal = $principalUri;
$principalUri = $this->convertPrincipal($principalUri, true);
$query = $this->db->getQueryBuilder();
$query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken'])
@@ -126,7 +123,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
$result->closeCursor();
// query for shared calendars
- $principals = $this->principalBackend->getGroupMembership($principalUri);
+ $principals = $this->principalBackend->getGroupMembership($principalUriOriginal, true);
$principals[]= $principalUri;
$query = $this->db->getQueryBuilder();
@@ -153,7 +150,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
'{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,
+ '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only' => (int)$row['access'] === Backend::ACCESS_READ,
];
}
}
@@ -395,7 +392,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
}
/**
- * Returns a specfic card.
+ * Returns a specific card.
*
* The same set of properties must be returned as with getCards. The only
* exception is that 'carddata' is absolutely required.
diff --git a/apps/dav/lib/connector/legacydavacl.php b/apps/dav/lib/connector/legacydavacl.php
index 07aefa1b863..eb6ca1fd7d5 100644
--- a/apps/dav/lib/connector/legacydavacl.php
+++ b/apps/dav/lib/connector/legacydavacl.php
@@ -23,7 +23,10 @@
namespace OCA\DAV\Connector;
use OCA\DAV\Connector\Sabre\DavAclPlugin;
+use Sabre\DAV\INode;
+use Sabre\DAV\PropFind;
use Sabre\HTTP\URLUtil;
+use Sabre\DAVACL\Xml\Property\Principal;
class LegacyDAVACL extends DavAclPlugin {
@@ -67,4 +70,16 @@ class LegacyDAVACL extends DavAclPlugin {
}
return "principals/$name";
}
+
+ function propFind(PropFind $propFind, INode $node) {
+ /* Overload current-user-principal */
+ $propFind->handle('{DAV:}current-user-principal', function () {
+ if ($url = parent::getCurrentUserPrincipal()) {
+ return new Principal(Principal::HREF, $url . '/');
+ } else {
+ return new Principal(Principal::UNAUTHENTICATED);
+ }
+ });
+ parent::propFind($propFind, $node);
+ }
}
diff --git a/apps/dav/lib/connector/sabre/auth.php b/apps/dav/lib/connector/sabre/auth.php
index 4bb07c5f0ed..b63efa3a1ba 100644
--- a/apps/dav/lib/connector/sabre/auth.php
+++ b/apps/dav/lib/connector/sabre/auth.php
@@ -30,6 +30,7 @@
namespace OCA\DAV\Connector\Sabre;
use Exception;
+use OC\AppFramework\Http\Request;
use OCP\IRequest;
use OCP\ISession;
use OCP\IUserSession;
@@ -48,6 +49,8 @@ class Auth extends AbstractBasic {
private $userSession;
/** @var IRequest */
private $request;
+ /** @var string */
+ private $currentUser;
/**
* @param ISession $session
@@ -130,7 +133,46 @@ class Auth extends AbstractBasic {
$msg = $e->getMessage();
throw new ServiceUnavailable("$class: $msg");
}
- }
+ }
+
+ /**
+ * Checks whether a CSRF check is required on the request
+ *
+ * @return bool
+ */
+ private function requiresCSRFCheck() {
+ // GET requires no check at all
+ if($this->request->getMethod() === 'GET') {
+ return false;
+ }
+
+ // Official ownCloud clients require no checks
+ if($this->request->isUserAgent([
+ Request::USER_AGENT_OWNCLOUD_DESKTOP,
+ Request::USER_AGENT_OWNCLOUD_ANDROID,
+ Request::USER_AGENT_OWNCLOUD_IOS,
+ ])) {
+ return false;
+ }
+
+ // If not logged-in no check is required
+ if(!$this->userSession->isLoggedIn()) {
+ return false;
+ }
+
+ // POST always requires a check
+ if($this->request->getMethod() === 'POST') {
+ return true;
+ }
+
+ // If logged-in AND DAV authenticated no check is required
+ if($this->userSession->isLoggedIn() &&
+ $this->isDavAuthenticated($this->userSession->getUser()->getUID())) {
+ return false;
+ }
+
+ return true;
+ }
/**
* @param RequestInterface $request
@@ -139,27 +181,33 @@ class Auth extends AbstractBasic {
* @throws NotAuthenticated
*/
private function auth(RequestInterface $request, ResponseInterface $response) {
- // If request is not GET and not authenticated via WebDAV a requesttoken is required
- if($this->userSession->isLoggedIn() &&
- $this->request->getMethod() !== 'GET' &&
- !$this->isDavAuthenticated($this->userSession->getUser()->getUID())) {
- if(!$this->request->passesCSRFCheck()) {
+ $forcedLogout = false;
+ if(!$this->request->passesCSRFCheck() &&
+ $this->requiresCSRFCheck()) {
+ // In case of a fail with POST we need to recheck the credentials
+ if($this->request->getMethod() === 'POST') {
+ $forcedLogout = true;
+ } else {
$response->setStatus(401);
throw new \Sabre\DAV\Exception\NotAuthenticated('CSRF check not passed.');
}
}
- if (\OC_User::handleApacheAuth() ||
- //Fix for broken webdav clients
- ($this->userSession->isLoggedIn() && is_null($this->session->get(self::DAV_AUTHENTICATED))) ||
- //Well behaved clients that only send the cookie are allowed
- ($this->userSession->isLoggedIn() && $this->session->get(self::DAV_AUTHENTICATED) === $this->userSession->getUser()->getUID() && $request->getHeader('Authorization') === null)
- ) {
- $user = $this->userSession->getUser()->getUID();
- \OC_Util::setupFS($user);
- $this->currentUser = $user;
- $this->session->close();
- return [true, $this->principalPrefix . $user];
+ if($forcedLogout) {
+ $this->userSession->logout();
+ } else {
+ if (\OC_User::handleApacheAuth() ||
+ //Fix for broken webdav clients
+ ($this->userSession->isLoggedIn() && is_null($this->session->get(self::DAV_AUTHENTICATED))) ||
+ //Well behaved clients that only send the cookie are allowed
+ ($this->userSession->isLoggedIn() && $this->session->get(self::DAV_AUTHENTICATED) === $this->userSession->getUser()->getUID() && $request->getHeader('Authorization') === null)
+ ) {
+ $user = $this->userSession->getUser()->getUID();
+ \OC_Util::setupFS($user);
+ $this->currentUser = $user;
+ $this->session->close();
+ return [true, $this->principalPrefix . $user];
+ }
}
if (!$this->userSession->isLoggedIn() && in_array('XMLHttpRequest', explode(',', $request->getHeader('X-Requested-With')))) {
@@ -169,6 +217,12 @@ class Auth extends AbstractBasic {
throw new \Sabre\DAV\Exception\NotAuthenticated('Cannot authenticate over ajax calls');
}
- return parent::check($request, $response);
+ $data = parent::check($request, $response);
+ if($data[0] === true) {
+ $startPos = strrpos($data[1], '/') + 1;
+ $user = $this->userSession->getUser()->getUID();
+ $data[1] = substr_replace($data[1], $user, $startPos);
+ }
+ return $data;
}
}
diff --git a/apps/dav/lib/connector/sabre/file.php b/apps/dav/lib/connector/sabre/file.php
index 59b3a6e7483..6b698c6e5a9 100644
--- a/apps/dav/lib/connector/sabre/file.php
+++ b/apps/dav/lib/connector/sabre/file.php
@@ -433,7 +433,7 @@ class File extends Node implements IFile {
list($partStorage, $partInternalPath) = $this->fileView->resolvePath($partFile);
- $chunk_handler->file_assemble($partStorage, $partInternalPath, $this->fileView->getAbsolutePath($targetPath));
+ $chunk_handler->file_assemble($partStorage, $partInternalPath);
// here is the final atomic rename
$renameOkay = $targetStorage->moveFromStorage($partStorage, $partInternalPath, $targetInternalPath);
@@ -452,7 +452,7 @@ class File extends Node implements IFile {
}
} else {
// assemble directly into the final file
- $chunk_handler->file_assemble($targetStorage, $targetInternalPath, $this->fileView->getAbsolutePath($targetPath));
+ $chunk_handler->file_assemble($targetStorage, $targetInternalPath);
}
// allow sync clients to send the mtime along in a header
diff --git a/apps/dav/lib/connector/sabre/filesplugin.php b/apps/dav/lib/connector/sabre/filesplugin.php
index e973b4e8682..fb2af554c68 100644
--- a/apps/dav/lib/connector/sabre/filesplugin.php
+++ b/apps/dav/lib/connector/sabre/filesplugin.php
@@ -27,10 +27,13 @@
namespace OCA\DAV\Connector\Sabre;
+use OC\Files\View;
+use Sabre\DAV\Exception\Forbidden;
use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\IFile;
use \Sabre\DAV\PropFind;
use \Sabre\DAV\PropPatch;
+use Sabre\DAV\Tree;
use \Sabre\HTTP\RequestInterface;
use \Sabre\HTTP\ResponseInterface;
use OCP\Files\StorageNotAvailableException;
@@ -58,7 +61,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
private $server;
/**
- * @var \Sabre\DAV\Tree
+ * @var Tree
*/
private $tree;
@@ -71,21 +74,29 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
private $isPublic;
/**
- * @var \OC\Files\View
+ * @var View
*/
private $fileView;
/**
- * @param \Sabre\DAV\Tree $tree
- * @param \OC\Files\View $view
+ * @var bool
+ */
+ private $downloadAttachment;
+
+ /**
+ * @param Tree $tree
+ * @param View $view
* @param bool $isPublic
+ * @param bool $downloadAttachment
*/
- public function __construct(\Sabre\DAV\Tree $tree,
- \OC\Files\View $view,
- $isPublic = false) {
+ public function __construct(Tree $tree,
+ View $view,
+ $isPublic = false,
+ $downloadAttachment = true) {
$this->tree = $tree;
$this->fileView = $view;
$this->isPublic = $isPublic;
+ $this->downloadAttachment = $downloadAttachment;
}
/**
@@ -135,7 +146,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
* Plugin that checks if a move can actually be performed.
* @param string $source source path
* @param string $destination destination path
- * @throws \Sabre\DAV\Exception\Forbidden
+ * @throws Forbidden
*/
function checkMove($source, $destination) {
list($sourceDir,) = \Sabre\HTTP\URLUtil::splitPath($source);
@@ -145,11 +156,11 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
$sourceFileInfo = $this->fileView->getFileInfo($source);
if ($sourceFileInfo === false) {
- throw new \Sabre\DAV\Exception\NotFound($source . ' does not exist');
+ throw new NotFound($source . ' does not exist');
}
if (!$sourceFileInfo->isDeletable()) {
- throw new \Sabre\DAV\Exception\Forbidden($source . " cannot be deleted");
+ throw new Forbidden($source . " cannot be deleted");
}
}
}
@@ -192,7 +203,9 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
if (!($node instanceof IFile)) return;
// adds a 'Content-Disposition: attachment' header
- $response->addHeader('Content-Disposition', 'attachment');
+ if ($this->downloadAttachment) {
+ $response->addHeader('Content-Disposition', 'attachment');
+ }
if ($node instanceof \OCA\DAV\Connector\Sabre\File) {
//Add OC-Checksum header
@@ -233,7 +246,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
});
$propFind->handle(self::GETETAG_PROPERTYNAME, function() use ($node) {
- return $node->getEtag();
+ return $node->getETag();
});
$propFind->handle(self::OWNER_ID_PROPERTYNAME, function() use ($node) {
diff --git a/apps/dav/lib/connector/sabre/lockplugin.php b/apps/dav/lib/connector/sabre/lockplugin.php
index ff4e1dc01bb..66da39a57c8 100644
--- a/apps/dav/lib/connector/sabre/lockplugin.php
+++ b/apps/dav/lib/connector/sabre/lockplugin.php
@@ -49,7 +49,7 @@ class LockPlugin extends ServerPlugin {
}
public function getLock(RequestInterface $request) {
- // we cant listen on 'beforeMethod:PUT' due to order of operations with setting up the tree
+ // we can't listen on 'beforeMethod:PUT' due to order of operations with setting up the tree
// so instead we limit ourselves to the PUT method manually
if ($request->getMethod() !== 'PUT' || isset($_SERVER['HTTP_OC_CHUNKED'])) {
return;
diff --git a/apps/dav/lib/connector/sabre/principal.php b/apps/dav/lib/connector/sabre/principal.php
index 31de4e5bad1..18f28a916f1 100644
--- a/apps/dav/lib/connector/sabre/principal.php
+++ b/apps/dav/lib/connector/sabre/principal.php
@@ -132,10 +132,11 @@ class Principal implements BackendInterface {
* Returns the list of groups a principal is a member of
*
* @param string $principal
+ * @param bool $needGroups
* @return array
* @throws Exception
*/
- public function getGroupMembership($principal) {
+ public function getGroupMembership($principal, $needGroups = false) {
list($prefix, $name) = URLUtil::splitPath($principal);
if ($prefix === $this->principalPrefix) {
@@ -144,7 +145,7 @@ class Principal implements BackendInterface {
throw new Exception('Principal not found');
}
- if ($this->hasGroups) {
+ if ($this->hasGroups || $needGroups) {
$groups = $this->groupManager->getUserGroups($user);
$groups = array_map(function($group) {
/** @var IGroup $group */
diff --git a/apps/dav/lib/connector/sabre/serverfactory.php b/apps/dav/lib/connector/sabre/serverfactory.php
index 6ccec0bc0e8..8158db3e92a 100644
--- a/apps/dav/lib/connector/sabre/serverfactory.php
+++ b/apps/dav/lib/connector/sabre/serverfactory.php
@@ -132,11 +132,18 @@ class ServerFactory {
}
$objectTree->init($root, $view, $this->mountManager);
- $server->addPlugin(new \OCA\DAV\Connector\Sabre\FilesPlugin($objectTree, $view));
+ $server->addPlugin(new \OCA\DAV\Connector\Sabre\FilesPlugin($objectTree, $view, false,
+ !$this->config->getSystemValue('debug', false)));
$server->addPlugin(new \OCA\DAV\Connector\Sabre\QuotaPlugin($view));
if($this->userSession->isLoggedIn()) {
$server->addPlugin(new \OCA\DAV\Connector\Sabre\TagsPlugin($objectTree, $this->tagManager));
+ $server->addPlugin(new \OCA\DAV\Connector\Sabre\SharesPlugin(
+ $objectTree,
+ $this->userSession,
+ $userFolder,
+ \OC::$server->getShareManager()
+ ));
$server->addPlugin(new \OCA\DAV\Connector\Sabre\CommentPropertiesPlugin(\OC::$server->getCommentsManager(), $this->userSession));
$server->addPlugin(new \OCA\DAV\Connector\Sabre\FilesReportPlugin(
$objectTree,
diff --git a/apps/dav/lib/connector/sabre/sharesplugin.php b/apps/dav/lib/connector/sabre/sharesplugin.php
new file mode 100644
index 00000000000..c76068969e9
--- /dev/null
+++ b/apps/dav/lib/connector/sabre/sharesplugin.php
@@ -0,0 +1,177 @@
+<?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 \Sabre\DAV\PropFind;
+use \Sabre\DAV\PropPatch;
+use OCP\IUserSession;
+use OCP\Share\IShare;
+use OCA\DAV\Connector\Sabre\ShareTypeList;
+
+/**
+ * Sabre Plugin to provide share-related properties
+ */
+class SharesPlugin extends \Sabre\DAV\ServerPlugin {
+
+ const NS_OWNCLOUD = 'http://owncloud.org/ns';
+ const SHARETYPES_PROPERTYNAME = '{http://owncloud.org/ns}share-types';
+
+ /**
+ * Reference to main server object
+ *
+ * @var \Sabre\DAV\Server
+ */
+ private $server;
+
+ /**
+ * @var \OCP\Share\IManager
+ */
+ private $shareManager;
+
+ /**
+ * @var \Sabre\DAV\Tree
+ */
+ private $tree;
+
+ /**
+ * @var string
+ */
+ private $userId;
+
+ /**
+ * @var \OCP\Files\Folder
+ */
+ private $userFolder;
+
+ /**
+ * @var IShare[]
+ */
+ private $cachedShareTypes;
+
+ /**
+ * @param \Sabre\DAV\Tree $tree tree
+ * @param IUserSession $userSession user session
+ * @param \OCP\Files\Folder $userFolder user home folder
+ * @param \OCP\Share\IManager $shareManager share manager
+ */
+ public function __construct(
+ \Sabre\DAV\Tree $tree,
+ IUserSession $userSession,
+ \OCP\Files\Folder $userFolder,
+ \OCP\Share\IManager $shareManager
+ ) {
+ $this->tree = $tree;
+ $this->shareManager = $shareManager;
+ $this->userFolder = $userFolder;
+ $this->userId = $userSession->getUser()->getUID();
+ $this->cachedShareTypes = [];
+ }
+
+ /**
+ * 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
+ */
+ public function initialize(\Sabre\DAV\Server $server) {
+ $server->xml->namespacesMap[self::NS_OWNCLOUD] = 'oc';
+ $server->xml->elementMap[self::SHARETYPES_PROPERTYNAME] = 'OCA\\DAV\\Connector\\Sabre\\ShareTypeList';
+ $server->protectedProperties[] = self::SHARETYPES_PROPERTYNAME;
+
+ $this->server = $server;
+ $this->server->on('propFind', array($this, 'handleGetProperties'));
+ }
+
+ /**
+ * Return a list of share types for outgoing shares
+ *
+ * @param \OCP\Files\Node $node file node
+ *
+ * @return int[] array of share types
+ */
+ private function getShareTypes(\OCP\Files\Node $node) {
+ $shareTypes = [];
+ $requestedShareTypes = [
+ \OCP\Share::SHARE_TYPE_USER,
+ \OCP\Share::SHARE_TYPE_GROUP,
+ \OCP\Share::SHARE_TYPE_LINK,
+ \OCP\Share::SHARE_TYPE_REMOTE
+ ];
+ foreach ($requestedShareTypes as $requestedShareType) {
+ // one of each type is enough to find out about the types
+ $shares = $this->shareManager->getSharesBy(
+ $this->userId,
+ $requestedShareType,
+ $node,
+ false,
+ 1
+ );
+ if (!empty($shares)) {
+ $shareTypes[] = $requestedShareType;
+ }
+ }
+ return $shareTypes;
+ }
+
+ /**
+ * Adds shares to propfind response
+ *
+ * @param PropFind $propFind propfind object
+ * @param \Sabre\DAV\INode $sabreNode sabre node
+ */
+ public function handleGetProperties(
+ PropFind $propFind,
+ \Sabre\DAV\INode $sabreNode
+ ) {
+ if (!($sabreNode instanceof \OCA\DAV\Connector\Sabre\Node)) {
+ return;
+ }
+
+ // need prefetch ?
+ if ($sabreNode instanceof \OCA\DAV\Connector\Sabre\Directory
+ && $propFind->getDepth() !== 0
+ && !is_null($propFind->getStatus(self::SHARETYPES_PROPERTYNAME))
+ ) {
+ $folderNode = $this->userFolder->get($propFind->getPath());
+ $children = $folderNode->getDirectoryListing();
+
+ $this->cachedShareTypes[$folderNode->getId()] = $this->getShareTypes($folderNode);
+ foreach ($children as $childNode) {
+ $this->cachedShareTypes[$childNode->getId()] = $this->getShareTypes($childNode);
+ }
+ }
+
+ $propFind->handle(self::SHARETYPES_PROPERTYNAME, function() use ($sabreNode) {
+ if (isset($this->cachedShareTypes[$sabreNode->getId()])) {
+ $shareTypes = $this->cachedShareTypes[$sabreNode->getId()];
+ } else {
+ $node = $this->userFolder->get($sabreNode->getPath());
+ $shareTypes = $this->getShareTypes($node);
+ }
+
+ return new ShareTypeList($shareTypes);
+ });
+ }
+}
diff --git a/apps/dav/lib/connector/sabre/sharetypelist.php b/apps/dav/lib/connector/sabre/sharetypelist.php
new file mode 100644
index 00000000000..763586412ad
--- /dev/null
+++ b/apps/dav/lib/connector/sabre/sharetypelist.php
@@ -0,0 +1,87 @@
+<?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 Sabre\Xml\Element;
+use Sabre\Xml\Reader;
+use Sabre\Xml\Writer;
+
+/**
+ * ShareTypeList property
+ *
+ * This property contains multiple "share-type" elements, each containing a share type.
+ */
+class ShareTypeList implements Element {
+ const NS_OWNCLOUD = 'http://owncloud.org/ns';
+
+ /**
+ * Share types
+ *
+ * @var int[]
+ */
+ private $shareTypes;
+
+ /**
+ * @param int[] $shareTypes
+ */
+ public function __construct($shareTypes) {
+ $this->shareTypes = $shareTypes;
+ }
+
+ /**
+ * Returns the share types
+ *
+ * @return int[]
+ */
+ public function getShareTypes() {
+ return $this->shareTypes;
+ }
+
+ /**
+ * The deserialize method is called during xml parsing.
+ *
+ * @param Reader $reader
+ * @return mixed
+ */
+ static function xmlDeserialize(Reader $reader) {
+ $shareTypes = [];
+
+ foreach ($reader->parseInnerTree() as $elem) {
+ if ($elem['name'] === '{' . self::NS_OWNCLOUD . '}share-type') {
+ $shareTypes[] = (int)$elem['value'];
+ }
+ }
+ return new self($shareTypes);
+ }
+
+ /**
+ * The xmlSerialize metod is called during xml writing.
+ *
+ * @param Writer $writer
+ * @return void
+ */
+ function xmlSerialize(Writer $writer) {
+ foreach ($this->shareTypes as $shareType) {
+ $writer->writeElement('{' . self::NS_OWNCLOUD . '}share-type', $shareType);
+ }
+ }
+}
diff --git a/apps/dav/lib/server.php b/apps/dav/lib/server.php
index f624137f316..e74292282a7 100644
--- a/apps/dav/lib/server.php
+++ b/apps/dav/lib/server.php
@@ -125,7 +125,8 @@ class Server {
$user = \OC::$server->getUserSession()->getUser();
if (!is_null($user)) {
$view = \OC\Files\Filesystem::getView();
- $this->server->addPlugin(new FilesPlugin($this->server->tree, $view));
+ $this->server->addPlugin(new FilesPlugin($this->server->tree, $view, false,
+ !\OC::$server->getConfig()->getSystemValue('debug', false)));
$this->server->addPlugin(
new \Sabre\DAV\PropertyStorage\Plugin(
diff --git a/apps/dav/tests/unit/caldav/calendartest.php b/apps/dav/tests/unit/caldav/calendartest.php
index e7f4d57067c..9e0c3c6c7e4 100644
--- a/apps/dav/tests/unit/caldav/calendartest.php
+++ b/apps/dav/tests/unit/caldav/calendartest.php
@@ -103,4 +103,64 @@ class CalendarTest extends TestCase {
$this->assertTrue(true);
}
}
+
+ /**
+ * @dataProvider providesReadOnlyInfo
+ */
+ public function testAcl($expectsWrite, $readOnlyValue, $hasOwnerSet) {
+ /** @var \PHPUnit_Framework_MockObject_MockObject | CalDavBackend $backend */
+ $backend = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')->disableOriginalConstructor()->getMock();
+ $backend->expects($this->any())->method('applyShareAcl')->willReturnArgument(1);
+ $calendarInfo = [
+ 'principaluri' => 'user2',
+ 'id' => 666,
+ 'uri' => 'default'
+ ];
+ if (!is_null($readOnlyValue)) {
+ $calendarInfo['{http://owncloud.org/ns}read-only'] = $readOnlyValue;
+ }
+ if ($hasOwnerSet) {
+ $calendarInfo['{http://owncloud.org/ns}owner-principal'] = 'user1';
+ }
+ $c = new Calendar($backend, $calendarInfo);
+ $acl = $c->getACL();
+ $childAcl = $c->getChildACL();
+
+ $expectedAcl = [[
+ 'privilege' => '{DAV:}read',
+ 'principal' => $hasOwnerSet ? 'user1' : 'user2',
+ 'protected' => true
+ ], [
+ 'privilege' => '{DAV:}write',
+ 'principal' => $hasOwnerSet ? 'user1' : 'user2',
+ 'protected' => true
+ ]];
+ if ($hasOwnerSet) {
+ $expectedAcl[] = [
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'user2',
+ 'protected' => true
+ ];
+ if ($expectsWrite) {
+ $expectedAcl[] = [
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'user2',
+ 'protected' => true
+ ];
+ }
+ }
+ $this->assertEquals($expectedAcl, $acl);
+ $this->assertEquals($expectedAcl, $childAcl);
+ }
+
+ public function providesReadOnlyInfo() {
+ return [
+ 'read-only property not set' => [true, null, true],
+ 'read-only property is false' => [true, false, true],
+ 'read-only property is true' => [false, true, true],
+ 'read-only property not set and no owner' => [true, null, false],
+ 'read-only property is false and no owner' => [true, false, false],
+ 'read-only property is true and no owner' => [false, true, false],
+ ];
+ }
}
diff --git a/apps/dav/tests/unit/carddav/addressbooktest.php b/apps/dav/tests/unit/carddav/addressbooktest.php
index 854c121a95d..c5cf7e5f7ba 100644
--- a/apps/dav/tests/unit/carddav/addressbooktest.php
+++ b/apps/dav/tests/unit/carddav/addressbooktest.php
@@ -32,7 +32,7 @@ class AddressBookTest extends TestCase {
/** @var \PHPUnit_Framework_MockObject_MockObject | CardDavBackend $backend */
$backend = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend')->disableOriginalConstructor()->getMock();
$backend->expects($this->once())->method('updateShares');
- $backend->method('getShares')->willReturn([
+ $backend->expects($this->any())->method('getShares')->willReturn([
['href' => 'principal:user2']
]);
$calendarInfo = [
@@ -51,7 +51,7 @@ class AddressBookTest extends TestCase {
/** @var \PHPUnit_Framework_MockObject_MockObject | CardDavBackend $backend */
$backend = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend')->disableOriginalConstructor()->getMock();
$backend->expects($this->never())->method('updateShares');
- $backend->method('getShares')->willReturn([
+ $backend->expects($this->any())->method('getShares')->willReturn([
['href' => 'principal:group2']
]);
$calendarInfo = [
@@ -77,4 +77,63 @@ class AddressBookTest extends TestCase {
$c = new AddressBook($backend, $calendarInfo);
$c->propPatch(new PropPatch([]));
}
-}
+
+ /**
+ * @dataProvider providesReadOnlyInfo
+ */
+ public function testAcl($expectsWrite, $readOnlyValue, $hasOwnerSet) {
+ /** @var \PHPUnit_Framework_MockObject_MockObject | CardDavBackend $backend */
+ $backend = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend')->disableOriginalConstructor()->getMock();
+ $backend->expects($this->any())->method('applyShareAcl')->willReturnArgument(1);
+ $calendarInfo = [
+ 'principaluri' => 'user2',
+ 'id' => 666,
+ 'uri' => 'default'
+ ];
+ if (!is_null($readOnlyValue)) {
+ $calendarInfo['{http://owncloud.org/ns}read-only'] = $readOnlyValue;
+ }
+ if ($hasOwnerSet) {
+ $calendarInfo['{http://owncloud.org/ns}owner-principal'] = 'user1';
+ }
+ $c = new AddressBook($backend, $calendarInfo);
+ $acl = $c->getACL();
+ $childAcl = $c->getChildACL();
+
+ $expectedAcl = [[
+ 'privilege' => '{DAV:}read',
+ 'principal' => $hasOwnerSet ? 'user1' : 'user2',
+ 'protected' => true
+ ], [
+ 'privilege' => '{DAV:}write',
+ 'principal' => $hasOwnerSet ? 'user1' : 'user2',
+ 'protected' => true
+ ]];
+ if ($hasOwnerSet) {
+ $expectedAcl[] = [
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'user2',
+ 'protected' => true
+ ];
+ if ($expectsWrite) {
+ $expectedAcl[] = [
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'user2',
+ 'protected' => true
+ ];
+ }
+ }
+ $this->assertEquals($expectedAcl, $acl);
+ $this->assertEquals($expectedAcl, $childAcl);
+ }
+
+ public function providesReadOnlyInfo() {
+ return [
+ 'read-only property not set' => [true, null, true],
+ 'read-only property is false' => [true, false, true],
+ 'read-only property is true' => [false, true, true],
+ 'read-only property not set and no owner' => [true, null, false],
+ 'read-only property is false and no owner' => [true, false, false],
+ 'read-only property is true and no owner' => [false, true, false],
+ ];
+ }}
diff --git a/apps/dav/tests/unit/connector/sabre/auth.php b/apps/dav/tests/unit/connector/sabre/auth.php
index 57ed44f01c0..b81a5e003b5 100644
--- a/apps/dav/tests/unit/connector/sabre/auth.php
+++ b/apps/dav/tests/unit/connector/sabre/auth.php
@@ -198,10 +198,7 @@ class Auth extends TestCase {
$this->assertFalse($this->invokePrivate($this->auth, 'validateUserPass', ['MyTestUser', 'MyTestPassword']));
}
- /**
- * @expectedException \Sabre\DAV\Exception\NotAuthenticated
- * @expectedExceptionMessage CSRF check not passed.
- */
+
public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenForNonGet() {
$request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')
->disableOriginalConstructor()
@@ -210,30 +207,42 @@ class Auth extends TestCase {
->disableOriginalConstructor()
->getMock();
$this->userSession
- ->expects($this->once())
+ ->expects($this->any())
->method('isLoggedIn')
->will($this->returnValue(true));
+ $this->request
+ ->expects($this->any())
+ ->method('getMethod')
+ ->willReturn('POST');
$this->session
- ->expects($this->once())
+ ->expects($this->any())
->method('get')
->with('AUTHENTICATED_TO_DAV_BACKEND')
->will($this->returnValue(null));
$user = $this->getMockBuilder('\OCP\IUser')
->disableOriginalConstructor()
->getMock();
- $user->expects($this->once())
+ $user->expects($this->any())
->method('getUID')
->will($this->returnValue('MyWrongDavUser'));
$this->userSession
- ->expects($this->once())
+ ->expects($this->any())
->method('getUser')
->will($this->returnValue($user));
+ $this->request
+ ->expects($this->once())
+ ->method('passesCSRFCheck')
+ ->willReturn(false);
+ $expectedResponse = [
+ false,
+ "No 'Authorization: Basic' header found. Either the client didn't send one, or the server is mis-configured",
+ ];
$response = $this->auth->check($request, $response);
- $this->assertEquals([true, 'principals/users/MyWrongDavUser'], $response);
+ $this->assertSame($expectedResponse, $response);
}
- public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenForGet() {
+ public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenAndCorrectlyDavAuthenticated() {
$request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')
->disableOriginalConstructor()
->getMock();
@@ -241,26 +250,169 @@ class Auth extends TestCase {
->disableOriginalConstructor()
->getMock();
$this->userSession
- ->expects($this->exactly(2))
+ ->expects($this->any())
->method('isLoggedIn')
- ->will($this->returnValue(true));
+ ->willReturn(true);
+ $this->request
+ ->expects($this->any())
+ ->method('getMethod')
+ ->willReturn('PROPFIND');
+ $this->request
+ ->expects($this->any())
+ ->method('isUserAgent')
+ ->with([
+ '/^Mozilla\/5\.0 \([A-Za-z ]+\) (mirall|csyncoC)\/.*$/',
+ '/^Mozilla\/5\.0 \(Android\) ownCloud\-android.*$/',
+ '/^Mozilla\/5\.0 \(iOS\) ownCloud\-iOS.*$/',
+ ])
+ ->willReturn(false);
$this->session
+ ->expects($this->any())
+ ->method('get')
+ ->with('AUTHENTICATED_TO_DAV_BACKEND')
+ ->will($this->returnValue('LoggedInUser'));
+ $user = $this->getMockBuilder('\OCP\IUser')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $user->expects($this->any())
+ ->method('getUID')
+ ->will($this->returnValue('LoggedInUser'));
+ $this->userSession
+ ->expects($this->any())
+ ->method('getUser')
+ ->will($this->returnValue($user));
+ $this->request
->expects($this->once())
+ ->method('passesCSRFCheck')
+ ->willReturn(false);
+ $this->auth->check($request, $response);
+ }
+
+ /**
+ * @expectedException \Sabre\DAV\Exception\NotAuthenticated
+ * @expectedExceptionMessage CSRF check not passed.
+ */
+ public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenAndIncorrectlyDavAuthenticated() {
+ $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->userSession
+ ->expects($this->any())
+ ->method('isLoggedIn')
+ ->willReturn(true);
+ $this->request
+ ->expects($this->any())
+ ->method('getMethod')
+ ->willReturn('PROPFIND');
+ $this->request
+ ->expects($this->any())
+ ->method('isUserAgent')
+ ->with([
+ '/^Mozilla\/5\.0 \([A-Za-z ]+\) (mirall|csyncoC)\/.*$/',
+ '/^Mozilla\/5\.0 \(Android\) ownCloud\-android.*$/',
+ '/^Mozilla\/5\.0 \(iOS\) ownCloud\-iOS.*$/',
+ ])
+ ->willReturn(false);
+ $this->session
+ ->expects($this->any())
+ ->method('get')
+ ->with('AUTHENTICATED_TO_DAV_BACKEND')
+ ->will($this->returnValue('AnotherUser'));
+ $user = $this->getMockBuilder('\OCP\IUser')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $user->expects($this->any())
+ ->method('getUID')
+ ->will($this->returnValue('LoggedInUser'));
+ $this->userSession
+ ->expects($this->any())
+ ->method('getUser')
+ ->will($this->returnValue($user));
+ $this->request
+ ->expects($this->once())
+ ->method('passesCSRFCheck')
+ ->willReturn(false);
+ $this->auth->check($request, $response);
+ }
+
+ public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenForNonGetAndDesktopClient() {
+ $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->userSession
+ ->expects($this->any())
+ ->method('isLoggedIn')
+ ->will($this->returnValue(true));
+ $this->request
+ ->expects($this->any())
+ ->method('getMethod')
+ ->willReturn('POST');
+ $this->request
+ ->expects($this->any())
+ ->method('isUserAgent')
+ ->with([
+ '/^Mozilla\/5\.0 \([A-Za-z ]+\) (mirall|csyncoC)\/.*$/',
+ '/^Mozilla\/5\.0 \(Android\) ownCloud\-android.*$/',
+ '/^Mozilla\/5\.0 \(iOS\) ownCloud\-iOS.*$/',
+ ])
+ ->willReturn(true);
+ $this->session
+ ->expects($this->any())
->method('get')
->with('AUTHENTICATED_TO_DAV_BACKEND')
->will($this->returnValue(null));
$user = $this->getMockBuilder('\OCP\IUser')
->disableOriginalConstructor()
->getMock();
- $user->expects($this->once())
+ $user->expects($this->any())
->method('getUID')
->will($this->returnValue('MyWrongDavUser'));
$this->userSession
- ->expects($this->once())
+ ->expects($this->any())
->method('getUser')
->will($this->returnValue($user));
$this->request
->expects($this->once())
+ ->method('passesCSRFCheck')
+ ->willReturn(false);
+
+ $this->auth->check($request, $response);
+ }
+
+ public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenForGet() {
+ $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->userSession
+ ->expects($this->any())
+ ->method('isLoggedIn')
+ ->will($this->returnValue(true));
+ $this->session
+ ->expects($this->any())
+ ->method('get')
+ ->with('AUTHENTICATED_TO_DAV_BACKEND')
+ ->will($this->returnValue(null));
+ $user = $this->getMockBuilder('\OCP\IUser')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $user->expects($this->any())
+ ->method('getUID')
+ ->will($this->returnValue('MyWrongDavUser'));
+ $this->userSession
+ ->expects($this->any())
+ ->method('getUser')
+ ->will($this->returnValue($user));
+ $this->request
+ ->expects($this->any())
->method('getMethod')
->willReturn('GET');
@@ -268,7 +420,6 @@ class Auth extends TestCase {
$this->assertEquals([true, 'principals/users/MyWrongDavUser'], $response);
}
-
public function testAuthenticateAlreadyLoggedInWithCsrfTokenForGet() {
$request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')
->disableOriginalConstructor()
@@ -277,22 +428,22 @@ class Auth extends TestCase {
->disableOriginalConstructor()
->getMock();
$this->userSession
- ->expects($this->exactly(2))
+ ->expects($this->any())
->method('isLoggedIn')
->will($this->returnValue(true));
$this->session
- ->expects($this->exactly(2))
+ ->expects($this->any())
->method('get')
->with('AUTHENTICATED_TO_DAV_BACKEND')
->will($this->returnValue(null));
$user = $this->getMockBuilder('\OCP\IUser')
->disableOriginalConstructor()
->getMock();
- $user->expects($this->exactly(2))
+ $user->expects($this->any())
->method('getUID')
->will($this->returnValue('MyWrongDavUser'));
$this->userSession
- ->expects($this->exactly(2))
+ ->expects($this->any())
->method('getUser')
->will($this->returnValue($user));
$this->request
@@ -368,6 +519,10 @@ class Auth extends TestCase {
->method('get')
->with('AUTHENTICATED_TO_DAV_BACKEND')
->will($this->returnValue('MyTestUser'));
+ $this->request
+ ->expects($this->once())
+ ->method('getMethod')
+ ->willReturn('GET');
$httpRequest
->expects($this->atLeastOnce())
->method('getHeader')
@@ -407,15 +562,15 @@ class Auth extends TestCase {
$user = $this->getMockBuilder('\OCP\IUser')
->disableOriginalConstructor()
->getMock();
- $user->expects($this->exactly(2))
+ $user->expects($this->exactly(3))
->method('getUID')
->will($this->returnValue('MyTestUser'));
$this->userSession
- ->expects($this->exactly(2))
+ ->expects($this->exactly(3))
->method('getUser')
->will($this->returnValue($user));
$response = $this->auth->check($server->httpRequest, $server->httpResponse);
- $this->assertEquals([true, 'principals/users/username'], $response);
+ $this->assertEquals([true, 'principals/users/MyTestUser'], $response);
}
public function testAuthenticateInvalidCredentials() {
diff --git a/apps/dav/tests/unit/connector/sabre/file.php b/apps/dav/tests/unit/connector/sabre/file.php
index 8bbef225483..eab7ece159c 100644
--- a/apps/dav/tests/unit/connector/sabre/file.php
+++ b/apps/dav/tests/unit/connector/sabre/file.php
@@ -422,6 +422,75 @@ class File extends \Test\TestCase {
);
}
+ /**
+ * Test that putting a file with chunks triggers create hooks
+ */
+ public function testPutChunkedFileTriggersHooks() {
+ HookHelper::setUpHooks();
+
+ $_SERVER['HTTP_OC_CHUNKED'] = true;
+ $this->assertNull($this->doPut('/foo.txt-chunking-12345-2-0'));
+ $this->assertNotEmpty($this->doPut('/foo.txt-chunking-12345-2-1'));
+
+ $this->assertCount(4, HookHelper::$hookCalls);
+ $this->assertHookCall(
+ HookHelper::$hookCalls[0],
+ Filesystem::signal_create,
+ '/foo.txt'
+ );
+ $this->assertHookCall(
+ HookHelper::$hookCalls[1],
+ Filesystem::signal_write,
+ '/foo.txt'
+ );
+ $this->assertHookCall(
+ HookHelper::$hookCalls[2],
+ Filesystem::signal_post_create,
+ '/foo.txt'
+ );
+ $this->assertHookCall(
+ HookHelper::$hookCalls[3],
+ Filesystem::signal_post_write,
+ '/foo.txt'
+ );
+ }
+
+ /**
+ * Test that putting a chunked file triggers update hooks
+ */
+ public function testPutOverwriteChunkedFileTriggersHooks() {
+ $view = \OC\Files\Filesystem::getView();
+ $view->file_put_contents('/foo.txt', 'some content that will be replaced');
+
+ HookHelper::setUpHooks();
+
+ $_SERVER['HTTP_OC_CHUNKED'] = true;
+ $this->assertNull($this->doPut('/foo.txt-chunking-12345-2-0'));
+ $this->assertNotEmpty($this->doPut('/foo.txt-chunking-12345-2-1'));
+
+ $this->assertCount(4, HookHelper::$hookCalls);
+ $this->assertHookCall(
+ HookHelper::$hookCalls[0],
+ Filesystem::signal_update,
+ '/foo.txt'
+ );
+ $this->assertHookCall(
+ HookHelper::$hookCalls[1],
+ Filesystem::signal_write,
+ '/foo.txt'
+ );
+ $this->assertHookCall(
+ HookHelper::$hookCalls[2],
+ Filesystem::signal_post_update,
+ '/foo.txt'
+ );
+ $this->assertHookCall(
+ HookHelper::$hookCalls[3],
+ Filesystem::signal_post_write,
+ '/foo.txt'
+ );
+ }
+
public static function cancellingHook($params) {
self::$hookCalls[] = array(
'signal' => Filesystem::signal_post_create,
diff --git a/apps/dav/tests/unit/connector/sabre/filesplugin.php b/apps/dav/tests/unit/connector/sabre/filesplugin.php
index 0a790ec6fc9..e88066a12da 100644
--- a/apps/dav/tests/unit/connector/sabre/filesplugin.php
+++ b/apps/dav/tests/unit/connector/sabre/filesplugin.php
@@ -366,7 +366,7 @@ class FilesPlugin extends \Test\TestCase {
* |-text.txt
* |-test.txt
*
- * FolderA is an incomming shared folder and there are no delete permissions.
+ * FolderA is an incoming shared folder and there are no delete permissions.
* Thus moving /FolderA/test.txt to /test.txt should fail already on that check
*
* @expectedException \Sabre\DAV\Exception\Forbidden
diff --git a/apps/dav/tests/unit/connector/sabre/sharesplugin.php b/apps/dav/tests/unit/connector/sabre/sharesplugin.php
new file mode 100644
index 00000000000..42f1b539916
--- /dev/null
+++ b/apps/dav/tests/unit/connector/sabre/sharesplugin.php
@@ -0,0 +1,259 @@
+<?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\Connector\Sabre;
+
+class SharesPlugin extends \Test\TestCase {
+
+ const SHARETYPES_PROPERTYNAME = \OCA\DAV\Connector\Sabre\SharesPlugin::SHARETYPES_PROPERTYNAME;
+
+ /**
+ * @var \Sabre\DAV\Server
+ */
+ private $server;
+
+ /**
+ * @var \Sabre\DAV\Tree
+ */
+ private $tree;
+
+ /**
+ * @var \OCP\Share\IManager
+ */
+ private $shareManager;
+
+ /**
+ * @var \OCP\Files\Folder
+ */
+ private $userFolder;
+
+ /**
+ * @var \OCA\DAV\Connector\Sabre\SharesPlugin
+ */
+ private $plugin;
+
+ public function setUp() {
+ parent::setUp();
+ $this->server = new \Sabre\DAV\Server();
+ $this->tree = $this->getMockBuilder('\Sabre\DAV\Tree')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->shareManager = $this->getMock('\OCP\Share\IManager');
+ $user = $this->getMock('\OCP\IUser');
+ $user->expects($this->once())
+ ->method('getUID')
+ ->will($this->returnValue('user1'));
+ $userSession = $this->getMock('\OCP\IUserSession');
+ $userSession->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($user));
+
+ $this->userFolder = $this->getMock('\OCP\Files\Folder');
+
+ $this->plugin = new \OCA\DAV\Connector\Sabre\SharesPlugin(
+ $this->tree,
+ $userSession,
+ $this->userFolder,
+ $this->shareManager
+ );
+ $this->plugin->initialize($this->server);
+ }
+
+ /**
+ * @dataProvider sharesGetPropertiesDataProvider
+ */
+ public function testGetProperties($shareTypes) {
+ $sabreNode = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Node')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $sabreNode->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue(123));
+ $sabreNode->expects($this->once())
+ ->method('getPath')
+ ->will($this->returnValue('/subdir'));
+
+ // node API nodes
+ $node = $this->getMock('\OCP\Files\Folder');
+
+ $this->userFolder->expects($this->once())
+ ->method('get')
+ ->with('/subdir')
+ ->will($this->returnValue($node));
+
+ $this->shareManager->expects($this->any())
+ ->method('getSharesBy')
+ ->with(
+ $this->equalTo('user1'),
+ $this->anything(),
+ $this->anything(),
+ $this->equalTo(false),
+ $this->equalTo(1)
+ )
+ ->will($this->returnCallback(function($userId, $requestedShareType, $node, $flag, $limit) use ($shareTypes){
+ if (in_array($requestedShareType, $shareTypes)) {
+ return ['dummyshare'];
+ }
+ return [];
+ }));
+
+ $propFind = new \Sabre\DAV\PropFind(
+ '/dummyPath',
+ [self::SHARETYPES_PROPERTYNAME],
+ 0
+ );
+
+ $this->plugin->handleGetProperties(
+ $propFind,
+ $sabreNode
+ );
+
+ $result = $propFind->getResultForMultiStatus();
+
+ $this->assertEmpty($result[404]);
+ unset($result[404]);
+ $this->assertEquals($shareTypes, $result[200][self::SHARETYPES_PROPERTYNAME]->getShareTypes());
+ }
+
+ /**
+ * @dataProvider sharesGetPropertiesDataProvider
+ */
+ public function testPreloadThenGetProperties($shareTypes) {
+ $sabreNode1 = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $sabreNode1->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue(111));
+ $sabreNode1->expects($this->never())
+ ->method('getPath');
+ $sabreNode2 = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $sabreNode2->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue(222));
+ $sabreNode2->expects($this->never())
+ ->method('getPath');
+
+ $sabreNode = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $sabreNode->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue(123));
+ // never, because we use getDirectoryListing from the Node API instead
+ $sabreNode->expects($this->never())
+ ->method('getChildren');
+ $sabreNode->expects($this->any())
+ ->method('getPath')
+ ->will($this->returnValue('/subdir'));
+
+ // node API nodes
+ $node = $this->getMock('\OCP\Files\Folder');
+ $node->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue(123));
+ $node1 = $this->getMock('\OCP\Files\File');
+ $node1->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue(111));
+ $node2 = $this->getMock('\OCP\Files\File');
+ $node2->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue(222));
+ $node->expects($this->once())
+ ->method('getDirectoryListing')
+ ->will($this->returnValue([$node1, $node2]));
+
+ $this->userFolder->expects($this->once())
+ ->method('get')
+ ->with('/subdir')
+ ->will($this->returnValue($node));
+
+ $this->shareManager->expects($this->any())
+ ->method('getSharesBy')
+ ->with(
+ $this->equalTo('user1'),
+ $this->anything(),
+ $this->anything(),
+ $this->equalTo(false),
+ $this->equalTo(1)
+ )
+ ->will($this->returnCallback(function($userId, $requestedShareType, $node, $flag, $limit) use ($shareTypes){
+ if ($node->getId() === 111 && in_array($requestedShareType, $shareTypes)) {
+ return ['dummyshare'];
+ }
+
+ return [];
+ }));
+
+ // simulate sabre recursive PROPFIND traversal
+ $propFindRoot = new \Sabre\DAV\PropFind(
+ '/subdir',
+ [self::SHARETYPES_PROPERTYNAME],
+ 1
+ );
+ $propFind1 = new \Sabre\DAV\PropFind(
+ '/subdir/test.txt',
+ [self::SHARETYPES_PROPERTYNAME],
+ 0
+ );
+ $propFind2 = new \Sabre\DAV\PropFind(
+ '/subdir/test2.txt',
+ [self::SHARETYPES_PROPERTYNAME],
+ 0
+ );
+
+ $this->plugin->handleGetProperties(
+ $propFindRoot,
+ $sabreNode
+ );
+ $this->plugin->handleGetProperties(
+ $propFind1,
+ $sabreNode1
+ );
+ $this->plugin->handleGetProperties(
+ $propFind2,
+ $sabreNode2
+ );
+
+ $result = $propFind1->getResultForMultiStatus();
+
+ $this->assertEmpty($result[404]);
+ unset($result[404]);
+ $this->assertEquals($shareTypes, $result[200][self::SHARETYPES_PROPERTYNAME]->getShareTypes());
+ }
+
+ function sharesGetPropertiesDataProvider() {
+ return [
+ [[]],
+ [[\OCP\Share::SHARE_TYPE_USER]],
+ [[\OCP\Share::SHARE_TYPE_GROUP]],
+ [[\OCP\Share::SHARE_TYPE_LINK]],
+ [[\OCP\Share::SHARE_TYPE_REMOTE]],
+ [[\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP]],
+ [[\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_LINK]],
+ [[\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_LINK]],
+ [[\OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_LINK]],
+ [[\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_REMOTE]],
+ ];
+ }
+}
diff --git a/apps/encryption/l10n/da.js b/apps/encryption/l10n/da.js
index b5ca0a29e0c..feb14d80d22 100644
--- a/apps/encryption/l10n/da.js
+++ b/apps/encryption/l10n/da.js
@@ -25,6 +25,8 @@ OC.L10N.register(
"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ugyldig privat nøgle for krypteringsprogrammet. Opdater venligst dit kodeord for den private nøgle i dine personlige indstillinger. Det kræves for at få adgang til dine krypterede filer.",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet er aktiveret, men din nøgler er ikke igangsat. Log venligst ud og ind igen.",
"Encryption App is enabled and ready" : "App til kryptering er slået til og er klar",
+ "Bad Signature" : "Ugyldig signatur",
+ "Missing Signature" : "Signatur mangler",
"one-time password for server-side-encryption" : "Engangs password for kryptering på serverdelen",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke kryptere denne fil, sandsynligvis fordi filen er delt. Bed venligst filens ejer om at dele den med dig på ny.",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke læse denne fil, sandsynligvis fordi det er en delt fil. Bed venligst ejeren af filen om at dele filen med dig på ny.",
@@ -32,6 +34,8 @@ OC.L10N.register(
"The share will expire on %s." : "Delingen vil udløbe om %s.",
"Cheers!" : "Hej!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hejsa,<br><br>administrator aktiveret kryptering på serverdelen. Dine file er blevet krypteret med kodeordet <strong>%s</strong>.<br><br>Venligst log på web brugerfladen, gå til sektionen \"ownCloud grundlæggende krypterings modul\" for din personlige opsætninger og opdater dine krypterings kodeord ved at indtaste dette kodeord i \"gamle kodeord log\" feltet samt dit nuværende kodeord.<br><br>",
+ "Encrypt the home storage" : "Krypter hjemmelageret",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ved at slå denne valgmulighed til krypteres alle filer i hovedlageret, ellers vil kun filer på eksternt lager blive krypteret",
"Enable recovery key" : "Aktivér gendannelsesnøgle",
"Disable recovery key" : "Deaktivér gendannelsesnøgle",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Gendannelsesnøglen er en ekstra krypteringsnøgle, der bruges til at kryptere filer. Den tillader gendannelse af en brugers filer, hvis brugeren glemmer sin adgangskode.",
diff --git a/apps/encryption/l10n/da.json b/apps/encryption/l10n/da.json
index 1ead926ca7c..ea9630eadeb 100644
--- a/apps/encryption/l10n/da.json
+++ b/apps/encryption/l10n/da.json
@@ -23,6 +23,8 @@
"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ugyldig privat nøgle for krypteringsprogrammet. Opdater venligst dit kodeord for den private nøgle i dine personlige indstillinger. Det kræves for at få adgang til dine krypterede filer.",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet er aktiveret, men din nøgler er ikke igangsat. Log venligst ud og ind igen.",
"Encryption App is enabled and ready" : "App til kryptering er slået til og er klar",
+ "Bad Signature" : "Ugyldig signatur",
+ "Missing Signature" : "Signatur mangler",
"one-time password for server-side-encryption" : "Engangs password for kryptering på serverdelen",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke kryptere denne fil, sandsynligvis fordi filen er delt. Bed venligst filens ejer om at dele den med dig på ny.",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke læse denne fil, sandsynligvis fordi det er en delt fil. Bed venligst ejeren af filen om at dele filen med dig på ny.",
@@ -30,6 +32,8 @@
"The share will expire on %s." : "Delingen vil udløbe om %s.",
"Cheers!" : "Hej!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hejsa,<br><br>administrator aktiveret kryptering på serverdelen. Dine file er blevet krypteret med kodeordet <strong>%s</strong>.<br><br>Venligst log på web brugerfladen, gå til sektionen \"ownCloud grundlæggende krypterings modul\" for din personlige opsætninger og opdater dine krypterings kodeord ved at indtaste dette kodeord i \"gamle kodeord log\" feltet samt dit nuværende kodeord.<br><br>",
+ "Encrypt the home storage" : "Krypter hjemmelageret",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ved at slå denne valgmulighed til krypteres alle filer i hovedlageret, ellers vil kun filer på eksternt lager blive krypteret",
"Enable recovery key" : "Aktivér gendannelsesnøgle",
"Disable recovery key" : "Deaktivér gendannelsesnøgle",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Gendannelsesnøglen er en ekstra krypteringsnøgle, der bruges til at kryptere filer. Den tillader gendannelse af en brugers filer, hvis brugeren glemmer sin adgangskode.",
diff --git a/apps/encryption/l10n/de_DE.js b/apps/encryption/l10n/de_DE.js
index 9b017eee43f..7de37a22979 100644
--- a/apps/encryption/l10n/de_DE.js
+++ b/apps/encryption/l10n/de_DE.js
@@ -30,8 +30,12 @@ OC.L10N.register(
"one-time password for server-side-encryption" : "Einmalpasswort für Serverseitige Verschlüsselung",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Diese Datei kann nicht entschlüsselt werden, es handelt sich wahrscheinlich um eine geteilte Datei. Bitte kontaktieren Sie den Eigentümer der Datei und bitten Sie darum, die Datei noch einmal mit Ihnen zu teilen.",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Diese Datei kann nicht gelesen werden, es handelt sich wahrscheinlich um eine geteilte Datei. Bitte kontaktieren Sie den Eigentümer der Datei und bitten Sie darum, die Datei noch einmal mit Ihnen zu teilen.",
+ "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Hey,\n\nder Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Kennwort '%s' verschlüsselt.\n\nBitte melden Sie sich im Web-Interface an, gehen Sie in ihre persönlichen Einstellungen. Dort finden Sie die Option 'ownCloud-Basisverschlüsselungsmodul' und aktualisieren Sie dort ihr Verschlüsselungspasswort indem Sie das Passwort in das 'alte Log - in Passwort' und in das 'aktuellen Login - Passwort' Feld eingeben.\n\n",
"The share will expire on %s." : "Die Freigabe wird am %s ablaufen.",
"Cheers!" : "Noch einen schönen Tag!",
+ "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hey,<br><br>der Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Kennwort <strong>%s</strong> verschlüsselt.<br><br>Bitte melden Sie sich im Web-Interface an, gehe Sie in ihre persönlichen Einstellungen. Dort finden Sie die Option 'ownCloud-Basisverschlüsselungsmodul' und aktualisieren Sie dort Ihr Verschlüsselungspasswort indem Sie das Passwort in das 'alte Log - in Passwort' und in das 'aktuellen Login - Passwort' Feld eingeben.<br><br>",
+ "Encrypt the home storage" : "Benutzerverzeichnis verschlüsslen",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Die Aktivierung dieser Option verschlüsselt alle Dateien die auf dem Hauptspeicher gespeichert sind, ansonsten werden nur Dateien auf dem externen Speicher verschlüsselt",
"Enable recovery key" : "Wiederherstellungsschlüssel aktivieren",
"Disable recovery key" : "Wiederherstellungsschlüssel deaktivieren",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Der Wiederherstellungsschlüssel ist ein zusätzlicher Verschlüsselungsschlüssel, der zum Verschlüsseln von Dateien benutzt wird. Er erlaubt die Wiederherstellung von Benutzerdateien auch dann, wenn der Benutzer sein Passwort vergessen hat.",
diff --git a/apps/encryption/l10n/de_DE.json b/apps/encryption/l10n/de_DE.json
index a3754c75846..b0e10256362 100644
--- a/apps/encryption/l10n/de_DE.json
+++ b/apps/encryption/l10n/de_DE.json
@@ -28,8 +28,12 @@
"one-time password for server-side-encryption" : "Einmalpasswort für Serverseitige Verschlüsselung",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Diese Datei kann nicht entschlüsselt werden, es handelt sich wahrscheinlich um eine geteilte Datei. Bitte kontaktieren Sie den Eigentümer der Datei und bitten Sie darum, die Datei noch einmal mit Ihnen zu teilen.",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Diese Datei kann nicht gelesen werden, es handelt sich wahrscheinlich um eine geteilte Datei. Bitte kontaktieren Sie den Eigentümer der Datei und bitten Sie darum, die Datei noch einmal mit Ihnen zu teilen.",
+ "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Hey,\n\nder Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Kennwort '%s' verschlüsselt.\n\nBitte melden Sie sich im Web-Interface an, gehen Sie in ihre persönlichen Einstellungen. Dort finden Sie die Option 'ownCloud-Basisverschlüsselungsmodul' und aktualisieren Sie dort ihr Verschlüsselungspasswort indem Sie das Passwort in das 'alte Log - in Passwort' und in das 'aktuellen Login - Passwort' Feld eingeben.\n\n",
"The share will expire on %s." : "Die Freigabe wird am %s ablaufen.",
"Cheers!" : "Noch einen schönen Tag!",
+ "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hey,<br><br>der Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Kennwort <strong>%s</strong> verschlüsselt.<br><br>Bitte melden Sie sich im Web-Interface an, gehe Sie in ihre persönlichen Einstellungen. Dort finden Sie die Option 'ownCloud-Basisverschlüsselungsmodul' und aktualisieren Sie dort Ihr Verschlüsselungspasswort indem Sie das Passwort in das 'alte Log - in Passwort' und in das 'aktuellen Login - Passwort' Feld eingeben.<br><br>",
+ "Encrypt the home storage" : "Benutzerverzeichnis verschlüsslen",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Die Aktivierung dieser Option verschlüsselt alle Dateien die auf dem Hauptspeicher gespeichert sind, ansonsten werden nur Dateien auf dem externen Speicher verschlüsselt",
"Enable recovery key" : "Wiederherstellungsschlüssel aktivieren",
"Disable recovery key" : "Wiederherstellungsschlüssel deaktivieren",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Der Wiederherstellungsschlüssel ist ein zusätzlicher Verschlüsselungsschlüssel, der zum Verschlüsseln von Dateien benutzt wird. Er erlaubt die Wiederherstellung von Benutzerdateien auch dann, wenn der Benutzer sein Passwort vergessen hat.",
diff --git a/apps/encryption/l10n/zh_TW.js b/apps/encryption/l10n/zh_TW.js
index d0c1e3dfee8..ae05a303d21 100644
--- a/apps/encryption/l10n/zh_TW.js
+++ b/apps/encryption/l10n/zh_TW.js
@@ -25,6 +25,8 @@ OC.L10N.register(
"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "無效的檔案加密私鑰,請在個人設定中更新您的私鑰密語以存取加密的檔案。",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "檔案加密已啓用,但是您的金鑰尚未初始化,請重新登入一次",
"Encryption App is enabled and ready" : "加密應用程式已經被啟用",
+ "Bad Signature" : "壞的簽章",
+ "Missing Signature" : "遺失簽章",
"one-time password for server-side-encryption" : "一次性密碼用於伺服器端的加密",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法解密這個檔案,也許這是分享的檔案。請詢問檔案所有人重新分享檔案給您。",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法檢視這個檔案,或許這是分享的檔案,請詢問這個檔案的擁有者並請他重新分享給您。",
diff --git a/apps/encryption/l10n/zh_TW.json b/apps/encryption/l10n/zh_TW.json
index feee736980f..4be9390da0e 100644
--- a/apps/encryption/l10n/zh_TW.json
+++ b/apps/encryption/l10n/zh_TW.json
@@ -23,6 +23,8 @@
"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "無效的檔案加密私鑰,請在個人設定中更新您的私鑰密語以存取加密的檔案。",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "檔案加密已啓用,但是您的金鑰尚未初始化,請重新登入一次",
"Encryption App is enabled and ready" : "加密應用程式已經被啟用",
+ "Bad Signature" : "壞的簽章",
+ "Missing Signature" : "遺失簽章",
"one-time password for server-side-encryption" : "一次性密碼用於伺服器端的加密",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法解密這個檔案,也許這是分享的檔案。請詢問檔案所有人重新分享檔案給您。",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法檢視這個檔案,或許這是分享的檔案,請詢問這個檔案的擁有者並請他重新分享給您。",
diff --git a/apps/federatedfilesharing/l10n/da.js b/apps/federatedfilesharing/l10n/da.js
index 2490457841a..0b113d6ae4f 100644
--- a/apps/federatedfilesharing/l10n/da.js
+++ b/apps/federatedfilesharing/l10n/da.js
@@ -3,6 +3,7 @@ OC.L10N.register(
{
"Invalid Federated Cloud ID" : "Ugyldigt Federated Cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Der skete en fejl ved deling af %s, objektet er allerede delt med %s",
+ "Not allowed to create a federated share with the same user" : "Det er ikke tilladt at danne et datafællesskab med samme bruger",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deling af %s mislykkedes - kunne ikke finde %s. Måske er serveren ikke tilgængelig i øjeblikket."
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/da.json b/apps/federatedfilesharing/l10n/da.json
index 6f05283a1a0..3f4e82b0528 100644
--- a/apps/federatedfilesharing/l10n/da.json
+++ b/apps/federatedfilesharing/l10n/da.json
@@ -1,6 +1,7 @@
{ "translations": {
"Invalid Federated Cloud ID" : "Ugyldigt Federated Cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Der skete en fejl ved deling af %s, objektet er allerede delt med %s",
+ "Not allowed to create a federated share with the same user" : "Det er ikke tilladt at danne et datafællesskab med samme bruger",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deling af %s mislykkedes - kunne ikke finde %s. Måske er serveren ikke tilgængelig i øjeblikket."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/tr.js b/apps/federatedfilesharing/l10n/tr.js
index 123271c5e6b..c0e9f843271 100644
--- a/apps/federatedfilesharing/l10n/tr.js
+++ b/apps/federatedfilesharing/l10n/tr.js
@@ -3,6 +3,7 @@ OC.L10N.register(
{
"Invalid Federated Cloud ID" : "Geçersiz Birleşmiş Bulut Kimliği",
"Sharing %s failed, because this item is already shared with %s" : "%s paylaşımı, %s ile zaten paylaşıldığından dolayı başarısız oldu",
+ "Not allowed to create a federated share with the same user" : "Aynı kullanıcı ile bir birleşmiş paylaşım oluşturulamaz",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s paylaşımı başarısız. %s bulunamadı veya sunucu şu anda ulaşılamıyor olabilir."
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/federatedfilesharing/l10n/tr.json b/apps/federatedfilesharing/l10n/tr.json
index c81393bc30d..dc9bd7a8f46 100644
--- a/apps/federatedfilesharing/l10n/tr.json
+++ b/apps/federatedfilesharing/l10n/tr.json
@@ -1,6 +1,7 @@
{ "translations": {
"Invalid Federated Cloud ID" : "Geçersiz Birleşmiş Bulut Kimliği",
"Sharing %s failed, because this item is already shared with %s" : "%s paylaşımı, %s ile zaten paylaşıldığından dolayı başarısız oldu",
+ "Not allowed to create a federated share with the same user" : "Aynı kullanıcı ile bir birleşmiş paylaşım oluşturulamaz",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s paylaşımı başarısız. %s bulunamadı veya sunucu şu anda ulaşılamıyor olabilir."
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/federation/backgroundjob/getsharedsecret.php b/apps/federation/backgroundjob/getsharedsecret.php
index d3dd00c74a2..66ab082c1a2 100644
--- a/apps/federation/backgroundjob/getsharedsecret.php
+++ b/apps/federation/backgroundjob/getsharedsecret.php
@@ -25,12 +25,13 @@ namespace OCA\Federation\BackgroundJob;
use GuzzleHttp\Exception\ClientException;
use OC\BackgroundJob\JobList;
-use OC\BackgroundJob\QueuedJob;
+use OC\BackgroundJob\Job;
use OCA\Federation\DbHandler;
use OCA\Federation\TrustedServers;
use OCP\AppFramework\Http;
use OCP\BackgroundJob\IJobList;
use OCP\Http\Client\IClient;
+use OCP\Http\Client\IResponse;
use OCP\ILogger;
use OCP\IURLGenerator;
@@ -41,7 +42,7 @@ use OCP\IURLGenerator;
*
* @package OCA\Federation\Backgroundjob
*/
-class GetSharedSecret extends QueuedJob{
+class GetSharedSecret extends Job{
/** @var IClient */
private $httpClient;
@@ -61,6 +62,9 @@ class GetSharedSecret extends QueuedJob{
/** @var ILogger */
private $logger;
+ /** @var bool */
+ protected $retainJob = false;
+
private $endPoint = '/ocs/v2.php/apps/federation/api/v1/shared-secret?format=json';
/**
@@ -79,7 +83,7 @@ class GetSharedSecret extends QueuedJob{
IJobList $jobList = null,
TrustedServers $trustedServers = null,
ILogger $logger = null,
- dbHandler $dbHandler = null
+ DbHandler $dbHandler = null
) {
$this->logger = $logger ? $logger : \OC::$server->getLogger();
$this->httpClient = $httpClient ? $httpClient : \OC::$server->getHTTPClientService()->newClient();
@@ -108,12 +112,15 @@ class GetSharedSecret extends QueuedJob{
* @param ILogger $logger
*/
public function execute($jobList, ILogger $logger = null) {
- $jobList->remove($this, $this->argument);
$target = $this->argument['url'];
// only execute if target is still in the list of trusted domains
if ($this->trustedServers->isTrustedServer($target)) {
$this->parentExecute($jobList, $logger);
}
+
+ if (!$this->retainJob) {
+ $jobList->remove($this, $this->argument);
+ }
}
/**
@@ -132,6 +139,7 @@ class GetSharedSecret extends QueuedJob{
$source = rtrim($source, '/');
$token = $argument['token'];
+ $result = null;
try {
$result = $this->httpClient->get(
$target . $this->endPoint,
@@ -156,7 +164,7 @@ class GetSharedSecret extends QueuedJob{
$this->logger->logException($e, ['app' => 'federation']);
}
} catch (\Exception $e) {
- $status = HTTP::STATUS_INTERNAL_SERVER_ERROR;
+ $status = Http::STATUS_INTERNAL_SERVER_ERROR;
$this->logger->logException($e, ['app' => 'federation']);
}
@@ -165,16 +173,13 @@ class GetSharedSecret extends QueuedJob{
$status !== Http::STATUS_OK
&& $status !== Http::STATUS_FORBIDDEN
) {
- $this->jobList->add(
- 'OCA\Federation\BackgroundJob\GetSharedSecret',
- $argument
- );
+ $this->retainJob = true;
} else {
// reset token if we received a valid response
$this->dbHandler->addToken($target, '');
}
- if ($status === Http::STATUS_OK) {
+ if ($status === Http::STATUS_OK && $result instanceof IResponse) {
$body = $result->getBody();
$result = json_decode($body, true);
if (isset($result['ocs']['data']['sharedSecret'])) {
diff --git a/apps/federation/backgroundjob/requestsharedsecret.php b/apps/federation/backgroundjob/requestsharedsecret.php
index 79b55fe4ee4..040e8e1d8e2 100644
--- a/apps/federation/backgroundjob/requestsharedsecret.php
+++ b/apps/federation/backgroundjob/requestsharedsecret.php
@@ -27,7 +27,7 @@ namespace OCA\Federation\BackgroundJob;
use GuzzleHttp\Exception\ClientException;
use OC\BackgroundJob\JobList;
-use OC\BackgroundJob\QueuedJob;
+use OC\BackgroundJob\Job;
use OCA\Federation\DbHandler;
use OCA\Federation\TrustedServers;
use OCP\AppFramework\Http;
@@ -43,7 +43,7 @@ use OCP\IURLGenerator;
*
* @package OCA\Federation\Backgroundjob
*/
-class RequestSharedSecret extends QueuedJob {
+class RequestSharedSecret extends Job {
/** @var IClient */
private $httpClient;
@@ -65,6 +65,9 @@ class RequestSharedSecret extends QueuedJob {
/** @var ILogger */
private $logger;
+ /** @var bool */
+ protected $retainJob = false;
+
/**
* RequestSharedSecret constructor.
*
@@ -79,7 +82,7 @@ class RequestSharedSecret extends QueuedJob {
IURLGenerator $urlGenerator = null,
IJobList $jobList = null,
TrustedServers $trustedServers = null,
- dbHandler $dbHandler = null
+ DbHandler $dbHandler = null
) {
$this->httpClient = $httpClient ? $httpClient : \OC::$server->getHTTPClientService()->newClient();
$this->jobList = $jobList ? $jobList : \OC::$server->getJobList();
@@ -109,15 +112,20 @@ class RequestSharedSecret extends QueuedJob {
* @param ILogger $logger
*/
public function execute($jobList, ILogger $logger = null) {
- $jobList->remove($this, $this->argument);
$target = $this->argument['url'];
// only execute if target is still in the list of trusted domains
if ($this->trustedServers->isTrustedServer($target)) {
$this->parentExecute($jobList, $logger);
}
+
+ if (!$this->retainJob) {
+ $jobList->remove($this, $this->argument);
+ }
}
/**
+ * call execute() method of parent
+ *
* @param JobList $jobList
* @param ILogger $logger
*/
@@ -155,7 +163,7 @@ class RequestSharedSecret extends QueuedJob {
$this->logger->logException($e, ['app' => 'federation']);
}
} catch (\Exception $e) {
- $status = HTTP::STATUS_INTERNAL_SERVER_ERROR;
+ $status = Http::STATUS_INTERNAL_SERVER_ERROR;
$this->logger->logException($e, ['app' => 'federation']);
}
@@ -164,10 +172,7 @@ class RequestSharedSecret extends QueuedJob {
$status !== Http::STATUS_OK
&& $status !== Http::STATUS_FORBIDDEN
) {
- $this->jobList->add(
- 'OCA\Federation\BackgroundJob\RequestSharedSecret',
- $argument
- );
+ $this->retainJob = true;
}
if ($status === Http::STATUS_FORBIDDEN) {
diff --git a/apps/federation/l10n/ca.js b/apps/federation/l10n/ca.js
new file mode 100644
index 00000000000..1d21cd14db2
--- /dev/null
+++ b/apps/federation/l10n/ca.js
@@ -0,0 +1,15 @@
+OC.L10N.register(
+ "federation",
+ {
+ "Server added to the list of trusted ownClouds" : "Servidor afegit a la llista de confiança ownCloud",
+ "Server is already in the list of trusted servers." : "El servidor ja està a la llista de servidors de confiança",
+ "No ownCloud server found" : "No s'ha trobat cap servidor ownCloud",
+ "Could not add server" : "No s'ha pogut afegir el servidor",
+ "Federation" : "Federació",
+ "ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "La federació ownCloud et permet connectar amb altes servidors ownCloud de confiança per a intercanviar el directori d'usuari. Per exemple, això serà utilitzat per auto-completar usuaris externs de la compartició federada",
+ "Add server automatically once a federated share was created successfully" : "Afegir servidor automàticament quan s'hagi creat una federació correctament",
+ "Trusted ownCloud Servers" : "Servidors ownCloud de confiança",
+ "+ Add ownCloud server" : "+ Afegir servidor ownCloud",
+ "ownCloud Server" : "Servidor ownCloud"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/federation/l10n/ca.json b/apps/federation/l10n/ca.json
new file mode 100644
index 00000000000..3d5dc995c04
--- /dev/null
+++ b/apps/federation/l10n/ca.json
@@ -0,0 +1,13 @@
+{ "translations": {
+ "Server added to the list of trusted ownClouds" : "Servidor afegit a la llista de confiança ownCloud",
+ "Server is already in the list of trusted servers." : "El servidor ja està a la llista de servidors de confiança",
+ "No ownCloud server found" : "No s'ha trobat cap servidor ownCloud",
+ "Could not add server" : "No s'ha pogut afegir el servidor",
+ "Federation" : "Federació",
+ "ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "La federació ownCloud et permet connectar amb altes servidors ownCloud de confiança per a intercanviar el directori d'usuari. Per exemple, això serà utilitzat per auto-completar usuaris externs de la compartició federada",
+ "Add server automatically once a federated share was created successfully" : "Afegir servidor automàticament quan s'hagi creat una federació correctament",
+ "Trusted ownCloud Servers" : "Servidors ownCloud de confiança",
+ "+ Add ownCloud server" : "+ Afegir servidor ownCloud",
+ "ownCloud Server" : "Servidor ownCloud"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/federation/l10n/da.js b/apps/federation/l10n/da.js
new file mode 100644
index 00000000000..fec000d8c0f
--- /dev/null
+++ b/apps/federation/l10n/da.js
@@ -0,0 +1,15 @@
+OC.L10N.register(
+ "federation",
+ {
+ "Server added to the list of trusted ownClouds" : "Serveren er føjet til listen over sikre ownCloud servere",
+ "Server is already in the list of trusted servers." : "Serveren står allerede på listen over sikre servere",
+ "No ownCloud server found" : "Fandt ikke nogen ownCloud server",
+ "Could not add server" : "Kunne ikke tilføje server",
+ "Federation" : "Datafællesskab",
+ "ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "ownCloud datafællesskab giver dig mulighed for at forbinde til andre ownCloud-installationer, som du har tillid til, for at udveksle brugerkataloger. Dette vil f.eks. blive anvendt til at udfylde eksterne brugernavne automatisk ved deling af data",
+ "Add server automatically once a federated share was created successfully" : "Tilføj serveren automatisk, når et datafællesskab er oprettet ",
+ "Trusted ownCloud Servers" : "ownCloud servere der er tillid til",
+ "+ Add ownCloud server" : "+ Tilføj ownCloud server",
+ "ownCloud Server" : "ownCloud server"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/federation/l10n/da.json b/apps/federation/l10n/da.json
new file mode 100644
index 00000000000..3532e6acc26
--- /dev/null
+++ b/apps/federation/l10n/da.json
@@ -0,0 +1,13 @@
+{ "translations": {
+ "Server added to the list of trusted ownClouds" : "Serveren er føjet til listen over sikre ownCloud servere",
+ "Server is already in the list of trusted servers." : "Serveren står allerede på listen over sikre servere",
+ "No ownCloud server found" : "Fandt ikke nogen ownCloud server",
+ "Could not add server" : "Kunne ikke tilføje server",
+ "Federation" : "Datafællesskab",
+ "ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "ownCloud datafællesskab giver dig mulighed for at forbinde til andre ownCloud-installationer, som du har tillid til, for at udveksle brugerkataloger. Dette vil f.eks. blive anvendt til at udfylde eksterne brugernavne automatisk ved deling af data",
+ "Add server automatically once a federated share was created successfully" : "Tilføj serveren automatisk, når et datafællesskab er oprettet ",
+ "Trusted ownCloud Servers" : "ownCloud servere der er tillid til",
+ "+ Add ownCloud server" : "+ Tilføj ownCloud server",
+ "ownCloud Server" : "ownCloud server"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/federation/l10n/el.js b/apps/federation/l10n/el.js
index e67a9242b0d..b4404d94043 100644
--- a/apps/federation/l10n/el.js
+++ b/apps/federation/l10n/el.js
@@ -1,6 +1,10 @@
OC.L10N.register(
"federation",
{
- "Could not add server" : "Αδυναμία προσθήκης διακομιστή"
+ "Server added to the list of trusted ownClouds" : "Ο διακομιστής προστέθηκε στην λίστα των έμπιστων ownCloud",
+ "Server is already in the list of trusted servers." : "Ο διακομιστής περιλαμβάνεται ήδη στην λίστα των έμπιστων ownCloud",
+ "No ownCloud server found" : "Δεν βρέθηκε διακομιστής ownCloud",
+ "Could not add server" : "Αδυναμία προσθήκης διακομιστή",
+ "ownCloud Server" : "Διακομιστής ownCloud"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federation/l10n/el.json b/apps/federation/l10n/el.json
index 45d91aae735..887b731cad0 100644
--- a/apps/federation/l10n/el.json
+++ b/apps/federation/l10n/el.json
@@ -1,4 +1,8 @@
{ "translations": {
- "Could not add server" : "Αδυναμία προσθήκης διακομιστή"
+ "Server added to the list of trusted ownClouds" : "Ο διακομιστής προστέθηκε στην λίστα των έμπιστων ownCloud",
+ "Server is already in the list of trusted servers." : "Ο διακομιστής περιλαμβάνεται ήδη στην λίστα των έμπιστων ownCloud",
+ "No ownCloud server found" : "Δεν βρέθηκε διακομιστής ownCloud",
+ "Could not add server" : "Αδυναμία προσθήκης διακομιστή",
+ "ownCloud Server" : "Διακομιστής ownCloud"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federation/l10n/is.js b/apps/federation/l10n/is.js
index 6c5c4444f5d..970656835fd 100644
--- a/apps/federation/l10n/is.js
+++ b/apps/federation/l10n/is.js
@@ -1,8 +1,13 @@
OC.L10N.register(
"federation",
{
+ "Server added to the list of trusted ownClouds" : "Þjóninum bætt við listann yfir treyst ownCloud-ský",
+ "Server is already in the list of trusted servers." : "Þjónninn er nú þegar á listanum yfir treysta þjóna.",
"No ownCloud server found" : "Enginn ownCloud-þjónn fannst",
"Could not add server" : "Gat ekki bætt við þjóni",
+ "Federation" : "Samband",
+ "ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "ownCloud-samband (federation) gerir þér kleift að tengjast öðrumtreystum ownCloud-skýjum til að skiptast á notendaskrám. Þetta er til dæmis notað til að sjálfklára nöfn ytri notenda við deilingu sambandssameigna.",
+ "Add server automatically once a federated share was created successfully" : "Bæta þjóni við sjálfkrafa, hafi tekist að búa til sambandssameign",
"Trusted ownCloud Servers" : "Treystir ownCloud-þjónar",
"+ Add ownCloud server" : "+ Bæta við ownCloud-þjóni",
"ownCloud Server" : "ownCloud-þjónn"
diff --git a/apps/federation/l10n/is.json b/apps/federation/l10n/is.json
index 7b54843d64b..3754dc12ed7 100644
--- a/apps/federation/l10n/is.json
+++ b/apps/federation/l10n/is.json
@@ -1,6 +1,11 @@
{ "translations": {
+ "Server added to the list of trusted ownClouds" : "Þjóninum bætt við listann yfir treyst ownCloud-ský",
+ "Server is already in the list of trusted servers." : "Þjónninn er nú þegar á listanum yfir treysta þjóna.",
"No ownCloud server found" : "Enginn ownCloud-þjónn fannst",
"Could not add server" : "Gat ekki bætt við þjóni",
+ "Federation" : "Samband",
+ "ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "ownCloud-samband (federation) gerir þér kleift að tengjast öðrumtreystum ownCloud-skýjum til að skiptast á notendaskrám. Þetta er til dæmis notað til að sjálfklára nöfn ytri notenda við deilingu sambandssameigna.",
+ "Add server automatically once a federated share was created successfully" : "Bæta þjóni við sjálfkrafa, hafi tekist að búa til sambandssameign",
"Trusted ownCloud Servers" : "Treystir ownCloud-þjónar",
"+ Add ownCloud server" : "+ Bæta við ownCloud-þjóni",
"ownCloud Server" : "ownCloud-þjónn"
diff --git a/apps/federation/l10n/tr.js b/apps/federation/l10n/tr.js
index af299744a92..71e76bdec98 100644
--- a/apps/federation/l10n/tr.js
+++ b/apps/federation/l10n/tr.js
@@ -5,8 +5,11 @@ OC.L10N.register(
"Server is already in the list of trusted servers." : "Sunucu zaten güvenilen sunucu listesine eklenmiş.",
"No ownCloud server found" : "Hiçbir ownCloud sunucusu bulunamadı",
"Could not add server" : "Sunucu eklenemedi",
+ "Federation" : "Birleşim",
+ "ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "ownCloud Birleşimi, kullanıcı dizin değişimi yapmak için diğer güvenilir ownCloud'larla bağlanmanızı sağlar. Örneğin, birleşmiş paylaşım için hatici kullanıcıları otomatik doldurmak için kullanılacaktır.",
+ "Add server automatically once a federated share was created successfully" : "Birleşmiş bir paylaşım başarıyla eklenildiğinde sunucuyu otomatik olarak ekle",
"Trusted ownCloud Servers" : "Güvenilen ownCloud Sunucuları",
- "+ Add ownCloud server" : "ownCloud sunucusu ekle",
+ "+ Add ownCloud server" : "+ ownCloud sunucusu ekle",
"ownCloud Server" : "ownCloud Sunucusu"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/federation/l10n/tr.json b/apps/federation/l10n/tr.json
index 2ed13eca58e..68f7b38218b 100644
--- a/apps/federation/l10n/tr.json
+++ b/apps/federation/l10n/tr.json
@@ -3,8 +3,11 @@
"Server is already in the list of trusted servers." : "Sunucu zaten güvenilen sunucu listesine eklenmiş.",
"No ownCloud server found" : "Hiçbir ownCloud sunucusu bulunamadı",
"Could not add server" : "Sunucu eklenemedi",
+ "Federation" : "Birleşim",
+ "ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "ownCloud Birleşimi, kullanıcı dizin değişimi yapmak için diğer güvenilir ownCloud'larla bağlanmanızı sağlar. Örneğin, birleşmiş paylaşım için hatici kullanıcıları otomatik doldurmak için kullanılacaktır.",
+ "Add server automatically once a federated share was created successfully" : "Birleşmiş bir paylaşım başarıyla eklenildiğinde sunucuyu otomatik olarak ekle",
"Trusted ownCloud Servers" : "Güvenilen ownCloud Sunucuları",
- "+ Add ownCloud server" : "ownCloud sunucusu ekle",
+ "+ Add ownCloud server" : "+ ownCloud sunucusu ekle",
"ownCloud Server" : "ownCloud Sunucusu"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/federation/tests/backgroundjob/getsharedsecrettest.php b/apps/federation/tests/backgroundjob/getsharedsecrettest.php
index 08c8677415c..25f7502741d 100644
--- a/apps/federation/tests/backgroundjob/getsharedsecrettest.php
+++ b/apps/federation/tests/backgroundjob/getsharedsecrettest.php
@@ -95,8 +95,9 @@ class GetSharedSecretTest extends TestCase {
* @dataProvider dataTestExecute
*
* @param bool $isTrustedServer
+ * @param bool $retainBackgroundJob
*/
- public function testExecute($isTrustedServer) {
+ public function testExecute($isTrustedServer, $retainBackgroundJob) {
/** @var GetSharedSecret |\PHPUnit_Framework_MockObject_MockObject $getSharedSecret */
$getSharedSecret = $this->getMockBuilder('OCA\Federation\BackgroundJob\GetSharedSecret')
->setConstructorArgs(
@@ -111,7 +112,6 @@ class GetSharedSecretTest extends TestCase {
)->setMethods(['parentExecute'])->getMock();
$this->invokePrivate($getSharedSecret, 'argument', [['url' => 'url']]);
- $this->jobList->expects($this->once())->method('remove');
$this->trustedServers->expects($this->once())->method('isTrustedServer')
->with('url')->willReturn($isTrustedServer);
if ($isTrustedServer) {
@@ -119,6 +119,12 @@ class GetSharedSecretTest extends TestCase {
} else {
$getSharedSecret->expects($this->never())->method('parentExecute');
}
+ $this->invokePrivate($getSharedSecret, 'retainJob', [$retainBackgroundJob]);
+ if ($retainBackgroundJob) {
+ $this->jobList->expects($this->never())->method('remove');
+ } else {
+ $this->jobList->expects($this->once())->method('remove');
+ }
$getSharedSecret->execute($this->jobList);
@@ -126,8 +132,9 @@ class GetSharedSecretTest extends TestCase {
public function dataTestExecute() {
return [
- [true],
- [false]
+ [true, true],
+ [true, false],
+ [false, false],
];
}
@@ -167,12 +174,9 @@ class GetSharedSecretTest extends TestCase {
$statusCode !== Http::STATUS_OK
&& $statusCode !== Http::STATUS_FORBIDDEN
) {
- $this->jobList->expects($this->once())->method('add')
- ->with('OCA\Federation\BackgroundJob\GetSharedSecret', $argument);
$this->dbHandler->expects($this->never())->method('addToken');
} else {
$this->dbHandler->expects($this->once())->method('addToken')->with($target, '');
- $this->jobList->expects($this->never())->method('add');
}
if ($statusCode === Http::STATUS_OK) {
@@ -185,6 +189,15 @@ class GetSharedSecretTest extends TestCase {
}
$this->invokePrivate($this->getSharedSecret, 'run', [$argument]);
+ if (
+ $statusCode !== Http::STATUS_OK
+ && $statusCode !== Http::STATUS_FORBIDDEN
+ ) {
+ $this->assertTrue($this->invokePrivate($this->getSharedSecret, 'retainJob'));
+ } else {
+ $this->assertFalse($this->invokePrivate($this->getSharedSecret, 'retainJob'));
+ }
+
}
public function dataTestRun() {
diff --git a/apps/federation/tests/backgroundjob/requestsharedsecrettest.php b/apps/federation/tests/backgroundjob/requestsharedsecrettest.php
index 45f79e05249..5b4a1f87a5f 100644
--- a/apps/federation/tests/backgroundjob/requestsharedsecrettest.php
+++ b/apps/federation/tests/backgroundjob/requestsharedsecrettest.php
@@ -75,8 +75,9 @@ class RequestSharedSecretTest extends TestCase {
* @dataProvider dataTestExecute
*
* @param bool $isTrustedServer
+ * @param bool $retainBackgroundJob
*/
- public function testExecute($isTrustedServer) {
+ public function testExecute($isTrustedServer, $retainBackgroundJob) {
/** @var RequestSharedSecret |\PHPUnit_Framework_MockObject_MockObject $requestSharedSecret */
$requestSharedSecret = $this->getMockBuilder('OCA\Federation\BackgroundJob\RequestSharedSecret')
->setConstructorArgs(
@@ -90,7 +91,6 @@ class RequestSharedSecretTest extends TestCase {
)->setMethods(['parentExecute'])->getMock();
$this->invokePrivate($requestSharedSecret, 'argument', [['url' => 'url']]);
- $this->jobList->expects($this->once())->method('remove');
$this->trustedServers->expects($this->once())->method('isTrustedServer')
->with('url')->willReturn($isTrustedServer);
if ($isTrustedServer) {
@@ -98,6 +98,12 @@ class RequestSharedSecretTest extends TestCase {
} else {
$requestSharedSecret->expects($this->never())->method('parentExecute');
}
+ $this->invokePrivate($requestSharedSecret, 'retainJob', [$retainBackgroundJob]);
+ if ($retainBackgroundJob) {
+ $this->jobList->expects($this->never())->method('remove');
+ } else {
+ $this->jobList->expects($this->once())->method('remove');
+ }
$requestSharedSecret->execute($this->jobList);
@@ -105,8 +111,9 @@ class RequestSharedSecretTest extends TestCase {
public function dataTestExecute() {
return [
- [true],
- [false]
+ [true, true],
+ [true, false],
+ [false, false],
];
}
@@ -146,17 +153,22 @@ class RequestSharedSecretTest extends TestCase {
$statusCode !== Http::STATUS_OK
&& $statusCode !== Http::STATUS_FORBIDDEN
) {
- $this->jobList->expects($this->once())->method('add')
- ->with('OCA\Federation\BackgroundJob\RequestSharedSecret', $argument);
$this->dbHandler->expects($this->never())->method('addToken');
}
if ($statusCode === Http::STATUS_FORBIDDEN) {
- $this->jobList->expects($this->never())->method('add');
$this->dbHandler->expects($this->once())->method('addToken')->with($target, '');
}
$this->invokePrivate($this->requestSharedSecret, 'run', [$argument]);
+ if (
+ $statusCode !== Http::STATUS_OK
+ && $statusCode !== Http::STATUS_FORBIDDEN
+ ) {
+ $this->assertTrue($this->invokePrivate($this->requestSharedSecret, 'retainJob'));
+ } else {
+ $this->assertFalse($this->invokePrivate($this->requestSharedSecret, 'retainJob'));
+ }
}
public function dataTestRun() {
diff --git a/apps/files/appinfo/application.php b/apps/files/appinfo/application.php
index bc6dc9fb9ed..593e0533c80 100644
--- a/apps/files/appinfo/application.php
+++ b/apps/files/appinfo/application.php
@@ -40,8 +40,10 @@ class Application extends App {
return new ApiController(
$c->query('AppName'),
$c->query('Request'),
+ $server->getUserSession(),
$c->query('TagService'),
- $server->getPreviewManager()
+ $server->getPreviewManager(),
+ $server->getShareManager()
);
});
diff --git a/apps/files/controller/apicontroller.php b/apps/files/controller/apicontroller.php
index c96d92a046b..ad286284386 100644
--- a/apps/files/controller/apicontroller.php
+++ b/apps/files/controller/apicontroller.php
@@ -34,6 +34,10 @@ use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\Http\DataDisplayResponse;
use OCA\Files\Service\TagService;
use OCP\IPreview;
+use OCP\Share\IManager;
+use OCP\Files\FileInfo;
+use OCP\Files\Node;
+use OCP\IUserSession;
/**
* Class ApiController
@@ -43,8 +47,12 @@ use OCP\IPreview;
class ApiController extends Controller {
/** @var TagService */
private $tagService;
+ /** @var IManager **/
+ private $shareManager;
/** @var IPreview */
private $previewManager;
+ /** IUserSession */
+ private $userSession;
/**
* @param string $appName
@@ -54,11 +62,15 @@ class ApiController extends Controller {
*/
public function __construct($appName,
IRequest $request,
+ IUserSession $userSession,
TagService $tagService,
- IPreview $previewManager){
+ IPreview $previewManager,
+ IManager $shareManager) {
parent::__construct($appName, $request);
+ $this->userSession = $userSession;
$this->tagService = $tagService;
$this->previewManager = $previewManager;
+ $this->shareManager = $shareManager;
}
/**
@@ -132,8 +144,10 @@ class ApiController extends Controller {
*/
public function getFilesByTag($tagName) {
$files = array();
- $fileInfos = $this->tagService->getFilesByTag($tagName);
- foreach ($fileInfos as &$fileInfo) {
+ $nodes = $this->tagService->getFilesByTag($tagName);
+ foreach ($nodes as &$node) {
+ $shareTypes = $this->getShareTypes($node);
+ $fileInfo = $node->getFileInfo();
$file = \OCA\Files\Helper::formatFileInfo($fileInfo);
$parts = explode('/', dirname($fileInfo->getPath()), 4);
if(isset($parts[3])) {
@@ -142,9 +156,44 @@ class ApiController extends Controller {
$file['path'] = '/';
}
$file['tags'] = [$tagName];
+ if (!empty($shareTypes)) {
+ $file['shareTypes'] = $shareTypes;
+ }
$files[] = $file;
}
return new DataResponse(['files' => $files]);
}
+ /**
+ * Return a list of share types for outgoing shares
+ *
+ * @param Node $node file node
+ *
+ * @return int[] array of share types
+ */
+ private function getShareTypes(Node $node) {
+ $userId = $this->userSession->getUser()->getUID();
+ $shareTypes = [];
+ $requestedShareTypes = [
+ \OCP\Share::SHARE_TYPE_USER,
+ \OCP\Share::SHARE_TYPE_GROUP,
+ \OCP\Share::SHARE_TYPE_LINK,
+ \OCP\Share::SHARE_TYPE_REMOTE
+ ];
+ foreach ($requestedShareTypes as $requestedShareType) {
+ // one of each type is enough to find out about the types
+ $shares = $this->shareManager->getSharesBy(
+ $userId,
+ $requestedShareType,
+ $node,
+ false,
+ 1
+ );
+ if (!empty($shares)) {
+ $shareTypes[] = $requestedShareType;
+ }
+ }
+ return $shareTypes;
+ }
+
}
diff --git a/apps/files/css/files.css b/apps/files/css/files.css
index bfa5340fe09..d20ab102ba5 100644
--- a/apps/files/css/files.css
+++ b/apps/files/css/files.css
@@ -468,6 +468,7 @@ html.ie8 #fileList tr.selected td.filename>.selectCheckBox {
position: relative;
width: 100%;
padding-left: 0;
+ padding-right:0;
-webkit-transition:background-image 500ms; -moz-transition:background-image 500ms; -o-transition:background-image 500ms; transition:background-image 500ms;
}
@@ -572,13 +573,26 @@ html.ie8 .column-mtime .selectedActions {
opacity: 0;
display:none;
}
-#fileList a.action.action-share,
-#fileList a.action.action-menu {
+#fileList a.action.action-share {
padding: 17px 14px;
}
+#fileList a.action.action-menu {
+ padding-top: 17px;
+ padding-bottom: 17px;
+ padding-left:14px;
+ padding-right:0px;
+}
+
+#fileList .filesize {
+ padding-top:0px;
+ padding-bottom:0px;
+ padding-left:60px;
+ padding-right:15px;
+}
+
#fileList .popovermenu {
- margin-right: 21px;
+ margin-right: -5px;
}
.ie8 #fileList .popovermenu {
margin-top: -10px;
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
index bd80afd072c..fca69064cde 100644
--- a/apps/files/js/file-upload.js
+++ b/apps/files/js/file-upload.js
@@ -274,6 +274,7 @@ OC.Upload = {
if ( $('#file_upload_start').exists() ) {
var file_upload_param = {
dropZone: $('#content'), // restrict dropZone to content div
+ pasteZone: null,
autoUpload: false,
sequentialUploads: true,
//singleFileUploads is on by default, so the data.files array will always have length 1
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index bfcc77d8999..0c4d41b65f9 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -271,7 +271,8 @@
this.updateSearch();
- this.$fileList.on('click','td.filename>a.name', _.bind(this._onClickFile, this));
+ this.$fileList.on('click','td.filename>a.name, td.filesize, td.date', _.bind(this._onClickFile, this));
+
this.$fileList.on('change', 'td.filename>.selectCheckBox', _.bind(this._onClickFileCheckbox, this));
this.$el.on('urlChanged', _.bind(this._onUrlChanged, this));
this.$el.find('.select-all').click(_.bind(this._onClickSelectAll, this));
@@ -2279,12 +2280,14 @@
this.$el.find('#filestable thead th').addClass('hidden');
this.$el.find('#emptycontent').addClass('hidden');
$('#searchresults').addClass('filter-empty');
+ $('#searchresults .emptycontent').addClass('emptycontent-search');
if ( $('#searchresults').length === 0 || $('#searchresults').hasClass('hidden') ) {
this.$el.find('.nofilterresults').removeClass('hidden').
find('p').text(t('files', "No entries in this folder match '{filter}'", {filter:this._filter}, null, {'escape': false}));
}
} else {
$('#searchresults').removeClass('filter-empty');
+ $('#searchresults .emptycontent').removeClass('emptycontent-search');
this.$el.find('#filestable thead th').toggleClass('hidden', this.isEmpty);
if (!this.$el.find('.mask').exists()) {
this.$el.find('#emptycontent').toggleClass('hidden', !this.isEmpty);
diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js
index 56489fe30e4..7330264e4e0 100644
--- a/apps/files/l10n/ar.js
+++ b/apps/files/l10n/ar.js
@@ -83,7 +83,6 @@ OC.L10N.register(
"Save" : "حفظ",
"Settings" : "إعدادات",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "استخدم هذا العنوان لـ <a href=\"%s\" target=\"_blank\">الدخول الى ملفاتك عن طريق WebDAV</a>",
"Cancel upload" : "إلغاء الرفع",
"No files in here" : "لا يوجد ملفات هنا ",
"Upload some content or sync with your devices!" : "ارفع بعض المحتوي او زامن مع اجهزتك !",
diff --git a/apps/files/l10n/ar.json b/apps/files/l10n/ar.json
index 697c9627397..281d546c515 100644
--- a/apps/files/l10n/ar.json
+++ b/apps/files/l10n/ar.json
@@ -81,7 +81,6 @@
"Save" : "حفظ",
"Settings" : "إعدادات",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "استخدم هذا العنوان لـ <a href=\"%s\" target=\"_blank\">الدخول الى ملفاتك عن طريق WebDAV</a>",
"Cancel upload" : "إلغاء الرفع",
"No files in here" : "لا يوجد ملفات هنا ",
"Upload some content or sync with your devices!" : "ارفع بعض المحتوي او زامن مع اجهزتك !",
diff --git a/apps/files/l10n/ast.js b/apps/files/l10n/ast.js
index 2262d23345e..7e5aba5a63b 100644
--- a/apps/files/l10n/ast.js
+++ b/apps/files/l10n/ast.js
@@ -92,7 +92,6 @@ OC.L10N.register(
"Save" : "Guardar",
"Settings" : "Axustes",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usa esta direición <a href=\"%s\" target=\"_blank\">p'acceder a los ficheros a traviés de WebDAV</a>",
"Cancel upload" : "Encaboxar xuba",
"No files in here" : "Nun hai nengún ficheru equí",
"Upload some content or sync with your devices!" : "¡Xuba algún conteníu o sincroniza colos sos preseos!",
diff --git a/apps/files/l10n/ast.json b/apps/files/l10n/ast.json
index 53a2c6f8d86..f62ec31e0d8 100644
--- a/apps/files/l10n/ast.json
+++ b/apps/files/l10n/ast.json
@@ -90,7 +90,6 @@
"Save" : "Guardar",
"Settings" : "Axustes",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usa esta direición <a href=\"%s\" target=\"_blank\">p'acceder a los ficheros a traviés de WebDAV</a>",
"Cancel upload" : "Encaboxar xuba",
"No files in here" : "Nun hai nengún ficheru equí",
"Upload some content or sync with your devices!" : "¡Xuba algún conteníu o sincroniza colos sos preseos!",
diff --git a/apps/files/l10n/az.js b/apps/files/l10n/az.js
index 57db9be81be..0adeb3b7a7d 100644
--- a/apps/files/l10n/az.js
+++ b/apps/files/l10n/az.js
@@ -89,7 +89,6 @@ OC.L10N.register(
"Save" : "Saxlamaq",
"Settings" : "Quraşdırmalar",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Bu ünvanı <a href=\"%s\" target=\"_blank\">WebDAV vasitəsilə fayllarınızı əldə etmək üçün</a> istifadə edə bilərsiniz. ",
"Cancel upload" : "Yüklənməni dayandır",
"No files in here" : "Burda fayl yoxdur",
"Upload some content or sync with your devices!" : "Bezi kontenti yüklə yada, öz avadanlıqlarınızla sinxronizasiya edin!",
diff --git a/apps/files/l10n/az.json b/apps/files/l10n/az.json
index e1539015a83..cc98d275ed0 100644
--- a/apps/files/l10n/az.json
+++ b/apps/files/l10n/az.json
@@ -87,7 +87,6 @@
"Save" : "Saxlamaq",
"Settings" : "Quraşdırmalar",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Bu ünvanı <a href=\"%s\" target=\"_blank\">WebDAV vasitəsilə fayllarınızı əldə etmək üçün</a> istifadə edə bilərsiniz. ",
"Cancel upload" : "Yüklənməni dayandır",
"No files in here" : "Burda fayl yoxdur",
"Upload some content or sync with your devices!" : "Bezi kontenti yüklə yada, öz avadanlıqlarınızla sinxronizasiya edin!",
diff --git a/apps/files/l10n/bg_BG.js b/apps/files/l10n/bg_BG.js
index dcc4508e2e2..9e6abe1e554 100644
--- a/apps/files/l10n/bg_BG.js
+++ b/apps/files/l10n/bg_BG.js
@@ -81,7 +81,6 @@ OC.L10N.register(
"Save" : "Запис",
"Settings" : "Настройки",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Използвай този адрес, за да получиш <a href=\"%s\" target=\"_blank\">достъп до своите файлове чрез WebDAV</a>.",
"Cancel upload" : "Отказване на качването",
"No files in here" : "Тук няма файлове",
"Upload some content or sync with your devices!" : "Качи съдържание или синхронизирай с твоите устройства!",
diff --git a/apps/files/l10n/bg_BG.json b/apps/files/l10n/bg_BG.json
index 88370db84f7..20a146fdf24 100644
--- a/apps/files/l10n/bg_BG.json
+++ b/apps/files/l10n/bg_BG.json
@@ -79,7 +79,6 @@
"Save" : "Запис",
"Settings" : "Настройки",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Използвай този адрес, за да получиш <a href=\"%s\" target=\"_blank\">достъп до своите файлове чрез WebDAV</a>.",
"Cancel upload" : "Отказване на качването",
"No files in here" : "Тук няма файлове",
"Upload some content or sync with your devices!" : "Качи съдържание или синхронизирай с твоите устройства!",
diff --git a/apps/files/l10n/bs.js b/apps/files/l10n/bs.js
index a164132aeff..285808e77bc 100644
--- a/apps/files/l10n/bs.js
+++ b/apps/files/l10n/bs.js
@@ -64,7 +64,6 @@ OC.L10N.register(
"Save" : "Spasi",
"Settings" : "Postavke",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Koristi slijedeću adresu za <a href=\"%s\" target=\"_blank\">pristup vašim datotekama putem WebDAV-a</a>",
"Cancel upload" : "Prekini učitavanje",
"Upload some content or sync with your devices!" : "Učitaj neki sadržaj ili sinhronizuj sa tvojim uređajima!",
"Select all" : "Označi sve",
diff --git a/apps/files/l10n/bs.json b/apps/files/l10n/bs.json
index 3e7bb70cee8..dfe4b910b42 100644
--- a/apps/files/l10n/bs.json
+++ b/apps/files/l10n/bs.json
@@ -62,7 +62,6 @@
"Save" : "Spasi",
"Settings" : "Postavke",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Koristi slijedeću adresu za <a href=\"%s\" target=\"_blank\">pristup vašim datotekama putem WebDAV-a</a>",
"Cancel upload" : "Prekini učitavanje",
"Upload some content or sync with your devices!" : "Učitaj neki sadržaj ili sinhronizuj sa tvojim uređajima!",
"Select all" : "Označi sve",
diff --git a/apps/files/l10n/ca.js b/apps/files/l10n/ca.js
index 70626bb1ffa..c3c16103ada 100644
--- a/apps/files/l10n/ca.js
+++ b/apps/files/l10n/ca.js
@@ -84,7 +84,6 @@ OC.L10N.register(
"Save" : "Desa",
"Settings" : "Arranjament",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Useu aquesta adreça per <a href=\"%s\" target=\"_blank\">accedir als fitxers via WebDAV</a>",
"Cancel upload" : "Cancel·la la pujada",
"No files in here" : "No hi ha arxius",
"Upload some content or sync with your devices!" : "Pugi continguts o sincronitzi els seus dispositius.",
diff --git a/apps/files/l10n/ca.json b/apps/files/l10n/ca.json
index 3a9dae4e75e..a2b5da56dfd 100644
--- a/apps/files/l10n/ca.json
+++ b/apps/files/l10n/ca.json
@@ -82,7 +82,6 @@
"Save" : "Desa",
"Settings" : "Arranjament",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Useu aquesta adreça per <a href=\"%s\" target=\"_blank\">accedir als fitxers via WebDAV</a>",
"Cancel upload" : "Cancel·la la pujada",
"No files in here" : "No hi ha arxius",
"Upload some content or sync with your devices!" : "Pugi continguts o sincronitzi els seus dispositius.",
diff --git a/apps/files/l10n/cs_CZ.js b/apps/files/l10n/cs_CZ.js
index 1b89c48b129..536b5cdf935 100644
--- a/apps/files/l10n/cs_CZ.js
+++ b/apps/files/l10n/cs_CZ.js
@@ -106,7 +106,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Pro úpravy v aktuálním náhledu chybí oprávnění.",
"Settings" : "Nastavení",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použijte tuto adresu pro <a href=\"%s\" target=\"_blank\">přístup k vašim souborům přes WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Použijte tuto adresu pro <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">přístup k vašim Souborům přes WebDAV</a>",
"Cancel upload" : "Zrušit odesílání",
"No files in here" : "Žádné soubory",
"Upload some content or sync with your devices!" : "Nahrajte nějaký obsah nebo synchronizujte se svými přístroji!",
diff --git a/apps/files/l10n/cs_CZ.json b/apps/files/l10n/cs_CZ.json
index b307053d449..da4fb78b53b 100644
--- a/apps/files/l10n/cs_CZ.json
+++ b/apps/files/l10n/cs_CZ.json
@@ -104,7 +104,7 @@
"Missing permissions to edit from here." : "Pro úpravy v aktuálním náhledu chybí oprávnění.",
"Settings" : "Nastavení",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použijte tuto adresu pro <a href=\"%s\" target=\"_blank\">přístup k vašim souborům přes WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Použijte tuto adresu pro <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">přístup k vašim Souborům přes WebDAV</a>",
"Cancel upload" : "Zrušit odesílání",
"No files in here" : "Žádné soubory",
"Upload some content or sync with your devices!" : "Nahrajte nějaký obsah nebo synchronizujte se svými přístroji!",
diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js
index 6b406fed534..02e0610c24a 100644
--- a/apps/files/l10n/da.js
+++ b/apps/files/l10n/da.js
@@ -28,6 +28,7 @@ OC.L10N.register(
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan ikke upload {filename} da det er enten en mappe eller indholder 0 bytes.",
"Total file size {size1} exceeds upload limit {size2}" : "Den totale filstørrelse {size1} er større end uploadgrænsen {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Der er ikke tilstrækkeligt friplads. Du uplaoder {size1} men der er kun {size2} tilbage",
+ "Error uploading file \"{fileName}\": {message}" : "Fejl under upload af filen \"{fileName}\": {message}",
"Could not get result from server." : "Kunne ikke hente resultat fra server.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Fil upload kører. Hvis du forlader siden nu, vil uploadet blive annuleret.",
"Actions" : "Handlinger",
@@ -35,13 +36,15 @@ OC.L10N.register(
"Rename" : "Omdøb",
"Delete" : "Slet",
"Disconnect storage" : "Frakobl lager",
- "Unshare" : "Fjern deling",
+ "Unshare" : "Ophæv deling",
"Details" : "Detaljer",
"Select" : "Vælg",
"Pending" : "Afventer",
"Unable to determine date" : "Kan ikke fastslå datoen",
"This operation is forbidden" : "Denne operation er forbudt",
"This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig, tjek venligst loggene eller kontakt administratoren",
+ "Could not move \"{file}\", target exists" : "Kunne ikke flytte \"{file}\" - der findes allerede en fil med dette navn",
+ "Could not move \"{file}\"" : "Kunne ikke flytte \"{file}\"",
"No entries in this folder match '{filter}'" : "Der er ingen poster i denne mappe, der matcher '{filter}'",
"Name" : "Navn",
"Size" : "Størrelse",
@@ -90,9 +93,9 @@ OC.L10N.register(
"Maximum upload size" : "Maksimal upload-størrelse",
"max. possible: " : "max. mulige: ",
"Save" : "Gem",
+ "Missing permissions to edit from here." : "Rettighed mangler til at redigere på dette sted",
"Settings" : "Indstillinger",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Brug denne adresse for at <a href=\"%s\" target=\"_blank\">tilgå dine filer via WebDAV</a>",
"Cancel upload" : "Fortryd upload",
"No files in here" : "Her er ingen filer",
"Upload some content or sync with your devices!" : "Overfør indhold eller synkronisér med dine enheder!",
diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json
index e186674656c..5a9a14c414a 100644
--- a/apps/files/l10n/da.json
+++ b/apps/files/l10n/da.json
@@ -26,6 +26,7 @@
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan ikke upload {filename} da det er enten en mappe eller indholder 0 bytes.",
"Total file size {size1} exceeds upload limit {size2}" : "Den totale filstørrelse {size1} er større end uploadgrænsen {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Der er ikke tilstrækkeligt friplads. Du uplaoder {size1} men der er kun {size2} tilbage",
+ "Error uploading file \"{fileName}\": {message}" : "Fejl under upload af filen \"{fileName}\": {message}",
"Could not get result from server." : "Kunne ikke hente resultat fra server.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Fil upload kører. Hvis du forlader siden nu, vil uploadet blive annuleret.",
"Actions" : "Handlinger",
@@ -33,13 +34,15 @@
"Rename" : "Omdøb",
"Delete" : "Slet",
"Disconnect storage" : "Frakobl lager",
- "Unshare" : "Fjern deling",
+ "Unshare" : "Ophæv deling",
"Details" : "Detaljer",
"Select" : "Vælg",
"Pending" : "Afventer",
"Unable to determine date" : "Kan ikke fastslå datoen",
"This operation is forbidden" : "Denne operation er forbudt",
"This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig, tjek venligst loggene eller kontakt administratoren",
+ "Could not move \"{file}\", target exists" : "Kunne ikke flytte \"{file}\" - der findes allerede en fil med dette navn",
+ "Could not move \"{file}\"" : "Kunne ikke flytte \"{file}\"",
"No entries in this folder match '{filter}'" : "Der er ingen poster i denne mappe, der matcher '{filter}'",
"Name" : "Navn",
"Size" : "Størrelse",
@@ -88,9 +91,9 @@
"Maximum upload size" : "Maksimal upload-størrelse",
"max. possible: " : "max. mulige: ",
"Save" : "Gem",
+ "Missing permissions to edit from here." : "Rettighed mangler til at redigere på dette sted",
"Settings" : "Indstillinger",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Brug denne adresse for at <a href=\"%s\" target=\"_blank\">tilgå dine filer via WebDAV</a>",
"Cancel upload" : "Fortryd upload",
"No files in here" : "Her er ingen filer",
"Upload some content or sync with your devices!" : "Overfør indhold eller synkronisér med dine enheder!",
diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js
index d0ee9192669..40c9d78ba2a 100644
--- a/apps/files/l10n/de.js
+++ b/apps/files/l10n/de.js
@@ -106,7 +106,7 @@ OC.L10N.register(
"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>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Benutze diese Adresse, um <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">über WebDAV auf Deine Dateien zuzugreifen</a>",
"Cancel upload" : "Upload abbrechen",
"No files in here" : "Keine Dateien vorhanden",
"Upload some content or sync with your devices!" : "Lade Inhalte hoch oder synchronisiere mit Deinen Geräten!",
diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json
index 51120ebec0b..4f471d3a09b 100644
--- a/apps/files/l10n/de.json
+++ b/apps/files/l10n/de.json
@@ -104,7 +104,7 @@
"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>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Benutze diese Adresse, um <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">über WebDAV auf Deine Dateien zuzugreifen</a>",
"Cancel upload" : "Upload abbrechen",
"No files in here" : "Keine Dateien vorhanden",
"Upload some content or sync with your devices!" : "Lade Inhalte hoch oder synchronisiere mit Deinen Geräten!",
diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js
index d8472cbc459..d9543f39893 100644
--- a/apps/files/l10n/de_DE.js
+++ b/apps/files/l10n/de_DE.js
@@ -106,7 +106,7 @@ OC.L10N.register(
"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>" : "Benutzen Sie diese Adresse, um <a href=\"%s\" target=\"_blank\">über WebDAV auf Ihre Dateien zuzugreifen</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Benutzen Sie diese Adresse, um <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">über WebDAV auf Ihre Dateien zuzugreifen</a>",
"Cancel upload" : "Upload abbrechen",
"No files in here" : "Keine Dateien vorhanden",
"Upload some content or sync with your devices!" : "Laden Sie Inhalte hoch oder synchronisieren Sie mit Ihren Geräten!",
diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json
index 0ec7dea0e86..1dc7f9989ad 100644
--- a/apps/files/l10n/de_DE.json
+++ b/apps/files/l10n/de_DE.json
@@ -104,7 +104,7 @@
"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>" : "Benutzen Sie diese Adresse, um <a href=\"%s\" target=\"_blank\">über WebDAV auf Ihre Dateien zuzugreifen</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Benutzen Sie diese Adresse, um <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">über WebDAV auf Ihre Dateien zuzugreifen</a>",
"Cancel upload" : "Upload abbrechen",
"No files in here" : "Keine Dateien vorhanden",
"Upload some content or sync with your devices!" : "Laden Sie Inhalte hoch oder synchronisieren Sie mit Ihren Geräten!",
diff --git a/apps/files/l10n/el.js b/apps/files/l10n/el.js
index 20b57e415b0..7b65dbc90a6 100644
--- a/apps/files/l10n/el.js
+++ b/apps/files/l10n/el.js
@@ -101,7 +101,6 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Δεν υπάρχουν τα απαραίτητα δικαιώματα για να γίνει τροποποιήση σε αυτό το σημείο.",
"Settings" : "Ρυθμίσεις",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Χρησιμοποιήστε αυτήν την διεύθυνση για να αποκτήσετε <a href=\"%s\" target=\"_blank\">πρόσβαση στα αρχεία σας μέσω WebDAV</a>",
"Cancel upload" : "Ακύρωση μεταφόρτωσης",
"No files in here" : "Δεν υπάρχουν αρχεία",
"Upload some content or sync with your devices!" : "Μεταφόρτωση περιεχομένου ή συγχρονισμός με τις συσκευές σας!",
diff --git a/apps/files/l10n/el.json b/apps/files/l10n/el.json
index 849b0ee8a09..982dc0c97c9 100644
--- a/apps/files/l10n/el.json
+++ b/apps/files/l10n/el.json
@@ -99,7 +99,6 @@
"Missing permissions to edit from here." : "Δεν υπάρχουν τα απαραίτητα δικαιώματα για να γίνει τροποποιήση σε αυτό το σημείο.",
"Settings" : "Ρυθμίσεις",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Χρησιμοποιήστε αυτήν την διεύθυνση για να αποκτήσετε <a href=\"%s\" target=\"_blank\">πρόσβαση στα αρχεία σας μέσω WebDAV</a>",
"Cancel upload" : "Ακύρωση μεταφόρτωσης",
"No files in here" : "Δεν υπάρχουν αρχεία",
"Upload some content or sync with your devices!" : "Μεταφόρτωση περιεχομένου ή συγχρονισμός με τις συσκευές σας!",
diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js
index f15fa7e49ad..c9fd96ea507 100644
--- a/apps/files/l10n/en_GB.js
+++ b/apps/files/l10n/en_GB.js
@@ -106,7 +106,6 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Missing permissions to edit from here.",
"Settings" : "Settings",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>",
"Cancel upload" : "Cancel upload",
"No files in here" : "No files in here",
"Upload some content or sync with your devices!" : "Upload some content or sync with your devices!",
diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json
index 5606b0c2c7f..172f49cfc38 100644
--- a/apps/files/l10n/en_GB.json
+++ b/apps/files/l10n/en_GB.json
@@ -104,7 +104,6 @@
"Missing permissions to edit from here." : "Missing permissions to edit from here.",
"Settings" : "Settings",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>",
"Cancel upload" : "Cancel upload",
"No files in here" : "No files in here",
"Upload some content or sync with your devices!" : "Upload some content or sync with your devices!",
diff --git a/apps/files/l10n/eo.js b/apps/files/l10n/eo.js
index 5125d42feda..d0463d0ac10 100644
--- a/apps/files/l10n/eo.js
+++ b/apps/files/l10n/eo.js
@@ -102,7 +102,6 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Mankas permesoj por redakti ekde ĉi tie.",
"Settings" : "Agordo",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Uzu ĉi tiun adreson por <a href=\"%s\" target=\"_blank\">aliri viajn Dosierojn per WebDAV</a>",
"Cancel upload" : "Nuligi alŝuton",
"No files in here" : "Neniu dosiero estas ĉi tie",
"Upload some content or sync with your devices!" : "Alŝutu iom da enhavo aŭ sinkronigu kun viaj aparatoj!",
diff --git a/apps/files/l10n/eo.json b/apps/files/l10n/eo.json
index 7328acdef42..743d146699e 100644
--- a/apps/files/l10n/eo.json
+++ b/apps/files/l10n/eo.json
@@ -100,7 +100,6 @@
"Missing permissions to edit from here." : "Mankas permesoj por redakti ekde ĉi tie.",
"Settings" : "Agordo",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Uzu ĉi tiun adreson por <a href=\"%s\" target=\"_blank\">aliri viajn Dosierojn per WebDAV</a>",
"Cancel upload" : "Nuligi alŝuton",
"No files in here" : "Neniu dosiero estas ĉi tie",
"Upload some content or sync with your devices!" : "Alŝutu iom da enhavo aŭ sinkronigu kun viaj aparatoj!",
diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js
index f88135163c2..51114b98999 100644
--- a/apps/files/l10n/es.js
+++ b/apps/files/l10n/es.js
@@ -106,7 +106,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Faltan permisos para poder editar desde aquí.",
"Settings" : "Ajustes",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use esta URL <a href=\"%s\" target=\"_blank\">para acceder via WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Introduce esta dirección <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\"> en el cliente de ownCloud para acceder a tus archivos a través de él</a>",
"Cancel upload" : "Cancelar la subida",
"No files in here" : "Aquí no hay archivos",
"Upload some content or sync with your devices!" : "Suba contenidos o sincronice sus dispositivos.",
diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json
index fe135f765ce..eee5fcfced9 100644
--- a/apps/files/l10n/es.json
+++ b/apps/files/l10n/es.json
@@ -104,7 +104,7 @@
"Missing permissions to edit from here." : "Faltan permisos para poder editar desde aquí.",
"Settings" : "Ajustes",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use esta URL <a href=\"%s\" target=\"_blank\">para acceder via WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Introduce esta dirección <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\"> en el cliente de ownCloud para acceder a tus archivos a través de él</a>",
"Cancel upload" : "Cancelar la subida",
"No files in here" : "Aquí no hay archivos",
"Upload some content or sync with your devices!" : "Suba contenidos o sincronice sus dispositivos.",
diff --git a/apps/files/l10n/es_AR.js b/apps/files/l10n/es_AR.js
index bd4504592f1..7a5df7542e3 100644
--- a/apps/files/l10n/es_AR.js
+++ b/apps/files/l10n/es_AR.js
@@ -70,7 +70,6 @@ OC.L10N.register(
"Save" : "Guardar",
"Settings" : "Configuración",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usar esta dirección para <a href=\"%s\" target=\"_blank\">acceder a tus archivos vía WebDAV</a>",
"Cancel upload" : "Cancelar subida",
"Upload too large" : "El tamaño del archivo que querés subir es demasiado grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que intentás subir sobrepasan el tamaño máximo ",
diff --git a/apps/files/l10n/es_AR.json b/apps/files/l10n/es_AR.json
index 81898bf489d..03a0007c477 100644
--- a/apps/files/l10n/es_AR.json
+++ b/apps/files/l10n/es_AR.json
@@ -68,7 +68,6 @@
"Save" : "Guardar",
"Settings" : "Configuración",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usar esta dirección para <a href=\"%s\" target=\"_blank\">acceder a tus archivos vía WebDAV</a>",
"Cancel upload" : "Cancelar subida",
"Upload too large" : "El tamaño del archivo que querés subir es demasiado grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que intentás subir sobrepasan el tamaño máximo ",
diff --git a/apps/files/l10n/es_MX.js b/apps/files/l10n/es_MX.js
index 780c206c622..3eb1c68b888 100644
--- a/apps/files/l10n/es_MX.js
+++ b/apps/files/l10n/es_MX.js
@@ -56,7 +56,6 @@ OC.L10N.register(
"Save" : "Guardar",
"Settings" : "Ajustes",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilice esta dirección para <a href=\"%s\" target=\"_blank\">acceder a sus archivos vía WebDAV</a>",
"Cancel upload" : "Cancelar subida",
"Upload too large" : "Subida demasido grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.",
diff --git a/apps/files/l10n/es_MX.json b/apps/files/l10n/es_MX.json
index 17d5cb74e87..644ae02a3b5 100644
--- a/apps/files/l10n/es_MX.json
+++ b/apps/files/l10n/es_MX.json
@@ -54,7 +54,6 @@
"Save" : "Guardar",
"Settings" : "Ajustes",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilice esta dirección para <a href=\"%s\" target=\"_blank\">acceder a sus archivos vía WebDAV</a>",
"Cancel upload" : "Cancelar subida",
"Upload too large" : "Subida demasido grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.",
diff --git a/apps/files/l10n/et_EE.js b/apps/files/l10n/et_EE.js
index 5c59cf614b7..ab205b5ecf9 100644
--- a/apps/files/l10n/et_EE.js
+++ b/apps/files/l10n/et_EE.js
@@ -92,7 +92,6 @@ OC.L10N.register(
"Save" : "Salvesta",
"Settings" : "Seaded",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Kasuta seda aadressi <a href=\"%s\" target=\"_blank\">oma failidele ligipääsuks WebDAV kaudu</a>",
"Cancel upload" : "Tühista üleslaadimine",
"No files in here" : "Siin ei ole faile",
"Upload some content or sync with your devices!" : "Laadi sisu üles või süngi oma seadmetega!",
diff --git a/apps/files/l10n/et_EE.json b/apps/files/l10n/et_EE.json
index f438d07cdc8..15881c2a853 100644
--- a/apps/files/l10n/et_EE.json
+++ b/apps/files/l10n/et_EE.json
@@ -90,7 +90,6 @@
"Save" : "Salvesta",
"Settings" : "Seaded",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Kasuta seda aadressi <a href=\"%s\" target=\"_blank\">oma failidele ligipääsuks WebDAV kaudu</a>",
"Cancel upload" : "Tühista üleslaadimine",
"No files in here" : "Siin ei ole faile",
"Upload some content or sync with your devices!" : "Laadi sisu üles või süngi oma seadmetega!",
diff --git a/apps/files/l10n/eu.js b/apps/files/l10n/eu.js
index 16d681ebeab..cb4f4486b15 100644
--- a/apps/files/l10n/eu.js
+++ b/apps/files/l10n/eu.js
@@ -79,7 +79,6 @@ OC.L10N.register(
"Save" : "Gorde",
"Settings" : "Ezarpenak",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">helbidea erabili zure fitxategiak WebDAV bidez eskuratzeko</a>",
"Cancel upload" : "Ezeztatu igoera",
"Upload some content or sync with your devices!" : "Igo edukiren bat edo sinkronizatu zure gailuekin!",
"No entries found in this folder" : "Ez da sarrerarik aurkitu karpeta honetan",
diff --git a/apps/files/l10n/eu.json b/apps/files/l10n/eu.json
index f23d06bb5db..956e25a4a91 100644
--- a/apps/files/l10n/eu.json
+++ b/apps/files/l10n/eu.json
@@ -77,7 +77,6 @@
"Save" : "Gorde",
"Settings" : "Ezarpenak",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">helbidea erabili zure fitxategiak WebDAV bidez eskuratzeko</a>",
"Cancel upload" : "Ezeztatu igoera",
"Upload some content or sync with your devices!" : "Igo edukiren bat edo sinkronizatu zure gailuekin!",
"No entries found in this folder" : "Ez da sarrerarik aurkitu karpeta honetan",
diff --git a/apps/files/l10n/fa.js b/apps/files/l10n/fa.js
index 0d6086e0900..9d5e5d46c27 100644
--- a/apps/files/l10n/fa.js
+++ b/apps/files/l10n/fa.js
@@ -90,7 +90,6 @@ OC.L10N.register(
"Save" : "ذخیره",
"Settings" : "تنظیمات",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "از این آدرس استفاده کنید تا <a href=\"%s\" target=\"_blank\">بتوانید به فایل‌های خود توسط WebDAV دسترسی پیدا کنید</a>",
"Cancel upload" : "متوقف کردن بار گذاری",
"No files in here" : "هیچ فایلی اینجا وجود ندارد",
"Upload some content or sync with your devices!" : "محتوایی را آپلود کنید یا با دستگاه خود همگام‌سازی کنید!",
diff --git a/apps/files/l10n/fa.json b/apps/files/l10n/fa.json
index 109dfbdb585..53015919436 100644
--- a/apps/files/l10n/fa.json
+++ b/apps/files/l10n/fa.json
@@ -88,7 +88,6 @@
"Save" : "ذخیره",
"Settings" : "تنظیمات",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "از این آدرس استفاده کنید تا <a href=\"%s\" target=\"_blank\">بتوانید به فایل‌های خود توسط WebDAV دسترسی پیدا کنید</a>",
"Cancel upload" : "متوقف کردن بار گذاری",
"No files in here" : "هیچ فایلی اینجا وجود ندارد",
"Upload some content or sync with your devices!" : "محتوایی را آپلود کنید یا با دستگاه خود همگام‌سازی کنید!",
diff --git a/apps/files/l10n/fi_FI.js b/apps/files/l10n/fi_FI.js
index ba63b927655..7294495787f 100644
--- a/apps/files/l10n/fi_FI.js
+++ b/apps/files/l10n/fi_FI.js
@@ -106,7 +106,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Käyttöoikeudet eivät riitä tätä kautta muokkaamiseen.",
"Settings" : "Asetukset",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Käytä tätä osoitetta <a href=\"%s\" target=\"_blank\">käyttääksesi tiedostojasi WebDAVin kautta</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Käytä tätä osoitetta <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">päästäksesi tiedostoihisi WebDAV-liittymän kautta</a>",
"Cancel upload" : "Peru lähetys",
"No files in here" : "Täällä ei ole tiedostoja",
"Upload some content or sync with your devices!" : "Lähetä tiedostoja tai synkronoi sisältö laitteidesi kanssa!",
diff --git a/apps/files/l10n/fi_FI.json b/apps/files/l10n/fi_FI.json
index bfcc08aaa77..429845bb4ac 100644
--- a/apps/files/l10n/fi_FI.json
+++ b/apps/files/l10n/fi_FI.json
@@ -104,7 +104,7 @@
"Missing permissions to edit from here." : "Käyttöoikeudet eivät riitä tätä kautta muokkaamiseen.",
"Settings" : "Asetukset",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Käytä tätä osoitetta <a href=\"%s\" target=\"_blank\">käyttääksesi tiedostojasi WebDAVin kautta</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Käytä tätä osoitetta <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">päästäksesi tiedostoihisi WebDAV-liittymän kautta</a>",
"Cancel upload" : "Peru lähetys",
"No files in here" : "Täällä ei ole tiedostoja",
"Upload some content or sync with your devices!" : "Lähetä tiedostoja tai synkronoi sisältö laitteidesi kanssa!",
diff --git a/apps/files/l10n/fil.js b/apps/files/l10n/fil.js
index a1506749021..7ba73b69562 100644
--- a/apps/files/l10n/fil.js
+++ b/apps/files/l10n/fil.js
@@ -1,6 +1,11 @@
OC.L10N.register(
"files",
{
- "New folder" : "Bagong folder"
+ "Unknown error" : "Hindi kilalang error",
+ "Close" : "Isara",
+ "Download" : "I-download",
+ "Details" : "Mga Detalye",
+ "New folder" : "Bagong folder",
+ "Upload" : "Mag-upload"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files/l10n/fil.json b/apps/files/l10n/fil.json
index 5639f695982..0873377d19b 100644
--- a/apps/files/l10n/fil.json
+++ b/apps/files/l10n/fil.json
@@ -1,4 +1,9 @@
{ "translations": {
- "New folder" : "Bagong folder"
+ "Unknown error" : "Hindi kilalang error",
+ "Close" : "Isara",
+ "Download" : "I-download",
+ "Details" : "Mga Detalye",
+ "New folder" : "Bagong folder",
+ "Upload" : "Mag-upload"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js
index bc88d62fb20..12497c4dbe1 100644
--- a/apps/files/l10n/fr.js
+++ b/apps/files/l10n/fr.js
@@ -106,7 +106,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Manque de permissions pour éditer à partir d'ici.",
"Settings" : "Paramètres",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilisez cette adresse pour <a href=\"%s\" target=\"_blank\">accéder à vos fichiers par WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Utilisez cette adresse pour <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">accéder à vos fichiers par WebDAV</a>",
"Cancel upload" : "Annuler l'envoi",
"No files in here" : "Aucun fichier",
"Upload some content or sync with your devices!" : "Déposez du contenu ou synchronisez vos appareils !",
diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json
index b3d28f92a47..679d170b2ad 100644
--- a/apps/files/l10n/fr.json
+++ b/apps/files/l10n/fr.json
@@ -104,7 +104,7 @@
"Missing permissions to edit from here." : "Manque de permissions pour éditer à partir d'ici.",
"Settings" : "Paramètres",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilisez cette adresse pour <a href=\"%s\" target=\"_blank\">accéder à vos fichiers par WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Utilisez cette adresse pour <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">accéder à vos fichiers par WebDAV</a>",
"Cancel upload" : "Annuler l'envoi",
"No files in here" : "Aucun fichier",
"Upload some content or sync with your devices!" : "Déposez du contenu ou synchronisez vos appareils !",
diff --git a/apps/files/l10n/gl.js b/apps/files/l10n/gl.js
index e463ef16b3d..e02df778102 100644
--- a/apps/files/l10n/gl.js
+++ b/apps/files/l10n/gl.js
@@ -88,7 +88,6 @@ OC.L10N.register(
"Save" : "Gardar",
"Settings" : "Axustes",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Empregue esta ligazón para <a href=\"%s\" target=\"_blank\">acceder aos seus ficheiros mediante WebDAV</a>",
"Cancel upload" : "Cancelar o envío",
"No files in here" : "Aquí non hai ficheiros",
"Upload some content or sync with your devices!" : "Envíe algún contido ou sincronice cos seus dispositivos!",
diff --git a/apps/files/l10n/gl.json b/apps/files/l10n/gl.json
index 418767c5167..2add4f99144 100644
--- a/apps/files/l10n/gl.json
+++ b/apps/files/l10n/gl.json
@@ -86,7 +86,6 @@
"Save" : "Gardar",
"Settings" : "Axustes",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Empregue esta ligazón para <a href=\"%s\" target=\"_blank\">acceder aos seus ficheiros mediante WebDAV</a>",
"Cancel upload" : "Cancelar o envío",
"No files in here" : "Aquí non hai ficheiros",
"Upload some content or sync with your devices!" : "Envíe algún contido ou sincronice cos seus dispositivos!",
diff --git a/apps/files/l10n/he.js b/apps/files/l10n/he.js
index 74f54deb76e..138e474f307 100644
--- a/apps/files/l10n/he.js
+++ b/apps/files/l10n/he.js
@@ -106,7 +106,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "חסרות הרשאות לעריכה מכאן.",
"Settings" : "הגדרות",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "השתמש בכתובת זו לצורך <a href=\"%s\" target=\"_blank\">כניסה אל הקבצים שלך בעזרת WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "ניתן להשתמש בכתובת זו כדי <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">להכנס לקבצים שלך באמצעות WebDAV</a>",
"Cancel upload" : "ביטול ההעלאה",
"No files in here" : "אין כאן קבצים",
"Upload some content or sync with your devices!" : "יש להעלות קצת תוכן או לסנכרן עם ההתקנים שלך!",
diff --git a/apps/files/l10n/he.json b/apps/files/l10n/he.json
index 8f45d4c851b..fbe71b5bf4a 100644
--- a/apps/files/l10n/he.json
+++ b/apps/files/l10n/he.json
@@ -104,7 +104,7 @@
"Missing permissions to edit from here." : "חסרות הרשאות לעריכה מכאן.",
"Settings" : "הגדרות",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "השתמש בכתובת זו לצורך <a href=\"%s\" target=\"_blank\">כניסה אל הקבצים שלך בעזרת WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "ניתן להשתמש בכתובת זו כדי <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">להכנס לקבצים שלך באמצעות WebDAV</a>",
"Cancel upload" : "ביטול ההעלאה",
"No files in here" : "אין כאן קבצים",
"Upload some content or sync with your devices!" : "יש להעלות קצת תוכן או לסנכרן עם ההתקנים שלך!",
diff --git a/apps/files/l10n/hr.js b/apps/files/l10n/hr.js
index 746ee8ded91..906ed19d22f 100644
--- a/apps/files/l10n/hr.js
+++ b/apps/files/l10n/hr.js
@@ -79,7 +79,6 @@ OC.L10N.register(
"Save" : "Spremite",
"Settings" : "Postavke",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Koristitet slijedeću adresu za <a href=\"%s\" target=\"_blank\">pristup vašim datotekama putem WebDAV-a</a>",
"Cancel upload" : "Prekini upload",
"Upload some content or sync with your devices!" : "Aplodujte neki sadrzaj ili sinkronizirajte sa vasim uredjajem!",
"No entries found in this folder" : "Zapis nije pronadjen u ovom direktorijumu ",
diff --git a/apps/files/l10n/hr.json b/apps/files/l10n/hr.json
index 35bc43df7e0..950dcee3471 100644
--- a/apps/files/l10n/hr.json
+++ b/apps/files/l10n/hr.json
@@ -77,7 +77,6 @@
"Save" : "Spremite",
"Settings" : "Postavke",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Koristitet slijedeću adresu za <a href=\"%s\" target=\"_blank\">pristup vašim datotekama putem WebDAV-a</a>",
"Cancel upload" : "Prekini upload",
"Upload some content or sync with your devices!" : "Aplodujte neki sadrzaj ili sinkronizirajte sa vasim uredjajem!",
"No entries found in this folder" : "Zapis nije pronadjen u ovom direktorijumu ",
diff --git a/apps/files/l10n/hu_HU.js b/apps/files/l10n/hu_HU.js
index 0ea1a02d594..304457a9f5e 100644
--- a/apps/files/l10n/hu_HU.js
+++ b/apps/files/l10n/hu_HU.js
@@ -106,7 +106,6 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Innen nem lehet szerkeszteni hiányzó jogosultság miatt.",
"Settings" : "Beállítások",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Ezt a címet használja, ha <a href=\"%s\" target=\"_blank\">WebDAV-on keresztül szeretné elérni a fájljait</a>",
"Cancel upload" : "A feltöltés megszakítása",
"No files in here" : "Itt nincsenek fájlok",
"Upload some content or sync with your devices!" : "Tölts fel néhány tartalmat, vagy szinkronizálj az eszközöddel!",
diff --git a/apps/files/l10n/hu_HU.json b/apps/files/l10n/hu_HU.json
index 69314709c39..b39080d9cd6 100644
--- a/apps/files/l10n/hu_HU.json
+++ b/apps/files/l10n/hu_HU.json
@@ -104,7 +104,6 @@
"Missing permissions to edit from here." : "Innen nem lehet szerkeszteni hiányzó jogosultság miatt.",
"Settings" : "Beállítások",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Ezt a címet használja, ha <a href=\"%s\" target=\"_blank\">WebDAV-on keresztül szeretné elérni a fájljait</a>",
"Cancel upload" : "A feltöltés megszakítása",
"No files in here" : "Itt nincsenek fájlok",
"Upload some content or sync with your devices!" : "Tölts fel néhány tartalmat, vagy szinkronizálj az eszközöddel!",
diff --git a/apps/files/l10n/id.js b/apps/files/l10n/id.js
index c67a74e43da..fbf6df463d0 100644
--- a/apps/files/l10n/id.js
+++ b/apps/files/l10n/id.js
@@ -92,7 +92,6 @@ OC.L10N.register(
"Save" : "Simpan",
"Settings" : "Pengaturan",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gunakan alamat ini untuk <a href=\"%s\" target=\"_blank\">mengakses Berkas via WebDAV</a>",
"Cancel upload" : "Batal unggah",
"No files in here" : "Tidak ada berkas disini",
"Upload some content or sync with your devices!" : "Unggah beberapa konten dan sinkronisasikan dengan perangkat Anda!",
diff --git a/apps/files/l10n/id.json b/apps/files/l10n/id.json
index 68f01e0393a..230c204fc67 100644
--- a/apps/files/l10n/id.json
+++ b/apps/files/l10n/id.json
@@ -90,7 +90,6 @@
"Save" : "Simpan",
"Settings" : "Pengaturan",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gunakan alamat ini untuk <a href=\"%s\" target=\"_blank\">mengakses Berkas via WebDAV</a>",
"Cancel upload" : "Batal unggah",
"No files in here" : "Tidak ada berkas disini",
"Upload some content or sync with your devices!" : "Unggah beberapa konten dan sinkronisasikan dengan perangkat Anda!",
diff --git a/apps/files/l10n/is.js b/apps/files/l10n/is.js
index ff30045d6f7..1a2fe2dd914 100644
--- a/apps/files/l10n/is.js
+++ b/apps/files/l10n/is.js
@@ -106,7 +106,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Vantar heimildir til að breyta einhverju héðan.",
"Settings" : "Stillingar",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Notaðu þetta vistfang til að <a href=\"%s\" target=\"_blank\">nálgast skrárnar þínar með WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Notaðu þetta vistfang til að <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">nálgast skrárnar þínar með WebDAV</a>",
"Cancel upload" : "Hætta við innsendingu",
"No files in here" : "Engar skrár hér",
"Upload some content or sync with your devices!" : "Sendu inn eitthvað efni eða samstilltu við tækin þín!",
diff --git a/apps/files/l10n/is.json b/apps/files/l10n/is.json
index 2d7cafdf4c0..4f7c3822c0f 100644
--- a/apps/files/l10n/is.json
+++ b/apps/files/l10n/is.json
@@ -104,7 +104,7 @@
"Missing permissions to edit from here." : "Vantar heimildir til að breyta einhverju héðan.",
"Settings" : "Stillingar",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Notaðu þetta vistfang til að <a href=\"%s\" target=\"_blank\">nálgast skrárnar þínar með WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Notaðu þetta vistfang til að <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">nálgast skrárnar þínar með WebDAV</a>",
"Cancel upload" : "Hætta við innsendingu",
"No files in here" : "Engar skrár hér",
"Upload some content or sync with your devices!" : "Sendu inn eitthvað efni eða samstilltu við tækin þín!",
diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js
index e6072997b2d..8041a8c2d72 100644
--- a/apps/files/l10n/it.js
+++ b/apps/files/l10n/it.js
@@ -106,7 +106,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Permessi mancanti per modificare da qui.",
"Settings" : "Impostazioni",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilizza questo indirizzo per <a href=\"%s\" target=\"_blank\">accedere ai tuoi file con WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Utilizza questo indirizzo per <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">accedere ai tuoi file con WebDAV</a>",
"Cancel upload" : "Annulla caricamento",
"No files in here" : "Qui non c'è alcun file",
"Upload some content or sync with your devices!" : "Carica alcuni contenuti o sincronizza con i tuoi dispositivi!",
diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json
index f81affd9038..473433f853a 100644
--- a/apps/files/l10n/it.json
+++ b/apps/files/l10n/it.json
@@ -104,7 +104,7 @@
"Missing permissions to edit from here." : "Permessi mancanti per modificare da qui.",
"Settings" : "Impostazioni",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilizza questo indirizzo per <a href=\"%s\" target=\"_blank\">accedere ai tuoi file con WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Utilizza questo indirizzo per <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">accedere ai tuoi file con WebDAV</a>",
"Cancel upload" : "Annulla caricamento",
"No files in here" : "Qui non c'è alcun file",
"Upload some content or sync with your devices!" : "Carica alcuni contenuti o sincronizza con i tuoi dispositivi!",
diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js
index 4280375b46e..185a5d6d121 100644
--- a/apps/files/l10n/ja.js
+++ b/apps/files/l10n/ja.js
@@ -106,7 +106,6 @@ OC.L10N.register(
"Missing permissions to edit from here." : "ここから編集するための権限がありません。",
"Settings" : "設定",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">WebDAV経由でのファイルアクセス</a>にはこのアドレスを利用してください",
"Cancel upload" : "アップロードをキャンセル",
"No files in here" : "ファイルがありません",
"Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。",
diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json
index 674a3155954..129e417962b 100644
--- a/apps/files/l10n/ja.json
+++ b/apps/files/l10n/ja.json
@@ -104,7 +104,6 @@
"Missing permissions to edit from here." : "ここから編集するための権限がありません。",
"Settings" : "設定",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">WebDAV経由でのファイルアクセス</a>にはこのアドレスを利用してください",
"Cancel upload" : "アップロードをキャンセル",
"No files in here" : "ファイルがありません",
"Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。",
diff --git a/apps/files/l10n/ko.js b/apps/files/l10n/ko.js
index 741a71405db..38e16404c30 100644
--- a/apps/files/l10n/ko.js
+++ b/apps/files/l10n/ko.js
@@ -106,7 +106,6 @@ OC.L10N.register(
"Missing permissions to edit from here." : "여기에서 편집할 권한이 없습니다.",
"Settings" : "설정",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "WebDAV로 파일에 접근하려면 <a href=\"%s\" target=\"_blank\">이 주소를 사용하십시오</a>",
"Cancel upload" : "업로드 취소",
"No files in here" : "여기에 파일 없음",
"Upload some content or sync with your devices!" : "파일을 업로드하거나 장치와 동기화하십시오!",
diff --git a/apps/files/l10n/ko.json b/apps/files/l10n/ko.json
index fa7e7f06c90..1702efc58fa 100644
--- a/apps/files/l10n/ko.json
+++ b/apps/files/l10n/ko.json
@@ -104,7 +104,6 @@
"Missing permissions to edit from here." : "여기에서 편집할 권한이 없습니다.",
"Settings" : "설정",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "WebDAV로 파일에 접근하려면 <a href=\"%s\" target=\"_blank\">이 주소를 사용하십시오</a>",
"Cancel upload" : "업로드 취소",
"No files in here" : "여기에 파일 없음",
"Upload some content or sync with your devices!" : "파일을 업로드하거나 장치와 동기화하십시오!",
diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js
index 6e33b1ac7cc..958cc833b96 100644
--- a/apps/files/l10n/lt_LT.js
+++ b/apps/files/l10n/lt_LT.js
@@ -105,7 +105,6 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Draudžiama iš čia redaguoti",
"Settings" : "Nustatymai",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Naudokite šį adresą, kad <a href=\"%s\" target=\"_blank\">pasiektumėte savo failus per WebDAV</a>",
"Cancel upload" : "Atšaukti siuntimą",
"No files in here" : "Čia nėra failų",
"Upload some content or sync with your devices!" : "Įkelkite kokį nors turinį, arba sinchronizuokite su savo įrenginiais!",
diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json
index 0d32d1dbb2a..6613ea4e6ad 100644
--- a/apps/files/l10n/lt_LT.json
+++ b/apps/files/l10n/lt_LT.json
@@ -103,7 +103,6 @@
"Missing permissions to edit from here." : "Draudžiama iš čia redaguoti",
"Settings" : "Nustatymai",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Naudokite šį adresą, kad <a href=\"%s\" target=\"_blank\">pasiektumėte savo failus per WebDAV</a>",
"Cancel upload" : "Atšaukti siuntimą",
"No files in here" : "Čia nėra failų",
"Upload some content or sync with your devices!" : "Įkelkite kokį nors turinį, arba sinchronizuokite su savo įrenginiais!",
diff --git a/apps/files/l10n/lv.js b/apps/files/l10n/lv.js
index f5533fd8995..9efd5f087cd 100644
--- a/apps/files/l10n/lv.js
+++ b/apps/files/l10n/lv.js
@@ -81,7 +81,6 @@ OC.L10N.register(
"Save" : "Saglabāt",
"Settings" : "Iestatījumi",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Izmantojot šo adresi, <a href=\"%s\" target=\"_blank\">piekļūstiet saviem failiem, izmantojot WebDAV</a>",
"Cancel upload" : "Atcelt augšupielādi",
"Upload some content or sync with your devices!" : "Augšupielādē kaut ko vai sinhronizē saturu ar savām ierīcēm!",
"No entries found in this folder" : "Šajā mapē nekas nav atrasts",
diff --git a/apps/files/l10n/lv.json b/apps/files/l10n/lv.json
index 18189049ed8..685801c471f 100644
--- a/apps/files/l10n/lv.json
+++ b/apps/files/l10n/lv.json
@@ -79,7 +79,6 @@
"Save" : "Saglabāt",
"Settings" : "Iestatījumi",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Izmantojot šo adresi, <a href=\"%s\" target=\"_blank\">piekļūstiet saviem failiem, izmantojot WebDAV</a>",
"Cancel upload" : "Atcelt augšupielādi",
"Upload some content or sync with your devices!" : "Augšupielādē kaut ko vai sinhronizē saturu ar savām ierīcēm!",
"No entries found in this folder" : "Šajā mapē nekas nav atrasts",
diff --git a/apps/files/l10n/nb_NO.js b/apps/files/l10n/nb_NO.js
index 4b4a9e19273..b1b83d36c29 100644
--- a/apps/files/l10n/nb_NO.js
+++ b/apps/files/l10n/nb_NO.js
@@ -39,7 +39,7 @@ OC.L10N.register(
"Unshare" : "Avslutt deling",
"Details" : "Detaljer",
"Select" : "Velg",
- "Pending" : "Ventende",
+ "Pending" : "Venter",
"Unable to determine date" : "Kan ikke fastslå datoen",
"This operation is forbidden" : "Operasjonen er forbudt",
"This directory is unavailable, please check the logs or contact the administrator" : "Denne mappen er utilgjengelig. Sjekk loggene eller kontakt administrator",
@@ -106,7 +106,6 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Manglende rettigheter til å redigere herfra.",
"Settings" : "Innstillinger",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Bruk denne adressen for å <a href=\"%s\" target=\"_blank\">få tilgang til filene dine via WebDAV</a>",
"Cancel upload" : "Avbryt opplasting",
"No files in here" : "Ingen filer her",
"Upload some content or sync with your devices!" : "Last opp noe innhold eller synkroniser med enhetene dine!",
diff --git a/apps/files/l10n/nb_NO.json b/apps/files/l10n/nb_NO.json
index f3b0021dbbf..fc0958dce74 100644
--- a/apps/files/l10n/nb_NO.json
+++ b/apps/files/l10n/nb_NO.json
@@ -37,7 +37,7 @@
"Unshare" : "Avslutt deling",
"Details" : "Detaljer",
"Select" : "Velg",
- "Pending" : "Ventende",
+ "Pending" : "Venter",
"Unable to determine date" : "Kan ikke fastslå datoen",
"This operation is forbidden" : "Operasjonen er forbudt",
"This directory is unavailable, please check the logs or contact the administrator" : "Denne mappen er utilgjengelig. Sjekk loggene eller kontakt administrator",
@@ -104,7 +104,6 @@
"Missing permissions to edit from here." : "Manglende rettigheter til å redigere herfra.",
"Settings" : "Innstillinger",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Bruk denne adressen for å <a href=\"%s\" target=\"_blank\">få tilgang til filene dine via WebDAV</a>",
"Cancel upload" : "Avbryt opplasting",
"No files in here" : "Ingen filer her",
"Upload some content or sync with your devices!" : "Last opp noe innhold eller synkroniser med enhetene dine!",
diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js
index 58c06acbe53..45f435806bc 100644
--- a/apps/files/l10n/nl.js
+++ b/apps/files/l10n/nl.js
@@ -105,7 +105,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Ontbrekende rechten om vanaf hier te bewerken.",
"Settings" : "Instellingen",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gebruik deze link <a href=\"%s\" target=\"_blank\">om uw bestanden via WebDAV te benaderen</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Gebruik deze link <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">om uw bestanden via WebDAV te benaderen</a>",
"Cancel upload" : "Upload afbreken",
"No files in here" : "Hier geen bestanden",
"Upload some content or sync with your devices!" : "Upload bestanden of synchroniseer met uw apparaten!",
diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json
index 9c94151fb4c..1c0990e3394 100644
--- a/apps/files/l10n/nl.json
+++ b/apps/files/l10n/nl.json
@@ -103,7 +103,7 @@
"Missing permissions to edit from here." : "Ontbrekende rechten om vanaf hier te bewerken.",
"Settings" : "Instellingen",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gebruik deze link <a href=\"%s\" target=\"_blank\">om uw bestanden via WebDAV te benaderen</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Gebruik deze link <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">om uw bestanden via WebDAV te benaderen</a>",
"Cancel upload" : "Upload afbreken",
"No files in here" : "Hier geen bestanden",
"Upload some content or sync with your devices!" : "Upload bestanden of synchroniseer met uw apparaten!",
diff --git a/apps/files/l10n/oc.js b/apps/files/l10n/oc.js
index 6fde5981b12..567e3bfa6f5 100644
--- a/apps/files/l10n/oc.js
+++ b/apps/files/l10n/oc.js
@@ -105,7 +105,6 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Manca de permissions per editar a partir d'aicí.",
"Settings" : "Paramètres",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilizatz aquesta adreça per <a href=\"%s\" target=\"_blank\">accedir a vòstres fichièrs per WebDAV</a>",
"Cancel upload" : "Anullar lo mandadís",
"No files in here" : "Pas cap de fichièr aicí",
"Upload some content or sync with your devices!" : "Depausatz de contengut o sincronizatz vòstres aparelhs !",
diff --git a/apps/files/l10n/oc.json b/apps/files/l10n/oc.json
index 37b2fc5f452..a6e32c220ab 100644
--- a/apps/files/l10n/oc.json
+++ b/apps/files/l10n/oc.json
@@ -103,7 +103,6 @@
"Missing permissions to edit from here." : "Manca de permissions per editar a partir d'aicí.",
"Settings" : "Paramètres",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilizatz aquesta adreça per <a href=\"%s\" target=\"_blank\">accedir a vòstres fichièrs per WebDAV</a>",
"Cancel upload" : "Anullar lo mandadís",
"No files in here" : "Pas cap de fichièr aicí",
"Upload some content or sync with your devices!" : "Depausatz de contengut o sincronizatz vòstres aparelhs !",
diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js
index 91a4cf9a389..ae77a698287 100644
--- a/apps/files/l10n/pl.js
+++ b/apps/files/l10n/pl.js
@@ -85,7 +85,6 @@ OC.L10N.register(
"Save" : "Zapisz",
"Settings" : "Ustawienia",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Użyj tego adresu do <a href=\"%s\" target=\"_blank\">dostępu do twoich plików przez WebDAV</a>",
"Cancel upload" : "Anuluj wysyłanie",
"No files in here" : "Brak plików",
"No entries found in this folder" : "Brak wpisów w tym folderze",
diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json
index e6f02590b5b..31eb9ac8cc4 100644
--- a/apps/files/l10n/pl.json
+++ b/apps/files/l10n/pl.json
@@ -83,7 +83,6 @@
"Save" : "Zapisz",
"Settings" : "Ustawienia",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Użyj tego adresu do <a href=\"%s\" target=\"_blank\">dostępu do twoich plików przez WebDAV</a>",
"Cancel upload" : "Anuluj wysyłanie",
"No files in here" : "Brak plików",
"No entries found in this folder" : "Brak wpisów w tym folderze",
diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js
index 4af02942fb1..fa05c516166 100644
--- a/apps/files/l10n/pt_BR.js
+++ b/apps/files/l10n/pt_BR.js
@@ -106,7 +106,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Faltando permissões para editar a partir daqui.",
"Settings" : "Configurações",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use este endereço <a href=\"%s\" target=\"_blank\">para ter acesso aos seus Arquivos via WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Use este endereço <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">para acessar seus Arquivos via WebDAV</a>",
"Cancel upload" : "Cancelar envio",
"No files in here" : "Nenhum arquivo aqui",
"Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com seus dispositivos!",
diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json
index 71ca647a90d..eb2426495eb 100644
--- a/apps/files/l10n/pt_BR.json
+++ b/apps/files/l10n/pt_BR.json
@@ -104,7 +104,7 @@
"Missing permissions to edit from here." : "Faltando permissões para editar a partir daqui.",
"Settings" : "Configurações",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use este endereço <a href=\"%s\" target=\"_blank\">para ter acesso aos seus Arquivos via WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Use este endereço <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">para acessar seus Arquivos via WebDAV</a>",
"Cancel upload" : "Cancelar envio",
"No files in here" : "Nenhum arquivo aqui",
"Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com seus dispositivos!",
diff --git a/apps/files/l10n/pt_PT.js b/apps/files/l10n/pt_PT.js
index 98ecabe7e47..ae1f1a8d11d 100644
--- a/apps/files/l10n/pt_PT.js
+++ b/apps/files/l10n/pt_PT.js
@@ -106,7 +106,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Faltam permissões para editar a partir daqui.",
"Settings" : "Definições",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilize esta ligação para <a href=\"%s\" target=\"_blank\">aceder aos seus ficheiros via WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Utilize esta ligação para <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">aceder aos seus ficheiros via WebDAV</a>",
"Cancel upload" : "Cancelar o envio",
"No files in here" : "Nenhuns ficheiros aqui",
"Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com os seus aparelhos!",
diff --git a/apps/files/l10n/pt_PT.json b/apps/files/l10n/pt_PT.json
index 8277852b5be..345840ffa39 100644
--- a/apps/files/l10n/pt_PT.json
+++ b/apps/files/l10n/pt_PT.json
@@ -104,7 +104,7 @@
"Missing permissions to edit from here." : "Faltam permissões para editar a partir daqui.",
"Settings" : "Definições",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilize esta ligação para <a href=\"%s\" target=\"_blank\">aceder aos seus ficheiros via WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Utilize esta ligação para <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">aceder aos seus ficheiros via WebDAV</a>",
"Cancel upload" : "Cancelar o envio",
"No files in here" : "Nenhuns ficheiros aqui",
"Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com os seus aparelhos!",
diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js
index bd869ce56d6..f9cbc9542f3 100644
--- a/apps/files/l10n/ro.js
+++ b/apps/files/l10n/ro.js
@@ -76,7 +76,6 @@ OC.L10N.register(
"Save" : "Salvează",
"Settings" : "Setări",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Folosește această adresă <a href=\"%s\" target=\"_blank\">pentru acces la fișierele tale folosind WebDAV</a>",
"Cancel upload" : "Anulează încărcarea",
"Select all" : "Selectează tot",
"Upload too large" : "Fișierul încărcat este prea mare",
diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json
index b842342a09a..bae42dd57b4 100644
--- a/apps/files/l10n/ro.json
+++ b/apps/files/l10n/ro.json
@@ -74,7 +74,6 @@
"Save" : "Salvează",
"Settings" : "Setări",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Folosește această adresă <a href=\"%s\" target=\"_blank\">pentru acces la fișierele tale folosind WebDAV</a>",
"Cancel upload" : "Anulează încărcarea",
"Select all" : "Selectează tot",
"Upload too large" : "Fișierul încărcat este prea mare",
diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js
index d5954cc4147..183953629a2 100644
--- a/apps/files/l10n/ru.js
+++ b/apps/files/l10n/ru.js
@@ -106,7 +106,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Отсутствуют права на удаление.",
"Settings" : "Настройки",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Используйте этот адрес для <a href=\"%s\" target=\"_blank\">доступа файлам через WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Используйте этот адрес для <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">для доступа к вашим файлам по WebDAV</a>",
"Cancel upload" : "Отменить загрузку",
"No files in here" : "Здесь нет файлов",
"Upload some content or sync with your devices!" : "Загрузите что-нибудь или синхронизируйте со своими устройствами!",
diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json
index 9ec3788fb5e..f75736df6ba 100644
--- a/apps/files/l10n/ru.json
+++ b/apps/files/l10n/ru.json
@@ -104,7 +104,7 @@
"Missing permissions to edit from here." : "Отсутствуют права на удаление.",
"Settings" : "Настройки",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Используйте этот адрес для <a href=\"%s\" target=\"_blank\">доступа файлам через WebDAV</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Используйте этот адрес для <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">для доступа к вашим файлам по WebDAV</a>",
"Cancel upload" : "Отменить загрузку",
"No files in here" : "Здесь нет файлов",
"Upload some content or sync with your devices!" : "Загрузите что-нибудь или синхронизируйте со своими устройствами!",
diff --git a/apps/files/l10n/sk_SK.js b/apps/files/l10n/sk_SK.js
index 52711dd9c7b..3fc39663934 100644
--- a/apps/files/l10n/sk_SK.js
+++ b/apps/files/l10n/sk_SK.js
@@ -89,7 +89,6 @@ OC.L10N.register(
"Save" : "Uložiť",
"Settings" : "Nastavenia",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použite túto linku <a href=\"%s\" target=\"_blank\">pre prístup k vašim súborom cez WebDAV</a>",
"Cancel upload" : "Zrušiť nahrávanie",
"No files in here" : "Nie sú tu žiadne súbory",
"Upload some content or sync with your devices!" : "Nahrajte nejaký obsah alebo synchronizujte zo svojimi zariadeniami!",
diff --git a/apps/files/l10n/sk_SK.json b/apps/files/l10n/sk_SK.json
index ca371eb189c..5a672616260 100644
--- a/apps/files/l10n/sk_SK.json
+++ b/apps/files/l10n/sk_SK.json
@@ -87,7 +87,6 @@
"Save" : "Uložiť",
"Settings" : "Nastavenia",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použite túto linku <a href=\"%s\" target=\"_blank\">pre prístup k vašim súborom cez WebDAV</a>",
"Cancel upload" : "Zrušiť nahrávanie",
"No files in here" : "Nie sú tu žiadne súbory",
"Upload some content or sync with your devices!" : "Nahrajte nejaký obsah alebo synchronizujte zo svojimi zariadeniami!",
diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js
index 2c6c38892b2..be0457c9b9a 100644
--- a/apps/files/l10n/sl.js
+++ b/apps/files/l10n/sl.js
@@ -106,7 +106,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Ni ustreznih dovoljenj za urejanje na tej ravni.",
"Settings" : "Nastavitve",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Uporabite naslov <a href=\"%s\" target=\"_blank\"> za dostop do datotek peko sistema WebDAV</a>.",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Uporabite naslov <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\"> za dostop do datotek prek sistema WebDAV</a>.",
"Cancel upload" : "Prekliči pošiljanje",
"No files in here" : "V mapi ni datotek",
"Upload some content or sync with your devices!" : "Uvozite vsebino ali pa omogočite usklajevanje z napravami!",
diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json
index 8d5b4002a13..4f2cf82b46b 100644
--- a/apps/files/l10n/sl.json
+++ b/apps/files/l10n/sl.json
@@ -104,7 +104,7 @@
"Missing permissions to edit from here." : "Ni ustreznih dovoljenj za urejanje na tej ravni.",
"Settings" : "Nastavitve",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Uporabite naslov <a href=\"%s\" target=\"_blank\"> za dostop do datotek peko sistema WebDAV</a>.",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Uporabite naslov <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\"> za dostop do datotek prek sistema WebDAV</a>.",
"Cancel upload" : "Prekliči pošiljanje",
"No files in here" : "V mapi ni datotek",
"Upload some content or sync with your devices!" : "Uvozite vsebino ali pa omogočite usklajevanje z napravami!",
diff --git a/apps/files/l10n/sq.js b/apps/files/l10n/sq.js
index 0f5d5abdd42..d1c07c62025 100644
--- a/apps/files/l10n/sq.js
+++ b/apps/files/l10n/sq.js
@@ -106,7 +106,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Mungojnë lejet për përpunim që nga këtu.",
"Settings" : "Rregullime",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\">të hyrë te Kartelat tuaja përmes WebDAV-it</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">të hyrë te Kartelat tuaja përmes WebDAV-it</a>",
"Cancel upload" : "Anuloje ngarkimin",
"No files in here" : "S’ka kartela këtu",
"Upload some content or sync with your devices!" : "Ngarkoni ca lëndë ose bëni njëkohësim me pajisjet tuaja!",
diff --git a/apps/files/l10n/sq.json b/apps/files/l10n/sq.json
index 56025d47807..40e8a3bb4ac 100644
--- a/apps/files/l10n/sq.json
+++ b/apps/files/l10n/sq.json
@@ -104,7 +104,7 @@
"Missing permissions to edit from here." : "Mungojnë lejet për përpunim që nga këtu.",
"Settings" : "Rregullime",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\">të hyrë te Kartelat tuaja përmes WebDAV-it</a>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">të hyrë te Kartelat tuaja përmes WebDAV-it</a>",
"Cancel upload" : "Anuloje ngarkimin",
"No files in here" : "S’ka kartela këtu",
"Upload some content or sync with your devices!" : "Ngarkoni ca lëndë ose bëni njëkohësim me pajisjet tuaja!",
diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js
index fbfa08ecf86..b906d9cdeb6 100644
--- a/apps/files/l10n/sr.js
+++ b/apps/files/l10n/sr.js
@@ -92,7 +92,6 @@ OC.L10N.register(
"Save" : "Сачувај",
"Settings" : "Поставке",
"WebDAV" : "ВебДАВ",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Користите ову адресу да <a href=\"%s\" target=\"_blank\"> приступите фајловима преко ВебДАВ-а</a>",
"Cancel upload" : "Откажи отпремање",
"No files in here" : "Овде нема фајлова",
"Upload some content or sync with your devices!" : "Отпремите неки садржај или синхронизујте са вашим уређајима!",
diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json
index d231c5416c8..fa9a4b42b47 100644
--- a/apps/files/l10n/sr.json
+++ b/apps/files/l10n/sr.json
@@ -90,7 +90,6 @@
"Save" : "Сачувај",
"Settings" : "Поставке",
"WebDAV" : "ВебДАВ",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Користите ову адресу да <a href=\"%s\" target=\"_blank\"> приступите фајловима преко ВебДАВ-а</a>",
"Cancel upload" : "Откажи отпремање",
"No files in here" : "Овде нема фајлова",
"Upload some content or sync with your devices!" : "Отпремите неки садржај или синхронизујте са вашим уређајима!",
diff --git a/apps/files/l10n/sr@latin.js b/apps/files/l10n/sr@latin.js
index 7c62a464494..6d6e3dfd414 100644
--- a/apps/files/l10n/sr@latin.js
+++ b/apps/files/l10n/sr@latin.js
@@ -81,7 +81,6 @@ OC.L10N.register(
"Save" : "Sačuvaj",
"Settings" : "Postavke",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Koristite ovu adresu da <a href=\"%s\" target=\"_blank\"> pristupite fajlovima preko WebDAV-a</a>",
"Cancel upload" : "Otkaži otpremanje",
"No files in here" : "Ovde nema fajlova",
"Upload some content or sync with your devices!" : "Otpremite neki sadržaj ili sinhronizujte sa vašim uređajima!",
diff --git a/apps/files/l10n/sr@latin.json b/apps/files/l10n/sr@latin.json
index 506ae677ca4..29798adf208 100644
--- a/apps/files/l10n/sr@latin.json
+++ b/apps/files/l10n/sr@latin.json
@@ -79,7 +79,6 @@
"Save" : "Sačuvaj",
"Settings" : "Postavke",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Koristite ovu adresu da <a href=\"%s\" target=\"_blank\"> pristupite fajlovima preko WebDAV-a</a>",
"Cancel upload" : "Otkaži otpremanje",
"No files in here" : "Ovde nema fajlova",
"Upload some content or sync with your devices!" : "Otpremite neki sadržaj ili sinhronizujte sa vašim uređajima!",
diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js
index 1ad6ebade5f..95bbf36253b 100644
--- a/apps/files/l10n/sv.js
+++ b/apps/files/l10n/sv.js
@@ -106,7 +106,6 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Saknar rättigheter att ändra härifrån.",
"Settings" : "Inställningar",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Använd denna adress till <a href=\"%s\" target=\"_blank\">nå dina Filer via WebDAV</a>",
"Cancel upload" : "Avbryt uppladdning",
"No files in here" : "Inga filer kunde hittas",
"Upload some content or sync with your devices!" : "Ladda upp innehåll eller synkronisera med dina enheter!",
diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json
index 37d62ecd885..484d6630fa0 100644
--- a/apps/files/l10n/sv.json
+++ b/apps/files/l10n/sv.json
@@ -104,7 +104,6 @@
"Missing permissions to edit from here." : "Saknar rättigheter att ändra härifrån.",
"Settings" : "Inställningar",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Använd denna adress till <a href=\"%s\" target=\"_blank\">nå dina Filer via WebDAV</a>",
"Cancel upload" : "Avbryt uppladdning",
"No files in here" : "Inga filer kunde hittas",
"Upload some content or sync with your devices!" : "Ladda upp innehåll eller synkronisera med dina enheter!",
diff --git a/apps/files/l10n/th_TH.js b/apps/files/l10n/th_TH.js
index d4bd37cb1e7..ba1871f1682 100644
--- a/apps/files/l10n/th_TH.js
+++ b/apps/files/l10n/th_TH.js
@@ -105,7 +105,6 @@ OC.L10N.register(
"Missing permissions to edit from here." : "สิทธิ์ในการแก้ไขส่วนนี้หายไป",
"Settings" : "ตั้งค่า",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "ใช้ที่อยู่นี้เพื่อ <a href=\"%s\" target=\"_blank\">เข้าถึงไฟล์ของคุณผ่าน WebDAV</a>",
"Cancel upload" : "ยกเลิกการอัพโหลด",
"No files in here" : "ไม่มีไฟล์ที่นี่",
"Upload some content or sync with your devices!" : "อัพโหลดเนื้อหาบางส่วนหรือประสานข้อมูลกับอุปกรณ์ของคุณ! อีกครั้ง",
diff --git a/apps/files/l10n/th_TH.json b/apps/files/l10n/th_TH.json
index 03d6c6adb76..73d88b544c9 100644
--- a/apps/files/l10n/th_TH.json
+++ b/apps/files/l10n/th_TH.json
@@ -103,7 +103,6 @@
"Missing permissions to edit from here." : "สิทธิ์ในการแก้ไขส่วนนี้หายไป",
"Settings" : "ตั้งค่า",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "ใช้ที่อยู่นี้เพื่อ <a href=\"%s\" target=\"_blank\">เข้าถึงไฟล์ของคุณผ่าน WebDAV</a>",
"Cancel upload" : "ยกเลิกการอัพโหลด",
"No files in here" : "ไม่มีไฟล์ที่นี่",
"Upload some content or sync with your devices!" : "อัพโหลดเนื้อหาบางส่วนหรือประสานข้อมูลกับอุปกรณ์ของคุณ! อีกครั้ง",
diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js
index 7e0b3f17327..d5b7a5bfe36 100644
--- a/apps/files/l10n/tr.js
+++ b/apps/files/l10n/tr.js
@@ -28,6 +28,7 @@ OC.L10N.register(
"Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} bir dizin veya 0 bayt olduğundan yüklenemedi",
"Total file size {size1} exceeds upload limit {size2}" : "Toplam dosya boyutu {size1}, {size2} gönderme sınırını aşıyor",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Yeterince boş alan yok. Gönderdiğiniz boyut {size1} ancak {size2} alan mevcut",
+ "Error uploading file \"{fileName}\": {message}" : "\"{fileName}\" dosyası yüklenirken hata: {message}",
"Could not get result from server." : "Sunucudan sonuç alınamadı.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Dosya yükleme işlemi sürüyor. Şu anda sayfadan ayrılmak yükleme işlemini iptal edecek.",
"Actions" : "Eylemler",
@@ -105,7 +106,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Buradan düzenleme için eksik yetki.",
"Settings" : "Ayarlar",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">Dosyalarınıza WebDAV aracılığıyla erişmek için</a> bu adresi kullanın",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Dosyalarınıza WebDAV ile erişmek için <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">bu adresi kullanın</a>",
"Cancel upload" : "Yüklemeyi iptal et",
"No files in here" : "Burada hiç dosya yok",
"Upload some content or sync with your devices!" : "Bir şeyler yükleyin veya aygıtlarınızla eşitleyin!",
diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json
index 87f3b063df1..1be304f7c3b 100644
--- a/apps/files/l10n/tr.json
+++ b/apps/files/l10n/tr.json
@@ -26,6 +26,7 @@
"Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} bir dizin veya 0 bayt olduğundan yüklenemedi",
"Total file size {size1} exceeds upload limit {size2}" : "Toplam dosya boyutu {size1}, {size2} gönderme sınırını aşıyor",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Yeterince boş alan yok. Gönderdiğiniz boyut {size1} ancak {size2} alan mevcut",
+ "Error uploading file \"{fileName}\": {message}" : "\"{fileName}\" dosyası yüklenirken hata: {message}",
"Could not get result from server." : "Sunucudan sonuç alınamadı.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Dosya yükleme işlemi sürüyor. Şu anda sayfadan ayrılmak yükleme işlemini iptal edecek.",
"Actions" : "Eylemler",
@@ -103,7 +104,7 @@
"Missing permissions to edit from here." : "Buradan düzenleme için eksik yetki.",
"Settings" : "Ayarlar",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">Dosyalarınıza WebDAV aracılığıyla erişmek için</a> bu adresi kullanın",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Dosyalarınıza WebDAV ile erişmek için <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">bu adresi kullanın</a>",
"Cancel upload" : "Yüklemeyi iptal et",
"No files in here" : "Burada hiç dosya yok",
"Upload some content or sync with your devices!" : "Bir şeyler yükleyin veya aygıtlarınızla eşitleyin!",
diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js
index f41baa183f5..43700de436d 100644
--- a/apps/files/l10n/uk.js
+++ b/apps/files/l10n/uk.js
@@ -84,7 +84,6 @@ OC.L10N.register(
"Save" : "Зберегти",
"Settings" : "Налаштування",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Для доступу до файлів через WebDAV використовуйте <a href=\"%s\" target=\"_blank\">це посилання</a>",
"Cancel upload" : "Скасувати вивантаження",
"No files in here" : "Тут немає файлів",
"Upload some content or sync with your devices!" : "Вивантажте щось або синхронізуйте з пристроями!",
diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json
index 86acf1b8b60..039cd449bfe 100644
--- a/apps/files/l10n/uk.json
+++ b/apps/files/l10n/uk.json
@@ -82,7 +82,6 @@
"Save" : "Зберегти",
"Settings" : "Налаштування",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Для доступу до файлів через WebDAV використовуйте <a href=\"%s\" target=\"_blank\">це посилання</a>",
"Cancel upload" : "Скасувати вивантаження",
"No files in here" : "Тут немає файлів",
"Upload some content or sync with your devices!" : "Вивантажте щось або синхронізуйте з пристроями!",
diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js
index faf803c704e..60a7a990f27 100644
--- a/apps/files/l10n/zh_CN.js
+++ b/apps/files/l10n/zh_CN.js
@@ -106,7 +106,6 @@ OC.L10N.register(
"Missing permissions to edit from here." : "没有从这里进行编辑的权限",
"Settings" : "设置",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "使用这个地址 <a href=\"%s\" target=\"_blank\">通过 WebDAV 访问您的文件</a>",
"Cancel upload" : "取消上传",
"No files in here" : "无文件",
"Upload some content or sync with your devices!" : "上传一些内容或者与设备同步!",
diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json
index 96aa0bb6f13..30b6ad1b78d 100644
--- a/apps/files/l10n/zh_CN.json
+++ b/apps/files/l10n/zh_CN.json
@@ -104,7 +104,6 @@
"Missing permissions to edit from here." : "没有从这里进行编辑的权限",
"Settings" : "设置",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "使用这个地址 <a href=\"%s\" target=\"_blank\">通过 WebDAV 访问您的文件</a>",
"Cancel upload" : "取消上传",
"No files in here" : "无文件",
"Upload some content or sync with your devices!" : "上传一些内容或者与设备同步!",
diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js
index 0f013be694f..9ae73b2195d 100644
--- a/apps/files/l10n/zh_TW.js
+++ b/apps/files/l10n/zh_TW.js
@@ -105,7 +105,6 @@ OC.L10N.register(
"Missing permissions to edit from here." : "您沒有在此編輯的權限",
"Settings" : "設定",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "使用這個地址<a href=\"%s\" target=\"_blank\">來透過 WebDAV 存取檔案</a>",
"Cancel upload" : "取消上傳",
"No files in here" : "沒有任何檔案",
"Upload some content or sync with your devices!" : "在您的裝置中同步或上傳一些內容",
diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json
index 1258145c71f..1187ffa9c24 100644
--- a/apps/files/l10n/zh_TW.json
+++ b/apps/files/l10n/zh_TW.json
@@ -103,7 +103,6 @@
"Missing permissions to edit from here." : "您沒有在此編輯的權限",
"Settings" : "設定",
"WebDAV" : "WebDAV",
- "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "使用這個地址<a href=\"%s\" target=\"_blank\">來透過 WebDAV 存取檔案</a>",
"Cancel upload" : "取消上傳",
"No files in here" : "沒有任何檔案",
"Upload some content or sync with your devices!" : "在您的裝置中同步或上傳一些內容",
diff --git a/apps/files/service/tagservice.php b/apps/files/service/tagservice.php
index e1425c46615..57cad43a539 100644
--- a/apps/files/service/tagservice.php
+++ b/apps/files/service/tagservice.php
@@ -25,6 +25,7 @@
namespace OCA\Files\Service;
use OC\Files\FileInfo;
+use OCP\Files\Node;
/**
* Service class to manage tags on files.
@@ -93,7 +94,7 @@ class TagService {
* Get all files for the given tag
*
* @param string $tagName tag name to filter by
- * @return FileInfo[] list of matching files
+ * @return Node[] list of matching files
* @throws \Exception if the tag does not exist
*/
public function getFilesByTag($tagName) {
@@ -103,15 +104,11 @@ class TagService {
return [];
}
- $fileInfos = [];
+ $allNodes = [];
foreach ($fileIds as $fileId) {
- $nodes = $this->homeFolder->getById((int) $fileId);
- foreach ($nodes as $node) {
- /** @var \OC\Files\Node\Node $node */
- $fileInfos[] = $node->getFileInfo();
- }
+ $allNodes = array_merge($allNodes, $this->homeFolder->getById((int) $fileId));
}
- return $fileInfos;
+ return $allNodes;
}
}
diff --git a/apps/files/templates/appnavigation.php b/apps/files/templates/appnavigation.php
index d05a02ee7db..39a5875f3d0 100644
--- a/apps/files/templates/appnavigation.php
+++ b/apps/files/templates/appnavigation.php
@@ -18,7 +18,7 @@
<div id="app-settings-content">
<label for="webdavurl"><?php p($l->t('WebDAV'));?></label>
<input id="webdavurl" type="text" readonly="readonly" value="<?php p(\OCP\Util::linkToRemote('webdav')); ?>" />
- <em><?php print_unescaped($l->t('Use this address to <a href="%s" target="_blank">access your Files via WebDAV</a>', array(link_to_docs('user-webdav'))));?></em>
+ <em><?php print_unescaped($l->t('Use this address to <a href="%s" target="_blank" rel="noreferrer">access your Files via WebDAV</a>', array(link_to_docs('user-webdav'))));?></em>
</div>
</div>
</div>
diff --git a/apps/files/tests/controller/apicontrollertest.php b/apps/files/tests/controller/apicontrollertest.php
index 6fb8340ead8..a9b248a36fe 100644
--- a/apps/files/tests/controller/apicontrollertest.php
+++ b/apps/files/tests/controller/apicontrollertest.php
@@ -51,14 +51,27 @@ class ApiControllerTest extends TestCase {
private $preview;
/** @var ApiController */
private $apiController;
+ /** @var \OCP\Share\IManager */
+ private $shareManager;
public function setUp() {
$this->request = $this->getMockBuilder('\OCP\IRequest')
->disableOriginalConstructor()
->getMock();
+ $user = $this->getMock('\OCP\IUser');
+ $user->expects($this->any())
+ ->method('getUID')
+ ->will($this->returnValue('user1'));
+ $userSession = $this->getMock('\OCP\IUserSession');
+ $userSession->expects($this->any())
+ ->method('getUser')
+ ->will($this->returnValue($user));
$this->tagService = $this->getMockBuilder('\OCA\Files\Service\TagService')
->disableOriginalConstructor()
->getMock();
+ $this->shareManager = $this->getMockBuilder('\OCP\Share\IManager')
+ ->disableOriginalConstructor()
+ ->getMock();
$this->preview = $this->getMockBuilder('\OCP\IPreview')
->disableOriginalConstructor()
->getMock();
@@ -66,8 +79,10 @@ class ApiControllerTest extends TestCase {
$this->apiController = new ApiController(
$this->appName,
$this->request,
+ $userSession,
$this->tagService,
- $this->preview
+ $this->preview,
+ $this->shareManager
);
}
@@ -101,10 +116,32 @@ class ApiControllerTest extends TestCase {
->disableOriginalConstructor()
->getMock()
);
+ $node = $this->getMockBuilder('\OC\Files\Node\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node->expects($this->once())
+ ->method('getFileInfo')
+ ->will($this->returnValue($fileInfo));
$this->tagService->expects($this->once())
->method('getFilesByTag')
->with($this->equalTo([$tagName]))
- ->will($this->returnValue([$fileInfo]));
+ ->will($this->returnValue([$node]));
+
+ $this->shareManager->expects($this->any())
+ ->method('getSharesBy')
+ ->with(
+ $this->equalTo('user1'),
+ $this->anything(),
+ $node,
+ $this->equalTo(false),
+ $this->equalTo(1)
+ )
+ ->will($this->returnCallback(function($userId, $shareType) {
+ if ($shareType === \OCP\Share::SHARE_TYPE_USER || $shareType === \OCP\Share::SHARE_TYPE_LINK) {
+ return ['dummy_share'];
+ }
+ return [];
+ }));
$expected = new DataResponse([
'files' => [
@@ -124,6 +161,7 @@ class ApiControllerTest extends TestCase {
'MyTagName'
]
],
+ 'shareTypes' => [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_LINK]
],
],
]);
@@ -166,10 +204,22 @@ class ApiControllerTest extends TestCase {
->disableOriginalConstructor()
->getMock()
);
+ $node1 = $this->getMockBuilder('\OC\Files\Node\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node1->expects($this->once())
+ ->method('getFileInfo')
+ ->will($this->returnValue($fileInfo1));
+ $node2 = $this->getMockBuilder('\OC\Files\Node\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node2->expects($this->once())
+ ->method('getFileInfo')
+ ->will($this->returnValue($fileInfo2));
$this->tagService->expects($this->once())
->method('getFilesByTag')
->with($this->equalTo([$tagName]))
- ->will($this->returnValue([$fileInfo1, $fileInfo2]));
+ ->will($this->returnValue([$node1, $node2]));
$expected = new DataResponse([
'files' => [
diff --git a/apps/files_external/3rdparty/.gitignore b/apps/files_external/3rdparty/.gitignore
index c8d4e6eed0b..b56af237c35 100644
--- a/apps/files_external/3rdparty/.gitignore
+++ b/apps/files_external/3rdparty/.gitignore
@@ -2,3 +2,4 @@ example.php
icewind/smb/tests
icewind/smb/install_libsmbclient.sh
icewind/smb/.travis.yml
+icewind/streams/tests
diff --git a/apps/files_external/3rdparty/composer.json b/apps/files_external/3rdparty/composer.json
index 4c130404add..b0267ba3438 100644
--- a/apps/files_external/3rdparty/composer.json
+++ b/apps/files_external/3rdparty/composer.json
@@ -8,8 +8,8 @@
"classmap-authoritative": true
},
"require": {
- "icewind/smb": "1.0.5",
- "icewind/streams": "0.2"
+ "icewind/smb": "1.0.8",
+ "icewind/streams": "0.4"
}
}
diff --git a/apps/files_external/3rdparty/composer.lock b/apps/files_external/3rdparty/composer.lock
index 7bfb48a2c0d..13931ad757d 100644
--- a/apps/files_external/3rdparty/composer.lock
+++ b/apps/files_external/3rdparty/composer.lock
@@ -4,25 +4,25 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "hash": "669663944c7232473a1c51a6d160319d",
- "content-hash": "7612ced4391f6287fb3e50534500d217",
+ "hash": "1671a5ec7bef407432d42775f898dc34",
+ "content-hash": "9d995f0d55bee8a3b344a3c685e7b4a4",
"packages": [
{
"name": "icewind/smb",
- "version": "v1.0.5",
+ "version": "v1.0.8",
"source": {
"type": "git",
"url": "https://github.com/icewind1991/SMB.git",
- "reference": "acb94a0a85290d653cd64c883175b855ada5022f"
+ "reference": "764f3fc793a904eb937d619ad097fb076ff199cd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/icewind1991/SMB/zipball/acb94a0a85290d653cd64c883175b855ada5022f",
- "reference": "acb94a0a85290d653cd64c883175b855ada5022f",
+ "url": "https://api.github.com/repos/icewind1991/SMB/zipball/764f3fc793a904eb937d619ad097fb076ff199cd",
+ "reference": "764f3fc793a904eb937d619ad097fb076ff199cd",
"shasum": ""
},
"require": {
- "icewind/streams": "0.2.*",
+ "icewind/streams": ">=0.2.0",
"php": ">=5.3"
},
"require-dev": {
@@ -47,27 +47,28 @@
}
],
"description": "php wrapper for smbclient and libsmbclient-php",
- "time": "2016-01-20 13:12:36"
+ "time": "2016-03-17 13:29:58"
},
{
"name": "icewind/streams",
- "version": "0.2",
+ "version": "0.4.0",
"source": {
"type": "git",
"url": "https://github.com/icewind1991/Streams.git",
- "reference": "5aae45f2ddd3d1a6e2a496dd5d1e7857bfeb605a"
+ "reference": "9ca40274645a967ecc3408b0ca2e6255ead1d1d3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/icewind1991/Streams/zipball/5aae45f2ddd3d1a6e2a496dd5d1e7857bfeb605a",
- "reference": "5aae45f2ddd3d1a6e2a496dd5d1e7857bfeb605a",
+ "url": "https://api.github.com/repos/icewind1991/Streams/zipball/9ca40274645a967ecc3408b0ca2e6255ead1d1d3",
+ "reference": "9ca40274645a967ecc3408b0ca2e6255ead1d1d3",
"shasum": ""
},
"require": {
"php": ">=5.3"
},
"require-dev": {
- "satooshi/php-coveralls": "dev-master"
+ "phpunit/phpunit": "^4.8",
+ "satooshi/php-coveralls": "v1.0.0"
},
"type": "library",
"autoload": {
@@ -87,7 +88,7 @@
}
],
"description": "A set of generic stream wrappers",
- "time": "2014-07-30 23:46:15"
+ "time": "2016-03-17 12:32:25"
}
],
"packages-dev": [],
diff --git a/apps/files_external/3rdparty/composer/ClassLoader.php b/apps/files_external/3rdparty/composer/ClassLoader.php
index 5e1469e8307..ff6ecfb822f 100644
--- a/apps/files_external/3rdparty/composer/ClassLoader.php
+++ b/apps/files_external/3rdparty/composer/ClassLoader.php
@@ -13,9 +13,7 @@
namespace Composer\Autoload;
/**
- * ClassLoader implements a PSR-0 class loader
- *
- * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
*
* $loader = new \Composer\Autoload\ClassLoader();
*
@@ -39,6 +37,8 @@ namespace Composer\Autoload;
*
* @author Fabien Potencier <fabien@symfony.com>
* @author Jordi Boggiano <j.boggiano@seld.be>
+ * @see http://www.php-fig.org/psr/psr-0/
+ * @see http://www.php-fig.org/psr/psr-4/
*/
class ClassLoader
{
@@ -147,7 +147,7 @@ class ClassLoader
* appending or prepending to the ones previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
- * @param array|string $paths The PSR-0 base directories
+ * @param array|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
diff --git a/apps/files_external/3rdparty/composer/autoload_classmap.php b/apps/files_external/3rdparty/composer/autoload_classmap.php
index 5b0f2511e12..942dbce7336 100644
--- a/apps/files_external/3rdparty/composer/autoload_classmap.php
+++ b/apps/files_external/3rdparty/composer/autoload_classmap.php
@@ -52,12 +52,23 @@ return array(
'Icewind\\SMB\\TimeZoneProvider' => $vendorDir . '/icewind/smb/src/TimeZoneProvider.php',
'Icewind\\Streams\\CallbackWrapper' => $vendorDir . '/icewind/streams/src/CallbackWrapper.php',
'Icewind\\Streams\\Directory' => $vendorDir . '/icewind/streams/src/Directory.php',
+ 'Icewind\\Streams\\DirectoryFilter' => $vendorDir . '/icewind/streams/src/DirectoryFilter.php',
+ 'Icewind\\Streams\\DirectoryWrapper' => $vendorDir . '/icewind/streams/src/DirectoryWrapper.php',
'Icewind\\Streams\\File' => $vendorDir . '/icewind/streams/src/File.php',
'Icewind\\Streams\\IteratorDirectory' => $vendorDir . '/icewind/streams/src/IteratorDirectory.php',
'Icewind\\Streams\\NullWrapper' => $vendorDir . '/icewind/streams/src/NullWrapper.php',
- 'Icewind\\Streams\\Tests\\CallbackWrapper' => $vendorDir . '/icewind/streams/tests/CallbackWrapper.php',
- 'Icewind\\Streams\\Tests\\IteratorDirectory' => $vendorDir . '/icewind/streams/tests/IteratorDirectory.php',
- 'Icewind\\Streams\\Tests\\NullWrapper' => $vendorDir . '/icewind/streams/tests/NullWrapper.php',
- 'Icewind\\Streams\\Tests\\Wrapper' => $vendorDir . '/icewind/streams/tests/Wrapper.php',
+ 'Icewind\\Streams\\Path' => $vendorDir . '/icewind/streams/src/Path.php',
+ 'Icewind\\Streams\\RetryWrapper' => $vendorDir . '/icewind/streams/src/RetryWrapper.php',
+ 'Icewind\\Streams\\SeekableWrapper' => $vendorDir . '/icewind/streams/src/SeekableWrapper.php',
+ 'Icewind\\Streams\\Tests\\DirectoryFilter' => $vendorDir . '/icewind/streams/tests/DirectoryFilter.php',
+ 'Icewind\\Streams\\Tests\\DirectoryWrapper' => $vendorDir . '/icewind/streams/tests/DirectoryWrapper.php',
+ 'Icewind\\Streams\\Tests\\DirectoryWrapperDummy' => $vendorDir . '/icewind/streams/tests/DirectoryWrapper.php',
+ 'Icewind\\Streams\\Tests\\DirectoryWrapperNull' => $vendorDir . '/icewind/streams/tests/DirectoryWrapper.php',
+ 'Icewind\\Streams\\Tests\\PartialWrapper' => $vendorDir . '/icewind/streams/tests/RetryWrapper.php',
+ 'Icewind\\Streams\\Tests\\RetryWrapper' => $vendorDir . '/icewind/streams/tests/RetryWrapper.php',
+ 'Icewind\\Streams\\Tests\\SeekableWrapper' => $vendorDir . '/icewind/streams/tests/SeekableWrapper.php',
+ 'Icewind\\Streams\\Tests\\UrlCallBack' => $vendorDir . '/icewind/streams/tests/UrlCallBack.php',
+ 'Icewind\\Streams\\Url' => $vendorDir . '/icewind/streams/src/Url.php',
+ 'Icewind\\Streams\\UrlCallback' => $vendorDir . '/icewind/streams/src/UrlCallBack.php',
'Icewind\\Streams\\Wrapper' => $vendorDir . '/icewind/streams/src/Wrapper.php',
);
diff --git a/apps/files_external/3rdparty/composer/autoload_real.php b/apps/files_external/3rdparty/composer/autoload_real.php
index 9e8b3b558e5..6f27fffb9da 100644
--- a/apps/files_external/3rdparty/composer/autoload_real.php
+++ b/apps/files_external/3rdparty/composer/autoload_real.php
@@ -23,16 +23,6 @@ class ComposerAutoloaderInit98fe9b281934250b3a93f69a5ce843b3
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('ComposerAutoloaderInit98fe9b281934250b3a93f69a5ce843b3', 'loadClassLoader'));
- $map = require __DIR__ . '/autoload_namespaces.php';
- foreach ($map as $namespace => $path) {
- $loader->set($namespace, $path);
- }
-
- $map = require __DIR__ . '/autoload_psr4.php';
- foreach ($map as $namespace => $path) {
- $loader->setPsr4($namespace, $path);
- }
-
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
$loader->addClassMap($classMap);
@@ -44,8 +34,3 @@ class ComposerAutoloaderInit98fe9b281934250b3a93f69a5ce843b3
return $loader;
}
}
-
-function composerRequire98fe9b281934250b3a93f69a5ce843b3($file)
-{
- require $file;
-}
diff --git a/apps/files_external/3rdparty/composer/installed.json b/apps/files_external/3rdparty/composer/installed.json
index 6e0b5d0d8f9..48f8c555c34 100644
--- a/apps/files_external/3rdparty/composer/installed.json
+++ b/apps/files_external/3rdparty/composer/installed.json
@@ -1,26 +1,27 @@
[
{
"name": "icewind/streams",
- "version": "0.2",
- "version_normalized": "0.2.0.0",
+ "version": "0.4.0",
+ "version_normalized": "0.4.0.0",
"source": {
"type": "git",
"url": "https://github.com/icewind1991/Streams.git",
- "reference": "5aae45f2ddd3d1a6e2a496dd5d1e7857bfeb605a"
+ "reference": "9ca40274645a967ecc3408b0ca2e6255ead1d1d3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/icewind1991/Streams/zipball/5aae45f2ddd3d1a6e2a496dd5d1e7857bfeb605a",
- "reference": "5aae45f2ddd3d1a6e2a496dd5d1e7857bfeb605a",
+ "url": "https://api.github.com/repos/icewind1991/Streams/zipball/9ca40274645a967ecc3408b0ca2e6255ead1d1d3",
+ "reference": "9ca40274645a967ecc3408b0ca2e6255ead1d1d3",
"shasum": ""
},
"require": {
"php": ">=5.3"
},
"require-dev": {
- "satooshi/php-coveralls": "dev-master"
+ "phpunit/phpunit": "^4.8",
+ "satooshi/php-coveralls": "v1.0.0"
},
- "time": "2014-07-30 23:46:15",
+ "time": "2016-03-17 12:32:25",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -43,28 +44,28 @@
},
{
"name": "icewind/smb",
- "version": "v1.0.5",
- "version_normalized": "1.0.5.0",
+ "version": "v1.0.8",
+ "version_normalized": "1.0.8.0",
"source": {
"type": "git",
"url": "https://github.com/icewind1991/SMB.git",
- "reference": "acb94a0a85290d653cd64c883175b855ada5022f"
+ "reference": "764f3fc793a904eb937d619ad097fb076ff199cd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/icewind1991/SMB/zipball/acb94a0a85290d653cd64c883175b855ada5022f",
- "reference": "acb94a0a85290d653cd64c883175b855ada5022f",
+ "url": "https://api.github.com/repos/icewind1991/SMB/zipball/764f3fc793a904eb937d619ad097fb076ff199cd",
+ "reference": "764f3fc793a904eb937d619ad097fb076ff199cd",
"shasum": ""
},
"require": {
- "icewind/streams": "0.2.*",
+ "icewind/streams": ">=0.2.0",
"php": ">=5.3"
},
"require-dev": {
"phpunit/phpunit": "^4.8",
"satooshi/php-coveralls": "v1.0.0"
},
- "time": "2016-01-20 13:12:36",
+ "time": "2016-03-17 13:29:58",
"type": "library",
"installation-source": "source",
"autoload": {
diff --git a/apps/files_external/3rdparty/icewind/smb/README.md b/apps/files_external/3rdparty/icewind/smb/README.md
index a0864717b09..32f3c650f87 100644
--- a/apps/files_external/3rdparty/icewind/smb/README.md
+++ b/apps/files_external/3rdparty/icewind/smb/README.md
@@ -75,7 +75,7 @@ $share = $server->getShare('test');
$content = $share->dir('test');
foreach ($content as $info) {
- echo $name->getName() . "\n";
+ echo $info->getName() . "\n";
echo "\tsize :" . $info->getSize() . "\n";
}
```
diff --git a/apps/files_external/3rdparty/icewind/smb/composer.json b/apps/files_external/3rdparty/icewind/smb/composer.json
index 2e1fd35f7a6..4ac8b27e725 100644
--- a/apps/files_external/3rdparty/icewind/smb/composer.json
+++ b/apps/files_external/3rdparty/icewind/smb/composer.json
@@ -10,7 +10,7 @@
],
"require" : {
"php": ">=5.3",
- "icewind/streams": "0.2.*"
+ "icewind/streams": ">=0.2.0"
},
"require-dev": {
"satooshi/php-coveralls" : "v1.0.0",
diff --git a/apps/files_external/3rdparty/icewind/smb/src/NativeShare.php b/apps/files_external/3rdparty/icewind/smb/src/NativeShare.php
index 0b184fd585c..27d975514a3 100644
--- a/apps/files_external/3rdparty/icewind/smb/src/NativeShare.php
+++ b/apps/files_external/3rdparty/icewind/smb/src/NativeShare.php
@@ -239,8 +239,9 @@ class NativeShare extends AbstractShare {
*/
public function read($source) {
$this->connect();
- $handle = $this->state->open($this->buildUrl($source), 'r');
- return NativeStream::wrap($this->state, $handle, 'r');
+ $url = $this->buildUrl($source);
+ $handle = $this->state->open($url, 'r');
+ return NativeStream::wrap($this->state, $handle, 'r', $url);
}
/**
@@ -254,8 +255,9 @@ class NativeShare extends AbstractShare {
*/
public function write($source) {
$this->connect();
- $handle = $this->state->create($this->buildUrl($source));
- return NativeStream::wrap($this->state, $handle, 'w');
+ $url = $this->buildUrl($source);
+ $handle = $this->state->create($url);
+ return NativeStream::wrap($this->state, $handle, 'w', $url);
}
/**
diff --git a/apps/files_external/3rdparty/icewind/smb/src/NativeStream.php b/apps/files_external/3rdparty/icewind/smb/src/NativeStream.php
index 07bd2f1e797..481395b025a 100644
--- a/apps/files_external/3rdparty/icewind/smb/src/NativeStream.php
+++ b/apps/files_external/3rdparty/icewind/smb/src/NativeStream.php
@@ -7,6 +7,7 @@
namespace Icewind\SMB;
+use Icewind\SMB\Exception\Exception;
use Icewind\SMB\Exception\InvalidRequestException;
use Icewind\Streams\File;
@@ -32,19 +33,26 @@ class NativeStream implements File {
private $eof = false;
/**
+ * @var string
+ */
+ private $url;
+
+ /**
* Wrap a stream from libsmbclient-php into a regular php stream
*
* @param \Icewind\SMB\NativeState $state
* @param resource $smbStream
* @param string $mode
+ * @param string $url
* @return resource
*/
- public static function wrap($state, $smbStream, $mode) {
+ public static function wrap($state, $smbStream, $mode, $url) {
stream_wrapper_register('nativesmb', '\Icewind\SMB\NativeStream');
$context = stream_context_create(array(
'nativesmb' => array(
'state' => $state,
- 'handle' => $smbStream
+ 'handle' => $smbStream,
+ 'url' => $url
)
));
$fh = fopen('nativesmb://', $mode, false, $context);
@@ -68,6 +76,7 @@ class NativeStream implements File {
$context = stream_context_get_options($this->context);
$this->state = $context['nativesmb']['state'];
$this->handle = $context['nativesmb']['handle'];
+ $this->url = $context['nativesmb']['url'];
return true;
}
@@ -89,7 +98,11 @@ class NativeStream implements File {
}
public function stream_stat() {
- return $this->state->fstat($this->handle);
+ try {
+ return $this->state->stat($this->url);
+ } catch (Exception $e) {
+ return false;
+ }
}
public function stream_tell() {
diff --git a/apps/files_external/3rdparty/icewind/streams-dummy/composer.json b/apps/files_external/3rdparty/icewind/streams-dummy/composer.json
new file mode 100644
index 00000000000..ad6a6a1b1c1
--- /dev/null
+++ b/apps/files_external/3rdparty/icewind/streams-dummy/composer.json
@@ -0,0 +1,7 @@
+{
+ "name": "icewind/streams-dummy",
+ "provide": {
+ "icewind/streams": "0.2"
+ }
+}
+
diff --git a/apps/files_external/3rdparty/icewind/streams/.travis.yml b/apps/files_external/3rdparty/icewind/streams/.travis.yml
index dfa52767dda..d2e1afaad67 100644
--- a/apps/files_external/3rdparty/icewind/streams/.travis.yml
+++ b/apps/files_external/3rdparty/icewind/streams/.travis.yml
@@ -1,13 +1,14 @@
language: php
php:
- - 5.3
- 5.4
- 5.5
+ - 5.6
+ - 7.0
- hhvm
matrix:
- allow_failures:
- - php: hhvm # due to facebook/hhvm#3321
+ allow_failures:
+ - php: hhvm # due to facebook/hhvm#3321
env:
global:
diff --git a/apps/files_external/3rdparty/icewind/streams/LICENCE b/apps/files_external/3rdparty/icewind/streams/LICENCE
new file mode 100644
index 00000000000..a194b9117b8
--- /dev/null
+++ b/apps/files_external/3rdparty/icewind/streams/LICENCE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Robin Appelman
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/apps/files_external/3rdparty/icewind/streams/README.md b/apps/files_external/3rdparty/icewind/streams/README.md
index 54f6d19a560..ca13db28e44 100644
--- a/apps/files_external/3rdparty/icewind/streams/README.md
+++ b/apps/files_external/3rdparty/icewind/streams/README.md
@@ -2,6 +2,7 @@
[![Build Status](https://travis-ci.org/icewind1991/Streams.svg?branch=master)](https://travis-ci.org/icewind1991/Streams)
[![Coverage Status](https://img.shields.io/coveralls/icewind1991/Streams.svg)](https://coveralls.io/r/icewind1991/Streams?branch=master)
+[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/icewind1991/Streams/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/icewind1991/Streams/?branch=master)
Generic stream wrappers for php.
diff --git a/apps/files_external/3rdparty/icewind/streams/composer.json b/apps/files_external/3rdparty/icewind/streams/composer.json
index 86d3c834258..f2f3e0fc255 100644
--- a/apps/files_external/3rdparty/icewind/streams/composer.json
+++ b/apps/files_external/3rdparty/icewind/streams/composer.json
@@ -12,7 +12,8 @@
"php": ">=5.3"
},
"require-dev" : {
- "satooshi/php-coveralls": "dev-master"
+ "satooshi/php-coveralls": "v1.0.0",
+ "phpunit/phpunit": "^4.8"
},
"autoload" : {
"psr-4": {
diff --git a/apps/files_external/3rdparty/icewind/streams/src/CallbackWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/CallbackWrapper.php
index fd99aa6ebe8..c5847b95fdb 100644
--- a/apps/files_external/3rdparty/icewind/streams/src/CallbackWrapper.php
+++ b/apps/files_external/3rdparty/icewind/streams/src/CallbackWrapper.php
@@ -13,10 +13,11 @@ namespace Icewind\Streams;
* The following options should be passed in the context when opening the stream
* [
* 'callback' => [
- * 'source' => resource
- * 'read' => function($count){} (optional)
- * 'write' => function($data){} (optional)
- * 'close' => function(){} (optional)
+ * 'source' => resource
+ * 'read' => function($count){} (optional)
+ * 'write' => function($data){} (optional)
+ * 'close' => function(){} (optional)
+ * 'readdir' => function(){} (optional)
* ]
* ]
*
@@ -39,54 +40,56 @@ class CallbackWrapper extends Wrapper {
protected $closeCallback;
/**
+ * @var callable
+ */
+ protected $readDirCallBack;
+
+ /**
* Wraps a stream with the provided callbacks
*
* @param resource $source
* @param callable $read (optional)
* @param callable $write (optional)
* @param callable $close (optional)
+ * @param callable $readDir (optional)
* @return resource
*
* @throws \BadMethodCallException
*/
- public static function wrap($source, $read = null, $write = null, $close = null) {
+ public static function wrap($source, $read = null, $write = null, $close = null, $readDir = null) {
$context = stream_context_create(array(
'callback' => array(
'source' => $source,
'read' => $read,
'write' => $write,
- 'close' => $close
+ 'close' => $close,
+ 'readDir' => $readDir
)
));
- stream_wrapper_register('callback', '\Icewind\Streams\CallbackWrapper');
- try {
- $wrapped = fopen('callback://', 'r+', false, $context);
- } catch (\BadMethodCallException $e) {
- stream_wrapper_unregister('callback');
- throw $e;
- }
- stream_wrapper_unregister('callback');
- return $wrapped;
+ return Wrapper::wrapSource($source, $context, 'callback', '\Icewind\Streams\CallbackWrapper');
}
- public function stream_open($path, $mode, $options, &$opened_path) {
+ protected function open() {
$context = $this->loadContext('callback');
- if (isset($context['read']) and is_callable($context['read'])) {
- $this->readCallback = $context['read'];
- }
- if (isset($context['write']) and is_callable($context['write'])) {
- $this->writeCallback = $context['write'];
- }
- if (isset($context['close']) and is_callable($context['close'])) {
- $this->closeCallback = $context['close'];
- }
+ $this->readCallback = $context['read'];
+ $this->writeCallback = $context['write'];
+ $this->closeCallback = $context['close'];
+ $this->readDirCallBack = $context['readDir'];
return true;
}
+ public function dir_opendir($path, $options) {
+ return $this->open();
+ }
+
+ public function stream_open($path, $mode, $options, &$opened_path) {
+ return $this->open();
+ }
+
public function stream_read($count) {
$result = parent::stream_read($count);
- if ($this->readCallback) {
+ if (is_callable($this->readCallback)) {
call_user_func($this->readCallback, $count);
}
return $result;
@@ -94,7 +97,7 @@ class CallbackWrapper extends Wrapper {
public function stream_write($data) {
$result = parent::stream_write($data);
- if ($this->writeCallback) {
+ if (is_callable($this->writeCallback)) {
call_user_func($this->writeCallback, $data);
}
return $result;
@@ -102,9 +105,17 @@ class CallbackWrapper extends Wrapper {
public function stream_close() {
$result = parent::stream_close();
- if ($this->closeCallback) {
+ if (is_callable($this->closeCallback)) {
call_user_func($this->closeCallback);
}
return $result;
}
+
+ public function dir_readdir() {
+ $result = parent::dir_readdir();
+ if (is_callable($this->readDirCallBack)) {
+ call_user_func($this->readDirCallBack);
+ }
+ return $result;
+ }
}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/DirectoryFilter.php b/apps/files_external/3rdparty/icewind/streams/src/DirectoryFilter.php
new file mode 100644
index 00000000000..4b869699000
--- /dev/null
+++ b/apps/files_external/3rdparty/icewind/streams/src/DirectoryFilter.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Copyright (c) 2015 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Licensed under the MIT license:
+ * http://opensource.org/licenses/MIT
+ */
+
+namespace Icewind\Streams;
+
+/**
+ * Wrapper allows filtering of directories
+ *
+ * The filter callback will be called for each entry in the folder
+ * when the callback return false the entry will be filtered out
+ */
+class DirectoryFilter extends DirectoryWrapper {
+ /**
+ * @var callable
+ */
+ private $filter;
+
+ /**
+ * @param string $path
+ * @param array $options
+ * @return bool
+ */
+ public function dir_opendir($path, $options) {
+ $context = $this->loadContext('filter');
+ $this->filter = $context['filter'];
+ return true;
+ }
+
+ /**
+ * @return string
+ */
+ public function dir_readdir() {
+ $file = readdir($this->source);
+ $filter = $this->filter;
+ // keep reading untill we have an accepted entry or we're at the end of the folder
+ while ($file !== false && $filter($file) === false) {
+ $file = readdir($this->source);
+ }
+ return $file;
+ }
+
+ /**
+ * @param resource $source
+ * @param callable $filter
+ * @return resource
+ */
+ public static function wrap($source, callable $filter) {
+ $options = array(
+ 'filter' => array(
+ 'source' => $source,
+ 'filter' => $filter
+ )
+ );
+ return self::wrapWithOptions($options, '\Icewind\Streams\DirectoryFilter');
+ }
+}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/DirectoryWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/DirectoryWrapper.php
new file mode 100644
index 00000000000..63e4805a807
--- /dev/null
+++ b/apps/files_external/3rdparty/icewind/streams/src/DirectoryWrapper.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Copyright (c) 2015 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Licensed under the MIT license:
+ * http://opensource.org/licenses/MIT
+ */
+
+namespace Icewind\Streams;
+
+class DirectoryWrapper implements Directory {
+ /**
+ * @var resource
+ */
+ public $context;
+
+ /**
+ * @var resource
+ */
+ protected $source;
+
+ /**
+ * Load the source from the stream context and return the context options
+ *
+ * @param string $name
+ * @return array
+ * @throws \Exception
+ */
+ protected function loadContext($name) {
+ $context = stream_context_get_options($this->context);
+ if (isset($context[$name])) {
+ $context = $context[$name];
+ } else {
+ throw new \BadMethodCallException('Invalid context, "' . $name . '" options not set');
+ }
+ if (isset($context['source']) and is_resource($context['source'])) {
+ $this->source = $context['source'];
+ } else {
+ throw new \BadMethodCallException('Invalid context, source not set');
+ }
+ return $context;
+ }
+
+ /**
+ * @param string $path
+ * @param array $options
+ * @return bool
+ */
+ public function dir_opendir($path, $options) {
+ $this->loadContext('dir');
+ return true;
+ }
+
+ /**
+ * @return string
+ */
+ public function dir_readdir() {
+ return readdir($this->source);
+ }
+
+ /**
+ * @return bool
+ */
+ public function dir_closedir() {
+ closedir($this->source);
+ return true;
+ }
+
+ /**
+ * @return bool
+ */
+ public function dir_rewinddir() {
+ rewinddir($this->source);
+ return true;
+ }
+
+ /**
+ * @param array $options the options for the context to wrap the stream with
+ * @param string $class
+ * @return resource
+ */
+ protected static function wrapWithOptions($options, $class) {
+ $context = stream_context_create($options);
+ stream_wrapper_register('dirwrapper', $class);
+ $wrapped = opendir('dirwrapper://', $context);
+ stream_wrapper_unregister('dirwrapper');
+ return $wrapped;
+ }
+}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/File.php b/apps/files_external/3rdparty/icewind/streams/src/File.php
index 6202ef4a4b4..252b7b8971f 100644
--- a/apps/files_external/3rdparty/icewind/streams/src/File.php
+++ b/apps/files_external/3rdparty/icewind/streams/src/File.php
@@ -21,7 +21,7 @@ interface File {
public function stream_open($path, $mode, $options, &$opened_path);
/**
- * @param string $offset
+ * @param int $offset
* @param int $whence
* @return bool
*/
diff --git a/apps/files_external/3rdparty/icewind/streams/src/IteratorDirectory.php b/apps/files_external/3rdparty/icewind/streams/src/IteratorDirectory.php
index c4eac5d4ed3..6dfa42a8b68 100644
--- a/apps/files_external/3rdparty/icewind/streams/src/IteratorDirectory.php
+++ b/apps/files_external/3rdparty/icewind/streams/src/IteratorDirectory.php
@@ -45,9 +45,9 @@ class IteratorDirectory implements Directory {
} else {
throw new \BadMethodCallException('Invalid context, "' . $name . '" options not set');
}
- if (isset($context['iterator']) and $context['iterator'] instanceof \Iterator) {
+ if (isset($context['iterator'])) {
$this->iterator = $context['iterator'];
- } else if (isset($context['array']) and is_array($context['array'])) {
+ } else if (isset($context['array'])) {
$this->iterator = new \ArrayIterator($context['array']);
} else {
throw new \BadMethodCallException('Invalid context, iterator or array not set');
diff --git a/apps/files_external/3rdparty/icewind/streams/src/NullWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/NullWrapper.php
index 8cbaaa756d3..b6c71d98fc4 100644
--- a/apps/files_external/3rdparty/icewind/streams/src/NullWrapper.php
+++ b/apps/files_external/3rdparty/icewind/streams/src/NullWrapper.php
@@ -24,19 +24,16 @@ class NullWrapper extends Wrapper {
'null' => array(
'source' => $source)
));
- stream_wrapper_register('null', '\Icewind\Streams\NullWrapper');
- try {
- $wrapped = fopen('null://', 'r+', false, $context);
- } catch (\BadMethodCallException $e) {
- stream_wrapper_unregister('null');
- throw $e;
- }
- stream_wrapper_unregister('null');
- return $wrapped;
+ return Wrapper::wrapSource($source, $context, 'null', '\Icewind\Streams\NullWrapper');
}
public function stream_open($path, $mode, $options, &$opened_path) {
$this->loadContext('null');
return true;
}
+
+ public function dir_opendir($path, $options) {
+ $this->loadContext('null');
+ return true;
+ }
}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/Path.php b/apps/files_external/3rdparty/icewind/streams/src/Path.php
new file mode 100644
index 00000000000..46d2156b69a
--- /dev/null
+++ b/apps/files_external/3rdparty/icewind/streams/src/Path.php
@@ -0,0 +1,104 @@
+<?php
+/**
+ * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Licensed under the MIT license:
+ * http://opensource.org/licenses/MIT
+ */
+
+namespace Icewind\Streams;
+
+/**
+ * A string-like object that automatically registers a stream wrapper when used and removes the stream wrapper when no longer used
+ *
+ * Can optionally pass context options to the stream wrapper
+ */
+class Path {
+
+ /**
+ * @var bool
+ */
+ protected $registered = false;
+
+ /**
+ * @var string
+ */
+ protected $protocol;
+
+ /**
+ * @var string
+ */
+ protected $class;
+
+ /**
+ * @var array
+ */
+ protected $contextOptions;
+
+ /**
+ * @param string $class
+ * @param array $contextOptions
+ */
+ public function __construct($class, $contextOptions = array()) {
+ $this->class = $class;
+ $this->contextOptions = $contextOptions;
+ }
+
+ public function getProtocol() {
+ if (!$this->protocol) {
+ $this->protocol = 'auto' . uniqid();
+ }
+ return $this->protocol;
+ }
+
+ public function wrapPath($path) {
+ return $this->getProtocol() . '://' . $path;
+ }
+
+ protected function register() {
+ if (!$this->registered) {
+ $this->appendDefaultContent($this->getProtocol(), $this->contextOptions);
+ stream_wrapper_register($this->getProtocol(), $this->class);
+ $this->registered = true;
+ }
+ }
+
+ protected function unregister() {
+ stream_wrapper_unregister($this->getProtocol());
+ $this->unsetDefaultContent($this->getProtocol());
+ $this->registered = false;
+ }
+
+ /**
+ * Add values to the default stream context
+ *
+ * @param string $key
+ * @param array $values
+ */
+ protected function appendDefaultContent($key, $values) {
+ $context = stream_context_get_default();
+ $defaults = stream_context_get_options($context);
+ $defaults[$key] = $values;
+ stream_context_set_default($defaults);
+ }
+
+ /**
+ * Remove values from the default stream context
+ *
+ * @param string $key
+ */
+ protected function unsetDefaultContent($key) {
+ $context = stream_context_get_default();
+ $defaults = stream_context_get_options($context);
+ unset($defaults[$key]);
+ stream_context_set_default($defaults);
+ }
+
+ public function __toString() {
+ $this->register();
+ return $this->protocol . '://';
+ }
+
+ public function __destruct() {
+ $this->unregister();
+ }
+}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/RetryWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/RetryWrapper.php
new file mode 100644
index 00000000000..84b43f6bd02
--- /dev/null
+++ b/apps/files_external/3rdparty/icewind/streams/src/RetryWrapper.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Copyright (c) 2016 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Licensed under the MIT license:
+ * http://opensource.org/licenses/MIT
+ */
+
+namespace Icewind\Streams;
+
+/**
+ * Wrapper that retries reads/writes to remote streams that dont deliver/recieve all requested data at once
+ */
+class RetryWrapper extends Wrapper {
+
+ /**
+ * Wraps a stream with the provided callbacks
+ *
+ * @param resource $source
+ * @return resource
+ */
+ public static function wrap($source) {
+ $context = stream_context_create(array(
+ 'retry' => array(
+ 'source' => $source
+ )
+ ));
+ return Wrapper::wrapSource($source, $context, 'retry', '\Icewind\Streams\RetryWrapper');
+ }
+
+ protected function open() {
+ $this->loadContext('retry');
+ return true;
+ }
+
+ public function dir_opendir($path, $options) {
+ return false;
+ }
+
+ public function stream_open($path, $mode, $options, &$opened_path) {
+ return $this->open();
+ }
+
+ public function stream_read($count) {
+ $result = parent::stream_read($count);
+
+ $bytesReceived = strlen($result);
+ while ($bytesReceived < $count && !$this->stream_eof()) {
+ $result .= parent::stream_read($count - $bytesReceived);
+ $bytesReceived = strlen($result);
+ }
+
+ return $result;
+ }
+
+ public function stream_write($data) {
+ $bytesToSend = strlen($data);
+ $result = parent::stream_write($data);
+
+ while ($result < $bytesToSend && !$this->stream_eof()) {
+ $dataLeft = substr($data, $result);
+ $result += parent::stream_write($dataLeft);
+ }
+
+ return $result;
+ }
+}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/SeekableWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/SeekableWrapper.php
new file mode 100644
index 00000000000..d41fd73ec9c
--- /dev/null
+++ b/apps/files_external/3rdparty/icewind/streams/src/SeekableWrapper.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Licensed under the MIT license:
+ * http://opensource.org/licenses/MIT
+ */
+
+namespace Icewind\Streams;
+
+/**
+ * Wrapper that provides callbacks for write, read and close
+ *
+ * The following options should be passed in the context when opening the stream
+ * [
+ * 'callback' => [
+ * 'source' => resource
+ * ]
+ * ]
+ *
+ * All callbacks are called after the operation is executed on the source stream
+ */
+class SeekableWrapper extends Wrapper {
+ /**
+ * @var resource
+ */
+ protected $cache;
+
+ /**
+ * Wraps a stream to make it seekable
+ *
+ * @param resource $source
+ * @return resource
+ *
+ * @throws \BadMethodCallException
+ */
+ public static function wrap($source) {
+ $context = stream_context_create(array(
+ 'callback' => array(
+ 'source' => $source
+ )
+ ));
+ return Wrapper::wrapSource($source, $context, 'callback', '\Icewind\Streams\SeekableWrapper');
+ }
+
+ public function dir_opendir($path, $options) {
+ return false;
+ }
+
+ public function stream_open($path, $mode, $options, &$opened_path) {
+ $this->loadContext('callback');
+ $this->cache = fopen('php://temp', 'w+');
+ return true;
+ }
+
+ protected function readTill($position) {
+ $current = ftell($this->source);
+ if ($position > $current) {
+ $data = parent::stream_read($position - $current);
+ $cachePosition = ftell($this->cache);
+ fseek($this->cache, $current);
+ fwrite($this->cache, $data);
+ fseek($this->cache, $cachePosition);
+ }
+ }
+
+ public function stream_read($count) {
+ $current = ftell($this->cache);
+ $this->readTill($current + $count);
+ return fread($this->cache, $count);
+ }
+
+ public function stream_seek($offset, $whence = SEEK_SET) {
+ if ($whence === SEEK_SET) {
+ $target = $offset;
+ } else if ($whence === SEEK_CUR) {
+ $current = ftell($this->cache);
+ $target = $current + $offset;
+ } else {
+ return false;
+ }
+ $this->readTill($target);
+ return fseek($this->cache, $target) === 0;
+ }
+
+ public function stream_tell() {
+ return ftell($this->cache);
+ }
+
+ public function stream_eof() {
+ return parent::stream_eof() and (ftell($this->source) === ftell($this->cache));
+ }
+}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/Url.php b/apps/files_external/3rdparty/icewind/streams/src/Url.php
new file mode 100644
index 00000000000..d6822608a33
--- /dev/null
+++ b/apps/files_external/3rdparty/icewind/streams/src/Url.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Licensed under the MIT license:
+ * http://opensource.org/licenses/MIT
+ */
+
+namespace Icewind\Streams;
+
+/**
+ * Interface for stream wrappers that implement url functions such as unlink, stat
+ */
+interface Url {
+ /**
+ * @param string $path
+ * @param array $options
+ * @return bool
+ */
+ public function dir_opendir($path, $options);
+
+ /**
+ * @param string $path
+ * @param string $mode
+ * @param int $options
+ * @param string &$opened_path
+ * @return bool
+ */
+ public function stream_open($path, $mode, $options, &$opened_path);
+
+ /**
+ * @param string $path
+ * @param int $mode
+ * @param int $options
+ * @return bool
+ */
+ public function mkdir($path, $mode, $options);
+
+ /**
+ * @param string $source
+ * @param string $target
+ * @return bool
+ */
+ public function rename($source, $target);
+
+ /**
+ * @param string $path
+ * @param int $options
+ * @return bool
+ */
+ public function rmdir($path, $options);
+
+ /**
+ * @param string
+ * @return bool
+ */
+ public function unlink($path);
+
+ /**
+ * @param string $path
+ * @param int $flags
+ * @return array
+ */
+ public function url_stat($path, $flags);
+}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/UrlCallBack.php b/apps/files_external/3rdparty/icewind/streams/src/UrlCallBack.php
new file mode 100644
index 00000000000..580bfc6ba22
--- /dev/null
+++ b/apps/files_external/3rdparty/icewind/streams/src/UrlCallBack.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Licensed under the MIT license:
+ * http://opensource.org/licenses/MIT
+ */
+
+namespace Icewind\Streams;
+
+/**
+ * Wrapper that provides callbacks for url actions such as fopen, unlink, rename
+ *
+ * Usage:
+ *
+ * $path = UrlCallBack('/path/so/source', function(){
+ * echo 'fopen';
+ * }, function(){
+ * echo 'opendir';
+ * }, function(){
+ * echo 'mkdir';
+ * }, function(){
+ * echo 'rename';
+ * }, function(){
+ * echo 'rmdir';
+ * }, function(){
+ * echo 'unlink';
+ * }, function(){
+ * echo 'stat';
+ * });
+ *
+ * mkdir($path);
+ * ...
+ *
+ * All callbacks are called after the operation is executed on the source stream
+ */
+class UrlCallback extends Wrapper implements Url {
+
+ /**
+ * @param string $source
+ * @param callable $fopen
+ * @param callable $opendir
+ * @param callable $mkdir
+ * @param callable $rename
+ * @param callable $rmdir
+ * @param callable $unlink
+ * @param callable $stat
+ * @return \Icewind\Streams\Path
+ *
+ * @throws \BadMethodCallException
+ * @throws \Exception
+ */
+ public static function wrap($source, $fopen = null, $opendir = null, $mkdir = null, $rename = null, $rmdir = null,
+ $unlink = null, $stat = null) {
+ $options = array(
+ 'source' => $source,
+ 'fopen' => $fopen,
+ 'opendir' => $opendir,
+ 'mkdir' => $mkdir,
+ 'rename' => $rename,
+ 'rmdir' => $rmdir,
+ 'unlink' => $unlink,
+ 'stat' => $stat
+ );
+ return new Path('\Icewind\Streams\UrlCallBack', $options);
+ }
+
+ protected function loadContext($url) {
+ list($protocol) = explode('://', $url);
+ $options = stream_context_get_options($this->context);
+ return $options[$protocol];
+ }
+
+ protected function callCallBack($context, $callback) {
+ if (is_callable($context[$callback])) {
+ call_user_func($context[$callback]);
+ }
+ }
+
+ public function stream_open($path, $mode, $options, &$opened_path) {
+ $context = $this->loadContext($path);
+ $this->callCallBack($context, 'fopen');
+ $this->setSourceStream(fopen($context['source'], $mode));
+ return true;
+ }
+
+ public function dir_opendir($path, $options) {
+ $context = $this->loadContext($path);
+ $this->callCallBack($context, 'opendir');
+ $this->setSourceStream(opendir($context['source']));
+ return true;
+ }
+
+ public function mkdir($path, $mode, $options) {
+ $context = $this->loadContext($path);
+ $this->callCallBack($context, 'mkdir');
+ return mkdir($context['source'], $mode, $options & STREAM_MKDIR_RECURSIVE);
+ }
+
+ public function rmdir($path, $options) {
+ $context = $this->loadContext($path);
+ $this->callCallBack($context, 'rmdir');
+ return rmdir($context['source']);
+ }
+
+ public function rename($source, $target) {
+ $context = $this->loadContext($source);
+ $this->callCallBack($context, 'rename');
+ list(, $target) = explode('://', $target);
+ return rename($context['source'], $target);
+ }
+
+ public function unlink($path) {
+ $context = $this->loadContext($path);
+ $this->callCallBack($context, 'unlink');
+ return unlink($context['source']);
+ }
+
+ public function url_stat($path, $flags) {
+ throw new \Exception('stat is not supported due to php bug 50526');
+ }
+}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/Wrapper.php b/apps/files_external/3rdparty/icewind/streams/src/Wrapper.php
index 2e3a6e6cd88..53de2942ca9 100644
--- a/apps/files_external/3rdparty/icewind/streams/src/Wrapper.php
+++ b/apps/files_external/3rdparty/icewind/streams/src/Wrapper.php
@@ -12,7 +12,7 @@ namespace Icewind\Streams;
*
* This wrapper itself doesn't implement any functionality but is just a base class for other wrappers to extend
*/
-abstract class Wrapper implements File {
+abstract class Wrapper implements File, Directory {
/**
* @var resource
*/
@@ -25,6 +25,22 @@ abstract class Wrapper implements File {
*/
protected $source;
+ protected static function wrapSource($source, $context, $protocol, $class) {
+ try {
+ stream_wrapper_register($protocol, $class);
+ if (@rewinddir($source) === false) {
+ $wrapped = fopen($protocol . '://', 'r+', false, $context);
+ } else {
+ $wrapped = opendir($protocol . '://', $context);
+ }
+ } catch (\BadMethodCallException $e) {
+ stream_wrapper_unregister($protocol);
+ throw $e;
+ }
+ stream_wrapper_unregister($protocol);
+ return $wrapped;
+ }
+
/**
* Load the source from the stream context and return the context options
*
@@ -107,4 +123,17 @@ abstract class Wrapper implements File {
public function stream_close() {
return fclose($this->source);
}
+
+ public function dir_readdir() {
+ return readdir($this->source);
+ }
+
+ public function dir_closedir() {
+ closedir($this->source);
+ return true;
+ }
+
+ public function dir_rewinddir() {
+ return rewind($this->source);
+ }
}
diff --git a/apps/files_external/3rdparty/icewind/streams/tests/CallbackWrapper.php b/apps/files_external/3rdparty/icewind/streams/tests/CallbackWrapper.php
deleted file mode 100644
index 229b629dcd9..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/tests/CallbackWrapper.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-/**
- * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
- * This file is licensed under the Licensed under the MIT license:
- * http://opensource.org/licenses/MIT
- */
-
-namespace Icewind\Streams\Tests;
-
-class CallbackWrapper extends Wrapper {
-
- /**
- * @param resource $source
- * @param callable $read
- * @param callable $write
- * @param callable $close
- * @return resource
- */
- protected function wrapSource($source, $read = null, $write = null, $close = null) {
- return \Icewind\Streams\CallbackWrapper::wrap($source, $read, $write, $close);
- }
-
- /**
- * @expectedException \BadMethodCallException
- */
- public function testWrapInvalidSource() {
- $this->wrapSource('foo');
- }
-
- public function testReadCallback() {
- $called = false;
- $callBack = function () use (&$called) {
- $called = true;
- };
-
- $source = fopen('php://temp', 'r+');
- fwrite($source, 'foobar');
- rewind($source);
-
- $wrapped = $this->wrapSource($source, $callBack);
- $this->assertEquals('foo', fread($wrapped, 3));
- $this->assertTrue($called);
- }
-
- public function testWriteCallback() {
- $lastData = '';
- $callBack = function ($data) use (&$lastData) {
- $lastData = $data;
- };
-
- $source = fopen('php://temp', 'r+');
-
- $wrapped = $this->wrapSource($source, null, $callBack);
- fwrite($wrapped, 'foobar');
- $this->assertEquals('foobar', $lastData);
- }
-
- public function testCloseCallback() {
- $called = false;
- $callBack = function () use (&$called) {
- $called = true;
- };
-
- $source = fopen('php://temp', 'r+');
- fwrite($source, 'foobar');
- rewind($source);
-
- $wrapped = $this->wrapSource($source, null, null, $callBack);
- fclose($wrapped);
- $this->assertTrue($called);
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/tests/IteratorDirectory.php b/apps/files_external/3rdparty/icewind/streams/tests/IteratorDirectory.php
deleted file mode 100644
index 0d990468368..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/tests/IteratorDirectory.php
+++ /dev/null
@@ -1,130 +0,0 @@
-<?php
-/**
- * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
- * This file is licensed under the Licensed under the MIT license:
- * http://opensource.org/licenses/MIT
- */
-
-namespace Icewind\Streams\Tests;
-
-class IteratorDirectory extends \PHPUnit_Framework_TestCase {
-
- /**
- * @param \Iterator | array $source
- * @return resource
- */
- protected function wrapSource($source) {
- return \Icewind\Streams\IteratorDirectory::wrap($source);
- }
-
- /**
- * @expectedException \BadMethodCallException
- */
- public function testNoContext() {
- $context = stream_context_create(array());
- stream_wrapper_register('iterator', '\Icewind\Streams\IteratorDirectory');
- try {
- opendir('iterator://', $context);
- stream_wrapper_unregister('iterator');
- } catch (\Exception $e) {
- stream_wrapper_unregister('iterator');
- throw $e;
- }
- }
-
- /**
- * @expectedException \BadMethodCallException
- */
- public function testInvalidSource() {
- $context = stream_context_create(array(
- 'dir' => array(
- 'array' => 2
- )
- ));
- stream_wrapper_register('iterator', '\Icewind\Streams\IteratorDirectory');
- try {
- opendir('iterator://', $context);
- stream_wrapper_unregister('iterator');
- } catch (\Exception $e) {
- stream_wrapper_unregister('iterator');
- throw $e;
- }
- }
-
- /**
- * @expectedException \BadMethodCallException
- */
- public function testWrapInvalidSource() {
- $this->wrapSource(2);
- }
-
- public function fileListProvider() {
- $longList = array_fill(0, 500, 'foo');
- return array(
- array(
- array(
- 'foo',
- 'bar',
- 'qwerty'
- )
- ),
- array(
- array(
- 'with spaces',
- 'under_scores',
- '日本語',
- 'character %$_',
- '.',
- '0',
- 'double "quotes"',
- "single 'quotes'"
- )
- ),
- array(
- array(
- 'single item'
- )
- ),
- array(
- $longList
- ),
- array(
- array()
- )
- );
- }
-
- protected function basicTest($fileList, $dh) {
- $result = array();
-
- while (($file = readdir($dh)) !== false) {
- $result[] = $file;
- }
-
- $this->assertEquals($fileList, $result);
-
- rewinddir($dh);
- if (count($fileList)) {
- $this->assertEquals($fileList[0], readdir($dh));
- } else {
- $this->assertFalse(readdir($dh));
- }
- }
-
- /**
- * @dataProvider fileListProvider
- */
- public function testBasicIterator($fileList) {
- $iterator = new \ArrayIterator($fileList);
- $dh = $this->wrapSource($iterator);
- $this->basicTest($fileList, $dh);
- }
-
- /**
- * @dataProvider fileListProvider
- */
- public function testBasicArray($fileList) {
- $dh = $this->wrapSource($fileList);
- $this->basicTest($fileList, $dh);
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/tests/NullWrapper.php b/apps/files_external/3rdparty/icewind/streams/tests/NullWrapper.php
deleted file mode 100644
index ba42b4dfea1..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/tests/NullWrapper.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-/**
- * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
- * This file is licensed under the Licensed under the MIT license:
- * http://opensource.org/licenses/MIT
- */
-
-namespace Icewind\Streams\Tests;
-
-class NullWrapper extends Wrapper {
-
- /**
- * @param resource $source
- * @return resource
- */
- protected function wrapSource($source) {
- return \Icewind\Streams\NullWrapper::wrap($source);
- }
-
- /**
- * @expectedException \BadMethodCallException
- */
- public function testNoContext() {
- stream_wrapper_register('null', '\Icewind\Streams\NullWrapper');
- $context = stream_context_create(array());
- try {
- fopen('null://', 'r+', false, $context);
- stream_wrapper_unregister('null');
- } catch (\Exception $e) {
- stream_wrapper_unregister('null');
- throw $e;
- }
- }
-
- /**
- * @expectedException \BadMethodCallException
- */
- public function testNoSource() {
- stream_wrapper_register('null', '\Icewind\Streams\NullWrapper');
- $context = stream_context_create(array(
- 'null' => array(
- 'source' => 'bar'
- )
- ));
- try {
- fopen('null://', 'r+', false, $context);
- } catch (\Exception $e) {
- stream_wrapper_unregister('null');
- throw $e;
- }
- }
-
- /**
- * @expectedException \BadMethodCallException
- */
- public function testWrapInvalidSource() {
- $this->wrapSource('foo');
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/tests/Wrapper.php b/apps/files_external/3rdparty/icewind/streams/tests/Wrapper.php
deleted file mode 100644
index 6bb644dd611..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/tests/Wrapper.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-/**
- * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
- * This file is licensed under the Licensed under the MIT license:
- * http://opensource.org/licenses/MIT
- */
-
-namespace Icewind\Streams\Tests;
-
-abstract class Wrapper extends \PHPUnit_Framework_TestCase {
- /**
- * @param resource $source
- * @return resource
- */
- abstract protected function wrapSource($source);
-
- public function testRead() {
- $source = fopen('php://temp', 'r+');
- fwrite($source, 'foobar');
- rewind($source);
-
- $wrapped = $this->wrapSource($source);
- $this->assertEquals('foo', fread($wrapped, 3));
- $this->assertEquals('bar', fread($wrapped, 3));
- $this->assertEquals('', fread($wrapped, 3));
- }
-
- public function testWrite() {
- $source = fopen('php://temp', 'r+');
- rewind($source);
-
- $wrapped = $this->wrapSource($source);
-
- $this->assertEquals(6, fwrite($wrapped, 'foobar'));
- rewind($source);
- $this->assertEquals('foobar', stream_get_contents($source));
- }
-
- public function testClose() {
- $source = fopen('php://temp', 'r+');
- rewind($source);
-
- $wrapped = $this->wrapSource($source);
-
- fclose($wrapped);
- $this->assertFalse(is_resource($source));
- }
-
- public function testSeekTell() {
- $source = fopen('php://temp', 'r+');
- fwrite($source, 'foobar');
- rewind($source);
-
- $wrapped = $this->wrapSource($source);
-
- $this->assertEquals(0, ftell($wrapped));
-
- fseek($wrapped, 2);
- $this->assertEquals(2, ftell($source));
- $this->assertEquals(2, ftell($wrapped));
-
- fseek($wrapped, 2, SEEK_CUR);
- $this->assertEquals(4, ftell($source));
- $this->assertEquals(4, ftell($wrapped));
-
- fseek($wrapped, -1, SEEK_END);
- $this->assertEquals(5, ftell($source));
- $this->assertEquals(5, ftell($wrapped));
- }
-
- public function testStat() {
- $source = fopen(__FILE__, 'r+');
- $wrapped = $this->wrapSource($source);
- $this->assertEquals(stat(__FILE__), fstat($wrapped));
- }
-
- public function testTruncate() {
- if (version_compare(phpversion(), '5.4.0', '<')) {
- $this->markTestSkipped('php <5.4 doesn\'t support truncate for stream wrappers');
- }
- $source = fopen('php://temp', 'r+');
- fwrite($source, 'foobar');
- rewind($source);
- $wrapped = $this->wrapSource($source);
-
- ftruncate($wrapped, 2);
- $this->assertEquals('fo', fread($wrapped, 10));
- }
-
- public function testLock() {
- $source = tmpfile();
- $wrapped = $this->wrapSource($source);
- if (!flock($wrapped, LOCK_EX)) {
- $this->fail('Unable to acquire lock');
- }
- }
-
- public function testStreamOptions() {
- $source = fopen('php://temp', 'r+');
- $wrapped = $this->wrapSource($source);
- stream_set_blocking($wrapped, 0);
- stream_set_timeout($wrapped, 1, 0);
- stream_set_write_buffer($wrapped, 0);
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/tests/bootstrap.php b/apps/files_external/3rdparty/icewind/streams/tests/bootstrap.php
deleted file mode 100644
index 2c17fd57feb..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/tests/bootstrap.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-/**
- * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
- * This file is licensed under the Licensed under the MIT license:
- * http://opensource.org/licenses/MIT
- */
-
-date_default_timezone_set('UTC');
-require_once __DIR__ . '/../vendor/autoload.php';
diff --git a/apps/files_external/3rdparty/icewind/streams/tests/phpunit.xml b/apps/files_external/3rdparty/icewind/streams/tests/phpunit.xml
deleted file mode 100644
index e3d96352c43..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/tests/phpunit.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<phpunit bootstrap="bootstrap.php">
- <testsuite name='Stream'>
- <directory suffix='.php'>./</directory>
- </testsuite>
-</phpunit>
diff --git a/apps/files_external/js/statusmanager.js b/apps/files_external/js/statusmanager.js
index 33d2ea104be..118ec17d246 100644
--- a/apps/files_external/js/statusmanager.js
+++ b/apps/files_external/js/statusmanager.js
@@ -497,7 +497,7 @@ OCA.External.StatusManager.Utils = {
if (folder instanceof $) {
trFolder = folder;
} else {
- // cant use here FileList.findFileEl(OCA.External.StatusManager.Utils.jqSelEscape(folder)); return incorrect instance of filelist
+ // can't use here FileList.findFileEl(OCA.External.StatusManager.Utils.jqSelEscape(folder)); return incorrect instance of filelist
trFolder = $('#fileList tr[data-file=\"' + OCA.External.StatusManager.Utils.jqSelEscape(folder) + '\"]');
}
trFolder.removeClass('externalErroredRow').removeClass('externalDisabledRow');
diff --git a/apps/files_external/l10n/da.js b/apps/files_external/l10n/da.js
index 59e32a55fe6..88f066d7f89 100644
--- a/apps/files_external/l10n/da.js
+++ b/apps/files_external/l10n/da.js
@@ -16,6 +16,9 @@ OC.L10N.register(
"Not permitted to use authentication mechanism \"%s\"" : "Ikke tilladt at bruge autorisation mekanismen \"%s\"",
"Unsatisfied backend parameters" : "Utilfredsstillede backend-parametre",
"Unsatisfied authentication mechanism parameters" : "Utilfredsstillede parametre for godkendelsesmekanisme",
+ "Insufficient data: %s" : "Utilstrækkelige data: %s",
+ "%s" : "%s",
+ "Storage with id \"%i\" is not user editable" : "Lageret med id \"%i\" kan ikke redigeres af bruger",
"Personal" : "Personligt",
"System" : "System",
"Grant access" : "Godkend adgang",
@@ -26,12 +29,15 @@ OC.L10N.register(
"Error generating key pair" : "Fejl under oprettelse af nøglepar",
"Enable encryption" : "Slå kryptering til",
"Enable previews" : "Slå forhåndsvisninger til",
+ "Enable sharing" : "Slå deling til",
"Check for changes" : "Tjek for ændringer",
"Never" : "Aldrig",
"Once every direct access" : "Kun ved hver direkte tilgang",
"All users. Type to select user or group." : "Alle brugere. Indtast for at vælge bruger eller gruppe.",
"(group)" : "(gruppe)",
+ "Admin defined" : "Bestemt af administrator",
"Saved" : "Gemt",
+ "Empty response from the server" : "Svar fra serveren uden data",
"Username" : "Brugernavn",
"Password" : "Kodeord",
"Save" : "Gem",
diff --git a/apps/files_external/l10n/da.json b/apps/files_external/l10n/da.json
index ae50904a225..4d6f80c7ef1 100644
--- a/apps/files_external/l10n/da.json
+++ b/apps/files_external/l10n/da.json
@@ -14,6 +14,9 @@
"Not permitted to use authentication mechanism \"%s\"" : "Ikke tilladt at bruge autorisation mekanismen \"%s\"",
"Unsatisfied backend parameters" : "Utilfredsstillede backend-parametre",
"Unsatisfied authentication mechanism parameters" : "Utilfredsstillede parametre for godkendelsesmekanisme",
+ "Insufficient data: %s" : "Utilstrækkelige data: %s",
+ "%s" : "%s",
+ "Storage with id \"%i\" is not user editable" : "Lageret med id \"%i\" kan ikke redigeres af bruger",
"Personal" : "Personligt",
"System" : "System",
"Grant access" : "Godkend adgang",
@@ -24,12 +27,15 @@
"Error generating key pair" : "Fejl under oprettelse af nøglepar",
"Enable encryption" : "Slå kryptering til",
"Enable previews" : "Slå forhåndsvisninger til",
+ "Enable sharing" : "Slå deling til",
"Check for changes" : "Tjek for ændringer",
"Never" : "Aldrig",
"Once every direct access" : "Kun ved hver direkte tilgang",
"All users. Type to select user or group." : "Alle brugere. Indtast for at vælge bruger eller gruppe.",
"(group)" : "(gruppe)",
+ "Admin defined" : "Bestemt af administrator",
"Saved" : "Gemt",
+ "Empty response from the server" : "Svar fra serveren uden data",
"Username" : "Brugernavn",
"Password" : "Kodeord",
"Save" : "Gem",
diff --git a/apps/files_external/l10n/de.js b/apps/files_external/l10n/de.js
index a082b8c63aa..f3aff522a82 100644
--- a/apps/files_external/l10n/de.js
+++ b/apps/files_external/l10n/de.js
@@ -44,7 +44,7 @@ OC.L10N.register(
"There was an error with message: " : "Es ist ein Fehler mit folgender Meldung aufgetreten:",
"External mount error" : "Fehler beim einbinden des externen Speichers",
"external-storage" : "Externer Speicher",
- "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Es konnte keine Liste der Windows Netzlaufwerk erstellt werden: leer Antwort vom Server",
+ "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Es konnte keine Liste der Windows-Netzlaufwerke erstellt werden: leer Antwort vom Server",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Einige der konfigurierten externen Bereitstellungspunkte sind nicht angeschlossen. Bitte klicke auf die roten Zeile(n) für weitere Informationen",
"Please enter the credentials for the {mount} mount" : "Bitte gib die Anmeldeinformationen für den {mount} externen Bereitstellungspunkt ein",
"Username" : "Benutzername",
diff --git a/apps/files_external/l10n/de.json b/apps/files_external/l10n/de.json
index 6157cb12fc3..384b2ff06e0 100644
--- a/apps/files_external/l10n/de.json
+++ b/apps/files_external/l10n/de.json
@@ -42,7 +42,7 @@
"There was an error with message: " : "Es ist ein Fehler mit folgender Meldung aufgetreten:",
"External mount error" : "Fehler beim einbinden des externen Speichers",
"external-storage" : "Externer Speicher",
- "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Es konnte keine Liste der Windows Netzlaufwerk erstellt werden: leer Antwort vom Server",
+ "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Es konnte keine Liste der Windows-Netzlaufwerke erstellt werden: leer Antwort vom Server",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Einige der konfigurierten externen Bereitstellungspunkte sind nicht angeschlossen. Bitte klicke auf die roten Zeile(n) für weitere Informationen",
"Please enter the credentials for the {mount} mount" : "Bitte gib die Anmeldeinformationen für den {mount} externen Bereitstellungspunkt ein",
"Username" : "Benutzername",
diff --git a/apps/files_external/l10n/de_DE.js b/apps/files_external/l10n/de_DE.js
index cbe2f98d6b8..8a75e97627b 100644
--- a/apps/files_external/l10n/de_DE.js
+++ b/apps/files_external/l10n/de_DE.js
@@ -38,10 +38,14 @@ OC.L10N.register(
"Admin defined" : "Administrator definiert",
"Saved" : "Gespeichert",
"Empty response from the server" : "Leere Antwort vom Server erhalten",
+ "Couldn't access. Please logout and login to activate this mount point" : "Anmeldung nicht möglich. Bitte melden Sie sich ab und wieder an, damit Sie von diesem Endpunkt zugreifen können.",
+ "Couldn't get the information from the ownCloud server: {code} {type}" : "Es konnten keine Informationen aus dem ownCloud -Server gelesen werden: {code} {type}",
"Couldn't get the list of external mount points: {type}" : "Konnte die Liste von externen Speichern nicht laden: {type}",
"There was an error with message: " : "Ein Fehler ist aufgetreten:",
"External mount error" : "Externer Einhängefehler",
"external-storage" : "externer Speicher",
+ "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Es konnte keine Liste der Windows-Netzlaufwerke erstellt werden: leer Antwort vom Server",
+ "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Einige der konfigurierten externen Bereitstellungspunkte sind nicht angeschlossen. Bitte klicke Sie auf die roten Zeile(n) für weitere Informationen",
"Please enter the credentials for the {mount} mount" : "Bitte geben Sie die Zugangsdaten für den {mount} Speicher an",
"Username" : "Benutzername",
"Password" : "Passwort",
@@ -61,6 +65,7 @@ OC.L10N.register(
"Client secret" : "Geheime Zeichenkette des Client",
"OpenStack" : "Freihand",
"Tenant name" : "Name des Mieters",
+ "Identity endpoint URL" : "Identität Endpunkt-URL",
"Rackspace" : "Rackspace",
"API key" : "API-Schlüssel",
"Username and password" : "Benutzername und Passwort",
diff --git a/apps/files_external/l10n/de_DE.json b/apps/files_external/l10n/de_DE.json
index a4e3d1f7306..8008ff262fa 100644
--- a/apps/files_external/l10n/de_DE.json
+++ b/apps/files_external/l10n/de_DE.json
@@ -36,10 +36,14 @@
"Admin defined" : "Administrator definiert",
"Saved" : "Gespeichert",
"Empty response from the server" : "Leere Antwort vom Server erhalten",
+ "Couldn't access. Please logout and login to activate this mount point" : "Anmeldung nicht möglich. Bitte melden Sie sich ab und wieder an, damit Sie von diesem Endpunkt zugreifen können.",
+ "Couldn't get the information from the ownCloud server: {code} {type}" : "Es konnten keine Informationen aus dem ownCloud -Server gelesen werden: {code} {type}",
"Couldn't get the list of external mount points: {type}" : "Konnte die Liste von externen Speichern nicht laden: {type}",
"There was an error with message: " : "Ein Fehler ist aufgetreten:",
"External mount error" : "Externer Einhängefehler",
"external-storage" : "externer Speicher",
+ "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Es konnte keine Liste der Windows-Netzlaufwerke erstellt werden: leer Antwort vom Server",
+ "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Einige der konfigurierten externen Bereitstellungspunkte sind nicht angeschlossen. Bitte klicke Sie auf die roten Zeile(n) für weitere Informationen",
"Please enter the credentials for the {mount} mount" : "Bitte geben Sie die Zugangsdaten für den {mount} Speicher an",
"Username" : "Benutzername",
"Password" : "Passwort",
@@ -59,6 +63,7 @@
"Client secret" : "Geheime Zeichenkette des Client",
"OpenStack" : "Freihand",
"Tenant name" : "Name des Mieters",
+ "Identity endpoint URL" : "Identität Endpunkt-URL",
"Rackspace" : "Rackspace",
"API key" : "API-Schlüssel",
"Username and password" : "Benutzername und Passwort",
diff --git a/apps/files_external/l10n/el.js b/apps/files_external/l10n/el.js
index 5322fc65ad0..b1e09dfad18 100644
--- a/apps/files_external/l10n/el.js
+++ b/apps/files_external/l10n/el.js
@@ -34,6 +34,7 @@ OC.L10N.register(
"All users. Type to select user or group." : "Όλοι οι χρήστες. Πληκτρολογήστε για να επιλέξετε χρήστη ή ομάδα.",
"(group)" : "(ομάδα)",
"Saved" : "Αποθηκεύτηκαν",
+ "There was an error with message: " : "Υπήρξε σφάλμα στο μήνυμα:",
"External mount error" : "Σφάλμα εξωτερικής προσάρτησης",
"Username" : "Όνομα χρήστη",
"Password" : "Κωδικός πρόσβασης",
diff --git a/apps/files_external/l10n/el.json b/apps/files_external/l10n/el.json
index 84763812a40..01c0dadc171 100644
--- a/apps/files_external/l10n/el.json
+++ b/apps/files_external/l10n/el.json
@@ -32,6 +32,7 @@
"All users. Type to select user or group." : "Όλοι οι χρήστες. Πληκτρολογήστε για να επιλέξετε χρήστη ή ομάδα.",
"(group)" : "(ομάδα)",
"Saved" : "Αποθηκεύτηκαν",
+ "There was an error with message: " : "Υπήρξε σφάλμα στο μήνυμα:",
"External mount error" : "Σφάλμα εξωτερικής προσάρτησης",
"Username" : "Όνομα χρήστη",
"Password" : "Κωδικός πρόσβασης",
diff --git a/apps/files_external/l10n/es.js b/apps/files_external/l10n/es.js
index 648c91e3164..f46eb9c651e 100644
--- a/apps/files_external/l10n/es.js
+++ b/apps/files_external/l10n/es.js
@@ -29,7 +29,7 @@ OC.L10N.register(
"Error generating key pair" : "Error al generar el par de claves",
"Enable encryption" : "Habilitar cifrado",
"Enable previews" : "Habilitar previsualizaciones",
- "Enable sharing" : "Habilitar comparto",
+ "Enable sharing" : "Habilitar el uso compartido",
"Check for changes" : "Comprobar si hay cambios",
"Never" : "Nunca",
"Once every direct access" : "Una vez cada acceso directo",
@@ -69,7 +69,7 @@ OC.L10N.register(
"Rackspace" : "Espacio de Rack",
"API key" : "Clave API",
"Username and password" : "Nombre de usuario y contraseña",
- "Log-in credentials, save in session" : "Iniciar credenciales, guardar en la sesión",
+ "Log-in credentials, save in session" : "Credenciales de login, guardar en la sesión",
"RSA public key" : "Clave pública RSA",
"Public key" : "Clave pública",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/es.json b/apps/files_external/l10n/es.json
index c9a07f20d13..3dfc2736ec0 100644
--- a/apps/files_external/l10n/es.json
+++ b/apps/files_external/l10n/es.json
@@ -27,7 +27,7 @@
"Error generating key pair" : "Error al generar el par de claves",
"Enable encryption" : "Habilitar cifrado",
"Enable previews" : "Habilitar previsualizaciones",
- "Enable sharing" : "Habilitar comparto",
+ "Enable sharing" : "Habilitar el uso compartido",
"Check for changes" : "Comprobar si hay cambios",
"Never" : "Nunca",
"Once every direct access" : "Una vez cada acceso directo",
@@ -67,7 +67,7 @@
"Rackspace" : "Espacio de Rack",
"API key" : "Clave API",
"Username and password" : "Nombre de usuario y contraseña",
- "Log-in credentials, save in session" : "Iniciar credenciales, guardar en la sesión",
+ "Log-in credentials, save in session" : "Credenciales de login, guardar en la sesión",
"RSA public key" : "Clave pública RSA",
"Public key" : "Clave pública",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/fil.js b/apps/files_external/l10n/fil.js
index e049851ae50..650a1c9f83a 100644
--- a/apps/files_external/l10n/fil.js
+++ b/apps/files_external/l10n/fil.js
@@ -2,6 +2,8 @@ OC.L10N.register(
"files_external",
{
"Username" : "Username",
- "Password" : "Password"
+ "Password" : "Password",
+ "Share" : "I-share",
+ "Folder name" : "Pangalan ng folder"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_external/l10n/fil.json b/apps/files_external/l10n/fil.json
index 95d8e5f9717..4038379e221 100644
--- a/apps/files_external/l10n/fil.json
+++ b/apps/files_external/l10n/fil.json
@@ -1,5 +1,7 @@
{ "translations": {
"Username" : "Username",
- "Password" : "Password"
+ "Password" : "Password",
+ "Share" : "I-share",
+ "Folder name" : "Pangalan ng folder"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/is.js b/apps/files_external/l10n/is.js
index 2affa90b1cd..4ea2081014a 100644
--- a/apps/files_external/l10n/is.js
+++ b/apps/files_external/l10n/is.js
@@ -1,12 +1,24 @@
OC.L10N.register(
"files_external",
{
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Mistókst að ná í beiðniteikn (request token). Gakktu úr skugga um að forritslykill og leynilykill séu réttir.",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "Mistókst að ná í aðgangsteikn (access token). Gakktu úr skugga um að forritslykill og leynilykill séu réttir.",
+ "Please provide a valid app key and secret." : "Settu inn gildan forritslykil og leynilykil (secret).",
"Step 1 failed. Exception: %s" : "Skref 1 mistókst. Undantekning: %s",
"Step 2 failed. Exception: %s" : "Skref 2 mistókst. Undantekning: %s",
"External storage" : "Ytri gagnageymsla",
+ "Storage with id \"%i\" not found" : "Geymsla með auðkennið '%i' fannst ekki",
+ "Invalid backend or authentication mechanism class" : "Ógildur flokkur bakenda eða auðkenningartækni",
"Invalid mount point" : "Ógildur tengipunktur",
+ "Objectstore forbidden" : "Hlutageymsla (objectstore) bönnuð",
+ "Invalid storage backend \"%s\"" : "Ógildur geymslubakendi \"%s\"",
+ "Not permitted to use backend \"%s\"" : "Ekki leyft að nota \"%s\" bakendann",
+ "Not permitted to use authentication mechanism \"%s\"" : "Ekki leyft að nota \"%s\" auðkenningartæknina",
+ "Unsatisfied backend parameters" : "Óuppfyllt viðföng bakenda",
+ "Unsatisfied authentication mechanism parameters" : "Óuppfyllt viðföng auðkenningartækni",
"Insufficient data: %s" : "Ónóg gögn: %s",
"%s" : "%s",
+ "Storage with id \"%i\" is not user editable" : "Geymslan með auðkennið '%s' er ekki breytanleg af notanda",
"Personal" : "Einka",
"System" : "Kerfi",
"Grant access" : "Veita aðgengi",
@@ -20,24 +32,44 @@ OC.L10N.register(
"Enable sharing" : "Virkja deilingu",
"Check for changes" : "Fylgjast með breytingum",
"Never" : "Aldrei",
+ "Once every direct access" : "Einu sinni við hvern beinan aðgang",
+ "All users. Type to select user or group." : "Allir notendur. Skrifaðu til að velja notanda eða hóp.",
"(group)" : "(hópur)",
+ "Admin defined" : "Skilgreindur kerfisstjóri",
"Saved" : "Vistað",
"Empty response from the server" : "Tómt svar frá þjóni móttekið",
+ "Couldn't access. Please logout and login to activate this mount point" : "Náði ekki aðgangi. Skráðu þig út og svo aftur inn til að virkja þennan tengipunkt",
+ "Couldn't get the information from the ownCloud server: {code} {type}" : "Gat ekki lesið upplýsingar frá ownCloud-þjóninum: {code} {type}",
+ "Couldn't get the list of external mount points: {type}" : "Gat ekki fengið lista yfir fjartengda tengipunkta: {type}",
+ "There was an error with message: " : "Það kom upp villa með skilaboðunum: ",
"External mount error" : "Villa við tengingu í fjartengdu skráakerfi",
"external-storage" : "ytri-gagnageymsla",
+ "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Gat ekki fengið lista yfir tengipunkta Windows-netdrifa: autt svar frá þjóni",
+ "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Sumir uppsettir tengipunktar eru ekki tengdir í skráakerfið. Smelltu á rauðu örina/örvarnar til að fá frekari upplýsingar",
+ "Please enter the credentials for the {mount} mount" : "Settu inn auðkenni fyrir {mount} tengipunktinn",
"Username" : "Notendanafn",
"Password" : "Lykilorð",
+ "Credentials saved" : "Auðkenni vistuð",
+ "Credentials saving failed" : "Vistun auðkenna tókst ekki",
+ "Credentials required" : "Auðkenna krafist",
"Save" : "Vista",
"Access key" : "Aðgangslykill",
"Secret key" : "Leynilykill",
"Builtin" : "Innbyggt",
"None" : "Ekkert",
"OAuth1" : "OAuth1",
+ "App key" : "Lykill forrits",
+ "App secret" : "Leynilykill forrits",
"OAuth2" : "OAuth2",
+ "Client ID" : "Biðlaraauðkenni",
+ "Client secret" : "Leynilykill biðlara",
"OpenStack" : "OpenStack",
+ "Tenant name" : "Nafn handhafa (tenant)",
+ "Identity endpoint URL" : "Endapunktur auðkennisslóðar (identity endpoint URL)",
"Rackspace" : "Rackspace",
"API key" : "API-lykill",
"Username and password" : "Notandanafn og lykilorð",
+ "Log-in credentials, save in session" : "Innskráningarauðkenni, vista í setu",
"RSA public key" : "RSA-dreifilykill",
"Public key" : "Dreifilykill",
"Amazon S3" : "Amazon S3",
@@ -46,6 +78,7 @@ OC.L10N.register(
"Port" : "Gátt",
"Region" : "Svæði",
"Enable SSL" : "Virkja SSL",
+ "Enable Path Style" : "Virkja slóðastíl",
"WebDAV" : "WebDAV",
"URL" : "Slóð (URL)",
"Remote subfolder" : "Fjartengd undirmappa",
@@ -60,21 +93,33 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Rót (root)",
+ "SFTP with secret key login" : "SFTP innskráning með leynilykli",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Deila",
"Domain" : "Lén",
+ "SMB / CIFS using OC login" : "SMB / CIFS með OC-innskráningu",
"Username as share" : "Notandanafn sem sameign",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Heiti á þjónustu",
+ "Request timeout (seconds)" : "Tímamörk á beiðni (sekúndur)",
"<b>Note:</b> " : "<b>Athugið:</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>Athugið:</b> Stuðningur við cURL í PHP er ekki virkjaður eða ekki uppsettur. Tenging %s er ekki möguleg. Biddu kerfisstjórann þinn um að setja þetta upp.",
+ "<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>Athugið:</b> Stuðningur við FTP í PHP er ekki virkjaður eða ekki uppsettur. Tenging %s er ekki möguleg. Biddu kerfisstjórann þinn um að setja þetta upp.",
+ "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Athugið:</b> \"%s\" ekki uppsett. Tenging %s er ekki möguleg. Biddu kerfisstjórann þinn um að setja þetta upp.",
+ "No external storage configured" : "Engin ytri-gagnageymsla stillt",
+ "You can add external storages in the personal settings" : "Þú getur bætt við ytri gagnageymslum í einkastillingunum þínum",
"Name" : "Nafn",
+ "Storage type" : "Tegund gagnageymslu",
"Scope" : "Umfang",
"External Storage" : "Ytri gagnageymsla",
"Folder name" : "Nafn möppu",
"Authentication" : "Auðkenning",
"Configuration" : "Uppsetning",
"Available for" : "Tiltækt fyrir",
+ "Add storage" : "Bæta við gagnahirslu",
"Advanced settings" : "Ítarlegri valkostir",
- "Delete" : "Eyða"
+ "Delete" : "Eyða",
+ "Allow users to mount external storage" : "Leyfa notendum að tengja ytri gagnageymslur í skráakerfi",
+ "Allow users to mount the following external storage" : "Leyfa notendum að tengja eftirfarandi ytri gagnageymslu í skráakerfi"
},
"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");
diff --git a/apps/files_external/l10n/is.json b/apps/files_external/l10n/is.json
index c1927e674f2..bd424aca99e 100644
--- a/apps/files_external/l10n/is.json
+++ b/apps/files_external/l10n/is.json
@@ -1,10 +1,22 @@
{ "translations": {
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Mistókst að ná í beiðniteikn (request token). Gakktu úr skugga um að forritslykill og leynilykill séu réttir.",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "Mistókst að ná í aðgangsteikn (access token). Gakktu úr skugga um að forritslykill og leynilykill séu réttir.",
+ "Please provide a valid app key and secret." : "Settu inn gildan forritslykil og leynilykil (secret).",
"Step 1 failed. Exception: %s" : "Skref 1 mistókst. Undantekning: %s",
"Step 2 failed. Exception: %s" : "Skref 2 mistókst. Undantekning: %s",
"External storage" : "Ytri gagnageymsla",
+ "Storage with id \"%i\" not found" : "Geymsla með auðkennið '%i' fannst ekki",
+ "Invalid backend or authentication mechanism class" : "Ógildur flokkur bakenda eða auðkenningartækni",
"Invalid mount point" : "Ógildur tengipunktur",
+ "Objectstore forbidden" : "Hlutageymsla (objectstore) bönnuð",
+ "Invalid storage backend \"%s\"" : "Ógildur geymslubakendi \"%s\"",
+ "Not permitted to use backend \"%s\"" : "Ekki leyft að nota \"%s\" bakendann",
+ "Not permitted to use authentication mechanism \"%s\"" : "Ekki leyft að nota \"%s\" auðkenningartæknina",
+ "Unsatisfied backend parameters" : "Óuppfyllt viðföng bakenda",
+ "Unsatisfied authentication mechanism parameters" : "Óuppfyllt viðföng auðkenningartækni",
"Insufficient data: %s" : "Ónóg gögn: %s",
"%s" : "%s",
+ "Storage with id \"%i\" is not user editable" : "Geymslan með auðkennið '%s' er ekki breytanleg af notanda",
"Personal" : "Einka",
"System" : "Kerfi",
"Grant access" : "Veita aðgengi",
@@ -18,24 +30,44 @@
"Enable sharing" : "Virkja deilingu",
"Check for changes" : "Fylgjast með breytingum",
"Never" : "Aldrei",
+ "Once every direct access" : "Einu sinni við hvern beinan aðgang",
+ "All users. Type to select user or group." : "Allir notendur. Skrifaðu til að velja notanda eða hóp.",
"(group)" : "(hópur)",
+ "Admin defined" : "Skilgreindur kerfisstjóri",
"Saved" : "Vistað",
"Empty response from the server" : "Tómt svar frá þjóni móttekið",
+ "Couldn't access. Please logout and login to activate this mount point" : "Náði ekki aðgangi. Skráðu þig út og svo aftur inn til að virkja þennan tengipunkt",
+ "Couldn't get the information from the ownCloud server: {code} {type}" : "Gat ekki lesið upplýsingar frá ownCloud-þjóninum: {code} {type}",
+ "Couldn't get the list of external mount points: {type}" : "Gat ekki fengið lista yfir fjartengda tengipunkta: {type}",
+ "There was an error with message: " : "Það kom upp villa með skilaboðunum: ",
"External mount error" : "Villa við tengingu í fjartengdu skráakerfi",
"external-storage" : "ytri-gagnageymsla",
+ "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Gat ekki fengið lista yfir tengipunkta Windows-netdrifa: autt svar frá þjóni",
+ "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Sumir uppsettir tengipunktar eru ekki tengdir í skráakerfið. Smelltu á rauðu örina/örvarnar til að fá frekari upplýsingar",
+ "Please enter the credentials for the {mount} mount" : "Settu inn auðkenni fyrir {mount} tengipunktinn",
"Username" : "Notendanafn",
"Password" : "Lykilorð",
+ "Credentials saved" : "Auðkenni vistuð",
+ "Credentials saving failed" : "Vistun auðkenna tókst ekki",
+ "Credentials required" : "Auðkenna krafist",
"Save" : "Vista",
"Access key" : "Aðgangslykill",
"Secret key" : "Leynilykill",
"Builtin" : "Innbyggt",
"None" : "Ekkert",
"OAuth1" : "OAuth1",
+ "App key" : "Lykill forrits",
+ "App secret" : "Leynilykill forrits",
"OAuth2" : "OAuth2",
+ "Client ID" : "Biðlaraauðkenni",
+ "Client secret" : "Leynilykill biðlara",
"OpenStack" : "OpenStack",
+ "Tenant name" : "Nafn handhafa (tenant)",
+ "Identity endpoint URL" : "Endapunktur auðkennisslóðar (identity endpoint URL)",
"Rackspace" : "Rackspace",
"API key" : "API-lykill",
"Username and password" : "Notandanafn og lykilorð",
+ "Log-in credentials, save in session" : "Innskráningarauðkenni, vista í setu",
"RSA public key" : "RSA-dreifilykill",
"Public key" : "Dreifilykill",
"Amazon S3" : "Amazon S3",
@@ -44,6 +76,7 @@
"Port" : "Gátt",
"Region" : "Svæði",
"Enable SSL" : "Virkja SSL",
+ "Enable Path Style" : "Virkja slóðastíl",
"WebDAV" : "WebDAV",
"URL" : "Slóð (URL)",
"Remote subfolder" : "Fjartengd undirmappa",
@@ -58,21 +91,33 @@
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Rót (root)",
+ "SFTP with secret key login" : "SFTP innskráning með leynilykli",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Deila",
"Domain" : "Lén",
+ "SMB / CIFS using OC login" : "SMB / CIFS með OC-innskráningu",
"Username as share" : "Notandanafn sem sameign",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Heiti á þjónustu",
+ "Request timeout (seconds)" : "Tímamörk á beiðni (sekúndur)",
"<b>Note:</b> " : "<b>Athugið:</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>Athugið:</b> Stuðningur við cURL í PHP er ekki virkjaður eða ekki uppsettur. Tenging %s er ekki möguleg. Biddu kerfisstjórann þinn um að setja þetta upp.",
+ "<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>Athugið:</b> Stuðningur við FTP í PHP er ekki virkjaður eða ekki uppsettur. Tenging %s er ekki möguleg. Biddu kerfisstjórann þinn um að setja þetta upp.",
+ "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Athugið:</b> \"%s\" ekki uppsett. Tenging %s er ekki möguleg. Biddu kerfisstjórann þinn um að setja þetta upp.",
+ "No external storage configured" : "Engin ytri-gagnageymsla stillt",
+ "You can add external storages in the personal settings" : "Þú getur bætt við ytri gagnageymslum í einkastillingunum þínum",
"Name" : "Nafn",
+ "Storage type" : "Tegund gagnageymslu",
"Scope" : "Umfang",
"External Storage" : "Ytri gagnageymsla",
"Folder name" : "Nafn möppu",
"Authentication" : "Auðkenning",
"Configuration" : "Uppsetning",
"Available for" : "Tiltækt fyrir",
+ "Add storage" : "Bæta við gagnahirslu",
"Advanced settings" : "Ítarlegri valkostir",
- "Delete" : "Eyða"
+ "Delete" : "Eyða",
+ "Allow users to mount external storage" : "Leyfa notendum að tengja ytri gagnageymslur í skráakerfi",
+ "Allow users to mount the following external storage" : "Leyfa notendum að tengja eftirfarandi ytri gagnageymslu í skráakerfi"
},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/mk.js b/apps/files_external/l10n/mk.js
index 70d9b5a755f..0f0677c2d55 100644
--- a/apps/files_external/l10n/mk.js
+++ b/apps/files_external/l10n/mk.js
@@ -4,6 +4,7 @@ OC.L10N.register(
"Personal" : "Лично",
"Grant access" : "Дозволи пристап",
"Access granted" : "Пристапот е дозволен",
+ "Enable encryption" : "Овозможи енкрипција",
"Saved" : "Снимено",
"Username" : "Корисничко име",
"Password" : "Лозинка",
diff --git a/apps/files_external/l10n/mk.json b/apps/files_external/l10n/mk.json
index d97c5b872ba..b6437b19640 100644
--- a/apps/files_external/l10n/mk.json
+++ b/apps/files_external/l10n/mk.json
@@ -2,6 +2,7 @@
"Personal" : "Лично",
"Grant access" : "Дозволи пристап",
"Access granted" : "Пристапот е дозволен",
+ "Enable encryption" : "Овозможи енкрипција",
"Saved" : "Снимено",
"Username" : "Корисничко име",
"Password" : "Лозинка",
diff --git a/apps/files_external/l10n/tr.js b/apps/files_external/l10n/tr.js
index dfbbef593ae..14e86c5868f 100644
--- a/apps/files_external/l10n/tr.js
+++ b/apps/files_external/l10n/tr.js
@@ -43,8 +43,15 @@ OC.L10N.register(
"Couldn't get the list of external mount points: {type}" : "Harici bağlama noktalarının listesi alınamadı: {type}",
"There was an error with message: " : "Şu mesajla bir hata oluştu:",
"External mount error" : "Harici bağlama hatası",
+ "external-storage" : "harici-depolama",
+ "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Windows ağ sürücüsü bağlama nokta listesi alınamadı: sunucudan boş yanıt",
+ "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Yapılandırılmış harici bağlama noktalarından bazıları bağlı değil. Lütfen daha fazla bilgi için kırmızı satırlara tıklayın",
+ "Please enter the credentials for the {mount} mount" : "{mount} bağlaması için kimlik bilgilerini girin",
"Username" : "Kullanıcı Adı",
"Password" : "Parola",
+ "Credentials saved" : "Kimlik bilgileri kaydedildi",
+ "Credentials saving failed" : "Kimlik bilgileri kaydedilemedi",
+ "Credentials required" : "Kimlik bilgileri gerekli",
"Save" : "Kaydet",
"Access key" : "Erişim anahtarı",
"Secret key" : "Gizli anahtar",
@@ -62,6 +69,7 @@ OC.L10N.register(
"Rackspace" : "Rackspace",
"API key" : "API anahtarı",
"Username and password" : "Kullanıcı adı ve parola",
+ "Log-in credentials, save in session" : "Oturum kimlik bilgileri, oturumda kaydet",
"RSA public key" : "RSA ortak anahtarı",
"Public key" : "Ortak anahtar",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/tr.json b/apps/files_external/l10n/tr.json
index 2b1296e3c6f..cc015c380fe 100644
--- a/apps/files_external/l10n/tr.json
+++ b/apps/files_external/l10n/tr.json
@@ -41,8 +41,15 @@
"Couldn't get the list of external mount points: {type}" : "Harici bağlama noktalarının listesi alınamadı: {type}",
"There was an error with message: " : "Şu mesajla bir hata oluştu:",
"External mount error" : "Harici bağlama hatası",
+ "external-storage" : "harici-depolama",
+ "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Windows ağ sürücüsü bağlama nokta listesi alınamadı: sunucudan boş yanıt",
+ "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Yapılandırılmış harici bağlama noktalarından bazıları bağlı değil. Lütfen daha fazla bilgi için kırmızı satırlara tıklayın",
+ "Please enter the credentials for the {mount} mount" : "{mount} bağlaması için kimlik bilgilerini girin",
"Username" : "Kullanıcı Adı",
"Password" : "Parola",
+ "Credentials saved" : "Kimlik bilgileri kaydedildi",
+ "Credentials saving failed" : "Kimlik bilgileri kaydedilemedi",
+ "Credentials required" : "Kimlik bilgileri gerekli",
"Save" : "Kaydet",
"Access key" : "Erişim anahtarı",
"Secret key" : "Gizli anahtar",
@@ -60,6 +67,7 @@
"Rackspace" : "Rackspace",
"API key" : "API anahtarı",
"Username and password" : "Kullanıcı adı ve parola",
+ "Log-in credentials, save in session" : "Oturum kimlik bilgileri, oturumda kaydet",
"RSA public key" : "RSA ortak anahtarı",
"Public key" : "Ortak anahtar",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/lib/dropbox.php b/apps/files_external/lib/dropbox.php
index f59b5a460e1..8381ccbae59 100644
--- a/apps/files_external/lib/dropbox.php
+++ b/apps/files_external/lib/dropbox.php
@@ -29,7 +29,9 @@
namespace OC\Files\Storage;
+use GuzzleHttp\Exception\RequestException;
use Icewind\Streams\IteratorDirectory;
+use Icewind\Streams\RetryWrapper;
require_once __DIR__ . '/../3rdparty/Dropbox/autoload.php';
@@ -257,10 +259,9 @@ class Dropbox extends \OC\Files\Storage\Common {
$client = \OC::$server->getHTTPClientService()->newClient();
try {
- $tmpFile = \OC::$server->getTempManager()->getTemporaryFile();
- $client->get($downloadUrl, [
+ $response = $client->get($downloadUrl, [
'headers' => $headers,
- 'save_to' => $tmpFile,
+ 'stream' => true,
]);
} catch (RequestException $e) {
if (!is_null($e->getResponse())) {
@@ -274,7 +275,8 @@ class Dropbox extends \OC\Files\Storage\Common {
}
}
- return fopen($tmpFile, 'r');
+ $handle = $response->getBody();
+ return RetryWrapper::wrap($handle);
} catch (\Exception $exception) {
\OCP\Util::writeLog('files_external', $exception->getMessage(), \OCP\Util::ERROR);
return false;
diff --git a/apps/files_external/lib/ftp.php b/apps/files_external/lib/ftp.php
index 125888ef722..338e2c14fa4 100644
--- a/apps/files_external/lib/ftp.php
+++ b/apps/files_external/lib/ftp.php
@@ -30,6 +30,8 @@
namespace OC\Files\Storage;
+use Icewind\Streams\RetryWrapper;
+
class FTP extends \OC\Files\Storage\StreamWrapper{
private $password;
private $user;
@@ -105,7 +107,8 @@ class FTP extends \OC\Files\Storage\StreamWrapper{
case 'ab':
//these are supported by the wrapper
$context = stream_context_create(array('ftp' => array('overwrite' => true)));
- return fopen($this->constructUrl($path), $mode, false, $context);
+ $handle = fopen($this->constructUrl($path), $mode, false, $context);
+ return RetryWrapper::wrap($handle);
case 'r+':
case 'w+':
case 'wb+':
diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/google.php
index 5e5716cf438..91e7dfee08d 100644
--- a/apps/files_external/lib/google.php
+++ b/apps/files_external/lib/google.php
@@ -445,6 +445,7 @@ class Google extends \OC\Files\Storage\Common {
$client->get($downloadUrl, [
'headers' => $httpRequest->getRequestHeaders(),
'save_to' => $tmpFile,
+ 'verify' => __DIR__ . '/../3rdparty/google-api-php-client/src/Google/IO/cacerts.pem',
]);
} catch (RequestException $e) {
if(!is_null($e->getResponse())) {
@@ -490,18 +491,27 @@ class Google extends \OC\Files\Storage\Common {
$path = self::$tempFiles[$tmpFile];
$parentFolder = $this->getDriveFile(dirname($path));
if ($parentFolder) {
- // TODO Research resumable upload
$mimetype = \OC::$server->getMimeTypeDetector()->detect($tmpFile);
- $data = file_get_contents($tmpFile);
$params = array(
- 'data' => $data,
'mimeType' => $mimetype,
'uploadType' => 'media'
);
$result = false;
+
+ $chunkSizeBytes = 10 * 1024 * 1024;
+
+ $useChunking = false;
+ $size = filesize($tmpFile);
+ if ($size > $chunkSizeBytes) {
+ $useChunking = true;
+ } else {
+ $params['data'] = file_get_contents($tmpFile);
+ }
+
if ($this->file_exists($path)) {
$file = $this->getDriveFile($path);
- $result = $this->service->files->update($file->getId(), $file, $params);
+ $this->client->setDefer($useChunking);
+ $request = $this->service->files->update($file->getId(), $file, $params);
} else {
$file = new \Google_Service_Drive_DriveFile();
$file->setTitle(basename($path));
@@ -509,8 +519,46 @@ class Google extends \OC\Files\Storage\Common {
$parent = new \Google_Service_Drive_ParentReference();
$parent->setId($parentFolder->getId());
$file->setParents(array($parent));
- $result = $this->service->files->insert($file, $params);
+ $this->client->setDefer($useChunking);
+ $request = $this->service->files->insert($file, $params);
+ }
+
+ if ($useChunking) {
+ // Create a media file upload to represent our upload process.
+ $media = new \Google_Http_MediaFileUpload(
+ $this->client,
+ $request,
+ 'text/plain',
+ null,
+ true,
+ $chunkSizeBytes
+ );
+ $media->setFileSize($size);
+
+ // Upload the various chunks. $status will be false until the process is
+ // complete.
+ $status = false;
+ $handle = fopen($tmpFile, 'rb');
+ while (!$status && !feof($handle)) {
+ $chunk = fread($handle, $chunkSizeBytes);
+ $status = $media->nextChunk($chunk);
+ }
+
+ // The final value of $status will be the data from the API for the object
+ // that has been uploaded.
+ $result = false;
+ if ($status !== false) {
+ $result = $status;
+ }
+
+ fclose($handle);
+ } else {
+ $result = $request;
}
+
+ // Reset to the client to execute requests immediately in the future.
+ $this->client->setDefer(false);
+
if ($result) {
$this->setDriveFile($path, $result);
}
diff --git a/apps/files_external/lib/sftp.php b/apps/files_external/lib/sftp.php
index f6b2873cf49..c44ee9f908e 100644
--- a/apps/files_external/lib/sftp.php
+++ b/apps/files_external/lib/sftp.php
@@ -32,6 +32,7 @@
namespace OC\Files\Storage;
use Icewind\Streams\IteratorDirectory;
+use Icewind\Streams\RetryWrapper;
use phpseclib\Net\SFTP\Stream;
/**
@@ -374,7 +375,8 @@ class SFTP extends \OC\Files\Storage\Common {
case 'c':
case 'c+':
$context = stream_context_create(array('sftp' => array('session' => $this->getConnection())));
- return fopen($this->constructUrl($path), $mode, false, $context);
+ $handle = fopen($this->constructUrl($path), $mode, false, $context);
+ return RetryWrapper::wrap($handle);
}
} catch (\Exception $e) {
}
diff --git a/apps/files_external/lib/smb.php b/apps/files_external/lib/smb.php
index 25acae95fa3..08c4b25a088 100644
--- a/apps/files_external/lib/smb.php
+++ b/apps/files_external/lib/smb.php
@@ -349,6 +349,28 @@ class SMB extends Common {
}
}
+ public function isReadable($path) {
+ try {
+ $info = $this->getFileInfo($path);
+ return !$info->isHidden();
+ } catch (NotFoundException $e) {
+ return false;
+ } catch (ForbiddenException $e) {
+ return false;
+ }
+ }
+
+ public function isUpdatable($path) {
+ try {
+ $info = $this->getFileInfo($path);
+ return !$info->isHidden() && !$info->isReadOnly();
+ } catch (NotFoundException $e) {
+ return false;
+ } catch (ForbiddenException $e) {
+ return false;
+ }
+ }
+
/**
* check if smbclient is installed
*/
diff --git a/apps/files_external/service/globalstoragesservice.php b/apps/files_external/service/globalstoragesservice.php
index 312d8417a92..62da314c5fa 100644
--- a/apps/files_external/service/globalstoragesservice.php
+++ b/apps/files_external/service/globalstoragesservice.php
@@ -72,7 +72,7 @@ class GlobalStoragesService extends StoragesService {
/**
* Triggers signal_create_mount or signal_delete_mount to
- * accomodate for additions/deletions in applicableUsers
+ * accommodate for additions/deletions in applicableUsers
* and applicableGroups fields.
*
* @param StorageConfig $oldStorage old storage config
diff --git a/apps/files_external/service/legacystoragesservice.php b/apps/files_external/service/legacystoragesservice.php
index bab1008e561..158fc2b5137 100644
--- a/apps/files_external/service/legacystoragesservice.php
+++ b/apps/files_external/service/legacystoragesservice.php
@@ -188,7 +188,7 @@ abstract class LegacyStoragesService {
$storagesWithConfigHash[$configId] = $currentStorage;
}
} catch (\UnexpectedValueException $e) {
- // dont die if a storage backend doesn't exist
+ // don't die if a storage backend doesn't exist
\OCP\Util::writeLog(
'files_external',
'Could not load storage: "' . $e->getMessage() . '"',
diff --git a/apps/files_external/service/storagesservice.php b/apps/files_external/service/storagesservice.php
index 1762b55a06c..6542be146d6 100644
--- a/apps/files_external/service/storagesservice.php
+++ b/apps/files_external/service/storagesservice.php
@@ -96,7 +96,7 @@ abstract class StoragesService {
$config->setId((int)$mount['mount_id']);
return $config;
} catch (\UnexpectedValueException $e) {
- // dont die if a storage backend doesn't exist
+ // don't die if a storage backend doesn't exist
\OCP\Util::writeLog(
'files_external',
'Could not load storage: "' . $e->getMessage() . '"',
@@ -352,7 +352,7 @@ abstract class StoragesService {
/**
* Triggers signal_create_mount or signal_delete_mount to
- * accomodate for additions/deletions in applicableUsers
+ * accommodate for additions/deletions in applicableUsers
* and applicableGroups fields.
*
* @param StorageConfig $oldStorage old storage data
diff --git a/apps/files_external/service/userstoragesservice.php b/apps/files_external/service/userstoragesservice.php
index d4b04de609d..c46846e76d6 100644
--- a/apps/files_external/service/userstoragesservice.php
+++ b/apps/files_external/service/userstoragesservice.php
@@ -82,7 +82,7 @@ class UserStoragesService extends StoragesService {
/**
* Triggers signal_create_mount or signal_delete_mount to
- * accomodate for additions/deletions in applicableUsers
+ * accommodate for additions/deletions in applicableUsers
* and applicableGroups fields.
*
* @param StorageConfig $oldStorage old storage data
diff --git a/apps/files_sharing/api/share20ocs.php b/apps/files_sharing/api/share20ocs.php
index 5a2af48d6f5..61d5044cf84 100644
--- a/apps/files_sharing/api/share20ocs.php
+++ b/apps/files_sharing/api/share20ocs.php
@@ -161,6 +161,10 @@ class Share20OCS {
* @return \OC_OCS_Result
*/
public function getShare($id) {
+ if (!$this->shareManager->shareApiEnabled()) {
+ return new \OC_OCS_Result(null, 404, 'Share API is disabled');
+ }
+
try {
$share = $this->getShareById($id);
} catch (ShareNotFound $e) {
@@ -186,7 +190,10 @@ class Share20OCS {
* @return \OC_OCS_Result
*/
public function deleteShare($id) {
- // Try both our default and our federated provider
+ if (!$this->shareManager->shareApiEnabled()) {
+ return new \OC_OCS_Result(null, 404, 'Share API is disabled');
+ }
+
try {
$share = $this->getShareById($id);
} catch (ShareNotFound $e) {
@@ -208,6 +215,10 @@ class Share20OCS {
public function createShare() {
$share = $this->shareManager->newShare();
+ if (!$this->shareManager->shareApiEnabled()) {
+ return new \OC_OCS_Result(null, 404, 'Share API is disabled');
+ }
+
// Verify path
$path = $this->request->getParam('path', null);
if ($path === null) {
@@ -264,6 +275,10 @@ class Share20OCS {
$share->setSharedWith($shareWith);
$share->setPermissions($permissions);
} else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
+ if (!$this->shareManager->allowGroupSharing()) {
+ return new \OC_OCS_Result(null, 404, 'group sharing is disabled by the administrator');
+ }
+
// Valid group is required to share
if ($shareWith === null || !$this->groupManager->groupExists($shareWith)) {
return new \OC_OCS_Result(null, 404, 'please specify a valid group');
@@ -421,6 +436,10 @@ class Share20OCS {
* @return \OC_OCS_Result
*/
public function getShares() {
+ if (!$this->shareManager->shareApiEnabled()) {
+ return new \OC_OCS_Result();
+ }
+
$sharedWithMe = $this->request->getParam('shared_with_me', null);
$reshares = $this->request->getParam('reshares', null);
$subfiles = $this->request->getParam('subfiles');
@@ -478,6 +497,10 @@ class Share20OCS {
* @return \OC_OCS_Result
*/
public function updateShare($id) {
+ if (!$this->shareManager->shareApiEnabled()) {
+ return new \OC_OCS_Result(null, 404, 'Share API is disabled');
+ }
+
try {
$share = $this->getShareById($id);
} catch (ShareNotFound $e) {
diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php
index 718be4dece9..4e005c5e26c 100644
--- a/apps/files_sharing/api/sharees.php
+++ b/apps/files_sharing/api/sharees.php
@@ -62,6 +62,9 @@ class Sharees {
/** @var ILogger */
protected $logger;
+ /** @var \OCP\Share\IManager */
+ protected $shareManager;
+
/** @var bool */
protected $shareWithGroupOnly = false;
@@ -97,6 +100,7 @@ class Sharees {
* @param IURLGenerator $urlGenerator
* @param IRequest $request
* @param ILogger $logger
+ * @param \OCP\Share\IManager $shareManager
*/
public function __construct(IGroupManager $groupManager,
IUserManager $userManager,
@@ -105,7 +109,8 @@ class Sharees {
IUserSession $userSession,
IURLGenerator $urlGenerator,
IRequest $request,
- ILogger $logger) {
+ ILogger $logger,
+ \OCP\Share\IManager $shareManager) {
$this->groupManager = $groupManager;
$this->userManager = $userManager;
$this->contactsManager = $contactsManager;
@@ -114,6 +119,7 @@ class Sharees {
$this->urlGenerator = $urlGenerator;
$this->request = $request;
$this->logger = $logger;
+ $this->shareManager = $shareManager;
}
/**
@@ -411,9 +417,14 @@ class Sharees {
$shareTypes = [
Share::SHARE_TYPE_USER,
- Share::SHARE_TYPE_GROUP,
- Share::SHARE_TYPE_REMOTE,
];
+
+ if ($this->shareManager->allowGroupSharing()) {
+ $shareTypes[] = Share::SHARE_TYPE_GROUP;
+ }
+
+ $shareTypes[] = Share::SHARE_TYPE_REMOTE;
+
if (isset($_GET['shareType']) && is_array($_GET['shareType'])) {
$shareTypes = array_intersect($shareTypes, $_GET['shareType']);
sort($shareTypes);
diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php
index 961206079be..80632f0fedf 100644
--- a/apps/files_sharing/appinfo/routes.php
+++ b/apps/files_sharing/appinfo/routes.php
@@ -126,7 +126,8 @@ $sharees = new \OCA\Files_Sharing\API\Sharees(\OC::$server->getGroupManager(),
\OC::$server->getUserSession(),
\OC::$server->getURLGenerator(),
\OC::$server->getRequest(),
- \OC::$server->getLogger());
+ \OC::$server->getLogger(),
+ \OC::$server->getShareManager());
API::register('get',
'/apps/files_sharing/api/v1/sharees',
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index 2711b2392e9..5bfc8e1d4a2 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -60,6 +60,9 @@
if (fileData.recipientsDisplayName) {
tr.attr('data-share-recipients', fileData.recipientsDisplayName);
}
+ if (fileData.shareTypes) {
+ tr.attr('data-share-types', fileData.shareTypes.join(','));
+ }
return tr;
};
@@ -77,6 +80,7 @@
fileList._getWebdavProperties = function() {
var props = oldGetWebdavProperties.apply(this, arguments);
props.push('{' + NS_OC + '}owner-display-name');
+ props.push('{' + NS_OC + '}share-types');
return props;
};
@@ -88,40 +92,48 @@
if (permissionsProp && permissionsProp.indexOf('S') >= 0) {
data.shareOwner = props['{' + NS_OC + '}owner-display-name'];
}
+
+ var shareTypesProp = props['{' + NS_OC + '}share-types'];
+ if (shareTypesProp) {
+ data.shareTypes = _.chain(shareTypesProp).filter(function(xmlvalue) {
+ return (xmlvalue.namespaceURI === NS_OC && xmlvalue.nodeName.split(':')[1] === 'share-type');
+ }).map(function(xmlvalue) {
+ return parseInt(xmlvalue.textContent || xmlvalue.text, 10);
+ }).value();
+ }
+
return data;
});
// use delegate to catch the case with multiple file lists
fileList.$el.on('fileActionsReady', function(ev){
- var fileList = ev.fileList;
var $files = ev.$files;
- function updateIcons($files) {
- if (!$files) {
- // if none specified, update all
- $files = fileList.$fileList.find('tr');
+ _.each($files, function(file) {
+ var $tr = $(file);
+ var shareTypes = $tr.attr('data-share-types') || '';
+ var shareOwner = $tr.attr('data-share-owner');
+ if (shareTypes || shareOwner) {
+ var hasLink = false;
+ var hasShares = false;
+ _.each(shareTypes.split(',') || [], function(shareType) {
+ shareType = parseInt(shareType, 10);
+ if (shareType === OC.Share.SHARE_TYPE_LINK) {
+ hasLink = true;
+ } else if (shareType === OC.Share.SHARE_TYPE_USER) {
+ hasShares = true;
+ } else if (shareType === OC.Share.SHARE_TYPE_GROUP) {
+ hasShares = true;
+ } else if (shareType === OC.Share.SHARE_TYPE_REMOTE) {
+ hasShares = true;
+ }
+ });
+ OCA.Sharing.Util._updateFileActionIcon($tr, hasShares, hasLink);
}
- _.each($files, function(file) {
- var $tr = $(file);
- var shareStatus = OC.Share.statuses[$tr.data('id')];
- OCA.Sharing.Util._updateFileActionIcon($tr, !!shareStatus, shareStatus && shareStatus.link);
- });
- }
-
- if (!OCA.Sharing.sharesLoaded){
- OC.Share.loadIcons('file', fileList, function() {
- // since we don't know which files are affected, just refresh them all
- updateIcons();
- });
- // assume that we got all shares, so switching directories
- // will not invalidate that list
- OCA.Sharing.sharesLoaded = true;
- }
- else{
- updateIcons($files);
- }
+ });
});
+
fileList.$el.on('changeDirectory', function() {
OCA.Sharing.sharesLoaded = false;
});
diff --git a/apps/files_sharing/js/sharedfilelist.js b/apps/files_sharing/js/sharedfilelist.js
index a799d4a94c2..da0f957ed99 100644
--- a/apps/files_sharing/js/sharedfilelist.js
+++ b/apps/files_sharing/js/sharedfilelist.js
@@ -286,6 +286,8 @@
// using a hash to make them unique,
// this is only a list to be displayed
data.recipients = {};
+ // share types
+ data.shareTypes = {};
// counter is cheaper than calling _.keys().length
data.recipientsCount = 0;
data.mtime = file.share.stime;
@@ -308,6 +310,8 @@
data.recipientsCount++;
}
+ data.shareTypes[file.share.type] = true;
+
delete file.share;
return memo;
}, {})
@@ -324,6 +328,12 @@
data.recipientsCount
);
delete data.recipientsCount;
+ if (self._sharedWithUser) {
+ // only for outgoing shres
+ delete data.shareTypes;
+ } else {
+ data.shareTypes = _.keys(data.shareTypes);
+ }
})
// Finish the chain by getting the result
.value();
diff --git a/apps/files_sharing/l10n/da.js b/apps/files_sharing/l10n/da.js
index d3ba2463591..b981022986a 100644
--- a/apps/files_sharing/l10n/da.js
+++ b/apps/files_sharing/l10n/da.js
@@ -3,6 +3,7 @@ OC.L10N.register(
{
"Server to server sharing is not enabled on this server" : "Server til serverdeling er ikke slået til på denne server",
"The mountpoint name contains invalid characters." : "Monteringspunktets navn indeholder ugyldige tegn.",
+ "Not allowed to create a federated share with the same user server" : "Det er ikke tilladt at danne et datafællesskab med samme brugerserver",
"Invalid or untrusted SSL certificate" : "Ugyldigt eller upålideligt SSL-certifikat",
"Could not authenticate to remote share, password might be wrong" : "Kunne ikke godkende fjerndelingen - kodeordet er muilgvis forkert",
"Storage not valid" : "Lagerplads er ikke gyldig",
@@ -10,6 +11,7 @@ OC.L10N.register(
"Shared with you" : "Delt med dig",
"Shared with others" : "Delt med andre",
"Shared by link" : "Delt via link",
+ "Federated sharing" : "Datafællesskabsdeling",
"Nothing shared with you yet" : "Der deles ikke noget med dig endnu",
"Files and folders others share with you will show up here" : "Filer og mapper som andre deler med dig, vil blive vist her",
"Nothing shared yet" : "Der deles endnu ikke noget",
diff --git a/apps/files_sharing/l10n/da.json b/apps/files_sharing/l10n/da.json
index d447dee544e..38f98ca22b8 100644
--- a/apps/files_sharing/l10n/da.json
+++ b/apps/files_sharing/l10n/da.json
@@ -1,6 +1,7 @@
{ "translations": {
"Server to server sharing is not enabled on this server" : "Server til serverdeling er ikke slået til på denne server",
"The mountpoint name contains invalid characters." : "Monteringspunktets navn indeholder ugyldige tegn.",
+ "Not allowed to create a federated share with the same user server" : "Det er ikke tilladt at danne et datafællesskab med samme brugerserver",
"Invalid or untrusted SSL certificate" : "Ugyldigt eller upålideligt SSL-certifikat",
"Could not authenticate to remote share, password might be wrong" : "Kunne ikke godkende fjerndelingen - kodeordet er muilgvis forkert",
"Storage not valid" : "Lagerplads er ikke gyldig",
@@ -8,6 +9,7 @@
"Shared with you" : "Delt med dig",
"Shared with others" : "Delt med andre",
"Shared by link" : "Delt via link",
+ "Federated sharing" : "Datafællesskabsdeling",
"Nothing shared with you yet" : "Der deles ikke noget med dig endnu",
"Files and folders others share with you will show up here" : "Filer og mapper som andre deler med dig, vil blive vist her",
"Nothing shared yet" : "Der deles endnu ikke noget",
diff --git a/apps/files_sharing/l10n/fil.js b/apps/files_sharing/l10n/fil.js
index 59f17cc001b..89f2cadd416 100644
--- a/apps/files_sharing/l10n/fil.js
+++ b/apps/files_sharing/l10n/fil.js
@@ -1,6 +1,8 @@
OC.L10N.register(
"files_sharing",
{
- "Password" : "Password"
+ "Cancel" : "I-cancel",
+ "Password" : "Password",
+ "Download" : "I-download"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_sharing/l10n/fil.json b/apps/files_sharing/l10n/fil.json
index b60f17590ba..adfa180e683 100644
--- a/apps/files_sharing/l10n/fil.json
+++ b/apps/files_sharing/l10n/fil.json
@@ -1,4 +1,6 @@
{ "translations": {
- "Password" : "Password"
+ "Cancel" : "I-cancel",
+ "Password" : "Password",
+ "Download" : "I-download"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/sv.js b/apps/files_sharing/l10n/sv.js
index d2357c0de33..e9cac30212a 100644
--- a/apps/files_sharing/l10n/sv.js
+++ b/apps/files_sharing/l10n/sv.js
@@ -3,11 +3,15 @@ OC.L10N.register(
{
"Server to server sharing is not enabled on this server" : "Server-till-server-delning är inte aktiverat på denna server",
"The mountpoint name contains invalid characters." : "Monteringspunktens namn innehåller ogiltiga tecken.",
+ "Not allowed to create a federated share with the same user server" : "Ej tillåten att skapa en federerad delning med samma användarserver.",
"Invalid or untrusted SSL certificate" : "Ogiltigt eller ej betrott SSL-certifikat",
+ "Could not authenticate to remote share, password might be wrong" : "Kunde ej autensiera fjärrdelningen, lösenordet kan vara fel",
+ "Storage not valid" : "Lagring ej giltig",
"Couldn't add remote share" : "Kunde inte lägga till fjärrutdelning",
"Shared with you" : "Delat med dig",
"Shared with others" : "Delat med andra",
"Shared by link" : "Delad som länk",
+ "Federated sharing" : "Federated Delning",
"Nothing shared with you yet" : "Inget delat med dig ännu",
"Files and folders others share with you will show up here" : "Filer och mappar andra delar med dig kommer visas här",
"Nothing shared yet" : "Inget delat ännu",
@@ -19,12 +23,15 @@ OC.L10N.register(
"Remote share password" : "Lösenord för fjärrdelning",
"Cancel" : "Avbryt",
"Add remote share" : "Lägg till fjärrdelning",
+ "You can upload into this folder" : "Du kan ladda upp i denna map",
+ "No ownCloud installation (7 or higher) found at {remote}" : "Ingen OwnCloud Installation (7 eller senare) funnen på {remote}",
"Invalid ownCloud url" : "Felaktig ownCloud url",
"Shared by" : "Delad av",
"Sharing" : "Dela",
"A file or folder has been <strong>shared</strong>" : "En fil eller mapp har <strong>delats</strong>",
"A file or folder was shared from <strong>another server</strong>" : "En fil eller mapp delades från <strong>en annan server</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "En publikt delad fil eller mapp blev <strong>nerladdad</strong>",
+ "You received a new remote share %2$s from %1$s" : "Du har mottagit en fjärrdelning %2$s från %1$s",
"You received a new remote share from %s" : "Du mottog en ny fjärrdelning från %s",
"%1$s accepted remote share %2$s" : "%1$s accepterade fjärrdelning %2$s",
"%1$s declined remote share %2$s" : "%1$s nekade fjärrdelning %2$s",
@@ -32,11 +39,42 @@ OC.L10N.register(
"Public shared folder %1$s was downloaded" : "Publikt delad mapp %1$s blev nerladdad",
"Public shared file %1$s was downloaded" : "Publikt delad fil %1$s blev nerladdad",
"You shared %1$s with %2$s" : "Du delade %1$s med %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s delade %1$s med %3$s",
+ "%2$s removed the share of %3$s for %1$s" : "%2$s tog bort delningen av %3$s för %1$s",
"You shared %1$s with group %2$s" : "Du delade %1$s med grupp %2$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s delade %1$s med gruppen %3$s",
+ "You removed the share of group %2$s for %1$s" : "Du tog bort delningen av gruppen %2$s för %1$s",
+ "%2$s removed the share of group %3$s for %1$s" : "%2$s tog bort delningen av grupp %3$s för %1$s",
+ "%2$s shared %1$s via link" : "%2$s delade %1$s via länk",
"You shared %1$s via link" : "Du delade %1$s via länk",
+ "You removed the public link for %1$s" : "Du tog bort den publika länken för %1$s",
+ "%2$s removed the public link for %1$s" : "%2$s tog bort den publika länken för %1$s",
+ "Your public link for %1$s expired" : "Din publika länk för %1$s har löpt ut",
+ "The public link of %2$s for %1$s expired" : "Den publika länken för %2$s av %1$s har löpt ut",
"%2$s shared %1$s with you" : "%2$s delade %1$s med dig",
+ "%2$s removed the share for %1$s" : "%2$s tog bort delningen av %1$s",
+ "Downloaded via public link" : "Nerladdad via publik länk",
+ "Shared with %2$s" : "Delad med %2$s",
+ "Shared with %3$s by %2$s" : "Delad med %3$s av %2$s",
+ "Removed share for %2$s" : "Tog bort delningen för %2$s",
+ "%2$s removed share for %3$s" : "%2$s tog bort delningen för %3$s",
+ "Shared with group %2$s" : "Delning med grupp %2$s",
+ "Shared with group %3$s by %2$s" : "Delade med grupp %3$s av %2$s",
+ "Removed share of group %2$s" : "Tog bort delning av grupp %2$s",
+ "%2$s removed share of group %3$s" : "%2$s tog bort delningen av grupp %3$s",
+ "Shared via link by %2$s" : "Delad via länk av %2$s",
+ "Shared via public link" : "Delad via publik länk",
+ "Removed public link" : "Tog bort publik länk",
+ "%2$s removed public link" : "%2$s tog bort publik länk",
+ "Public link expired" : "Tidsgräns för publik länk har löpt ut",
+ "Public link of %2$s expired" : "Tidsgräns för publik länk för %2$s har löpt ut",
+ "Shared by %2$s" : "Delad av %2$s",
"Shares" : "Delningar",
+ "You received \"/%2$s\" as a remote share from %1$s" : "Du mottog \"/%2$s\" som fjärrdelning från %1$s",
"Accept" : "Acceptera",
+ "Decline" : "Neka",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dela med mig genom min #owncloud Federated Cloud ID, se %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Dela med mig genom min #ownCloud Federated Cloud ID",
"This share is password-protected" : "Den här delningen är lösenordsskyddad",
"The password is wrong. Try again." : "Lösenordet är fel. Försök igen.",
"Password" : "Lösenord",
@@ -53,7 +91,15 @@ OC.L10N.register(
"Download" : "Ladda ner",
"Download %s" : "Ladda ner %s",
"Direct link" : "Direkt länk",
+ "Federated Cloud Sharing" : "Federate Cloud delning",
+ "Open documentation" : "Öppna dokumentation",
"Allow users on this server to send shares to other servers" : "Tillåt användare på denna server att skicka utdelningar till andra servrar",
- "Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar"
+ "Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Ditt Federated Cloud ID",
+ "Share it:" : "Dela detta:",
+ "Add to your website" : "Lägg till på din hemsida",
+ "Share with me via ownCloud" : "Dela med mig via Owncloud",
+ "HTML Code:" : "HTML Kod:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/sv.json b/apps/files_sharing/l10n/sv.json
index 9331d95aafb..fd916262560 100644
--- a/apps/files_sharing/l10n/sv.json
+++ b/apps/files_sharing/l10n/sv.json
@@ -1,11 +1,15 @@
{ "translations": {
"Server to server sharing is not enabled on this server" : "Server-till-server-delning är inte aktiverat på denna server",
"The mountpoint name contains invalid characters." : "Monteringspunktens namn innehåller ogiltiga tecken.",
+ "Not allowed to create a federated share with the same user server" : "Ej tillåten att skapa en federerad delning med samma användarserver.",
"Invalid or untrusted SSL certificate" : "Ogiltigt eller ej betrott SSL-certifikat",
+ "Could not authenticate to remote share, password might be wrong" : "Kunde ej autensiera fjärrdelningen, lösenordet kan vara fel",
+ "Storage not valid" : "Lagring ej giltig",
"Couldn't add remote share" : "Kunde inte lägga till fjärrutdelning",
"Shared with you" : "Delat med dig",
"Shared with others" : "Delat med andra",
"Shared by link" : "Delad som länk",
+ "Federated sharing" : "Federated Delning",
"Nothing shared with you yet" : "Inget delat med dig ännu",
"Files and folders others share with you will show up here" : "Filer och mappar andra delar med dig kommer visas här",
"Nothing shared yet" : "Inget delat ännu",
@@ -17,12 +21,15 @@
"Remote share password" : "Lösenord för fjärrdelning",
"Cancel" : "Avbryt",
"Add remote share" : "Lägg till fjärrdelning",
+ "You can upload into this folder" : "Du kan ladda upp i denna map",
+ "No ownCloud installation (7 or higher) found at {remote}" : "Ingen OwnCloud Installation (7 eller senare) funnen på {remote}",
"Invalid ownCloud url" : "Felaktig ownCloud url",
"Shared by" : "Delad av",
"Sharing" : "Dela",
"A file or folder has been <strong>shared</strong>" : "En fil eller mapp har <strong>delats</strong>",
"A file or folder was shared from <strong>another server</strong>" : "En fil eller mapp delades från <strong>en annan server</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "En publikt delad fil eller mapp blev <strong>nerladdad</strong>",
+ "You received a new remote share %2$s from %1$s" : "Du har mottagit en fjärrdelning %2$s från %1$s",
"You received a new remote share from %s" : "Du mottog en ny fjärrdelning från %s",
"%1$s accepted remote share %2$s" : "%1$s accepterade fjärrdelning %2$s",
"%1$s declined remote share %2$s" : "%1$s nekade fjärrdelning %2$s",
@@ -30,11 +37,42 @@
"Public shared folder %1$s was downloaded" : "Publikt delad mapp %1$s blev nerladdad",
"Public shared file %1$s was downloaded" : "Publikt delad fil %1$s blev nerladdad",
"You shared %1$s with %2$s" : "Du delade %1$s med %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s delade %1$s med %3$s",
+ "%2$s removed the share of %3$s for %1$s" : "%2$s tog bort delningen av %3$s för %1$s",
"You shared %1$s with group %2$s" : "Du delade %1$s med grupp %2$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s delade %1$s med gruppen %3$s",
+ "You removed the share of group %2$s for %1$s" : "Du tog bort delningen av gruppen %2$s för %1$s",
+ "%2$s removed the share of group %3$s for %1$s" : "%2$s tog bort delningen av grupp %3$s för %1$s",
+ "%2$s shared %1$s via link" : "%2$s delade %1$s via länk",
"You shared %1$s via link" : "Du delade %1$s via länk",
+ "You removed the public link for %1$s" : "Du tog bort den publika länken för %1$s",
+ "%2$s removed the public link for %1$s" : "%2$s tog bort den publika länken för %1$s",
+ "Your public link for %1$s expired" : "Din publika länk för %1$s har löpt ut",
+ "The public link of %2$s for %1$s expired" : "Den publika länken för %2$s av %1$s har löpt ut",
"%2$s shared %1$s with you" : "%2$s delade %1$s med dig",
+ "%2$s removed the share for %1$s" : "%2$s tog bort delningen av %1$s",
+ "Downloaded via public link" : "Nerladdad via publik länk",
+ "Shared with %2$s" : "Delad med %2$s",
+ "Shared with %3$s by %2$s" : "Delad med %3$s av %2$s",
+ "Removed share for %2$s" : "Tog bort delningen för %2$s",
+ "%2$s removed share for %3$s" : "%2$s tog bort delningen för %3$s",
+ "Shared with group %2$s" : "Delning med grupp %2$s",
+ "Shared with group %3$s by %2$s" : "Delade med grupp %3$s av %2$s",
+ "Removed share of group %2$s" : "Tog bort delning av grupp %2$s",
+ "%2$s removed share of group %3$s" : "%2$s tog bort delningen av grupp %3$s",
+ "Shared via link by %2$s" : "Delad via länk av %2$s",
+ "Shared via public link" : "Delad via publik länk",
+ "Removed public link" : "Tog bort publik länk",
+ "%2$s removed public link" : "%2$s tog bort publik länk",
+ "Public link expired" : "Tidsgräns för publik länk har löpt ut",
+ "Public link of %2$s expired" : "Tidsgräns för publik länk för %2$s har löpt ut",
+ "Shared by %2$s" : "Delad av %2$s",
"Shares" : "Delningar",
+ "You received \"/%2$s\" as a remote share from %1$s" : "Du mottog \"/%2$s\" som fjärrdelning från %1$s",
"Accept" : "Acceptera",
+ "Decline" : "Neka",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dela med mig genom min #owncloud Federated Cloud ID, se %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Dela med mig genom min #ownCloud Federated Cloud ID",
"This share is password-protected" : "Den här delningen är lösenordsskyddad",
"The password is wrong. Try again." : "Lösenordet är fel. Försök igen.",
"Password" : "Lösenord",
@@ -51,7 +89,15 @@
"Download" : "Ladda ner",
"Download %s" : "Ladda ner %s",
"Direct link" : "Direkt länk",
+ "Federated Cloud Sharing" : "Federate Cloud delning",
+ "Open documentation" : "Öppna dokumentation",
"Allow users on this server to send shares to other servers" : "Tillåt användare på denna server att skicka utdelningar till andra servrar",
- "Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar"
+ "Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Ditt Federated Cloud ID",
+ "Share it:" : "Dela detta:",
+ "Add to your website" : "Lägg till på din hemsida",
+ "Share with me via ownCloud" : "Dela med mig via Owncloud",
+ "HTML Code:" : "HTML Kod:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/tr.js b/apps/files_sharing/l10n/tr.js
index df267d35b1f..c08d9baa0d5 100644
--- a/apps/files_sharing/l10n/tr.js
+++ b/apps/files_sharing/l10n/tr.js
@@ -74,8 +74,8 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "%1$s kişisinden \"/%2$s\" uzak paylaşımını aldınız",
"Accept" : "Kabul et",
"Decline" : "Reddet",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud Birleşik Bulut kimliğim ile paylaşıldı, bkz %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud Birleşmiş Bulut kimliğim ile paylaşıldı",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud Birleşik Bulut kimliğim ile paylaş, bkz %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud Birleşmiş Bulut kimliğim ile paylaş",
"This share is password-protected" : "Bu paylaşım parola korumalı",
"The password is wrong. Try again." : "Parola hatalı. Yeniden deneyin.",
"Password" : "Parola",
@@ -100,7 +100,7 @@ OC.L10N.register(
"Your Federated Cloud ID:" : "Birleşmiş Bulut Kimliğiniz:",
"Share it:" : "Paylaşın:",
"Add to your website" : "Web sitenize ekleyin",
- "Share with me via ownCloud" : "Benimle ownCloud aracılığıyla paylaşıldı",
+ "Share with me via ownCloud" : "Benimle ownCloud aracılığıyla paylaşın",
"HTML Code:" : "HTML Kodu:"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_sharing/l10n/tr.json b/apps/files_sharing/l10n/tr.json
index 1b921920dd7..b107ec25589 100644
--- a/apps/files_sharing/l10n/tr.json
+++ b/apps/files_sharing/l10n/tr.json
@@ -72,8 +72,8 @@
"You received \"/%2$s\" as a remote share from %1$s" : "%1$s kişisinden \"/%2$s\" uzak paylaşımını aldınız",
"Accept" : "Kabul et",
"Decline" : "Reddet",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud Birleşik Bulut kimliğim ile paylaşıldı, bkz %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud Birleşmiş Bulut kimliğim ile paylaşıldı",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud Birleşik Bulut kimliğim ile paylaş, bkz %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud Birleşmiş Bulut kimliğim ile paylaş",
"This share is password-protected" : "Bu paylaşım parola korumalı",
"The password is wrong. Try again." : "Parola hatalı. Yeniden deneyin.",
"Password" : "Parola",
@@ -98,7 +98,7 @@
"Your Federated Cloud ID:" : "Birleşmiş Bulut Kimliğiniz:",
"Share it:" : "Paylaşın:",
"Add to your website" : "Web sitenize ekleyin",
- "Share with me via ownCloud" : "Benimle ownCloud aracılığıyla paylaşıldı",
+ "Share with me via ownCloud" : "Benimle ownCloud aracılığıyla paylaşın",
"HTML Code:" : "HTML Kodu:"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/templates/settings-admin.php b/apps/files_sharing/templates/settings-admin.php
index 31bfa78e67d..64b6b8e72a3 100644
--- a/apps/files_sharing/templates/settings-admin.php
+++ b/apps/files_sharing/templates/settings-admin.php
@@ -4,7 +4,7 @@
?>
<div id="fileSharingSettings">
<h3><?php p($l->t('Federated Cloud Sharing'));?></h3>
- <a target="_blank" class="icon-info svg"
+ <a target="_blank" rel="noreferrer" class="icon-info svg"
title="<?php p($l->t('Open documentation'));?>"
href="<?php p(link_to_docs('admin-sharing-federated')); ?>"></a>
diff --git a/apps/files_sharing/templates/settings-personal.php b/apps/files_sharing/templates/settings-personal.php
index c318943712f..ea9aae038a7 100644
--- a/apps/files_sharing/templates/settings-personal.php
+++ b/apps/files_sharing/templates/settings-personal.php
@@ -53,7 +53,7 @@ if ($_['showShareIT']) {
<div class="hidden" id="oca-files-sharing-add-to-your-website-expanded">
<p style="margin: 10px 0">
- <a target="_blank" href="<?php p($_['reference']); ?>"
+ <a target="_blank" rel="noreferrer" href="<?php p($_['reference']); ?>"
style="padding:10px;background-color:#1d2d44;color:#fff;border-radius:3px;padding-left:4px;">
<img src="<?php p($_['owncloud_logo_path']); ?>"
style="width:50px;position:relative;top:8px;">
@@ -63,7 +63,7 @@ if ($_['showShareIT']) {
<p>
<?php p($l->t('HTML Code:')); ?>
- <xmp><a target="_blank" href="<?php p($_['reference']); ?>"
+ <xmp><a target="_blank" rel="noreferrer" href="<?php p($_['reference']); ?>"
style="padding:10px;background-color:#1d2d44;color:#fff;border-radius:3px;padding-left:4px;">
<img src="<?php p(\OC::$server->getURLGenerator()->getAbsoluteURL($_['owncloud_logo_path'])); ?>"
style="width:50px;position:relative;top:8px;">
diff --git a/apps/files_sharing/tests/api/share20ocstest.php b/apps/files_sharing/tests/api/share20ocstest.php
index a2c70d7673c..42a23b43ce1 100644
--- a/apps/files_sharing/tests/api/share20ocstest.php
+++ b/apps/files_sharing/tests/api/share20ocstest.php
@@ -65,6 +65,10 @@ class Share20OCSTest extends \Test\TestCase {
$this->shareManager = $this->getMockBuilder('OCP\Share\IManager')
->disableOriginalConstructor()
->getMock();
+ $this->shareManager
+ ->expects($this->any())
+ ->method('shareApiEnabled')
+ ->willReturn(true);
$this->groupManager = $this->getMock('OCP\IGroupManager');
$this->userManager = $this->getMock('OCP\IUserManager');
$this->request = $this->getMock('OCP\IRequest');
@@ -759,9 +763,12 @@ class Share20OCSTest extends \Test\TestCase {
->with('valid-path')
->willReturn($path);
- $group = $this->getMock('\OCP\IGroup');
$this->groupManager->method('groupExists')->with('validGroup')->willReturn(true);
+ $this->shareManager->expects($this->once())
+ ->method('allowGroupSharing')
+ ->willReturn(true);
+
$share->method('setPath')->with($path);
$share->method('setPermissions')->with(\OCP\Constants::PERMISSION_ALL);
$share->method('setShareType')->with(\OCP\Share::SHARE_TYPE_GROUP);
@@ -775,6 +782,51 @@ class Share20OCSTest extends \Test\TestCase {
$this->assertEquals($expected->getData(), $result->getData());
}
+ public function testCreateShareGroupNotAllowed() {
+ $share = $this->getMock('\OCP\Share\IShare');
+ $this->shareManager->method('newShare')->willReturn($share);
+
+ $this->request
+ ->method('getParam')
+ ->will($this->returnValueMap([
+ ['path', null, 'valid-path'],
+ ['permissions', null, \OCP\Constants::PERMISSION_ALL],
+ ['shareType', '-1', \OCP\Share::SHARE_TYPE_GROUP],
+ ['shareWith', null, 'validGroup'],
+ ]));
+
+ $userFolder = $this->getMock('\OCP\Files\Folder');
+ $this->rootFolder->expects($this->once())
+ ->method('getUserFolder')
+ ->with('currentUser')
+ ->willReturn($userFolder);
+
+ $path = $this->getMock('\OCP\Files\Folder');
+ $storage = $this->getMock('OCP\Files\Storage');
+ $storage->method('instanceOfStorage')
+ ->with('OCA\Files_Sharing\External\Storage')
+ ->willReturn(false);
+ $path->method('getStorage')->willReturn($storage);
+ $userFolder->expects($this->once())
+ ->method('get')
+ ->with('valid-path')
+ ->willReturn($path);
+
+ $this->groupManager->method('groupExists')->with('validGroup')->willReturn(true);
+
+ $this->shareManager->expects($this->once())
+ ->method('allowGroupSharing')
+ ->willReturn(false);
+
+ $share->method('setPath')->with($path);
+
+ $expected = new \OC_OCS_Result(null, 404, 'group sharing is disabled by the administrator');
+ $result = $this->ocs->createShare();
+
+ $this->assertEquals($expected->getMeta(), $result->getMeta());
+ $this->assertEquals($expected->getData(), $result->getData());
+ }
+
public function testCreateShareLinkNoLinksAllowed() {
$this->request
->method('getParam')
@@ -1827,7 +1879,74 @@ class Share20OCSTest extends \Test\TestCase {
} catch (NotFoundException $e) {
$this->assertTrue($exception);
}
+ }
+
+ /**
+ * @return Share20OCS
+ */
+ public function getOcsDisabledAPI() {
+ $shareManager = $this->getMockBuilder('OCP\Share\IManager')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $shareManager
+ ->expects($this->any())
+ ->method('shareApiEnabled')
+ ->willReturn(false);
+
+ return new Share20OCS(
+ $shareManager,
+ $this->groupManager,
+ $this->userManager,
+ $this->request,
+ $this->rootFolder,
+ $this->urlGenerator,
+ $this->currentUser
+ );
+ }
+
+ public function testGetShareApiDisabled() {
+ $ocs = $this->getOcsDisabledAPI();
+
+ $expected = new \OC_OCS_Result(null, 404, 'Share API is disabled');
+ $result = $ocs->getShare('my:id');
+
+ $this->assertEquals($expected, $result);
+ }
+
+ public function testDeleteShareApiDisabled() {
+ $ocs = $this->getOcsDisabledAPI();
+
+ $expected = new \OC_OCS_Result(null, 404, 'Share API is disabled');
+ $result = $ocs->deleteShare('my:id');
+
+ $this->assertEquals($expected, $result);
+ }
+
+
+ public function testCreateShareApiDisabled() {
+ $ocs = $this->getOcsDisabledAPI();
+
+ $expected = new \OC_OCS_Result(null, 404, 'Share API is disabled');
+ $result = $ocs->createShare();
+
+ $this->assertEquals($expected, $result);
+ }
+
+ public function testGetSharesApiDisabled() {
+ $ocs = $this->getOcsDisabledAPI();
+
+ $expected = new \OC_OCS_Result();
+ $result = $ocs->getShares();
+
+ $this->assertEquals($expected, $result);
+ }
+
+ public function testUpdateShareApiDisabled() {
+ $ocs = $this->getOcsDisabledAPI();
+ $expected = new \OC_OCS_Result(null, 404, 'Share API is disabled');
+ $result = $ocs->updateShare('my:id');
+ $this->assertEquals($expected, $result);
}
}
diff --git a/apps/files_sharing/tests/api/shareestest.php b/apps/files_sharing/tests/api/shareestest.php
index 87d143d0853..cda41f55183 100644
--- a/apps/files_sharing/tests/api/shareestest.php
+++ b/apps/files_sharing/tests/api/shareestest.php
@@ -55,6 +55,9 @@ class ShareesTest extends TestCase {
/** @var \OCP\IRequest|\PHPUnit_Framework_MockObject_MockObject */
protected $request;
+ /** @var \OCP\Share\IManager|\PHPUnit_Framework_MockObject_MockObject */
+ protected $shareManager;
+
protected function setUp() {
parent::setUp();
@@ -78,6 +81,10 @@ class ShareesTest extends TestCase {
->disableOriginalConstructor()
->getMock();
+ $this->shareManager = $this->getMockBuilder('OCP\Share\IManager')
+ ->disableOriginalConstructor()
+ ->getMock();
+
$this->sharees = new Sharees(
$this->groupManager,
$this->userManager,
@@ -86,7 +93,8 @@ class ShareesTest extends TestCase {
$this->session,
$this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(),
$this->request,
- $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock()
+ $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock(),
+ $this->shareManager
);
}
@@ -966,89 +974,95 @@ class ShareesTest extends TestCase {
$allTypes = [Share::SHARE_TYPE_USER, Share::SHARE_TYPE_GROUP, Share::SHARE_TYPE_REMOTE];
return [
- [[], '', 'yes', true, '', null, $allTypes, 1, 200, false, true],
+ [[], '', 'yes', true, '', null, $allTypes, 1, 200, false, true, true],
// Test itemType
[[
'search' => '',
- ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true],
+ ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true, true],
[[
'search' => 'foobar',
- ], '', 'yes', true, 'foobar', null, $allTypes, 1, 200, false, true],
+ ], '', 'yes', true, 'foobar', null, $allTypes, 1, 200, false, true, true],
[[
'search' => 0,
- ], '', 'yes', true, '0', null, $allTypes, 1, 200, false, true],
+ ], '', 'yes', true, '0', null, $allTypes, 1, 200, false, true, true],
// Test itemType
[[
'itemType' => '',
- ], '', 'yes', true, '', '', $allTypes, 1, 200, false, true],
+ ], '', 'yes', true, '', '', $allTypes, 1, 200, false, true, true],
[[
'itemType' => 'folder',
- ], '', 'yes', true, '', 'folder', $allTypes, 1, 200, false, true],
+ ], '', 'yes', true, '', 'folder', $allTypes, 1, 200, false, true, true],
[[
'itemType' => 0,
- ], '', 'yes', true, '', '0', $allTypes, 1, 200, false, true],
+ ], '', 'yes', true, '', '0', $allTypes, 1, 200, false, true, true],
// Test shareType
[[
- ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true],
+ ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true, true],
[[
'shareType' => 0,
- ], '', 'yes', true, '', null, [0], 1, 200, false, true],
+ ], '', 'yes', true, '', null, [0], 1, 200, false, true, true],
[[
'shareType' => '0',
- ], '', 'yes', true, '', null, [0], 1, 200, false, true],
+ ], '', 'yes', true, '', null, [0], 1, 200, false, true, true],
[[
'shareType' => 1,
- ], '', 'yes', true, '', null, [1], 1, 200, false, true],
+ ], '', 'yes', true, '', null, [1], 1, 200, false, true, true],
[[
'shareType' => 12,
- ], '', 'yes', true, '', null, [], 1, 200, false, true],
+ ], '', 'yes', true, '', null, [], 1, 200, false, true, true],
[[
'shareType' => 'foobar',
- ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true],
+ ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true, true],
[[
'shareType' => [0, 1, 2],
- ], '', 'yes', true, '', null, [0, 1], 1, 200, false, true],
+ ], '', 'yes', true, '', null, [0, 1], 1, 200, false, true, true],
[[
'shareType' => [0, 1],
- ], '', 'yes', true, '', null, [0, 1], 1, 200, false, true],
+ ], '', 'yes', true, '', null, [0, 1], 1, 200, false, true, true],
[[
'shareType' => $allTypes,
- ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true],
+ ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true, true],
[[
'shareType' => $allTypes,
- ], '', 'yes', false, '', null, [0, 1], 1, 200, false, true],
+ ], '', 'yes', false, '', null, [0, 1], 1, 200, false, true, true],
+ [[
+ 'shareType' => $allTypes,
+ ], '', 'yes', true, '', null, [0, 6], 1, 200, false, true, false],
+ [[
+ 'shareType' => $allTypes,
+ ], '', 'yes', false, '', null, [0], 1, 200, false, true, false],
// Test pagination
[[
'page' => 1,
- ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true],
+ ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true, true],
[[
'page' => 10,
- ], '', 'yes', true, '', null, $allTypes, 10, 200, false, true],
+ ], '', 'yes', true, '', null, $allTypes, 10, 200, false, true, true],
// Test perPage
[[
'perPage' => 1,
- ], '', 'yes', true, '', null, $allTypes, 1, 1, false, true],
+ ], '', 'yes', true, '', null, $allTypes, 1, 1, false, true, true],
[[
'perPage' => 10,
- ], '', 'yes', true, '', null, $allTypes, 1, 10, false, true],
+ ], '', 'yes', true, '', null, $allTypes, 1, 10, false, true, true],
// Test $shareWithGroupOnly setting
- [[], 'no', 'yes', true, '', null, $allTypes, 1, 200, false, true],
- [[], 'yes', 'yes', true, '', null, $allTypes, 1, 200, true, true],
+ [[], 'no', 'yes', true, '', null, $allTypes, 1, 200, false, true, true],
+ [[], 'yes', 'yes', true, '', null, $allTypes, 1, 200, true, true, true],
// Test $shareeEnumeration setting
- [[], 'no', 'yes', true, '', null, $allTypes, 1, 200, false, true],
- [[], 'no', 'no', true, '', null, $allTypes, 1, 200, false, false],
+ [[], 'no', 'yes', true, '', null, $allTypes, 1, 200, false, true, true],
+ [[], 'no', 'no', true, '', null, $allTypes, 1, 200, false, false, true],
// Test keep case for search
[[
'search' => 'foo@example.com/ownCloud',
- ], '', 'yes', true, 'foo@example.com/ownCloud', null, $allTypes, 1, 200, false, true],
+ ], '', 'yes', true, 'foo@example.com/ownCloud', null, $allTypes, 1, 200, false, true, true],
];
}
@@ -1066,8 +1080,9 @@ class ShareesTest extends TestCase {
* @param int $perPage
* @param bool $shareWithGroupOnly
* @param bool $shareeEnumeration
+ * @param bool $allowGroupSharing
*/
- public function testSearch($getData, $apiSetting, $enumSetting, $remoteSharingEnabled, $search, $itemType, $shareTypes, $page, $perPage, $shareWithGroupOnly, $shareeEnumeration) {
+ public function testSearch($getData, $apiSetting, $enumSetting, $remoteSharingEnabled, $search, $itemType, $shareTypes, $page, $perPage, $shareWithGroupOnly, $shareeEnumeration, $allowGroupSharing) {
$oldGet = $_GET;
$_GET = $getData;
@@ -1082,6 +1097,10 @@ class ShareesTest extends TestCase {
['core', 'shareapi_allow_share_dialog_user_enumeration', 'yes', $enumSetting],
]);
+ $this->shareManager->expects($this->once())
+ ->method('allowGroupSharing')
+ ->willReturn($allowGroupSharing);
+
$sharees = $this->getMockBuilder('\OCA\Files_Sharing\API\Sharees')
->setConstructorArgs([
$this->groupManager,
@@ -1091,7 +1110,8 @@ class ShareesTest extends TestCase {
$this->session,
$this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(),
$this->getMockBuilder('OCP\IRequest')->disableOriginalConstructor()->getMock(),
- $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock()
+ $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock(),
+ $this->shareManager
])
->setMethods(array('searchSharees', 'isRemoteSharingAllowed'))
->getMock();
@@ -1175,7 +1195,8 @@ class ShareesTest extends TestCase {
$this->session,
$this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(),
$this->getMockBuilder('OCP\IRequest')->disableOriginalConstructor()->getMock(),
- $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock()
+ $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock(),
+ $this->shareManager
])
->setMethods(array('searchSharees', 'isRemoteSharingAllowed'))
->getMock();
@@ -1327,7 +1348,8 @@ class ShareesTest extends TestCase {
$this->session,
$this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(),
$this->getMockBuilder('OCP\IRequest')->disableOriginalConstructor()->getMock(),
- $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock()
+ $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock(),
+ $this->shareManager
])
->setMethods(array('getShareesForShareIds', 'getUsers', 'getGroups', 'getRemote'))
->getMock();
diff --git a/apps/files_sharing/tests/js/shareSpec.js b/apps/files_sharing/tests/js/shareSpec.js
index 7607ada50ba..c34234bfe13 100644
--- a/apps/files_sharing/tests/js/shareSpec.js
+++ b/apps/files_sharing/tests/js/shareSpec.js
@@ -53,35 +53,21 @@ describe('OCA.Sharing.Util tests', function() {
permissions: OC.PERMISSION_ALL,
etag: 'abc',
shareOwner: 'User One',
- isShareMountPoint: false
+ isShareMountPoint: false,
+ shareTypes: [OC.Share.SHARE_TYPE_USER]
}];
-
- OCA.Sharing.sharesLoaded = true;
- OC.Share.statuses = {
- 1: {link: false, path: '/subdir'}
- };
});
afterEach(function() {
delete OCA.Sharing.sharesLoaded;
delete OC.Share.droppedDown;
fileList.destroy();
fileList = null;
- OC.Share.statuses = {};
- OC.Share.currentShares = {};
});
describe('Sharing data in table row', function() {
// TODO: test data-permissions, data-share-owner, etc
});
describe('Share action icon', function() {
- beforeEach(function() {
- OC.Share.statuses = {1: {link: false, path: '/subdir'}};
- OCA.Sharing.sharesLoaded = true;
- });
- afterEach(function() {
- OC.Share.statuses = {};
- OCA.Sharing.sharesLoaded = false;
- });
it('do not shows share text when not shared', function() {
var $action, $tr;
OC.Share.statuses = {};
@@ -93,7 +79,8 @@ describe('OCA.Sharing.Util tests', function() {
mimetype: 'httpd/unix-directory',
size: 12,
permissions: OC.PERMISSION_ALL,
- etag: 'abc'
+ etag: 'abc',
+ shareTypes: []
}]);
$tr = fileList.$el.find('tbody tr:first');
$action = $tr.find('.action-share');
@@ -111,7 +98,8 @@ describe('OCA.Sharing.Util tests', function() {
mimetype: 'text/plain',
size: 12,
permissions: OC.PERMISSION_ALL,
- etag: 'abc'
+ etag: 'abc',
+ shareTypes: [OC.Share.SHARE_TYPE_USER]
}]);
$tr = fileList.$el.find('tbody tr:first');
$action = $tr.find('.action-share');
@@ -131,7 +119,8 @@ describe('OCA.Sharing.Util tests', function() {
mimetype: 'text/plain',
size: 12,
permissions: OC.PERMISSION_ALL,
- etag: 'abc'
+ etag: 'abc',
+ shareTypes: [OC.Share.SHARE_TYPE_LINK]
}]);
$tr = fileList.$el.find('tbody tr:first');
$action = $tr.find('.action-share');
@@ -151,7 +140,8 @@ describe('OCA.Sharing.Util tests', function() {
size: 12,
permissions: OC.PERMISSION_ALL,
shareOwner: 'User One',
- etag: 'abc'
+ etag: 'abc',
+ shareTypes: []
}]);
$tr = fileList.$el.find('tbody tr:first');
$action = $tr.find('.action-share');
@@ -171,7 +161,8 @@ describe('OCA.Sharing.Util tests', function() {
size: 12,
permissions: OC.PERMISSION_ALL,
recipientsDisplayName: 'User One, User Two',
- etag: 'abc'
+ etag: 'abc',
+ shareTypes: [OC.Share.SHARE_TYPE_USER]
}]);
$tr = fileList.$el.find('tbody tr:first');
$action = $tr.find('.action-share');
diff --git a/apps/files_trashbin/lib/trashbin.php b/apps/files_trashbin/lib/trashbin.php
index 46447908b90..52692950a65 100644
--- a/apps/files_trashbin/lib/trashbin.php
+++ b/apps/files_trashbin/lib/trashbin.php
@@ -56,7 +56,7 @@ class Trashbin {
private static $scannedVersions = false;
/**
- * Ensure we dont need to scan the file during the move to trash
+ * Ensure we don't need to scan the file during the move to trash
* by triggering the scan in the pre-hook
*
* @param array $params
diff --git a/apps/files_trashbin/tests/storage.php b/apps/files_trashbin/tests/storage.php
index 958c5f79a98..afc07ff36c8 100644
--- a/apps/files_trashbin/tests/storage.php
+++ b/apps/files_trashbin/tests/storage.php
@@ -435,7 +435,7 @@ class Storage extends \Test\TestCase {
}
/**
- * Delete should fail is the source file cant be deleted
+ * Delete should fail if the source file can't be deleted.
*/
public function testSingleStorageDeleteFileFail() {
/**
@@ -472,7 +472,7 @@ class Storage extends \Test\TestCase {
}
/**
- * Delete should fail is the source folder cant be deleted
+ * Delete should fail if the source folder can't be deleted.
*/
public function testSingleStorageDeleteFolderFail() {
/**
diff --git a/apps/files_trashbin/tests/trashbin.php b/apps/files_trashbin/tests/trashbin.php
index 930f8c2bf3e..8d616b6e8e2 100644
--- a/apps/files_trashbin/tests/trashbin.php
+++ b/apps/files_trashbin/tests/trashbin.php
@@ -86,11 +86,12 @@ class Test_Trashbin extends \Test\TestCase {
}
-
public static function tearDownAfterClass() {
// cleanup test user
$user = \OC::$server->getUserManager()->get(self::TEST_TRASHBIN_USER1);
- if ($user !== null) { $user->delete(); }
+ if ($user !== null) {
+ $user->delete();
+ }
\OC::$server->getConfig()->setSystemValue('trashbin_retention_obligation', self::$rememberRetentionObligation);
@@ -109,6 +110,18 @@ class Test_Trashbin extends \Test\TestCase {
parent::setUp();
\OC::$server->getAppManager()->enableApp('files_trashbin');
+ $config = \OC::$server->getConfig();
+ $mockConfig = $this->getMock('\OCP\IConfig');
+ $mockConfig->expects($this->any())
+ ->method('getSystemValue')
+ ->will($this->returnCallback(function ($key, $default) use ($config) {
+ if ($key === 'filesystem_check_changes') {
+ return \OC\Files\Cache\Watcher::CHECK_ONCE;
+ } else {
+ return $config->getSystemValue($key, $default);
+ }
+ }));
+ $this->overwriteService('AllConfig', $mockConfig);
$this->trashRoot1 = '/' . self::TEST_TRASHBIN_USER1 . '/files_trashbin';
$this->trashRoot2 = '/' . self::TEST_TRASHBIN_USER2 . '/files_trashbin';
@@ -117,6 +130,7 @@ class Test_Trashbin extends \Test\TestCase {
}
protected function tearDown() {
+ $this->restoreService('AllConfig');
// disable trashbin to be able to properly clean up
\OC::$server->getAppManager()->disableApp('files_trashbin');
@@ -138,8 +152,8 @@ class Test_Trashbin extends \Test\TestCase {
public function testExpireOldFiles() {
$currentTime = time();
- $expireAt = $currentTime - 2*24*60*60;
- $expiredDate = $currentTime - 3*24*60*60;
+ $expireAt = $currentTime - 2 * 24 * 60 * 60;
+ $expiredDate = $currentTime - 3 * 24 * 60 * 60;
// create some files
\OC\Files\Filesystem::file_put_contents('file1.txt', 'file1');
@@ -187,7 +201,7 @@ class Test_Trashbin extends \Test\TestCase {
$currentTime = time();
$folder = "trashTest-" . $currentTime . '/';
- $expiredDate = $currentTime - 3*24*60*60;
+ $expiredDate = $currentTime - 3 * 24 * 60 * 60;
// create some files
\OC\Files\Filesystem::mkdir($folder);
@@ -250,6 +264,7 @@ class Test_Trashbin extends \Test\TestCase {
/**
* verify that the array contains the expected results
+ *
* @param OCP\Files\FileInfo[] $result
* @param string[] $expected
*/
@@ -265,7 +280,7 @@ class Test_Trashbin extends \Test\TestCase {
}
if (!$found) {
// if we didn't found the expected file, something went wrong
- $this->assertTrue(false, "can't find expected file '" . $expectedFile . "' in trash bin");
+ $this->assertTrue(false, "can't find expected file '" . $expectedFile . "' in trash bin");
}
}
}
@@ -281,7 +296,7 @@ class Test_Trashbin extends \Test\TestCase {
// modify every second file
$counter = ($counter + 1) % 2;
if ($counter === 1) {
- $source = $trashRoot . '/files/' . $file['name'].'.d'.$file['mtime'];
+ $source = $trashRoot . '/files/' . $file['name'] . '.d' . $file['mtime'];
$target = \OC\Files\Filesystem::normalizePath($trashRoot . '/files/' . $file['name'] . '.d' . $expireDate);
$this->rootView->rename($source, $target);
$file['mtime'] = $expireDate;
@@ -445,7 +460,7 @@ class Test_Trashbin extends \Test\TestCase {
$trashedFile = $filesInTrash[0];
$this->assertTrue(
- OCA\Files_Trashbin\Trashbin::restore(
+ OCA\Files_Trashbin\Trashbin::restore(
'folder.d' . $trashedFile->getMtime() . '/file1.txt',
'file1.txt',
$trashedFile->getMtime()
@@ -639,7 +654,7 @@ class Test_Trashbin extends \Test\TestCase {
if ($create) {
try {
\OC::$server->getUserManager()->createUser($user, $user);
- } catch(\Exception $e) { // catch username is already being used from previous aborted runs
+ } catch (\Exception $e) { // catch username is already being used from previous aborted runs
}
}
diff --git a/apps/files_versions/tests/versions.php b/apps/files_versions/tests/versions.php
index e82e65bf3a5..f6658e092bd 100644
--- a/apps/files_versions/tests/versions.php
+++ b/apps/files_versions/tests/versions.php
@@ -74,6 +74,19 @@ class Test_Files_Versioning extends \Test\TestCase {
protected function setUp() {
parent::setUp();
+ $config = \OC::$server->getConfig();
+ $mockConfig = $this->getMock('\OCP\IConfig');
+ $mockConfig->expects($this->any())
+ ->method('getSystemValue')
+ ->will($this->returnCallback(function ($key, $default) use ($config) {
+ if ($key === 'filesystem_check_changes') {
+ return \OC\Files\Cache\Watcher::CHECK_ONCE;
+ } else {
+ return $config->getSystemValue($key, $default);
+ }
+ }));
+ $this->overwriteService('AllConfig', $mockConfig);
+
// clear hooks
\OC_Hook::clear();
\OC::registerShareHooks();
@@ -87,6 +100,8 @@ class Test_Files_Versioning extends \Test\TestCase {
}
protected function tearDown() {
+ $this->restoreService('AllConfig');
+
if ($this->rootView) {
$this->rootView->deleteAll(self::TEST_VERSIONS_USER . '/files/');
$this->rootView->deleteAll(self::TEST_VERSIONS_USER2 . '/files/');
diff --git a/apps/systemtags/l10n/da.js b/apps/systemtags/l10n/da.js
index 5b381b76f48..8d0273a7707 100644
--- a/apps/systemtags/l10n/da.js
+++ b/apps/systemtags/l10n/da.js
@@ -1,7 +1,20 @@
OC.L10N.register(
"systemtags",
{
+ "<strong>System tags</strong> for a file have been modified" : "En fils <strong>systemmærkning</strong> er blevet ændret",
+ "%1$s assigned system tag %3$s" : "%1$s tilføjede et systemmærke %3$s",
+ "%1$s unassigned system tag %3$s" : "%1$s fjernede systemmærke %3$s",
+ "%1$s created system tag %2$s" : "%1$s oprettede systemmærke %2$s",
+ "%1$s deleted system tag %2$s" : "%1$s fjernede systemmærket %2$s",
+ "%1$s updated system tag %3$s to %2$s" : "%1$s ændrede systemmærket %3$s til %2$s",
+ "%1$s assigned system tag %3$s to %2$s" : "%1$s tilføjede systemmærke %3$s til %2$s",
+ "%1$s unassigned system tag %3$s from %2$s" : "%1$s fjernede systemmærket %3$s fra %2$s",
+ "%s (invisible)" : "%s (usynlig)",
"Tags" : "Mærker",
+ "Tagged files" : "Mærkede filer",
+ "Select tags to filter by" : "Vælg de mærker, der skal filtreres efter",
+ "Please select tags to filter by" : "Vælg de mærker, der skal filtreres efter",
+ "No files found for the selected tags" : "Der blev ikke fundet filer, som matcher de valgte mærker",
"No files in here" : "Her er ingen filer",
"No entries found in this folder" : "Der blev ikke fundet poster i denne mappe",
"Name" : "Navn",
diff --git a/apps/systemtags/l10n/da.json b/apps/systemtags/l10n/da.json
index 9b5049facc7..1fdf24f6e51 100644
--- a/apps/systemtags/l10n/da.json
+++ b/apps/systemtags/l10n/da.json
@@ -1,5 +1,18 @@
{ "translations": {
+ "<strong>System tags</strong> for a file have been modified" : "En fils <strong>systemmærkning</strong> er blevet ændret",
+ "%1$s assigned system tag %3$s" : "%1$s tilføjede et systemmærke %3$s",
+ "%1$s unassigned system tag %3$s" : "%1$s fjernede systemmærke %3$s",
+ "%1$s created system tag %2$s" : "%1$s oprettede systemmærke %2$s",
+ "%1$s deleted system tag %2$s" : "%1$s fjernede systemmærket %2$s",
+ "%1$s updated system tag %3$s to %2$s" : "%1$s ændrede systemmærket %3$s til %2$s",
+ "%1$s assigned system tag %3$s to %2$s" : "%1$s tilføjede systemmærke %3$s til %2$s",
+ "%1$s unassigned system tag %3$s from %2$s" : "%1$s fjernede systemmærket %3$s fra %2$s",
+ "%s (invisible)" : "%s (usynlig)",
"Tags" : "Mærker",
+ "Tagged files" : "Mærkede filer",
+ "Select tags to filter by" : "Vælg de mærker, der skal filtreres efter",
+ "Please select tags to filter by" : "Vælg de mærker, der skal filtreres efter",
+ "No files found for the selected tags" : "Der blev ikke fundet filer, som matcher de valgte mærker",
"No files in here" : "Her er ingen filer",
"No entries found in this folder" : "Der blev ikke fundet poster i denne mappe",
"Name" : "Navn",
diff --git a/apps/systemtags/l10n/el.js b/apps/systemtags/l10n/el.js
index fc28aae1554..54a89c389c9 100644
--- a/apps/systemtags/l10n/el.js
+++ b/apps/systemtags/l10n/el.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"systemtags",
{
+ "<strong>System tags</strong> for a file have been modified" : "<strong>Οι ετικέτες συστήματος</strong> για ένα αρχείο έχουν τροποποιηθεί",
"Tags" : "Ετικέτες",
"No files in here" : "Δεν υπάρχουν αρχεία",
"No entries found in this folder" : "Δεν βρέθηκαν καταχωρήσεις σε αυτόν το φάκελο",
diff --git a/apps/systemtags/l10n/el.json b/apps/systemtags/l10n/el.json
index ff5a775d737..c93616dcf6c 100644
--- a/apps/systemtags/l10n/el.json
+++ b/apps/systemtags/l10n/el.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "<strong>System tags</strong> for a file have been modified" : "<strong>Οι ετικέτες συστήματος</strong> για ένα αρχείο έχουν τροποποιηθεί",
"Tags" : "Ετικέτες",
"No files in here" : "Δεν υπάρχουν αρχεία",
"No entries found in this folder" : "Δεν βρέθηκαν καταχωρήσεις σε αυτόν το φάκελο",
diff --git a/apps/systemtags/l10n/pl.js b/apps/systemtags/l10n/pl.js
index ad361c38b81..6089dad7704 100644
--- a/apps/systemtags/l10n/pl.js
+++ b/apps/systemtags/l10n/pl.js
@@ -1,9 +1,19 @@
OC.L10N.register(
"systemtags",
{
+ "<strong>System tags</strong> for a file have been modified" : "<strong>System etykiet</strong> dla pliku został zmieniony",
+ "%1$s assigned system tag %3$s" : "%1$s przypisywalny system etykiet%3$s",
+ "%1$s unassigned system tag %3$s" : "%1$s nieprzypisany system etykiet%3$s",
+ "%1$s created system tag %2$s" : "%1$s stworzony system etykiet%2$s",
+ "%1$s deleted system tag %2$s" : "%1$s usunięty system etykiet%2$s",
+ "%1$s updated system tag %3$s to %2$s" : "%1$s zaktualizowany system etykiet%3$s do %2$s",
+ "%1$s assigned system tag %3$s to %2$s" : "%1$s przypisywalny system etykiet%3$s do %2$s",
+ "%1$s unassigned system tag %3$s from %2$s" : "%1$s nieprzypisany system etykiet %3$s z %2$s",
+ "%s (not-assignable)" : "%s (nieprzypisalny)",
"%s (invisible)" : "%s (niewidoczny)",
- "Tags" : "Tagi",
+ "Tags" : "Etykiety",
"Tagged files" : "Otagowane pliki",
+ "No files found for the selected tags" : "Nie znaleziono plików dla wybranych etykiet",
"No files in here" : "Brak plików",
"No entries found in this folder" : "Brak wpisów w tym folderze",
"Name" : "Nazwa",
diff --git a/apps/systemtags/l10n/pl.json b/apps/systemtags/l10n/pl.json
index ba17954a472..8005083201e 100644
--- a/apps/systemtags/l10n/pl.json
+++ b/apps/systemtags/l10n/pl.json
@@ -1,7 +1,17 @@
{ "translations": {
+ "<strong>System tags</strong> for a file have been modified" : "<strong>System etykiet</strong> dla pliku został zmieniony",
+ "%1$s assigned system tag %3$s" : "%1$s przypisywalny system etykiet%3$s",
+ "%1$s unassigned system tag %3$s" : "%1$s nieprzypisany system etykiet%3$s",
+ "%1$s created system tag %2$s" : "%1$s stworzony system etykiet%2$s",
+ "%1$s deleted system tag %2$s" : "%1$s usunięty system etykiet%2$s",
+ "%1$s updated system tag %3$s to %2$s" : "%1$s zaktualizowany system etykiet%3$s do %2$s",
+ "%1$s assigned system tag %3$s to %2$s" : "%1$s przypisywalny system etykiet%3$s do %2$s",
+ "%1$s unassigned system tag %3$s from %2$s" : "%1$s nieprzypisany system etykiet %3$s z %2$s",
+ "%s (not-assignable)" : "%s (nieprzypisalny)",
"%s (invisible)" : "%s (niewidoczny)",
- "Tags" : "Tagi",
+ "Tags" : "Etykiety",
"Tagged files" : "Otagowane pliki",
+ "No files found for the selected tags" : "Nie znaleziono plików dla wybranych etykiet",
"No files in here" : "Brak plików",
"No entries found in this folder" : "Brak wpisów w tym folderze",
"Name" : "Nazwa",
diff --git a/apps/systemtags/l10n/tr.js b/apps/systemtags/l10n/tr.js
index 6ca4c299006..2356ac42584 100644
--- a/apps/systemtags/l10n/tr.js
+++ b/apps/systemtags/l10n/tr.js
@@ -1,7 +1,21 @@
OC.L10N.register(
"systemtags",
{
+ "<strong>System tags</strong> for a file have been modified" : "Bir dosya için <strong>sistem etiketleri</strong> değiştirildi",
+ "%1$s assigned system tag %3$s" : "%1$s, %3$s sistem etiketini atadı",
+ "%1$s unassigned system tag %3$s" : "%1$s, %3$s sistem etiket atamasını kaldırdı",
+ "%1$s created system tag %2$s" : "%1$s, %2$s sistem etiketini oluşturdu",
+ "%1$s deleted system tag %2$s" : "%1$s, %2$s sistem etiketini sildi",
+ "%1$s updated system tag %3$s to %2$s" : "%1$s, %3$s sistem etiketini %2$s olarak güncelledi",
+ "%1$s assigned system tag %3$s to %2$s" : "%1$s, %3$s sistem etiketini %2$s etiketine atadı",
+ "%1$s unassigned system tag %3$s from %2$s" : "%1$s, %3$s sistem etiketinin %2$s atamasını kaldırdı",
+ "%s (not-assignable)" : "%s (atanamaz)",
+ "%s (invisible)" : "%s (gizli)",
"Tags" : "Etiketler",
+ "Tagged files" : "Etiketli dosyalar",
+ "Select tags to filter by" : "Filtrelemek için etiketleri seçin",
+ "Please select tags to filter by" : "Filtrelemek için etiketleri seçin",
+ "No files found for the selected tags" : "Seçilen etiketler ile ilgili dosya bulunamadı",
"No files in here" : "Burada hiç dosya yok",
"No entries found in this folder" : "Bu klasörde hiçbir girdi bulunamadı",
"Name" : "Ad",
diff --git a/apps/systemtags/l10n/tr.json b/apps/systemtags/l10n/tr.json
index 4dfd5722459..b85c64ab0b3 100644
--- a/apps/systemtags/l10n/tr.json
+++ b/apps/systemtags/l10n/tr.json
@@ -1,5 +1,19 @@
{ "translations": {
+ "<strong>System tags</strong> for a file have been modified" : "Bir dosya için <strong>sistem etiketleri</strong> değiştirildi",
+ "%1$s assigned system tag %3$s" : "%1$s, %3$s sistem etiketini atadı",
+ "%1$s unassigned system tag %3$s" : "%1$s, %3$s sistem etiket atamasını kaldırdı",
+ "%1$s created system tag %2$s" : "%1$s, %2$s sistem etiketini oluşturdu",
+ "%1$s deleted system tag %2$s" : "%1$s, %2$s sistem etiketini sildi",
+ "%1$s updated system tag %3$s to %2$s" : "%1$s, %3$s sistem etiketini %2$s olarak güncelledi",
+ "%1$s assigned system tag %3$s to %2$s" : "%1$s, %3$s sistem etiketini %2$s etiketine atadı",
+ "%1$s unassigned system tag %3$s from %2$s" : "%1$s, %3$s sistem etiketinin %2$s atamasını kaldırdı",
+ "%s (not-assignable)" : "%s (atanamaz)",
+ "%s (invisible)" : "%s (gizli)",
"Tags" : "Etiketler",
+ "Tagged files" : "Etiketli dosyalar",
+ "Select tags to filter by" : "Filtrelemek için etiketleri seçin",
+ "Please select tags to filter by" : "Filtrelemek için etiketleri seçin",
+ "No files found for the selected tags" : "Seçilen etiketler ile ilgili dosya bulunamadı",
"No files in here" : "Burada hiç dosya yok",
"No entries found in this folder" : "Bu klasörde hiçbir girdi bulunamadı",
"Name" : "Ad",
diff --git a/apps/updatenotification/l10n/da.js b/apps/updatenotification/l10n/da.js
index 4954c5c4581..530b18ec29c 100644
--- a/apps/updatenotification/l10n/da.js
+++ b/apps/updatenotification/l10n/da.js
@@ -1,9 +1,14 @@
OC.L10N.register(
"updatenotification",
{
+ "Updated channel" : "Kanal opdateret",
"{version} is available. Get more information on how to update." : "{version} er tilgængelig. Få mere information om hvordan du opdaterer.",
"Updater" : "Updater",
"A new version is available: %s" : "Der er en ny version tligængelig: %s",
- "Update channel:" : "Opdatér kanal:"
+ "Open updater" : "Åbn for opdatering",
+ "Your version is up to date." : "Du har seneste version.",
+ "Checked on %s" : "Tjekket per %s",
+ "Update channel:" : "Opdatér kanal:",
+ "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Du kan altid opdatere til en nyere version / eksperimentel kanal. Men du kan aldrig nedgradere til en mere stabil kanal"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/updatenotification/l10n/da.json b/apps/updatenotification/l10n/da.json
index 0d59d404f55..7f9dd1888bc 100644
--- a/apps/updatenotification/l10n/da.json
+++ b/apps/updatenotification/l10n/da.json
@@ -1,7 +1,12 @@
{ "translations": {
+ "Updated channel" : "Kanal opdateret",
"{version} is available. Get more information on how to update." : "{version} er tilgængelig. Få mere information om hvordan du opdaterer.",
"Updater" : "Updater",
"A new version is available: %s" : "Der er en ny version tligængelig: %s",
- "Update channel:" : "Opdatér kanal:"
+ "Open updater" : "Åbn for opdatering",
+ "Your version is up to date." : "Du har seneste version.",
+ "Checked on %s" : "Tjekket per %s",
+ "Update channel:" : "Opdatér kanal:",
+ "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Du kan altid opdatere til en nyere version / eksperimentel kanal. Men du kan aldrig nedgradere til en mere stabil kanal"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/updatenotification/l10n/de.js b/apps/updatenotification/l10n/de.js
index 3cd825bff94..6b940024e18 100644
--- a/apps/updatenotification/l10n/de.js
+++ b/apps/updatenotification/l10n/de.js
@@ -9,6 +9,6 @@ OC.L10N.register(
"Your version is up to date." : "Deine Version ist aktuell.",
"Checked on %s" : "Geprüft auf %s",
"Update channel:" : "Update-Kanal:",
- "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Du kannst immer auf eine neuere Version updaten / experimentelle Version, aber kein Downgrade auf eine stabiliere Version durchführen."
+ "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Du kannst immer auf eine neuere Version updaten / experimentelle Version, aber kein Downgrade auf eine stabilere Version durchführen."
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/updatenotification/l10n/de.json b/apps/updatenotification/l10n/de.json
index 566a33d9ba6..05965dbcb68 100644
--- a/apps/updatenotification/l10n/de.json
+++ b/apps/updatenotification/l10n/de.json
@@ -7,6 +7,6 @@
"Your version is up to date." : "Deine Version ist aktuell.",
"Checked on %s" : "Geprüft auf %s",
"Update channel:" : "Update-Kanal:",
- "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Du kannst immer auf eine neuere Version updaten / experimentelle Version, aber kein Downgrade auf eine stabiliere Version durchführen."
+ "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Du kannst immer auf eine neuere Version updaten / experimentelle Version, aber kein Downgrade auf eine stabilere Version durchführen."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/updatenotification/l10n/de_DE.js b/apps/updatenotification/l10n/de_DE.js
index d93e8685671..4d06cae7060 100644
--- a/apps/updatenotification/l10n/de_DE.js
+++ b/apps/updatenotification/l10n/de_DE.js
@@ -1,12 +1,14 @@
OC.L10N.register(
"updatenotification",
{
+ "Updated channel" : "Aktualisierter Kanal",
"{version} is available. Get more information on how to update." : "{version} ist verfügbar. Weitere Informationen zur Aktualisierungen.",
"Updater" : "Updater",
"A new version is available: %s" : "Eine neue Version ist verfügbar: %s",
"Open updater" : "Updater aufrufen",
"Your version is up to date." : "Die neuste Version ist installiert.",
"Checked on %s" : "Überprüft auf %s",
- "Update channel:" : "Update-Kanal:"
+ "Update channel:" : "Update-Kanal:",
+ "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Sie können immer auf eine neuere Version updaten / experimentelle Version, aber kein Downgrade auf eine stabilere Version durchführen."
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/updatenotification/l10n/de_DE.json b/apps/updatenotification/l10n/de_DE.json
index 2c8d54da7fe..ea4f0dd8807 100644
--- a/apps/updatenotification/l10n/de_DE.json
+++ b/apps/updatenotification/l10n/de_DE.json
@@ -1,10 +1,12 @@
{ "translations": {
+ "Updated channel" : "Aktualisierter Kanal",
"{version} is available. Get more information on how to update." : "{version} ist verfügbar. Weitere Informationen zur Aktualisierungen.",
"Updater" : "Updater",
"A new version is available: %s" : "Eine neue Version ist verfügbar: %s",
"Open updater" : "Updater aufrufen",
"Your version is up to date." : "Die neuste Version ist installiert.",
"Checked on %s" : "Überprüft auf %s",
- "Update channel:" : "Update-Kanal:"
+ "Update channel:" : "Update-Kanal:",
+ "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Sie können immer auf eine neuere Version updaten / experimentelle Version, aber kein Downgrade auf eine stabilere Version durchführen."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/updatenotification/l10n/el.js b/apps/updatenotification/l10n/el.js
index d5ecbce6954..4852da01df9 100644
--- a/apps/updatenotification/l10n/el.js
+++ b/apps/updatenotification/l10n/el.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"updatenotification",
{
+ "Updated channel" : "Ενημερωμένο κανάλι",
"{version} is available. Get more information on how to update." : "Η έκδοση {version} είναι διαθέσιμη. Δείτε περισσότερες πληροφορίες για το πως να κάνετε την ενημέρωση.",
"Updater" : "Εφαρμογή Ενημέρωσης",
"A new version is available: %s" : "Μία νέα έκδοση είναι διαθέσιμη: %s",
"Open updater" : "Άνοιγμα εφαρμογής ενημέρωσης",
+ "Your version is up to date." : "Έχετε την τελευταία έκδοση.",
"Update channel:" : "Ενημέρωση καναλιού:",
"You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Μπορείτε πάντα να περάσετε σε νεότερη / πειραματική έκδοση. Αλλά ποτέ δεν μπορείτε να γυρίσετε πίσω σε πιο σταθερό κανάλι."
},
diff --git a/apps/updatenotification/l10n/el.json b/apps/updatenotification/l10n/el.json
index de19b712dd5..0eff5d2857a 100644
--- a/apps/updatenotification/l10n/el.json
+++ b/apps/updatenotification/l10n/el.json
@@ -1,8 +1,10 @@
{ "translations": {
+ "Updated channel" : "Ενημερωμένο κανάλι",
"{version} is available. Get more information on how to update." : "Η έκδοση {version} είναι διαθέσιμη. Δείτε περισσότερες πληροφορίες για το πως να κάνετε την ενημέρωση.",
"Updater" : "Εφαρμογή Ενημέρωσης",
"A new version is available: %s" : "Μία νέα έκδοση είναι διαθέσιμη: %s",
"Open updater" : "Άνοιγμα εφαρμογής ενημέρωσης",
+ "Your version is up to date." : "Έχετε την τελευταία έκδοση.",
"Update channel:" : "Ενημέρωση καναλιού:",
"You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Μπορείτε πάντα να περάσετε σε νεότερη / πειραματική έκδοση. Αλλά ποτέ δεν μπορείτε να γυρίσετε πίσω σε πιο σταθερό κανάλι."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/updatenotification/l10n/fr.js b/apps/updatenotification/l10n/fr.js
index b4bcd3bf242..54bd598911c 100644
--- a/apps/updatenotification/l10n/fr.js
+++ b/apps/updatenotification/l10n/fr.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"updatenotification",
{
+ "Updated channel" : "Canal à jour",
"{version} is available. Get more information on how to update." : "La version {version} est disponible. Cliquez ici pour plus d'informations sur comment mettre à jour.",
"Updater" : "Mises à jour",
"A new version is available: %s" : "Une nouvelle version est disponible : %s",
diff --git a/apps/updatenotification/l10n/fr.json b/apps/updatenotification/l10n/fr.json
index d48167344b7..4e1b10fedb9 100644
--- a/apps/updatenotification/l10n/fr.json
+++ b/apps/updatenotification/l10n/fr.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "Updated channel" : "Canal à jour",
"{version} is available. Get more information on how to update." : "La version {version} est disponible. Cliquez ici pour plus d'informations sur comment mettre à jour.",
"Updater" : "Mises à jour",
"A new version is available: %s" : "Une nouvelle version est disponible : %s",
diff --git a/apps/updatenotification/l10n/pl.js b/apps/updatenotification/l10n/pl.js
index b685ad4a963..3439aae077a 100644
--- a/apps/updatenotification/l10n/pl.js
+++ b/apps/updatenotification/l10n/pl.js
@@ -1,10 +1,14 @@
OC.L10N.register(
"updatenotification",
{
+ "Updated channel" : "Zaktualizowano kanał",
"{version} is available. Get more information on how to update." : "Wersja {version} jest dostępna. Dowiedz się jak zaktualizować.",
"Updater" : "Aktualizator",
"A new version is available: %s" : "Dostępna jest nowa wersja: %s",
"Open updater" : "Otwórz aktualizator",
- "Update channel:" : "Kanał aktualizacji:"
+ "Your version is up to date." : "Posiadasz aktualną wersję.",
+ "Checked on %s" : "Sprawdzone na %s",
+ "Update channel:" : "Kanał aktualizacji:",
+ "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Możesz zawsze zaktualizować swoją wersję do nowego / ekperymentalnego kanału. Jednakże nie możesz powrócić do poprzedniej stabilniejszej wersji. "
},
"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/updatenotification/l10n/pl.json b/apps/updatenotification/l10n/pl.json
index 0a4ebdc6d95..f866a42188a 100644
--- a/apps/updatenotification/l10n/pl.json
+++ b/apps/updatenotification/l10n/pl.json
@@ -1,8 +1,12 @@
{ "translations": {
+ "Updated channel" : "Zaktualizowano kanał",
"{version} is available. Get more information on how to update." : "Wersja {version} jest dostępna. Dowiedz się jak zaktualizować.",
"Updater" : "Aktualizator",
"A new version is available: %s" : "Dostępna jest nowa wersja: %s",
"Open updater" : "Otwórz aktualizator",
- "Update channel:" : "Kanał aktualizacji:"
+ "Your version is up to date." : "Posiadasz aktualną wersję.",
+ "Checked on %s" : "Sprawdzone na %s",
+ "Update channel:" : "Kanał aktualizacji:",
+ "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Możesz zawsze zaktualizować swoją wersję do nowego / ekperymentalnego kanału. Jednakże nie możesz powrócić do poprzedniej stabilniejszej wersji. "
},"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/updatenotification/l10n/tr.js b/apps/updatenotification/l10n/tr.js
index 26b00321924..036cedb6fb6 100644
--- a/apps/updatenotification/l10n/tr.js
+++ b/apps/updatenotification/l10n/tr.js
@@ -1,9 +1,13 @@
OC.L10N.register(
"updatenotification",
{
+ "Updated channel" : "Kanal güncellendi",
"{version} is available. Get more information on how to update." : "Sürüm {version} hazır. Nasıl güncelleyeceğinizle ilgili daha fazla bilgi alın.",
"Updater" : "Güncelleyici",
"A new version is available: %s" : "Yeni bir sürüm mevcut: %s",
+ "Open updater" : "Güncelleyiciyi aç",
+ "Your version is up to date." : "Sürümünüz güncel.",
+ "Checked on %s" : "Son denetlenme: %s",
"Update channel:" : "Güncelleme kanalı:",
"You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Her zaman yeni / deneysel bir sürüme güncelleyebilirsiniz, ancak daha düşük bir kararlı sürüme düşüremezsiniz."
},
diff --git a/apps/updatenotification/l10n/tr.json b/apps/updatenotification/l10n/tr.json
index 07f42475269..a7523e3472b 100644
--- a/apps/updatenotification/l10n/tr.json
+++ b/apps/updatenotification/l10n/tr.json
@@ -1,7 +1,11 @@
{ "translations": {
+ "Updated channel" : "Kanal güncellendi",
"{version} is available. Get more information on how to update." : "Sürüm {version} hazır. Nasıl güncelleyeceğinizle ilgili daha fazla bilgi alın.",
"Updater" : "Güncelleyici",
"A new version is available: %s" : "Yeni bir sürüm mevcut: %s",
+ "Open updater" : "Güncelleyiciyi aç",
+ "Your version is up to date." : "Sürümünüz güncel.",
+ "Checked on %s" : "Son denetlenme: %s",
"Update channel:" : "Güncelleme kanalı:",
"You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Her zaman yeni / deneysel bir sürüme güncelleyebilirsiniz, ancak daha düşük bir kararlı sürüme düşüremezsiniz."
},"pluralForm" :"nplurals=2; plural=(n > 1);"
diff --git a/apps/user_ldap/l10n/da.js b/apps/user_ldap/l10n/da.js
index c01d3efa018..055fe44d504 100644
--- a/apps/user_ldap/l10n/da.js
+++ b/apps/user_ldap/l10n/da.js
@@ -24,6 +24,7 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Kunne ikke registrere Base DN - angiv den venligst manuelt.",
"{nthServer}. Server" : "{nthServer}. server",
"No object found in the given Base DN. Please revise." : "Intet objekt fundet i den givne Base DN. Gennemse venligst.",
+ "More than 1,000 directory entries available." : "Mere end 1.000 mappeposter",
" entries available within the provided Base DN" : "poster tilgængelige inden for det angivne Base DN.",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Der opstod en fejl. Tjek venligst Base DN, såvel som forbindelsesindstillingerne og brugeroplysningerne.",
"Do you really want to delete the current Server Configuration?" : "Ønsker du virkelig at slette den nuværende Server Konfiguration?",
diff --git a/apps/user_ldap/l10n/da.json b/apps/user_ldap/l10n/da.json
index db61541ef73..c3d2ba6abbf 100644
--- a/apps/user_ldap/l10n/da.json
+++ b/apps/user_ldap/l10n/da.json
@@ -22,6 +22,7 @@
"Could not detect Base DN, please enter it manually." : "Kunne ikke registrere Base DN - angiv den venligst manuelt.",
"{nthServer}. Server" : "{nthServer}. server",
"No object found in the given Base DN. Please revise." : "Intet objekt fundet i den givne Base DN. Gennemse venligst.",
+ "More than 1,000 directory entries available." : "Mere end 1.000 mappeposter",
" entries available within the provided Base DN" : "poster tilgængelige inden for det angivne Base DN.",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Der opstod en fejl. Tjek venligst Base DN, såvel som forbindelsesindstillingerne og brugeroplysningerne.",
"Do you really want to delete the current Server Configuration?" : "Ønsker du virkelig at slette den nuværende Server Konfiguration?",
diff --git a/apps/user_ldap/l10n/de.js b/apps/user_ldap/l10n/de.js
index 431f99a87e7..8e185d3806d 100644
--- a/apps/user_ldap/l10n/de.js
+++ b/apps/user_ldap/l10n/de.js
@@ -134,7 +134,7 @@ OC.L10N.register(
"One Group Base DN per line" : "Ein Gruppen Basis-DN pro Zeile",
"Group Search Attributes" : "Gruppensucheigenschaften",
"Group-Member association" : "Assoziation zwischen Gruppe und Benutzer",
- "Dynamic Group Member URL" : "Dynamische Gruppen Mitglied URL",
+ "Dynamic Group Member URL" : "Dynamische Gruppenmitglied 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.)" : "Ein LDAP-Attribut von Gruppenobjekten, das eine LDAP Such-URL enthält die festlegt welche Objekte zu der Gruppe gehören. (Ein leeres Feld deaktiviert die Funktion \"Dynamisch Gruppenzugehörigkeit\".)",
"Nested Groups" : "Eingebundene Gruppen",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Wenn aktiviert, werden Gruppen, die Gruppen enthalten, unterstützt. (Funktioniert nur, wenn das Merkmal des Gruppenmitgliedes den Domain-Namen enthält.)",
diff --git a/apps/user_ldap/l10n/de.json b/apps/user_ldap/l10n/de.json
index 3e03d9b7294..7ce59debdec 100644
--- a/apps/user_ldap/l10n/de.json
+++ b/apps/user_ldap/l10n/de.json
@@ -132,7 +132,7 @@
"One Group Base DN per line" : "Ein Gruppen Basis-DN pro Zeile",
"Group Search Attributes" : "Gruppensucheigenschaften",
"Group-Member association" : "Assoziation zwischen Gruppe und Benutzer",
- "Dynamic Group Member URL" : "Dynamische Gruppen Mitglied URL",
+ "Dynamic Group Member URL" : "Dynamische Gruppenmitglied 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.)" : "Ein LDAP-Attribut von Gruppenobjekten, das eine LDAP Such-URL enthält die festlegt welche Objekte zu der Gruppe gehören. (Ein leeres Feld deaktiviert die Funktion \"Dynamisch Gruppenzugehörigkeit\".)",
"Nested Groups" : "Eingebundene Gruppen",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Wenn aktiviert, werden Gruppen, die Gruppen enthalten, unterstützt. (Funktioniert nur, wenn das Merkmal des Gruppenmitgliedes den Domain-Namen enthält.)",
diff --git a/apps/user_ldap/l10n/de_DE.js b/apps/user_ldap/l10n/de_DE.js
index b72b41ea293..87ec6ba222a 100644
--- a/apps/user_ldap/l10n/de_DE.js
+++ b/apps/user_ldap/l10n/de_DE.js
@@ -122,6 +122,8 @@ OC.L10N.register(
"Directory Settings" : "Ordnereinstellungen",
"User Display Name Field" : "Feld für den Anzeigenamen des Benutzers",
"The LDAP attribute to use to generate the user's display name." : "Das LDAP-Attribut zur Generierung des Anzeigenamens des Benutzers.",
+ "2nd User Display Name Field" : "2. Benutzeranzeigename Feld",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optional. Ein hinzuzufügendes LDAP-Attribut um den Namen in Klammern anzuzeigen. Beispiel: »John Doe (john.doe@example.org)«.",
"Base User Tree" : "Basis-Benutzerbaum",
"One User Base DN per line" : "Ein Benutzer Basis-DN pro Zeile",
"User Search Attributes" : "Benutzersucheigenschaften",
@@ -132,6 +134,8 @@ OC.L10N.register(
"One Group Base DN per line" : "Ein Gruppen Basis-DN pro Zeile",
"Group Search Attributes" : "Gruppensucheigenschaften",
"Group-Member association" : "Assoziation zwischen Gruppe und Benutzer",
+ "Dynamic Group Member URL" : "Dynamische Gruppenmitglied 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.)" : "Ein LDAP-Attribut von Gruppenobjekten, das eine LDAP Such-URL enthält die festlegt welche Objekte zu der Gruppe gehören. (Ein leeres Feld deaktiviert die Funktion \"Dynamisch Gruppenzugehörigkeit\".)",
"Nested Groups" : "Eingebundene Gruppen",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Wenn aktiviert, werden Gruppen, die Gruppen enthalten, unterstützt. (Funktioniert nur, wenn das Merkmal des Gruppenmitgliedes den Domain-Namen enthält.)",
"Paging chunksize" : "Seitenstücke (Paging chunksize)",
diff --git a/apps/user_ldap/l10n/de_DE.json b/apps/user_ldap/l10n/de_DE.json
index 58ccaa400c9..f345ba52c2c 100644
--- a/apps/user_ldap/l10n/de_DE.json
+++ b/apps/user_ldap/l10n/de_DE.json
@@ -120,6 +120,8 @@
"Directory Settings" : "Ordnereinstellungen",
"User Display Name Field" : "Feld für den Anzeigenamen des Benutzers",
"The LDAP attribute to use to generate the user's display name." : "Das LDAP-Attribut zur Generierung des Anzeigenamens des Benutzers.",
+ "2nd User Display Name Field" : "2. Benutzeranzeigename Feld",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optional. Ein hinzuzufügendes LDAP-Attribut um den Namen in Klammern anzuzeigen. Beispiel: »John Doe (john.doe@example.org)«.",
"Base User Tree" : "Basis-Benutzerbaum",
"One User Base DN per line" : "Ein Benutzer Basis-DN pro Zeile",
"User Search Attributes" : "Benutzersucheigenschaften",
@@ -130,6 +132,8 @@
"One Group Base DN per line" : "Ein Gruppen Basis-DN pro Zeile",
"Group Search Attributes" : "Gruppensucheigenschaften",
"Group-Member association" : "Assoziation zwischen Gruppe und Benutzer",
+ "Dynamic Group Member URL" : "Dynamische Gruppenmitglied 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.)" : "Ein LDAP-Attribut von Gruppenobjekten, das eine LDAP Such-URL enthält die festlegt welche Objekte zu der Gruppe gehören. (Ein leeres Feld deaktiviert die Funktion \"Dynamisch Gruppenzugehörigkeit\".)",
"Nested Groups" : "Eingebundene Gruppen",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Wenn aktiviert, werden Gruppen, die Gruppen enthalten, unterstützt. (Funktioniert nur, wenn das Merkmal des Gruppenmitgliedes den Domain-Namen enthält.)",
"Paging chunksize" : "Seitenstücke (Paging chunksize)",
diff --git a/apps/user_ldap/l10n/fil.js b/apps/user_ldap/l10n/fil.js
index db848ae4c2c..ef3eeaef0cf 100644
--- a/apps/user_ldap/l10n/fil.js
+++ b/apps/user_ldap/l10n/fil.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"user_ldap",
{
+ "Help" : "Tulong",
"Password" : "Password"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/user_ldap/l10n/fil.json b/apps/user_ldap/l10n/fil.json
index b60f17590ba..d31ca17d01c 100644
--- a/apps/user_ldap/l10n/fil.json
+++ b/apps/user_ldap/l10n/fil.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "Help" : "Tulong",
"Password" : "Password"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/user_ldap/l10n/is.js b/apps/user_ldap/l10n/is.js
index 231875d07f9..b158b796056 100644
--- a/apps/user_ldap/l10n/is.js
+++ b/apps/user_ldap/l10n/is.js
@@ -1,15 +1,41 @@
OC.L10N.register(
"user_ldap",
{
+ "No action specified" : "Engin aðgerð tiltekin",
+ "No data specified" : "Engin gögn tiltekin",
+ "Action does not exist" : "Aðgerð er ekki til",
+ "Configuration incorrect" : "Röng uppsetning",
+ "Configuration OK" : "Stillingar eru í lagi",
+ "Select groups" : "Veldu hópa",
+ "{nthServer}. Server" : "{nthServer}. Þjónn",
+ "Confirm Deletion" : "Staðfesta eyðingu",
+ "Select attributes" : "Veldu eigindi",
+ "_%s group found_::_%s groups found_" : ["%s hópur fannst","%s hópar fundust"],
+ "_%s user found_::_%s users found_" : ["%s notandi fannst","%s notendur fundust"],
+ "Invalid Host" : "Ógild vél",
"Server" : "Þjónn",
"Users" : "Notendur",
+ "Login Attributes" : "Eigindi innskráningar",
"Groups" : "Hópar",
"Test Configuration" : "Prúfa uppsetningu",
"Help" : "Hjálp",
- "Host" : "Netþjónn",
+ "Search groups" : "Leita í hópum",
+ "Available groups" : "Tiltækir hópar",
+ "Selected groups" : "Valdir hópar",
+ "Verify settings" : "Sannprófa stillingar",
+ "1. Server" : "1. Þjónn",
+ "%s. Server:" : "%s. Þjónn:",
+ "Host" : "Hýsill",
"Port" : "Gátt",
+ "Detect Port" : "Finna gátt",
"Password" : "Lykilorð",
+ "Saving" : "Vistun",
+ "Back" : "Til baka",
"Continue" : "Halda áfram",
- "Advanced" : "Ítarlegt"
+ "LDAP" : "LDAP",
+ "Expert" : "Snillingur",
+ "Advanced" : "Ítarlegt",
+ "Connection Settings" : "Valkostir tengingar ",
+ "in bytes" : "í bætum"
},
"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");
diff --git a/apps/user_ldap/l10n/is.json b/apps/user_ldap/l10n/is.json
index ac8cdeb9ad3..3c049382900 100644
--- a/apps/user_ldap/l10n/is.json
+++ b/apps/user_ldap/l10n/is.json
@@ -1,13 +1,39 @@
{ "translations": {
+ "No action specified" : "Engin aðgerð tiltekin",
+ "No data specified" : "Engin gögn tiltekin",
+ "Action does not exist" : "Aðgerð er ekki til",
+ "Configuration incorrect" : "Röng uppsetning",
+ "Configuration OK" : "Stillingar eru í lagi",
+ "Select groups" : "Veldu hópa",
+ "{nthServer}. Server" : "{nthServer}. Þjónn",
+ "Confirm Deletion" : "Staðfesta eyðingu",
+ "Select attributes" : "Veldu eigindi",
+ "_%s group found_::_%s groups found_" : ["%s hópur fannst","%s hópar fundust"],
+ "_%s user found_::_%s users found_" : ["%s notandi fannst","%s notendur fundust"],
+ "Invalid Host" : "Ógild vél",
"Server" : "Þjónn",
"Users" : "Notendur",
+ "Login Attributes" : "Eigindi innskráningar",
"Groups" : "Hópar",
"Test Configuration" : "Prúfa uppsetningu",
"Help" : "Hjálp",
- "Host" : "Netþjónn",
+ "Search groups" : "Leita í hópum",
+ "Available groups" : "Tiltækir hópar",
+ "Selected groups" : "Valdir hópar",
+ "Verify settings" : "Sannprófa stillingar",
+ "1. Server" : "1. Þjónn",
+ "%s. Server:" : "%s. Þjónn:",
+ "Host" : "Hýsill",
"Port" : "Gátt",
+ "Detect Port" : "Finna gátt",
"Password" : "Lykilorð",
+ "Saving" : "Vistun",
+ "Back" : "Til baka",
"Continue" : "Halda áfram",
- "Advanced" : "Ítarlegt"
+ "LDAP" : "LDAP",
+ "Expert" : "Snillingur",
+ "Advanced" : "Ítarlegt",
+ "Connection Settings" : "Valkostir tengingar ",
+ "in bytes" : "í bætum"
},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
} \ No newline at end of file
diff --git a/apps/user_ldap/templates/part.settingcontrols.php b/apps/user_ldap/templates/part.settingcontrols.php
index bac00daa39f..fb5deb1897d 100644
--- a/apps/user_ldap/templates/part.settingcontrols.php
+++ b/apps/user_ldap/templates/part.settingcontrols.php
@@ -3,7 +3,7 @@
<?php p($l->t('Test Configuration'));?>
</button>
<a href="<?php p(\OC::$server->getURLGenerator()->linkToDocs('admin-ldap')); ?>"
- target="_blank">
+ target="_blank" rel="noreferrer">
<img src="<?php print_unescaped(OCP\Util::imagePath('', 'actions/info.png')); ?>"
style="height:1.75ex" />
<?php p($l->t('Help'));?>
diff --git a/apps/user_ldap/templates/part.wizardcontrols.php b/apps/user_ldap/templates/part.wizardcontrols.php
index cda4e1fd906..19d6de94ebe 100644
--- a/apps/user_ldap/templates/part.wizardcontrols.php
+++ b/apps/user_ldap/templates/part.wizardcontrols.php
@@ -9,7 +9,7 @@
<?php p($l->t('Continue'));?>
</button>
<a href="<?php p(\OC::$server->getURLGenerator()->linkToDocs('admin-ldap')); ?>"
- target="_blank">
+ target="_blank" rel="noreferrer">
<img src="<?php print_unescaped(OCP\Util::imagePath('', 'actions/info.png')); ?>"
style="height:1.75ex" />
<span class="ldap_grey"><?php p($l->t('Help'));?></span>