aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.htaccess4
-rw-r--r--apps/comments/l10n/bg_BG.js13
-rw-r--r--apps/comments/l10n/bg_BG.json13
-rw-r--r--apps/dav/appinfo/database.xml6
-rw-r--r--apps/dav/appinfo/info.xml7
-rw-r--r--apps/dav/appinfo/v1/caldav.php1
-rw-r--r--apps/dav/appinfo/v1/carddav.php1
-rw-r--r--apps/dav/appinfo/v1/publicwebdav.php9
-rw-r--r--apps/dav/appinfo/v1/webdav.php1
-rw-r--r--apps/dav/lib/AppInfo/Application.php10
-rw-r--r--apps/dav/lib/CalDAV/CalDavBackend.php90
-rw-r--r--apps/dav/lib/CalDAV/Calendar.php77
-rw-r--r--apps/dav/lib/CalDAV/CalendarObject.php92
-rw-r--r--apps/dav/lib/Connector/PublicAuth.php9
-rw-r--r--apps/dav/lib/Connector/Sabre/Auth.php21
-rw-r--r--apps/dav/lib/Connector/Sabre/Directory.php2
-rw-r--r--apps/dav/lib/Connector/Sabre/FilesPlugin.php32
-rw-r--r--apps/dav/lib/Connector/Sabre/Node.php4
-rw-r--r--apps/dav/lib/Connector/Sabre/ObjectTree.php2
-rw-r--r--apps/dav/lib/Connector/Sabre/ServerFactory.php4
-rw-r--r--apps/dav/lib/Migration/Classification.php93
-rw-r--r--apps/dav/lib/Server.php5
-rw-r--r--apps/dav/tests/unit/CalDAV/AbstractCalDavBackendTest.php163
-rw-r--r--apps/dav/tests/unit/CalDAV/CalDavBackendTest.php141
-rw-r--r--apps/dav/tests/unit/CalDAV/CalendarTest.php150
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/AuthTest.php66
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php126
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php3
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php59
-rw-r--r--apps/dav/tests/unit/Migration/ClassificationTest.php75
-rw-r--r--apps/encryption/l10n/pl.js2
-rw-r--r--apps/encryption/l10n/pl.json2
-rw-r--r--apps/encryption/l10n/pt_PT.js66
-rw-r--r--apps/encryption/l10n/pt_PT.json66
-rw-r--r--apps/federatedfilesharing/l10n/ar.js6
-rw-r--r--apps/federatedfilesharing/l10n/ar.json4
-rw-r--r--apps/federatedfilesharing/l10n/gl.js1
-rw-r--r--apps/federatedfilesharing/l10n/gl.json1
-rw-r--r--apps/federatedfilesharing/l10n/hu_HU.js6
-rw-r--r--apps/federatedfilesharing/l10n/hu_HU.json6
-rw-r--r--apps/federatedfilesharing/l10n/lt_LT.js2
-rw-r--r--apps/federatedfilesharing/l10n/lt_LT.json2
-rw-r--r--apps/federatedfilesharing/l10n/oc.js2
-rw-r--r--apps/federatedfilesharing/l10n/oc.json2
-rw-r--r--apps/federatedfilesharing/l10n/pl.js1
-rw-r--r--apps/federatedfilesharing/l10n/pl.json1
-rw-r--r--apps/federatedfilesharing/l10n/pt_PT.js6
-rw-r--r--apps/federatedfilesharing/l10n/pt_PT.json6
-rw-r--r--apps/federatedfilesharing/l10n/sk_SK.js2
-rw-r--r--apps/federatedfilesharing/l10n/sk_SK.json2
-rw-r--r--apps/federatedfilesharing/l10n/sl.js5
-rw-r--r--apps/federatedfilesharing/l10n/sl.json5
-rw-r--r--apps/federatedfilesharing/l10n/th_TH.js3
-rw-r--r--apps/federatedfilesharing/l10n/th_TH.json3
-rw-r--r--apps/federatedfilesharing/l10n/tr.js3
-rw-r--r--apps/federatedfilesharing/l10n/tr.json3
-rw-r--r--apps/federatedfilesharing/l10n/zh_CN.js3
-rw-r--r--apps/federatedfilesharing/l10n/zh_CN.json3
-rw-r--r--apps/federation/css/settings-admin.css11
-rw-r--r--apps/federation/js/settings-admin.js13
-rw-r--r--apps/federation/l10n/pt_PT.js2
-rw-r--r--apps/federation/l10n/pt_PT.json2
-rw-r--r--apps/federation/l10n/ro.js8
-rw-r--r--apps/federation/l10n/ro.json8
-rw-r--r--apps/federation/lib/DAV/FedAuth.php4
-rw-r--r--apps/federation/templates/settings-admin.php3
-rw-r--r--apps/files/js/app.js3
-rw-r--r--apps/files/l10n/ar.js6
-rw-r--r--apps/files/l10n/ar.json6
-rw-r--r--apps/files/l10n/da.js6
-rw-r--r--apps/files/l10n/da.json6
-rw-r--r--apps/files/l10n/de.js1
-rw-r--r--apps/files/l10n/de.json1
-rw-r--r--apps/files/l10n/de_DE.js1
-rw-r--r--apps/files/l10n/de_DE.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/fi_FI.js1
-rw-r--r--apps/files/l10n/fi_FI.json1
-rw-r--r--apps/files/l10n/it.js1
-rw-r--r--apps/files/l10n/it.json1
-rw-r--r--apps/files/l10n/lb.js2
-rw-r--r--apps/files/l10n/lb.json2
-rw-r--r--apps/files/l10n/pl.js3
-rw-r--r--apps/files/l10n/pl.json3
-rw-r--r--apps/files/l10n/pt_BR.js1
-rw-r--r--apps/files/l10n/pt_BR.json1
-rw-r--r--apps/files/l10n/pt_PT.js36
-rw-r--r--apps/files/l10n/pt_PT.json36
-rw-r--r--apps/files/l10n/ru.js14
-rw-r--r--apps/files/l10n/ru.json14
-rw-r--r--apps/files/l10n/sq.js1
-rw-r--r--apps/files/l10n/sq.json1
-rw-r--r--apps/files/lib/Controller/ViewController.php61
-rw-r--r--apps/files/templates/index.php1
-rw-r--r--apps/files/tests/Controller/ViewControllerTest.php13
-rw-r--r--apps/files_external/js/settings.js5
-rw-r--r--apps/files_external/js/statusmanager.js1
-rw-r--r--apps/files_external/l10n/fr.js1
-rw-r--r--apps/files_external/l10n/fr.json1
-rw-r--r--apps/files_external/l10n/pl.js2
-rw-r--r--apps/files_external/l10n/pl.json2
-rw-r--r--apps/files_external/l10n/pt_PT.js14
-rw-r--r--apps/files_external/l10n/pt_PT.json14
-rw-r--r--apps/files_external/lib/Controller/GlobalStoragesController.php5
-rw-r--r--apps/files_external/lib/Controller/StoragesController.php9
-rw-r--r--apps/files_external/lib/Controller/UserGlobalStoragesController.php9
-rw-r--r--apps/files_external/lib/Controller/UserStoragesController.php9
-rw-r--r--apps/files_external/lib/Lib/Storage/Google.php18
-rw-r--r--apps/files_external/lib/Lib/Storage/SMB.php20
-rw-r--r--apps/files_external/lib/config.php4
-rw-r--r--apps/files_external/tests/Storage/GoogleTest.php9
-rw-r--r--apps/files_external/tests/js/settingsSpec.js3
-rw-r--r--apps/files_sharing/l10n/cs_CZ.js38
-rw-r--r--apps/files_sharing/l10n/cs_CZ.json38
-rw-r--r--apps/files_sharing/l10n/de.js38
-rw-r--r--apps/files_sharing/l10n/de.json38
-rw-r--r--apps/files_sharing/l10n/de_DE.js38
-rw-r--r--apps/files_sharing/l10n/de_DE.json38
-rw-r--r--apps/files_sharing/l10n/en_GB.js38
-rw-r--r--apps/files_sharing/l10n/en_GB.json38
-rw-r--r--apps/files_sharing/l10n/es.js38
-rw-r--r--apps/files_sharing/l10n/es.json38
-rw-r--r--apps/files_sharing/l10n/fr.js38
-rw-r--r--apps/files_sharing/l10n/fr.json38
-rw-r--r--apps/files_sharing/l10n/it.js38
-rw-r--r--apps/files_sharing/l10n/it.json38
-rw-r--r--apps/files_sharing/l10n/ja.js38
-rw-r--r--apps/files_sharing/l10n/ja.json38
-rw-r--r--apps/files_sharing/l10n/lv.js32
-rw-r--r--apps/files_sharing/l10n/lv.json32
-rw-r--r--apps/files_sharing/l10n/nl.js38
-rw-r--r--apps/files_sharing/l10n/nl.json38
-rw-r--r--apps/files_sharing/l10n/pl.js4
-rw-r--r--apps/files_sharing/l10n/pl.json4
-rw-r--r--apps/files_sharing/l10n/pt_BR.js38
-rw-r--r--apps/files_sharing/l10n/pt_BR.json38
-rw-r--r--apps/files_sharing/l10n/pt_PT.js48
-rw-r--r--apps/files_sharing/l10n/pt_PT.json48
-rw-r--r--apps/files_sharing/l10n/ro.js22
-rw-r--r--apps/files_sharing/l10n/ro.json22
-rw-r--r--apps/files_sharing/l10n/sl.js43
-rw-r--r--apps/files_sharing/l10n/sl.json43
-rw-r--r--apps/files_sharing/l10n/sq.js38
-rw-r--r--apps/files_sharing/l10n/sq.json38
-rw-r--r--apps/files_sharing/l10n/th_TH.js38
-rw-r--r--apps/files_sharing/l10n/th_TH.json38
-rw-r--r--apps/files_sharing/l10n/zh_CN.js38
-rw-r--r--apps/files_sharing/l10n/zh_CN.json38
-rw-r--r--apps/files_sharing/lib/API/Share20OCS.php24
-rw-r--r--apps/files_sharing/lib/Cache.php2
-rw-r--r--apps/files_sharing/lib/Controllers/ShareController.php2
-rw-r--r--apps/files_sharing/lib/sharedstorage.php18
-rw-r--r--apps/files_sharing/tests/API/Share20OCSTest.php21
-rw-r--r--apps/files_sharing/tests/ApiTest.php41
-rw-r--r--apps/files_trashbin/l10n/ast.js2
-rw-r--r--apps/files_trashbin/l10n/ast.json2
-rw-r--r--apps/files_trashbin/l10n/lb.js2
-rw-r--r--apps/files_trashbin/l10n/lb.json2
-rw-r--r--apps/files_trashbin/l10n/ru.js2
-rw-r--r--apps/files_trashbin/l10n/ru.json2
-rw-r--r--apps/files_versions/lib/Storage.php10
-rw-r--r--apps/systemtags/l10n/fr.js22
-rw-r--r--apps/systemtags/l10n/fr.json22
-rw-r--r--apps/systemtags/l10n/hu_HU.js1
-rw-r--r--apps/systemtags/l10n/hu_HU.json1
-rw-r--r--apps/systemtags/l10n/pl.js2
-rw-r--r--apps/systemtags/l10n/pl.json2
-rw-r--r--apps/updatenotification/l10n/hu_HU.js3
-rw-r--r--apps/updatenotification/l10n/hu_HU.json3
-rw-r--r--apps/updatenotification/l10n/pl.js3
-rw-r--r--apps/updatenotification/l10n/pl.json3
-rw-r--r--apps/updatenotification/l10n/sl.js5
-rw-r--r--apps/updatenotification/l10n/sl.json5
-rw-r--r--apps/user_ldap/l10n/pl.js1
-rw-r--r--apps/user_ldap/l10n/pl.json1
-rw-r--r--apps/user_ldap/l10n/ru.js18
-rw-r--r--apps/user_ldap/l10n/ru.json18
-rw-r--r--apps/user_ldap/l10n/tr.js1
-rw-r--r--apps/user_ldap/l10n/tr.json1
-rw-r--r--apps/user_ldap/l10n/ur_PK.js1
-rw-r--r--apps/user_ldap/l10n/ur_PK.json1
-rw-r--r--apps/user_ldap/lib/Group_LDAP.php2
-rw-r--r--apps/user_ldap/tests/Group_LDAPTest.php53
-rwxr-xr-xautotest.sh2
-rw-r--r--build/integration/features/bootstrap/BasicStructure.php11
-rw-r--r--build/integration/features/bootstrap/FederationContext.php2
-rw-r--r--build/integration/features/webdav-related.feature4
-rw-r--r--build/integration/federation_features/federated.feature61
-rw-r--r--core/Application.php3
-rw-r--r--core/Command/Encryption/DecryptAll.php13
-rw-r--r--core/Command/Maintenance/Install.php7
-rw-r--r--core/Controller/LoginController.php5
-rw-r--r--core/Controller/TokenController.php36
-rw-r--r--core/Controller/TwoFactorChallengeController.php9
-rw-r--r--core/Middleware/TwoFactorMiddleware.php5
-rw-r--r--core/css/styles.css4
-rw-r--r--core/css/tooltip.css2
-rw-r--r--core/img/background.jpgbin90185 -> 133536 bytes
-rw-r--r--core/img/favicon.icobin5686 -> 4958 bytes
-rw-r--r--core/js/setupchecks.js4
-rw-r--r--core/js/tests/specs/setupchecksSpec.js2
-rw-r--r--core/l10n/de.js1
-rw-r--r--core/l10n/de.json1
-rw-r--r--core/l10n/de_DE.js1
-rw-r--r--core/l10n/de_DE.json1
-rw-r--r--core/l10n/en_GB.js1
-rw-r--r--core/l10n/en_GB.json1
-rw-r--r--core/l10n/fi_FI.js2
-rw-r--r--core/l10n/fi_FI.json2
-rw-r--r--core/l10n/it.js1
-rw-r--r--core/l10n/it.json1
-rw-r--r--core/l10n/ja.js1
-rw-r--r--core/l10n/ja.json1
-rw-r--r--core/l10n/pt_BR.js1
-rw-r--r--core/l10n/pt_BR.json1
-rw-r--r--core/l10n/pt_PT.js150
-rw-r--r--core/l10n/pt_PT.json150
-rw-r--r--core/l10n/ro.js56
-rw-r--r--core/l10n/ro.json56
-rw-r--r--core/l10n/ru.js1
-rw-r--r--core/l10n/ru.json1
-rw-r--r--core/l10n/sl.js2
-rw-r--r--core/l10n/sl.json2
-rw-r--r--core/l10n/sq.js1
-rw-r--r--core/l10n/sq.json1
-rw-r--r--core/templates/twofactorselectchallenge.php3
-rw-r--r--core/templates/twofactorshowchallenge.php1
-rw-r--r--lib/l10n/ar.js39
-rw-r--r--lib/l10n/ar.json39
-rw-r--r--lib/l10n/cs_CZ.js4
-rw-r--r--lib/l10n/cs_CZ.json4
-rw-r--r--lib/l10n/de.js4
-rw-r--r--lib/l10n/de.json4
-rw-r--r--lib/l10n/de_DE.js4
-rw-r--r--lib/l10n/de_DE.json4
-rw-r--r--lib/l10n/en_GB.js4
-rw-r--r--lib/l10n/en_GB.json4
-rw-r--r--lib/l10n/es.js4
-rw-r--r--lib/l10n/es.json4
-rw-r--r--lib/l10n/fi_FI.js4
-rw-r--r--lib/l10n/fi_FI.json4
-rw-r--r--lib/l10n/fr.js3
-rw-r--r--lib/l10n/fr.json3
-rw-r--r--lib/l10n/it.js4
-rw-r--r--lib/l10n/it.json4
-rw-r--r--lib/l10n/ja.js4
-rw-r--r--lib/l10n/ja.json4
-rw-r--r--lib/l10n/pl.js1
-rw-r--r--lib/l10n/pl.json1
-rw-r--r--lib/l10n/pt_BR.js4
-rw-r--r--lib/l10n/pt_BR.json4
-rw-r--r--lib/l10n/pt_PT.js30
-rw-r--r--lib/l10n/pt_PT.json30
-rw-r--r--lib/l10n/ro.js5
-rw-r--r--lib/l10n/ro.json5
-rw-r--r--lib/l10n/ru.js4
-rw-r--r--lib/l10n/ru.json4
-rw-r--r--lib/l10n/sl.js20
-rw-r--r--lib/l10n/sl.json20
-rw-r--r--lib/l10n/sq.js4
-rw-r--r--lib/l10n/sq.json4
-rw-r--r--lib/l10n/uk.js4
-rw-r--r--lib/l10n/uk.json4
-rw-r--r--lib/private/AllConfig.php9
-rw-r--r--lib/private/AppConfig.php6
-rw-r--r--lib/private/AppFramework/Middleware/Security/CORSMiddleware.php12
-rw-r--r--lib/private/Authentication/Token/DefaultTokenCleanupJob.php1
-rw-r--r--lib/private/DB/ConnectionFactory.php4
-rw-r--r--lib/private/Encryption/DecryptAll.php4
-rw-r--r--lib/private/Encryption/File.php3
-rw-r--r--lib/private/Files/Cache/Scanner.php7
-rw-r--r--lib/private/Files/Cache/Updater.php5
-rw-r--r--lib/private/Files/Filesystem.php2
-rw-r--r--lib/private/Files/Mount/MountPoint.php1
-rw-r--r--lib/private/Files/Storage/Common.php3
-rw-r--r--lib/private/Files/Storage/Local.php36
-rw-r--r--lib/private/Files/Utils/Scanner.php7
-rw-r--r--lib/private/Files/View.php45
-rw-r--r--lib/private/Log.php28
-rw-r--r--lib/private/Repair.php4
-rw-r--r--lib/private/Repair/AvatarPermissions.php115
-rw-r--r--lib/private/Repair/RemoveOldShares.php103
-rw-r--r--lib/private/User/Session.php49
-rw-r--r--lib/private/legacy/api.php8
-rw-r--r--lib/private/legacy/helper.php6
-rw-r--r--lib/private/legacy/json.php4
-rw-r--r--lib/private/legacy/util.php42
-rw-r--r--lib/public/IAppConfig.php2
-rw-r--r--lib/public/IConfig.php3
-rw-r--r--lib/public/Migration/IRepairStep.php3
-rw-r--r--settings/admin.php4
-rw-r--r--settings/js/users/users.js2
-rw-r--r--settings/l10n/en_GB.js2
-rw-r--r--settings/l10n/en_GB.json2
-rw-r--r--settings/l10n/pl.js1
-rw-r--r--settings/l10n/pl.json1
-rw-r--r--settings/l10n/pt_PT.js8
-rw-r--r--settings/l10n/pt_PT.json8
-rw-r--r--settings/l10n/ro.js68
-rw-r--r--settings/l10n/ro.json68
-rw-r--r--settings/l10n/sl.js8
-rw-r--r--settings/l10n/sl.json8
-rw-r--r--settings/l10n/sq.js2
-rw-r--r--settings/l10n/sq.json2
-rw-r--r--settings/l10n/sv.js2
-rw-r--r--settings/l10n/sv.json2
-rw-r--r--settings/personal.php5
-rw-r--r--settings/templates/apps.php14
-rw-r--r--tests/Core/Controller/LoginControllerTest.php48
-rw-r--r--tests/Core/Controller/TokenControllerTest.php40
-rw-r--r--tests/Core/Controller/TwoFactorChallengeControllerTest.php21
-rw-r--r--tests/lib/AllConfigTest.php19
-rw-r--r--tests/lib/AppFramework/Middleware/Security/CORSMiddlewareTest.php11
-rw-r--r--tests/lib/Encryption/DecryptAllTest.php35
-rw-r--r--tests/lib/Files/FilesystemTest.php27
-rw-r--r--tests/lib/Files/Storage/LocalTest.php31
-rw-r--r--tests/lib/Files/ViewTest.php51
-rw-r--r--tests/lib/LoggerTest.php6
-rw-r--r--tests/lib/Repair/AvatarPermissionsTest.php189
-rw-r--r--tests/lib/Repair/RemoveOldSharesTest.php160
-rw-r--r--tests/lib/TestCase.php7
-rw-r--r--tests/lib/User/SessionTest.php159
-rw-r--r--version.php4
324 files changed, 4382 insertions, 1528 deletions
diff --git a/.htaccess b/.htaccess
index 5bf7b321f0c..bd9f5af3f70 100644
--- a/.htaccess
+++ b/.htaccess
@@ -56,9 +56,9 @@
RewriteRule ^\.well-known/carddav /remote.php/dav/ [R=301,L]
RewriteRule ^\.well-known/caldav /remote.php/dav/ [R=301,L]
RewriteRule ^remote/(.*) remote.php [QSA,L]
- RewriteRule ^(build|tests|config|lib|3rdparty|templates)/.* - [R=404,L]
+ RewriteRule ^(?:build|tests|config|lib|3rdparty|templates)/.* - [R=404,L]
RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge/.*
- RewriteRule ^(\.|autotest|occ|issue|indie|db_|console).* - [R=404,L]
+ RewriteRule ^(?:\.|autotest|occ|issue|indie|db_|console).* - [R=404,L]
</IfModule>
<IfModule mod_mime.c>
AddType image/svg+xml svg svgz
diff --git a/apps/comments/l10n/bg_BG.js b/apps/comments/l10n/bg_BG.js
index e63aedf80db..c5fbba69f7b 100644
--- a/apps/comments/l10n/bg_BG.js
+++ b/apps/comments/l10n/bg_BG.js
@@ -1,8 +1,19 @@
OC.L10N.register(
"comments",
{
+ "Type in a new comment..." : "Напиши нов коментар...",
+ "Delete comment" : "Изтрий коментар",
"Cancel" : "Отказ",
+ "Edit comment" : "Редактирай коментра",
+ "[Deleted user]" : "[Изтрит потребител]",
+ "Comments" : "Коментари",
+ "No other comments available" : "Няма други коментари",
+ "More comments..." : "Още коментари...",
"Save" : "Запазване",
- "Comment" : "Коментар"
+ "Allowed characters {count} of {max}" : "Позволени символи {count} от {max}",
+ "{count} unread comments" : "{count} нечетени коментари",
+ "Comment" : "Коментар",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Коментари</strong> на файлове <em>(винаги изписвани в stream-а)</em>",
+ "You commented" : "Вие коментирахте"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/comments/l10n/bg_BG.json b/apps/comments/l10n/bg_BG.json
index 78ad0b57d4c..64f516861ca 100644
--- a/apps/comments/l10n/bg_BG.json
+++ b/apps/comments/l10n/bg_BG.json
@@ -1,6 +1,17 @@
{ "translations": {
+ "Type in a new comment..." : "Напиши нов коментар...",
+ "Delete comment" : "Изтрий коментар",
"Cancel" : "Отказ",
+ "Edit comment" : "Редактирай коментра",
+ "[Deleted user]" : "[Изтрит потребител]",
+ "Comments" : "Коментари",
+ "No other comments available" : "Няма други коментари",
+ "More comments..." : "Още коментари...",
"Save" : "Запазване",
- "Comment" : "Коментар"
+ "Allowed characters {count} of {max}" : "Позволени символи {count} от {max}",
+ "{count} unread comments" : "{count} нечетени коментари",
+ "Comment" : "Коментар",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Коментари</strong> на файлове <em>(винаги изписвани в stream-а)</em>",
+ "You commented" : "Вие коментирахте"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/dav/appinfo/database.xml b/apps/dav/appinfo/database.xml
index f79ea07ae76..9578526a705 100644
--- a/apps/dav/appinfo/database.xml
+++ b/apps/dav/appinfo/database.xml
@@ -272,6 +272,12 @@ CREATE TABLE calendarobjects (
<type>text</type>
<length>255</length>
</field>
+ <field>
+ <comments>0 - public, 1 - private, 2 - confidential</comments>
+ <name>classification</name>
+ <type>integer</type>
+ <default>0</default>
+ </field>
<index>
<name>calobjects_index</name>
<unique>true</unique>
diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml
index ca456b03089..26e37e6bb86 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.4</version>
+ <version>0.2.5</version>
<default_enable/>
<types>
<filesystem/>
@@ -20,4 +20,9 @@
<background-jobs>
<job>OCA\DAV\CardDAV\Sync\SyncJob</job>
</background-jobs>
+ <repair-steps>
+ <post-migration>
+ <job>OCA\DAV\Migration\Classification</job>
+ </post-migration>
+ </repair-steps>
</info>
diff --git a/apps/dav/appinfo/v1/caldav.php b/apps/dav/appinfo/v1/caldav.php
index d3af7144745..50348a60202 100644
--- a/apps/dav/appinfo/v1/caldav.php
+++ b/apps/dav/appinfo/v1/caldav.php
@@ -34,6 +34,7 @@ $authBackend = new Auth(
\OC::$server->getSession(),
\OC::$server->getUserSession(),
\OC::$server->getRequest(),
+ \OC::$server->getTwoFactorAuthManager(),
'principals/'
);
$principalBackend = new Principal(
diff --git a/apps/dav/appinfo/v1/carddav.php b/apps/dav/appinfo/v1/carddav.php
index 7ef510689c2..88582d64ee5 100644
--- a/apps/dav/appinfo/v1/carddav.php
+++ b/apps/dav/appinfo/v1/carddav.php
@@ -35,6 +35,7 @@ $authBackend = new Auth(
\OC::$server->getSession(),
\OC::$server->getUserSession(),
\OC::$server->getRequest(),
+ \OC::$server->getTwoFactorAuthManager(),
'principals/'
);
$principalBackend = new Principal(
diff --git a/apps/dav/appinfo/v1/publicwebdav.php b/apps/dav/appinfo/v1/publicwebdav.php
index c6aaab2712f..07004f43bd7 100644
--- a/apps/dav/appinfo/v1/publicwebdav.php
+++ b/apps/dav/appinfo/v1/publicwebdav.php
@@ -66,14 +66,11 @@ $server = $serverFactory->createServer($baseuri, $requestUri, $authBackend, func
$share = $authBackend->getShare();
$owner = $share->getShareOwner();
- $isWritable = $share->getPermissions() & (\OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_CREATE);
$fileId = $share->getNodeId();
- if (!$isWritable) {
- \OC\Files\Filesystem::addStorageWrapper('readonly', function ($mountPoint, $storage) {
- return new \OC\Files\Storage\Wrapper\PermissionsMask(array('storage' => $storage, 'mask' => \OCP\Constants::PERMISSION_READ + \OCP\Constants::PERMISSION_SHARE));
- });
- }
+ \OC\Files\Filesystem::addStorageWrapper('sharePermissions', function ($mountPoint, $storage) use ($share) {
+ return new \OC\Files\Storage\Wrapper\PermissionsMask(array('storage' => $storage, 'mask' => $share->getPermissions() | \OCP\Constants::PERMISSION_SHARE));
+ });
OC_Util::setupFS($owner);
$ownerView = \OC\Files\Filesystem::getView();
diff --git a/apps/dav/appinfo/v1/webdav.php b/apps/dav/appinfo/v1/webdav.php
index 275849f618d..3b733c0fbd5 100644
--- a/apps/dav/appinfo/v1/webdav.php
+++ b/apps/dav/appinfo/v1/webdav.php
@@ -42,6 +42,7 @@ $authBackend = new \OCA\DAV\Connector\Sabre\Auth(
\OC::$server->getSession(),
\OC::$server->getUserSession(),
\OC::$server->getRequest(),
+ \OC::$server->getTwoFactorAuthManager(),
'principals/'
);
$requestUri = \OC::$server->getRequest()->getRequestUri();
diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php
index ba0ef421f97..9e0d2da4e17 100644
--- a/apps/dav/lib/AppInfo/Application.php
+++ b/apps/dav/lib/AppInfo/Application.php
@@ -31,10 +31,12 @@ use OCA\DAV\CardDAV\SyncService;
use OCA\DAV\Connector\Sabre\Principal;
use OCA\DAV\DAV\GroupPrincipalBackend;
use OCA\DAV\HookManager;
+use OCA\DAV\Migration\Classification;
use \OCP\AppFramework\App;
use OCP\AppFramework\IAppContainer;
use OCP\Contacts\IManager;
use OCP\IUser;
+use Sabre\VObject\Reader;
use Symfony\Component\EventDispatcher\GenericEvent;
class Application extends App {
@@ -106,6 +108,14 @@ class Application extends App {
$g
);
});
+
+ $container->registerService('OCA\DAV\Migration\Classification', function ($c) {
+ /** @var IAppContainer $c */
+ return new Classification(
+ $c->query('CalDavBackend'),
+ $c->getServer()->getUserManager()
+ );
+ });
}
/**
diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php
index 64fdf0f7ebe..ce494082976 100644
--- a/apps/dav/lib/CalDAV/CalDavBackend.php
+++ b/apps/dav/lib/CalDAV/CalDavBackend.php
@@ -37,10 +37,11 @@ use Sabre\CalDAV\Xml\Property\ScheduleCalendarTransp;
use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet;
use Sabre\DAV;
use Sabre\DAV\Exception\Forbidden;
+use Sabre\DAV\PropPatch;
use Sabre\HTTP\URLUtil;
use Sabre\VObject\DateTimeParser;
use Sabre\VObject\Reader;
-use Sabre\VObject\RecurrenceIterator;
+use Sabre\VObject\Recur\EventIterator;
/**
* Class CalDavBackend
@@ -61,6 +62,10 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
*/
const MAX_DATE = '2038-01-01';
+ const CLASSIFICATION_PUBLIC = 0;
+ const CLASSIFICATION_PRIVATE = 1;
+ const CLASSIFICATION_CONFIDENTIAL = 2;
+
/**
* List of CalDAV properties, and how they map to database field names
* Add your own properties by simply adding on to this array.
@@ -395,10 +400,10 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
*
* Read the PropPatch documentation for more info and examples.
*
- * @param \Sabre\DAV\PropPatch $propPatch
+ * @param PropPatch $propPatch
* @return void
*/
- function updateCalendar($calendarId, \Sabre\DAV\PropPatch $propPatch) {
+ function updateCalendar($calendarId, PropPatch $propPatch) {
$supportedProperties = array_keys($this->propertyMap);
$supportedProperties[] = '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp';
@@ -484,7 +489,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
*/
function getCalendarObjects($calendarId) {
$query = $this->db->getQueryBuilder();
- $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'componenttype'])
+ $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'componenttype', 'classification'])
->from('calendarobjects')
->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId)));
$stmt = $query->execute();
@@ -499,6 +504,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
'calendarid' => $row['calendarid'],
'size' => (int)$row['size'],
'component' => strtolower($row['componenttype']),
+ 'classification'=> (int)$row['classification']
];
}
@@ -524,7 +530,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
function getCalendarObject($calendarId, $objectUri) {
$query = $this->db->getQueryBuilder();
- $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype'])
+ $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype', 'classification'])
->from('calendarobjects')
->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId)))
->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri)));
@@ -542,6 +548,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
'size' => (int)$row['size'],
'calendardata' => $this->readBlob($row['calendardata']),
'component' => strtolower($row['componenttype']),
+ 'classification'=> (int)$row['classification']
];
}
@@ -559,7 +566,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
*/
function getMultipleCalendarObjects($calendarId, array $uris) {
$query = $this->db->getQueryBuilder();
- $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype'])
+ $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype', 'classification'])
->from('calendarobjects')
->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId)))
->andWhere($query->expr()->in('uri', $query->createParameter('uri')))
@@ -579,6 +586,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
'size' => (int)$row['size'],
'calendardata' => $this->readBlob($row['calendardata']),
'component' => strtolower($row['componenttype']),
+ 'classification' => (int)$row['classification']
];
}
@@ -618,6 +626,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
'componenttype' => $query->createNamedParameter($extraData['componentType']),
'firstoccurence' => $query->createNamedParameter($extraData['firstOccurence']),
'lastoccurence' => $query->createNamedParameter($extraData['lastOccurence']),
+ 'classification' => $query->createNamedParameter($extraData['classification']),
'uid' => $query->createNamedParameter($extraData['uid']),
])
->execute();
@@ -657,6 +666,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
->set('componenttype', $query->createNamedParameter($extraData['componentType']))
->set('firstoccurence', $query->createNamedParameter($extraData['firstOccurence']))
->set('lastoccurence', $query->createNamedParameter($extraData['lastOccurence']))
+ ->set('classification', $query->createNamedParameter($extraData['classification']))
->set('uid', $query->createNamedParameter($extraData['uid']))
->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId)))
->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri)))
@@ -668,6 +678,23 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
}
/**
+ * @param int $calendarObjectId
+ * @param int $classification
+ */
+ public function setClassification($calendarObjectId, $classification) {
+ if (!in_array($classification, [
+ self::CLASSIFICATION_PUBLIC, self::CLASSIFICATION_PRIVATE, self::CLASSIFICATION_CONFIDENTIAL
+ ])) {
+ throw new \InvalidArgumentException();
+ }
+ $query = $this->db->getQueryBuilder();
+ $query->update('calendarobjects')
+ ->set('classification', $query->createNamedParameter($classification))
+ ->where($query->expr()->eq('id', $query->createNamedParameter($calendarObjectId)))
+ ->execute();
+ }
+
+ /**
* Deletes an existing calendar object.
*
* The object uri is only the basename, or filename and not a full path.
@@ -1086,10 +1113,10 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
* Read the PropPatch documentation for more info and examples.
*
* @param mixed $subscriptionId
- * @param \Sabre\DAV\PropPatch $propPatch
+ * @param PropPatch $propPatch
* @return void
*/
- function updateSubscription($subscriptionId, DAV\PropPatch $propPatch) {
+ function updateSubscription($subscriptionId, PropPatch $propPatch) {
$supportedProperties = array_keys($this->subscriptionPropertyMap);
$supportedProperties[] = '{http://calendarserver.org/ns/}source';
@@ -1280,14 +1307,15 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
* @param string $calendarData
* @return array
*/
- protected function getDenormalizedData($calendarData) {
+ public function getDenormalizedData($calendarData) {
$vObject = Reader::read($calendarData);
$componentType = null;
$component = null;
- $firstOccurence = null;
- $lastOccurence = null;
+ $firstOccurrence = null;
+ $lastOccurrence = null;
$uid = null;
+ $classification = self::CLASSIFICATION_PUBLIC;
foreach($vObject->getComponents() as $component) {
if ($component->name!=='VTIMEZONE') {
$componentType = $component->name;
@@ -1299,27 +1327,27 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
throw new \Sabre\DAV\Exception\BadRequest('Calendar objects must have a VJOURNAL, VEVENT or VTODO component');
}
if ($componentType === 'VEVENT' && $component->DTSTART) {
- $firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp();
+ $firstOccurrence = $component->DTSTART->getDateTime()->getTimeStamp();
// Finding the last occurrence is a bit harder
if (!isset($component->RRULE)) {
if (isset($component->DTEND)) {
- $lastOccurence = $component->DTEND->getDateTime()->getTimeStamp();
+ $lastOccurrence = $component->DTEND->getDateTime()->getTimeStamp();
} elseif (isset($component->DURATION)) {
$endDate = clone $component->DTSTART->getDateTime();
$endDate->add(DateTimeParser::parse($component->DURATION->getValue()));
- $lastOccurence = $endDate->getTimeStamp();
+ $lastOccurrence = $endDate->getTimeStamp();
} elseif (!$component->DTSTART->hasTime()) {
$endDate = clone $component->DTSTART->getDateTime();
$endDate->modify('+1 day');
- $lastOccurence = $endDate->getTimeStamp();
+ $lastOccurrence = $endDate->getTimeStamp();
} else {
- $lastOccurence = $firstOccurence;
+ $lastOccurrence = $firstOccurrence;
}
} else {
- $it = new RecurrenceIterator($vObject, (string)$component->UID);
+ $it = new EventIterator($vObject, (string)$component->UID);
$maxDate = new \DateTime(self::MAX_DATE);
if ($it->isInfinite()) {
- $lastOccurence = $maxDate->getTimeStamp();
+ $lastOccurrence = $maxDate->getTimeStamp();
} else {
$end = $it->getDtEnd();
while($it->valid() && $end < $maxDate) {
@@ -1327,19 +1355,31 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$it->next();
}
- $lastOccurence = $end->getTimeStamp();
+ $lastOccurrence = $end->getTimeStamp();
}
}
}
+ if ($component->CLASS) {
+ $classification = CalDavBackend::CLASSIFICATION_PRIVATE;
+ switch ($component->CLASS->getValue()) {
+ case 'PUBLIC':
+ $classification = CalDavBackend::CLASSIFICATION_PUBLIC;
+ break;
+ case 'CONFIDENTIAL':
+ $classification = CalDavBackend::CLASSIFICATION_CONFIDENTIAL;
+ break;
+ }
+ }
return [
- 'etag' => md5($calendarData),
- 'size' => strlen($calendarData),
- 'componentType' => $componentType,
- 'firstOccurence' => is_null($firstOccurence) ? null : max(0, $firstOccurence),
- 'lastOccurence' => $lastOccurence,
- 'uid' => $uid,
+ 'etag' => md5($calendarData),
+ 'size' => strlen($calendarData),
+ 'componentType' => $componentType,
+ 'firstOccurence' => is_null($firstOccurrence) ? null : max(0, $firstOccurrence),
+ 'lastOccurence' => $lastOccurrence,
+ 'uid' => $uid,
+ 'classification' => $classification
];
}
diff --git a/apps/dav/lib/CalDAV/Calendar.php b/apps/dav/lib/CalDAV/Calendar.php
index 73b3957a9b0..785bb5699e2 100644
--- a/apps/dav/lib/CalDAV/Calendar.php
+++ b/apps/dav/lib/CalDAV/Calendar.php
@@ -26,6 +26,7 @@ use OCA\DAV\DAV\Sharing\IShareable;
use OCP\IL10N;
use Sabre\CalDAV\Backend\BackendInterface;
use Sabre\DAV\Exception\Forbidden;
+use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\PropPatch;
class Calendar extends \Sabre\CalDAV\Calendar implements IShareable {
@@ -162,6 +163,78 @@ class Calendar extends \Sabre\CalDAV\Calendar implements IShareable {
parent::propPatch($propPatch);
}
+ function getChild($name) {
+
+ $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'], $name);
+
+ if (!$obj) {
+ throw new NotFound('Calendar object not found');
+ }
+
+ if ($this->isShared() && $obj['classification'] === CalDavBackend::CLASSIFICATION_PRIVATE) {
+ throw new NotFound('Calendar object not found');
+ }
+
+ $obj['acl'] = $this->getChildACL();
+
+ return new CalendarObject($this->caldavBackend, $this->calendarInfo, $obj);
+
+ }
+
+ function getChildren() {
+
+ $objs = $this->caldavBackend->getCalendarObjects($this->calendarInfo['id']);
+ $children = [];
+ foreach ($objs as $obj) {
+ if ($this->isShared() && $obj['classification'] === CalDavBackend::CLASSIFICATION_PRIVATE) {
+ continue;
+ }
+ $obj['acl'] = $this->getChildACL();
+ $children[] = new CalendarObject($this->caldavBackend, $this->calendarInfo, $obj);
+ }
+ return $children;
+
+ }
+
+ function getMultipleChildren(array $paths) {
+
+ $objs = $this->caldavBackend->getMultipleCalendarObjects($this->calendarInfo['id'], $paths);
+ $children = [];
+ foreach ($objs as $obj) {
+ if ($this->isShared() && $obj['classification'] === CalDavBackend::CLASSIFICATION_PRIVATE) {
+ continue;
+ }
+ $obj['acl'] = $this->getChildACL();
+ $children[] = new CalendarObject($this->caldavBackend, $this->calendarInfo, $obj);
+ }
+ return $children;
+
+ }
+
+ function childExists($name) {
+ $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'], $name);
+ if (!$obj) {
+ return false;
+ }
+ if ($this->isShared() && $obj['classification'] === CalDavBackend::CLASSIFICATION_PRIVATE) {
+ return false;
+ }
+
+ return true;
+ }
+
+ function calendarQuery(array $filters) {
+
+ $uris = $this->caldavBackend->calendarQuery($this->calendarInfo['id'], $filters);
+ if ($this->isShared()) {
+ return array_filter($uris, function ($uri) {
+ return $this->childExists($uri);
+ });
+ }
+
+ return $uris;
+ }
+
private function canWrite() {
if (isset($this->calendarInfo['{http://owncloud.org/ns}read-only'])) {
return !$this->calendarInfo['{http://owncloud.org/ns}read-only'];
@@ -169,4 +242,8 @@ class Calendar extends \Sabre\CalDAV\Calendar implements IShareable {
return true;
}
+ private function isShared() {
+ return isset($this->calendarInfo['{http://owncloud.org/ns}owner-principal']);
+ }
+
}
diff --git a/apps/dav/lib/CalDAV/CalendarObject.php b/apps/dav/lib/CalDAV/CalendarObject.php
new file mode 100644
index 00000000000..b4a58b52093
--- /dev/null
+++ b/apps/dav/lib/CalDAV/CalendarObject.php
@@ -0,0 +1,92 @@
+<?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\CalDAV;
+
+
+use Sabre\VObject\Component;
+use Sabre\VObject\Property;
+use Sabre\VObject\Reader;
+
+class CalendarObject extends \Sabre\CalDAV\CalendarObject {
+
+ /**
+ * @inheritdoc
+ */
+ function get() {
+ $data = parent::get();
+ if ($this->isShared() && $this->objectData['classification'] === CalDavBackend::CLASSIFICATION_CONFIDENTIAL) {
+ return $this->createConfidentialObject($data);
+ }
+ return $data;
+ }
+
+ private function isShared() {
+ return isset($this->calendarInfo['{http://owncloud.org/ns}owner-principal']);
+ }
+
+ /**
+ * @param string $calData
+ * @return string
+ */
+ private static function createConfidentialObject($calData) {
+
+ $vObject = Reader::read($calData);
+
+ /** @var Component $vElement */
+ $vElement = null;
+ if(isset($vObject->VEVENT)) {
+ $vElement = $vObject->VEVENT;
+ }
+ if(isset($vObject->VJOURNAL)) {
+ $vElement = $vObject->VJOURNAL;
+ }
+ if(isset($vObject->VTODO)) {
+ $vElement = $vObject->VTODO;
+ }
+ if(!is_null($vElement)) {
+ foreach ($vElement->children as &$property) {
+ /** @var Property $property */
+ switch($property->name) {
+ case 'CREATED':
+ case 'DTSTART':
+ case 'RRULE':
+ case 'DURATION':
+ case 'DTEND':
+ case 'CLASS':
+ case 'UID':
+ break;
+ case 'SUMMARY':
+ $property->setValue('Busy');
+ break;
+ default:
+ $vElement->__unset($property->name);
+ unset($property);
+ break;
+ }
+ }
+ }
+
+ return $vObject->serialize();
+ }
+
+}
diff --git a/apps/dav/lib/Connector/PublicAuth.php b/apps/dav/lib/Connector/PublicAuth.php
index 2716ca29107..4e63ca1d29e 100644
--- a/apps/dav/lib/Connector/PublicAuth.php
+++ b/apps/dav/lib/Connector/PublicAuth.php
@@ -31,13 +31,14 @@ use OCP\IRequest;
use OCP\ISession;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager;
+use Sabre\DAV\Auth\Backend\AbstractBasic;
/**
* Class PublicAuth
*
* @package OCA\DAV\Connector
*/
-class PublicAuth extends \Sabre\DAV\Auth\Backend\AbstractBasic {
+class PublicAuth extends AbstractBasic {
/** @var \OCP\Share\IShare */
private $share;
@@ -62,6 +63,10 @@ class PublicAuth extends \Sabre\DAV\Auth\Backend\AbstractBasic {
$this->request = $request;
$this->shareManager = $shareManager;
$this->session = $session;
+
+ // setup realm
+ $defaults = new \OC_Defaults();
+ $this->realm = $defaults->getName();
}
/**
@@ -99,7 +104,7 @@ class PublicAuth extends \Sabre\DAV\Auth\Backend\AbstractBasic {
if (in_array('XMLHttpRequest', explode(',', $this->request->getHeader('X-Requested-With')))) {
// do not re-authenticate over ajax, use dummy auth name to prevent browser popup
http_response_code(401);
- header('WWW-Authenticate', 'DummyBasic real="ownCloud"');
+ header('WWW-Authenticate','DummyBasic realm="' . $this->realm . '"');
throw new \Sabre\DAV\Exception\NotAuthenticated('Cannot authenticate over ajax calls');
}
return false;
diff --git a/apps/dav/lib/Connector/Sabre/Auth.php b/apps/dav/lib/Connector/Sabre/Auth.php
index 8b9f86af1e7..653da10bc3c 100644
--- a/apps/dav/lib/Connector/Sabre/Auth.php
+++ b/apps/dav/lib/Connector/Sabre/Auth.php
@@ -31,9 +31,10 @@ namespace OCA\DAV\Connector\Sabre;
use Exception;
use OC\AppFramework\Http\Request;
+use OC\Authentication\TwoFactorAuth\Manager;
+use OC\User\Session;
use OCP\IRequest;
use OCP\ISession;
-use OC\User\Session;
use Sabre\DAV\Auth\Backend\AbstractBasic;
use Sabre\DAV\Exception\NotAuthenticated;
use Sabre\DAV\Exception\ServiceUnavailable;
@@ -41,6 +42,8 @@ use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;
class Auth extends AbstractBasic {
+
+
const DAV_AUTHENTICATED = 'AUTHENTICATED_TO_DAV_BACKEND';
/** @var ISession */
@@ -51,21 +54,30 @@ class Auth extends AbstractBasic {
private $request;
/** @var string */
private $currentUser;
+ /** @var Manager */
+ private $twoFactorManager;
/**
* @param ISession $session
* @param Session $userSession
* @param IRequest $request
+ * @param Manager $twoFactorManager
* @param string $principalPrefix
*/
public function __construct(ISession $session,
Session $userSession,
IRequest $request,
+ Manager $twoFactorManager,
$principalPrefix = 'principals/users/') {
$this->session = $session;
$this->userSession = $userSession;
+ $this->twoFactorManager = $twoFactorManager;
$this->request = $request;
$this->principalPrefix = $principalPrefix;
+
+ // setup realm
+ $defaults = new \OC_Defaults();
+ $this->realm = $defaults->getName();
}
/**
@@ -102,10 +114,10 @@ class Auth extends AbstractBasic {
$this->session->close();
return true;
} else {
- \OC_Util::setUpFS(); //login hooks may need early access to the filesystem
+ \OC_Util::setupFS(); //login hooks may need early access to the filesystem
if($this->userSession->logClientIn($username, $password)) {
$this->userSession->createSessionToken($this->request, $this->userSession->getUser()->getUID(), $username, $password);
- \OC_Util::setUpFS($this->userSession->getUser()->getUID());
+ \OC_Util::setupFS($this->userSession->getUser()->getUID());
$this->session->set(self::DAV_AUTHENTICATED, $this->userSession->getUser()->getUID());
$this->session->close();
return true;
@@ -197,6 +209,9 @@ class Auth extends AbstractBasic {
if($forcedLogout) {
$this->userSession->logout();
} else {
+ if ($this->twoFactorManager->needsSecondFactor()) {
+ throw new \Sabre\DAV\Exception\NotAuthenticated('2FA challenge not passed.');
+ }
if (\OC_User::handleApacheAuth() ||
//Fix for broken webdav clients
($this->userSession->isLoggedIn() && is_null($this->session->get(self::DAV_AUTHENTICATED))) ||
diff --git a/apps/dav/lib/Connector/Sabre/Directory.php b/apps/dav/lib/Connector/Sabre/Directory.php
index e7226b58196..ddab34605f3 100644
--- a/apps/dav/lib/Connector/Sabre/Directory.php
+++ b/apps/dav/lib/Connector/Sabre/Directory.php
@@ -196,6 +196,8 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node
throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage());
} catch (\OCP\Files\InvalidPathException $ex) {
throw new InvalidPath($ex->getMessage());
+ } catch (ForbiddenException $e) {
+ throw new \Sabre\DAV\Exception\Forbidden();
}
}
diff --git a/apps/dav/lib/Connector/Sabre/FilesPlugin.php b/apps/dav/lib/Connector/Sabre/FilesPlugin.php
index a4e13709559..0a2e6713cb4 100644
--- a/apps/dav/lib/Connector/Sabre/FilesPlugin.php
+++ b/apps/dav/lib/Connector/Sabre/FilesPlugin.php
@@ -42,6 +42,7 @@ use \Sabre\HTTP\RequestInterface;
use \Sabre\HTTP\ResponseInterface;
use OCP\Files\StorageNotAvailableException;
use OCP\IConfig;
+use OCP\IRequest;
class FilesPlugin extends ServerPlugin {
@@ -96,19 +97,28 @@ class FilesPlugin extends ServerPlugin {
private $config;
/**
+ * @var IRequest
+ */
+ private $request;
+
+ /**
* @param Tree $tree
* @param View $view
+ * @param IConfig $config
+ * @param IRequest $request
* @param bool $isPublic
* @param bool $downloadAttachment
*/
public function __construct(Tree $tree,
View $view,
IConfig $config,
+ IRequest $request,
$isPublic = false,
$downloadAttachment = true) {
$this->tree = $tree;
$this->fileView = $view;
$this->config = $config;
+ $this->request = $request;
$this->isPublic = $isPublic;
$this->downloadAttachment = $downloadAttachment;
}
@@ -168,20 +178,19 @@ class FilesPlugin extends ServerPlugin {
*/
function checkMove($source, $destination) {
$sourceNode = $this->tree->getNodeForPath($source);
- if ($sourceNode instanceof FutureFile) {
+ if (!$sourceNode instanceof Node) {
return;
}
list($sourceDir,) = \Sabre\HTTP\URLUtil::splitPath($source);
list($destinationDir,) = \Sabre\HTTP\URLUtil::splitPath($destination);
if ($sourceDir !== $destinationDir) {
- $sourceFileInfo = $this->fileView->getFileInfo($source);
-
- if ($sourceFileInfo === false) {
+ $sourceNodeFileInfo = $sourceNode->getFileInfo();
+ if (is_null($sourceNodeFileInfo)) {
throw new NotFound($source . ' does not exist');
}
- if (!$sourceFileInfo->isDeletable()) {
+ if (!$sourceNodeFileInfo->isDeletable()) {
throw new Forbidden($source . " cannot be deleted");
}
}
@@ -226,7 +235,18 @@ class FilesPlugin extends ServerPlugin {
// adds a 'Content-Disposition: attachment' header
if ($this->downloadAttachment) {
- $response->addHeader('Content-Disposition', 'attachment');
+ $filename = $node->getName();
+ if ($this->request->isUserAgent(
+ [
+ \OC\AppFramework\Http\Request::USER_AGENT_IE,
+ \OC\AppFramework\Http\Request::USER_AGENT_ANDROID_MOBILE_CHROME,
+ \OC\AppFramework\Http\Request::USER_AGENT_FREEBOX,
+ ])) {
+ $response->addHeader('Content-Disposition', 'attachment; filename="' . rawurlencode($filename) . '"');
+ } else {
+ $response->addHeader('Content-Disposition', 'attachment; filename*=UTF-8\'\'' . rawurlencode($filename)
+ . '; filename="' . rawurlencode($filename) . '"');
+ }
}
if ($node instanceof \OCA\DAV\Connector\Sabre\File) {
diff --git a/apps/dav/lib/Connector/Sabre/Node.php b/apps/dav/lib/Connector/Sabre/Node.php
index 04640bbde4f..c41b5137fde 100644
--- a/apps/dav/lib/Connector/Sabre/Node.php
+++ b/apps/dav/lib/Connector/Sabre/Node.php
@@ -347,4 +347,8 @@ abstract class Node implements \Sabre\DAV\INode {
public function changeLock($type) {
$this->fileView->changeLock($this->path, $type);
}
+
+ public function getFileInfo() {
+ return $this->info;
+ }
}
diff --git a/apps/dav/lib/Connector/Sabre/ObjectTree.php b/apps/dav/lib/Connector/Sabre/ObjectTree.php
index 599f3fdfd0e..9e7d876187d 100644
--- a/apps/dav/lib/Connector/Sabre/ObjectTree.php
+++ b/apps/dav/lib/Connector/Sabre/ObjectTree.php
@@ -161,6 +161,8 @@ class ObjectTree extends \Sabre\DAV\Tree {
throw new \Sabre\DAV\Exception\NotFound('Storage ' . $path . ' is invalid');
} catch (LockedException $e) {
throw new \Sabre\DAV\Exception\Locked();
+ } catch (ForbiddenException $e) {
+ throw new \Sabre\DAV\Exception\Forbidden();
}
}
diff --git a/apps/dav/lib/Connector/Sabre/ServerFactory.php b/apps/dav/lib/Connector/Sabre/ServerFactory.php
index b193bfc76c7..c5b4f6a9352 100644
--- a/apps/dav/lib/Connector/Sabre/ServerFactory.php
+++ b/apps/dav/lib/Connector/Sabre/ServerFactory.php
@@ -100,10 +100,9 @@ class ServerFactory {
$server->setBaseUri($baseUri);
// Load plugins
- $defaults = new \OC_Defaults();
$server->addPlugin(new \OCA\DAV\Connector\Sabre\MaintenancePlugin($this->config));
$server->addPlugin(new \OCA\DAV\Connector\Sabre\BlockLegacyClientPlugin($this->config));
- $server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, $defaults->getName()));
+ $server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend));
// FIXME: The following line is a workaround for legacy components relying on being able to send a GET to /
$server->addPlugin(new \OCA\DAV\Connector\Sabre\DummyGetResponsePlugin());
$server->addPlugin(new \OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin('webdav', $this->logger));
@@ -144,6 +143,7 @@ class ServerFactory {
$objectTree,
$view,
$this->config,
+ $this->request,
false,
!$this->config->getSystemValue('debug', false)
)
diff --git a/apps/dav/lib/Migration/Classification.php b/apps/dav/lib/Migration/Classification.php
new file mode 100644
index 00000000000..b793f790af5
--- /dev/null
+++ b/apps/dav/lib/Migration/Classification.php
@@ -0,0 +1,93 @@
+<?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\Migration;
+
+use OCA\DAV\CalDAV\CalDavBackend;
+use OCP\IUser;
+use OCP\IUserManager;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
+
+class Classification implements IRepairStep {
+
+ /** @var CalDavBackend */
+ private $calDavBackend;
+
+ /** @var IUserManager */
+ private $userManager;
+
+ /**
+ * Classification constructor.
+ *
+ * @param CalDavBackend $calDavBackend
+ */
+ public function __construct(CalDavBackend $calDavBackend, IUserManager $userManager) {
+ $this->calDavBackend = $calDavBackend;
+ $this->userManager = $userManager;
+ }
+
+ /**
+ * @param IUser $user
+ */
+ public function runForUser($user) {
+ $principal = 'principals/users/' . $user->getUID();
+ $calendars = $this->calDavBackend->getCalendarsForUser($principal);
+ foreach ($calendars as $calendar) {
+ $objects = $this->calDavBackend->getCalendarObjects($calendar['id']);
+ foreach ($objects as $object) {
+ $calObject = $this->calDavBackend->getCalendarObject($calendar['id'], $object['uri']);
+ $classification = $this->extractClassification($calObject['calendardata']);
+ $this->calDavBackend->setClassification($object['id'], $classification);
+ }
+ }
+ }
+
+ /**
+ * @param $calendarData
+ * @return integer
+ * @throws \Sabre\DAV\Exception\BadRequest
+ */
+ protected function extractClassification($calendarData) {
+ return $this->calDavBackend->getDenormalizedData($calendarData)['classification'];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getName() {
+ return 'Fix classification for calendar objects';
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function run(IOutput $output) {
+ $output->startProgress();
+ $this->userManager->callForAllUsers(function($user) use ($output) {
+ /** @var IUser $user */
+ $output->advance(1, $user->getDisplayName());
+ $this->runForUser($user);
+ });
+ $output->finishProgress();
+ }
+}
diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php
index 2a9c36698b1..e150f441b82 100644
--- a/apps/dav/lib/Server.php
+++ b/apps/dav/lib/Server.php
@@ -25,7 +25,6 @@
namespace OCA\DAV;
use OCA\DAV\CalDAV\Schedule\IMipPlugin;
-use OCA\DAV\Connector\FedAuth;
use OCA\DAV\Connector\Sabre\Auth;
use OCA\DAV\Connector\Sabre\BlockLegacyClientPlugin;
use OCA\DAV\Connector\Sabre\DavAclPlugin;
@@ -57,7 +56,8 @@ class Server {
$authBackend = new Auth(
\OC::$server->getSession(),
\OC::$server->getUserSession(),
- \OC::$server->getRequest()
+ \OC::$server->getRequest(),
+ \OC::$server->getTwoFactorAuthManager()
);
// Set URL explicitly due to reverse-proxy situations
@@ -141,6 +141,7 @@ class Server {
$this->server->tree,
$view,
\OC::$server->getConfig(),
+ $this->request,
false,
!\OC::$server->getConfig()->getSystemValue('debug', false)
)
diff --git a/apps/dav/tests/unit/CalDAV/AbstractCalDavBackendTest.php b/apps/dav/tests/unit/CalDAV/AbstractCalDavBackendTest.php
new file mode 100644
index 00000000000..49e5e5a2bcc
--- /dev/null
+++ b/apps/dav/tests/unit/CalDAV/AbstractCalDavBackendTest.php
@@ -0,0 +1,163 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\DAV\Tests\unit\CalDAV;
+
+use DateTime;
+use DateTimeZone;
+use OCA\DAV\CalDAV\CalDavBackend;
+use OCA\DAV\CalDAV\Calendar;
+use OCA\DAV\Connector\Sabre\Principal;
+use OCP\IL10N;
+use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet;
+use Sabre\DAV\PropPatch;
+use Sabre\DAV\Xml\Property\Href;
+use Sabre\DAVACL\IACL;
+use Test\TestCase;
+
+/**
+ * Class CalDavBackendTest
+ *
+ * @group DB
+ *
+ * @package OCA\DAV\Tests\unit\CalDAV
+ */
+abstract class AbstractCalDavBackendTest extends TestCase {
+
+ /** @var CalDavBackend */
+ protected $backend;
+
+ /** @var Principal | \PHPUnit_Framework_MockObject_MockObject */
+ protected $principal;
+
+ const UNIT_TEST_USER = 'principals/users/caldav-unit-test';
+ const UNIT_TEST_USER1 = 'principals/users/caldav-unit-test1';
+ const UNIT_TEST_GROUP = 'principals/groups/caldav-unit-test-group';
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->principal = $this->getMockBuilder('OCA\DAV\Connector\Sabre\Principal')
+ ->disableOriginalConstructor()
+ ->setMethods(['getPrincipalByPath', 'getGroupMembership'])
+ ->getMock();
+ $this->principal->expects($this->any())->method('getPrincipalByPath')
+ ->willReturn([
+ 'uri' => 'principals/best-friend'
+ ]);
+ $this->principal->expects($this->any())->method('getGroupMembership')
+ ->withAnyParameters()
+ ->willReturn([self::UNIT_TEST_GROUP]);
+
+ $db = \OC::$server->getDatabaseConnection();
+ $this->backend = new CalDavBackend($db, $this->principal);
+
+ $this->tearDown();
+ }
+
+ public function tearDown() {
+ parent::tearDown();
+
+ if (is_null($this->backend)) {
+ return;
+ }
+ $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
+ foreach ($books as $book) {
+ $this->backend->deleteCalendar($book['id']);
+ }
+ $subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER);
+ foreach ($subscriptions as $subscription) {
+ $this->backend->deleteSubscription($subscription['id']);
+ }
+ }
+
+ protected function createTestCalendar() {
+ $this->backend->createCalendar(self::UNIT_TEST_USER, 'Example', [
+ '{http://apple.com/ns/ical/}calendar-color' => '#1C4587FF'
+ ]);
+ $calendars = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
+ $this->assertEquals(1, count($calendars));
+ $this->assertEquals(self::UNIT_TEST_USER, $calendars[0]['principaluri']);
+ /** @var SupportedCalendarComponentSet $components */
+ $components = $calendars[0]['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'];
+ $this->assertEquals(['VEVENT','VTODO'], $components->getValue());
+ $color = $calendars[0]['{http://apple.com/ns/ical/}calendar-color'];
+ $this->assertEquals('#1C4587FF', $color);
+ $this->assertEquals('Example', $calendars[0]['uri']);
+ $this->assertEquals('Example', $calendars[0]['{DAV:}displayname']);
+ $calendarId = $calendars[0]['id'];
+
+ return $calendarId;
+ }
+
+ protected function createEvent($calendarId, $start = '20130912T130000Z', $end = '20130912T140000Z') {
+
+ $calData = <<<EOD
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:ownCloud Calendar
+BEGIN:VEVENT
+CREATED;VALUE=DATE-TIME:20130910T125139Z
+UID:47d15e3ec8
+LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z
+DTSTAMP;VALUE=DATE-TIME:20130910T125139Z
+SUMMARY:Test Event
+DTSTART;VALUE=DATE-TIME:$start
+DTEND;VALUE=DATE-TIME:$end
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR
+EOD;
+ $uri0 = $this->getUniqueID('event');
+ $this->backend->createCalendarObject($calendarId, $uri0, $calData);
+
+ return $uri0;
+ }
+
+ protected function assertAcl($principal, $privilege, $acl) {
+ foreach($acl as $a) {
+ if ($a['principal'] === $principal && $a['privilege'] === $privilege) {
+ $this->assertTrue(true);
+ return;
+ }
+ }
+ $this->fail("ACL does not contain $principal / $privilege");
+ }
+
+ protected function assertNotAcl($principal, $privilege, $acl) {
+ foreach($acl as $a) {
+ if ($a['principal'] === $principal && $a['privilege'] === $privilege) {
+ $this->fail("ACL contains $principal / $privilege");
+ return;
+ }
+ }
+ $this->assertTrue(true);
+ }
+
+ protected function assertAccess($shouldHaveAcl, $principal, $privilege, $acl) {
+ if ($shouldHaveAcl) {
+ $this->assertAcl($principal, $privilege, $acl);
+ } else {
+ $this->assertNotAcl($principal, $privilege, $acl);
+ }
+ }
+}
diff --git a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php
index c3e32e436d9..977bdf15c8e 100644
--- a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php
+++ b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php
@@ -26,13 +26,10 @@ use DateTime;
use DateTimeZone;
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CalDAV\Calendar;
-use OCA\DAV\Connector\Sabre\Principal;
use OCP\IL10N;
-use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet;
use Sabre\DAV\PropPatch;
use Sabre\DAV\Xml\Property\Href;
use Sabre\DAVACL\IACL;
-use Test\TestCase;
/**
* Class CalDavBackendTest
@@ -41,54 +38,7 @@ use Test\TestCase;
*
* @package OCA\DAV\Tests\unit\CalDAV
*/
-class CalDavBackendTest extends TestCase {
-
- /** @var CalDavBackend */
- private $backend;
-
- /** @var Principal | \PHPUnit_Framework_MockObject_MockObject */
- private $principal;
-
- const UNIT_TEST_USER = 'principals/users/caldav-unit-test';
- const UNIT_TEST_USER1 = 'principals/users/caldav-unit-test1';
- const UNIT_TEST_GROUP = 'principals/groups/caldav-unit-test-group';
-
- public function setUp() {
- parent::setUp();
-
- $this->principal = $this->getMockBuilder('OCA\DAV\Connector\Sabre\Principal')
- ->disableOriginalConstructor()
- ->setMethods(['getPrincipalByPath', 'getGroupMembership'])
- ->getMock();
- $this->principal->expects($this->any())->method('getPrincipalByPath')
- ->willReturn([
- 'uri' => 'principals/best-friend'
- ]);
- $this->principal->expects($this->any())->method('getGroupMembership')
- ->withAnyParameters()
- ->willReturn([self::UNIT_TEST_GROUP]);
-
- $db = \OC::$server->getDatabaseConnection();
- $this->backend = new CalDavBackend($db, $this->principal);
-
- $this->tearDown();
- }
-
- public function tearDown() {
- parent::tearDown();
-
- if (is_null($this->backend)) {
- return;
- }
- $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
- foreach ($books as $book) {
- $this->backend->deleteCalendar($book['id']);
- }
- $subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER);
- foreach ($subscriptions as $subscription) {
- $this->backend->deleteSubscription($subscription['id']);
- }
- }
+class CalDavBackendTest extends AbstractCalDavBackendTest {
public function testCalendarOperations() {
@@ -232,6 +182,7 @@ EOD;
$calendarObjects = $this->backend->getCalendarObjects($calendarId);
$this->assertEquals(1, count($calendarObjects));
$this->assertEquals($calendarId, $calendarObjects[0]['calendarid']);
+ $this->assertArrayHasKey('classification', $calendarObjects[0]);
// get the cards
$calendarObject = $this->backend->getCalendarObject($calendarId, $uri);
@@ -241,6 +192,7 @@ EOD;
$this->assertArrayHasKey('lastmodified', $calendarObject);
$this->assertArrayHasKey('etag', $calendarObject);
$this->assertArrayHasKey('size', $calendarObject);
+ $this->assertArrayHasKey('classification', $calendarObject);
$this->assertEquals($calData, $calendarObject['calendardata']);
// update the card
@@ -310,6 +262,7 @@ EOD;
$this->assertArrayHasKey('lastmodified', $card);
$this->assertArrayHasKey('etag', $card);
$this->assertArrayHasKey('size', $card);
+ $this->assertArrayHasKey('classification', $card);
$this->assertEquals($calData, $card['calendardata']);
}
@@ -363,49 +316,6 @@ EOD;
];
}
- private function createTestCalendar() {
- $this->backend->createCalendar(self::UNIT_TEST_USER, 'Example', [
- '{http://apple.com/ns/ical/}calendar-color' => '#1C4587FF'
- ]);
- $calendars = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
- $this->assertEquals(1, count($calendars));
- $this->assertEquals(self::UNIT_TEST_USER, $calendars[0]['principaluri']);
- /** @var SupportedCalendarComponentSet $components */
- $components = $calendars[0]['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'];
- $this->assertEquals(['VEVENT','VTODO'], $components->getValue());
- $color = $calendars[0]['{http://apple.com/ns/ical/}calendar-color'];
- $this->assertEquals('#1C4587FF', $color);
- $this->assertEquals('Example', $calendars[0]['uri']);
- $this->assertEquals('Example', $calendars[0]['{DAV:}displayname']);
- $calendarId = $calendars[0]['id'];
-
- return $calendarId;
- }
-
- private function createEvent($calendarId, $start = '20130912T130000Z', $end = '20130912T140000Z') {
-
- $calData = <<<EOD
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:ownCloud Calendar
-BEGIN:VEVENT
-CREATED;VALUE=DATE-TIME:20130910T125139Z
-UID:47d15e3ec8
-LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z
-DTSTAMP;VALUE=DATE-TIME:20130910T125139Z
-SUMMARY:Test Event
-DTSTART;VALUE=DATE-TIME:$start
-DTEND;VALUE=DATE-TIME:$end
-CLASS:PUBLIC
-END:VEVENT
-END:VCALENDAR
-EOD;
- $uri0 = $this->getUniqueID('event');
- $this->backend->createCalendarObject($calendarId, $uri0, $calData);
-
- return $uri0;
- }
-
public function testSyncSupport() {
$calendarId = $this->createTestCalendar();
@@ -464,43 +374,20 @@ EOD;
/**
* @dataProvider providesCalDataForGetDenormalizedData
*/
- public function testGetDenormalizedData($expectedFirstOccurance, $calData) {
- $actual = $this->invokePrivate($this->backend, 'getDenormalizedData', [$calData]);
- $this->assertEquals($expectedFirstOccurance, $actual['firstOccurence']);
+ public function testGetDenormalizedData($expected, $key, $calData) {
+ $actual = $this->backend->getDenormalizedData($calData);
+ $this->assertEquals($expected, $actual[$key]);
}
public function providesCalDataForGetDenormalizedData() {
return [
- [0, "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:413F269B-B51B-46B1-AFB6-40055C53A4DC\r\nDTSTAMP:20160309T095056Z\r\nDTSTART;VALUE=DATE:16040222\r\nDTEND;VALUE=DATE:16040223\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:SUMMARY\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"],
- [null, "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:413F269B-B51B-46B1-AFB6-40055C53A4DC\r\nDTSTAMP:20160309T095056Z\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:SUMMARY\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"]
+ 'first occurrence before unix epoch starts' => [0, 'firstOccurence', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:413F269B-B51B-46B1-AFB6-40055C53A4DC\r\nDTSTAMP:20160309T095056Z\r\nDTSTART;VALUE=DATE:16040222\r\nDTEND;VALUE=DATE:16040223\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:SUMMARY\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"],
+ 'no first occurrence because yearly' => [null, 'firstOccurence', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:413F269B-B51B-46B1-AFB6-40055C53A4DC\r\nDTSTAMP:20160309T095056Z\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:SUMMARY\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"],
+ 'CLASS:PRIVATE' => [CalDavBackend::CLASSIFICATION_PRIVATE, 'classification', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//dmfs.org//mimedir.icalendar//EN\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Berlin\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTART;TZID=Europe/Berlin:20160419T130000\r\nSUMMARY:Test\r\nCLASS:PRIVATE\r\nTRANSP:OPAQUE\r\nSTATUS:CONFIRMED\r\nDTEND;TZID=Europe/Berlin:20160419T140000\r\nLAST-MODIFIED:20160419T074202Z\r\nDTSTAMP:20160419T074202Z\r\nCREATED:20160419T074202Z\r\nUID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310\r\nEND:VEVENT\r\nEND:VCALENDAR"],
+ 'CLASS:PUBLIC' => [CalDavBackend::CLASSIFICATION_PUBLIC, 'classification', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//dmfs.org//mimedir.icalendar//EN\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Berlin\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTART;TZID=Europe/Berlin:20160419T130000\r\nSUMMARY:Test\r\nCLASS:PUBLIC\r\nTRANSP:OPAQUE\r\nSTATUS:CONFIRMED\r\nDTEND;TZID=Europe/Berlin:20160419T140000\r\nLAST-MODIFIED:20160419T074202Z\r\nDTSTAMP:20160419T074202Z\r\nCREATED:20160419T074202Z\r\nUID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310\r\nEND:VEVENT\r\nEND:VCALENDAR"],
+ 'CLASS:CONFIDENTIAL' => [CalDavBackend::CLASSIFICATION_CONFIDENTIAL, 'classification', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//dmfs.org//mimedir.icalendar//EN\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Berlin\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTART;TZID=Europe/Berlin:20160419T130000\r\nSUMMARY:Test\r\nCLASS:CONFIDENTIAL\r\nTRANSP:OPAQUE\r\nSTATUS:CONFIRMED\r\nDTEND;TZID=Europe/Berlin:20160419T140000\r\nLAST-MODIFIED:20160419T074202Z\r\nDTSTAMP:20160419T074202Z\r\nCREATED:20160419T074202Z\r\nUID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310\r\nEND:VEVENT\r\nEND:VCALENDAR"],
+ 'no class set -> public' => [CalDavBackend::CLASSIFICATION_PUBLIC, 'classification', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//dmfs.org//mimedir.icalendar//EN\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Berlin\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTART;TZID=Europe/Berlin:20160419T130000\r\nSUMMARY:Test\r\nTRANSP:OPAQUE\r\nDTEND;TZID=Europe/Berlin:20160419T140000\r\nLAST-MODIFIED:20160419T074202Z\r\nDTSTAMP:20160419T074202Z\r\nCREATED:20160419T074202Z\r\nUID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310\r\nEND:VEVENT\r\nEND:VCALENDAR"],
+ 'unknown class -> private' => [CalDavBackend::CLASSIFICATION_PRIVATE, 'classification', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//dmfs.org//mimedir.icalendar//EN\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Berlin\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTART;TZID=Europe/Berlin:20160419T130000\r\nSUMMARY:Test\r\nCLASS:VERTRAULICH\r\nTRANSP:OPAQUE\r\nSTATUS:CONFIRMED\r\nDTEND;TZID=Europe/Berlin:20160419T140000\r\nLAST-MODIFIED:20160419T074202Z\r\nDTSTAMP:20160419T074202Z\r\nCREATED:20160419T074202Z\r\nUID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310\r\nEND:VEVENT\r\nEND:VCALENDAR"],
];
}
-
- private function assertAcl($principal, $privilege, $acl) {
- foreach($acl as $a) {
- if ($a['principal'] === $principal && $a['privilege'] === $privilege) {
- $this->assertTrue(true);
- return;
- }
- }
- $this->fail("ACL does not contain $principal / $privilege");
- }
-
- private function assertNotAcl($principal, $privilege, $acl) {
- foreach($acl as $a) {
- if ($a['principal'] === $principal && $a['privilege'] === $privilege) {
- $this->fail("ACL contains $principal / $privilege");
- return;
- }
- }
- $this->assertTrue(true);
- }
-
- private function assertAccess($shouldHaveAcl, $principal, $privilege, $acl) {
- if ($shouldHaveAcl) {
- $this->assertAcl($principal, $privilege, $acl);
- } else {
- $this->assertNotAcl($principal, $privilege, $acl);
- }
- }
}
diff --git a/apps/dav/tests/unit/CalDAV/CalendarTest.php b/apps/dav/tests/unit/CalDAV/CalendarTest.php
index 73d85e82bbc..56a2d4fcba7 100644
--- a/apps/dav/tests/unit/CalDAV/CalendarTest.php
+++ b/apps/dav/tests/unit/CalDAV/CalendarTest.php
@@ -27,6 +27,7 @@ use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CalDAV\Calendar;
use OCP\IL10N;
use Sabre\DAV\PropPatch;
+use Sabre\VObject\Reader;
use Test\TestCase;
class CalendarTest extends TestCase {
@@ -189,4 +190,153 @@ class CalendarTest extends TestCase {
'birthday calendar' => [false, false, false, BirthdayService::BIRTHDAY_CALENDAR_URI]
];
}
+
+ /**
+ * @dataProvider providesConfidentialClassificationData
+ * @param $expectedChildren
+ * @param $isShared
+ */
+ public function testPrivateClassification($expectedChildren, $isShared) {
+
+ $calObject0 = ['uri' => 'event-0', 'classification' => CalDavBackend::CLASSIFICATION_PUBLIC];
+ $calObject1 = ['uri' => 'event-1', 'classification' => CalDavBackend::CLASSIFICATION_CONFIDENTIAL];
+ $calObject2 = ['uri' => 'event-2', 'classification' => CalDavBackend::CLASSIFICATION_PRIVATE];
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | CalDavBackend $backend */
+ $backend = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')->disableOriginalConstructor()->getMock();
+ $backend->expects($this->any())->method('getCalendarObjects')->willReturn([
+ $calObject0, $calObject1, $calObject2
+ ]);
+ $backend->expects($this->any())->method('getMultipleCalendarObjects')
+ ->with(666, ['event-0', 'event-1', 'event-2'])
+ ->willReturn([
+ $calObject0, $calObject1, $calObject2
+ ]);
+ $backend->expects($this->any())->method('getCalendarObject')
+ ->willReturn($calObject2)->with(666, 'event-2');
+
+ $calendarInfo = [
+ 'principaluri' => 'user2',
+ 'id' => 666,
+ 'uri' => 'cal',
+ ];
+
+ if ($isShared) {
+ $calendarInfo['{http://owncloud.org/ns}owner-principal'] = 'user1';
+
+ }
+ $c = new Calendar($backend, $calendarInfo, $this->l10n);
+ $children = $c->getChildren();
+ $this->assertEquals($expectedChildren, count($children));
+ $children = $c->getMultipleChildren(['event-0', 'event-1', 'event-2']);
+ $this->assertEquals($expectedChildren, count($children));
+
+ $this->assertEquals(!$isShared, $c->childExists('event-2'));
+ }
+
+ /**
+ * @dataProvider providesConfidentialClassificationData
+ * @param $expectedChildren
+ * @param $isShared
+ */
+ public function testConfidentialClassification($expectedChildren, $isShared) {
+ $start = '20160609';
+ $end = '20160610';
+
+ $calData = <<<EOD
+BEGIN:VCALENDAR
+PRODID:-//ownCloud calendar v1.2.2
+BEGIN:VEVENT
+CREATED:20160602T133732
+DTSTAMP:20160602T133732
+LAST-MODIFIED:20160602T133732
+UID:wej2z68l9h
+SUMMARY:Test Event
+LOCATION:Somewhere ...
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;CUTYPE=INDIVIDUAL;CN=de
+ epdiver:MAILTO:thomas.mueller@tmit.eu
+ORGANIZER;CN=deepdiver:MAILTO:thomas.mueller@tmit.eu
+DESCRIPTION:maybe ....
+DTSTART;TZID=Europe/Berlin;VALUE=DATE:$start
+DTEND;TZID=Europe/Berlin;VALUE=DATE:$end
+RRULE:FREQ=DAILY
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER:-PT15M
+END:VALARM
+END:VEVENT
+BEGIN:VTIMEZONE
+TZID:Europe/Berlin
+BEGIN:DAYLIGHT
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+TZNAME:MESZ
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+TZNAME:MEZ
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
+EOD;
+
+ $calObject0 = ['uri' => 'event-0', 'classification' => CalDavBackend::CLASSIFICATION_PUBLIC];
+ $calObject1 = ['uri' => 'event-1', 'classification' => CalDavBackend::CLASSIFICATION_CONFIDENTIAL, 'calendardata' => $calData];
+ $calObject2 = ['uri' => 'event-2', 'classification' => CalDavBackend::CLASSIFICATION_PRIVATE];
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | CalDavBackend $backend */
+ $backend = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')->disableOriginalConstructor()->getMock();
+ $backend->expects($this->any())->method('getCalendarObjects')->willReturn([
+ $calObject0, $calObject1, $calObject2
+ ]);
+ $backend->expects($this->any())->method('getMultipleCalendarObjects')
+ ->with(666, ['event-0', 'event-1', 'event-2'])
+ ->willReturn([
+ $calObject0, $calObject1, $calObject2
+ ]);
+ $backend->expects($this->any())->method('getCalendarObject')
+ ->willReturn($calObject1)->with(666, 'event-1');
+
+ $calendarInfo = [
+ 'principaluri' => 'user2',
+ 'id' => 666,
+ 'uri' => 'cal',
+ ];
+
+ if ($isShared) {
+ $calendarInfo['{http://owncloud.org/ns}owner-principal'] = 'user1';
+
+ }
+ $c = new Calendar($backend, $calendarInfo, $this->l10n);
+
+ // test private event
+ $privateEvent = $c->getChild('event-1');
+ $calData = $privateEvent->get();
+ $event = Reader::read($calData);
+
+ $this->assertEquals($start, $event->VEVENT->DTSTART->getValue());
+ $this->assertEquals($end, $event->VEVENT->DTEND->getValue());
+
+ if ($isShared) {
+ $this->assertEquals('Busy', $event->VEVENT->SUMMARY->getValue());
+ $this->assertArrayNotHasKey('ATTENDEE', $event->VEVENT);
+ $this->assertArrayNotHasKey('LOCATION', $event->VEVENT);
+ $this->assertArrayNotHasKey('DESCRIPTION', $event->VEVENT);
+ $this->assertArrayNotHasKey('ORGANIZER', $event->VEVENT);
+ } else {
+ $this->assertEquals('Test Event', $event->VEVENT->SUMMARY->getValue());
+ }
+ }
+
+ public function providesConfidentialClassificationData() {
+ return [
+ [3, false],
+ [2, true]
+ ];
+ }
}
diff --git a/apps/dav/tests/unit/Connector/Sabre/AuthTest.php b/apps/dav/tests/unit/Connector/Sabre/AuthTest.php
index e5b5fe21b1f..b3ab49a027e 100644
--- a/apps/dav/tests/unit/Connector/Sabre/AuthTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/AuthTest.php
@@ -27,11 +27,12 @@
namespace OCA\DAV\Tests\unit\Connector\Sabre;
+use OC\Authentication\TwoFactorAuth\Manager;
+use OC\User\Session;
use OCP\IRequest;
+use OCP\ISession;
use OCP\IUser;
use Test\TestCase;
-use OCP\ISession;
-use OC\User\Session;
/**
* Class AuthTest
@@ -48,6 +49,8 @@ class AuthTest extends TestCase {
private $userSession;
/** @var IRequest */
private $request;
+ /** @var Manager */
+ private $twoFactorManager;
public function setUp() {
parent::setUp();
@@ -57,10 +60,14 @@ class AuthTest extends TestCase {
->disableOriginalConstructor()->getMock();
$this->request = $this->getMockBuilder('\OCP\IRequest')
->disableOriginalConstructor()->getMock();
+ $this->twoFactorManager = $this->getMockBuilder('\OC\Authentication\TwoFactorAuth\Manager')
+ ->disableOriginalConstructor()
+ ->getMock();
$this->auth = new \OCA\DAV\Connector\Sabre\Auth(
$this->session,
$this->userSession,
- $this->request
+ $this->request,
+ $this->twoFactorManager
);
}
@@ -297,6 +304,59 @@ class AuthTest extends TestCase {
/**
* @expectedException \Sabre\DAV\Exception\NotAuthenticated
+ * @expectedExceptionMessage 2FA challenge not passed.
+ */
+ public function testAuthenticateAlreadyLoggedInWithoutTwoFactorChallengePassed() {
+ $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('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(true);
+ $this->twoFactorManager->expects($this->once())
+ ->method('needsSecondFactor')
+ ->will($this->returnValue(true));
+ $this->auth->check($request, $response);
+ }
+
+ /**
+ * @expectedException \Sabre\DAV\Exception\NotAuthenticated
* @expectedExceptionMessage CSRF check not passed.
*/
public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenAndIncorrectlyDavAuthenticated() {
diff --git a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php
index 87fec17bf6b..2b3f3e15d1a 100644
--- a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php
@@ -24,6 +24,7 @@
*/
namespace OCA\DAV\Tests\unit\Connector\Sabre;
+use OCA\DAV\Connector\Sabre\FilesPlugin;
use OCP\Files\StorageNotAvailableException;
use Sabre\DAV\PropFind;
use Sabre\DAV\PropPatch;
@@ -36,16 +37,16 @@ use Test\TestCase;
* See the COPYING-README file.
*/
class FilesPluginTest extends TestCase {
- const GETETAG_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::GETETAG_PROPERTYNAME;
- const FILEID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::FILEID_PROPERTYNAME;
- const INTERNAL_FILEID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::INTERNAL_FILEID_PROPERTYNAME;
- const SIZE_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::SIZE_PROPERTYNAME;
- const PERMISSIONS_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::PERMISSIONS_PROPERTYNAME;
- const LASTMODIFIED_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::LASTMODIFIED_PROPERTYNAME;
- const DOWNLOADURL_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::DOWNLOADURL_PROPERTYNAME;
- const OWNER_ID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_ID_PROPERTYNAME;
- const OWNER_DISPLAY_NAME_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME;
- const DATA_FINGERPRINT_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::DATA_FINGERPRINT_PROPERTYNAME;
+ const GETETAG_PROPERTYNAME = FilesPlugin::GETETAG_PROPERTYNAME;
+ const FILEID_PROPERTYNAME = FilesPlugin::FILEID_PROPERTYNAME;
+ const INTERNAL_FILEID_PROPERTYNAME = FilesPlugin::INTERNAL_FILEID_PROPERTYNAME;
+ const SIZE_PROPERTYNAME = FilesPlugin::SIZE_PROPERTYNAME;
+ const PERMISSIONS_PROPERTYNAME = FilesPlugin::PERMISSIONS_PROPERTYNAME;
+ const LASTMODIFIED_PROPERTYNAME = FilesPlugin::LASTMODIFIED_PROPERTYNAME;
+ const DOWNLOADURL_PROPERTYNAME = FilesPlugin::DOWNLOADURL_PROPERTYNAME;
+ const OWNER_ID_PROPERTYNAME = FilesPlugin::OWNER_ID_PROPERTYNAME;
+ const OWNER_DISPLAY_NAME_PROPERTYNAME = FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME;
+ const DATA_FINGERPRINT_PROPERTYNAME = FilesPlugin::DATA_FINGERPRINT_PROPERTYNAME;
/**
* @var \Sabre\DAV\Server | \PHPUnit_Framework_MockObject_MockObject
@@ -58,7 +59,7 @@ class FilesPluginTest extends TestCase {
private $tree;
/**
- * @var \OCA\DAV\Connector\Sabre\FilesPlugin
+ * @var FilesPlugin
*/
private $plugin;
@@ -72,6 +73,11 @@ class FilesPluginTest extends TestCase {
*/
private $config;
+ /**
+ * @var \OCP\IRequest | \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $request;
+
public function setUp() {
parent::setUp();
$this->server = $this->getMockBuilder('\Sabre\DAV\Server')
@@ -84,14 +90,16 @@ class FilesPluginTest extends TestCase {
->disableOriginalConstructor()
->getMock();
$this->config = $this->getMock('\OCP\IConfig');
- $this->config->method('getSystemValue')
+ $this->config->expects($this->any())->method('getSystemValue')
->with($this->equalTo('data-fingerprint'), $this->equalTo(''))
->willReturn('my_fingerprint');
+ $this->request = $this->getMock('\OCP\IRequest');
- $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin(
+ $this->plugin = new FilesPlugin(
$this->tree,
$this->view,
- $this->config
+ $this->config,
+ $this->request
);
$this->plugin->initialize($this->server);
}
@@ -263,10 +271,11 @@ class FilesPluginTest extends TestCase {
}
public function testGetPublicPermissions() {
- $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin(
+ $this->plugin = new FilesPlugin(
$this->tree,
$this->view,
$this->config,
+ $this->getMock('\OCP\IRequest'),
true);
$this->plugin->initialize($this->server);
@@ -331,7 +340,7 @@ class FilesPluginTest extends TestCase {
$node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory')
->disableOriginalConstructor()
->getMock();
- $node->method('getPath')->willReturn('/');
+ $node->expects($this->any())->method('getPath')->willReturn('/');
$propFind = new PropFind(
'/',
@@ -432,11 +441,16 @@ class FilesPluginTest extends TestCase {
->method('isDeletable')
->willReturn(false);
- $this->view->expects($this->once())
+ $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Node')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node->expects($this->once())
->method('getFileInfo')
- ->with('FolderA/test.txt')
->willReturn($fileInfoFolderATestTXT);
+ $this->tree->expects($this->once())->method('getNodeForPath')
+ ->willReturn($node);
+
$this->plugin->checkMove('FolderA/test.txt', 'test.txt');
}
@@ -448,11 +462,16 @@ class FilesPluginTest extends TestCase {
->method('isDeletable')
->willReturn(true);
- $this->view->expects($this->once())
+ $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Node')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node->expects($this->once())
->method('getFileInfo')
- ->with('FolderA/test.txt')
->willReturn($fileInfoFolderATestTXT);
+ $this->tree->expects($this->once())->method('getNodeForPath')
+ ->willReturn($node);
+
$this->plugin->checkMove('FolderA/test.txt', 'test.txt');
}
@@ -461,11 +480,72 @@ class FilesPluginTest extends TestCase {
* @expectedExceptionMessage FolderA/test.txt does not exist
*/
public function testMoveSrcNotExist() {
- $this->view->expects($this->once())
+ $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Node')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node->expects($this->once())
->method('getFileInfo')
- ->with('FolderA/test.txt')
- ->willReturn(false);
+ ->willReturn(null);
+
+ $this->tree->expects($this->once())->method('getNodeForPath')
+ ->willReturn($node);
$this->plugin->checkMove('FolderA/test.txt', 'test.txt');
}
+
+ public function downloadHeadersProvider() {
+ return [
+ [
+ false,
+ 'attachment; filename*=UTF-8\'\'somefile.xml; filename="somefile.xml"'
+ ],
+ [
+ true,
+ 'attachment; filename="somefile.xml"'
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider downloadHeadersProvider
+ */
+ public function testDownloadHeaders($isClumsyAgent, $contentDispositionHeader) {
+ $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $request
+ ->expects($this->once())
+ ->method('getPath')
+ ->will($this->returnValue('test/somefile.xml'));
+
+ $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node
+ ->expects($this->once())
+ ->method('getName')
+ ->will($this->returnValue('somefile.xml'));
+
+ $this->tree
+ ->expects($this->once())
+ ->method('getNodeForPath')
+ ->with('test/somefile.xml')
+ ->will($this->returnValue($node));
+
+ $this->request
+ ->expects($this->once())
+ ->method('isUserAgent')
+ ->will($this->returnValue($isClumsyAgent));
+
+ $response
+ ->expects($this->once())
+ ->method('addHeader')
+ ->with('Content-Disposition', $contentDispositionHeader);
+
+ $this->plugin->httpGet($request, $response);
+ }
}
diff --git a/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php
index 41d44efd89c..baf4259b215 100644
--- a/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php
@@ -343,7 +343,8 @@ class FilesReportPluginTest extends \Test\TestCase {
new \OCA\DAV\Connector\Sabre\FilesPlugin(
$this->tree,
$this->view,
- $config
+ $config,
+ $this->getMock('\OCP\IRequest')
)
);
$this->plugin->initialize($this->server);
diff --git a/apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php b/apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php
new file mode 100644
index 00000000000..4f481cba557
--- /dev/null
+++ b/apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ * @author Robin Appelman <icewind@owncloud.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\DAV\Tests\unit\Connector\Sabre\RequestTest;
+
+use OC\Connector\Sabre\Exception\FileLocked;
+use OCP\AppFramework\Http;
+use OCP\Lock\ILockingProvider;
+
+/**
+ * Class DeleteTest
+ *
+ * @group DB
+ *
+ * @package OCA\DAV\Tests\unit\Connector\Sabre\RequestTest
+ */
+class DeleteTest extends RequestTest {
+ public function testBasicUpload() {
+ $user = $this->getUniqueID();
+ $view = $this->setupUser($user, 'pass');
+
+ $view->file_put_contents('foo.txt', 'asd');
+ $mount = $view->getMount('foo.txt');
+ $internalPath = $view->getAbsolutePath();
+
+ // create a ghost file
+ $mount->getStorage()->unlink($mount->getInternalPath($internalPath));
+
+ // cache entry still exists
+ $this->assertInstanceOf('\OCP\Files\FileInfo', $view->getFileInfo('foo.txt'));
+
+ $response = $this->request($view, $user, 'pass', 'DELETE', '/foo.txt');
+
+ $this->assertEquals(Http::STATUS_NO_CONTENT, $response->getStatus());
+
+ // no longer in the cache
+ $this->assertFalse($view->getFileInfo('foo.txt'));
+ }
+}
diff --git a/apps/dav/tests/unit/Migration/ClassificationTest.php b/apps/dav/tests/unit/Migration/ClassificationTest.php
new file mode 100644
index 00000000000..5c7fa627226
--- /dev/null
+++ b/apps/dav/tests/unit/Migration/ClassificationTest.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\DAV\Tests\unit\DAV\Migration;
+
+use OCA\DAV\CalDAV\CalDavBackend;
+use OCA\DAV\Migration\Classification;
+use OCA\DAV\Tests\unit\CalDAV\AbstractCalDavBackendTest;
+use OCP\IUser;
+
+/**
+ * Class ClassificationTest
+ *
+ * @group DB
+ *
+ * @package OCA\DAV\Tests\unit\DAV
+ */
+class ClassificationTest extends AbstractCalDavBackendTest {
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\IUserManager */
+ private $userManager;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->userManager = $this->getMockBuilder('OCP\IUserManager')
+ ->disableOriginalConstructor()->getMock();
+ }
+
+ public function test() {
+ // setup data
+ $calendarId = $this->createTestCalendar();
+ $eventUri = $this->createEvent($calendarId, '20130912T130000Z', '20130912T140000Z');
+ $object = $this->backend->getCalendarObject($calendarId, $eventUri);
+
+ // assert proper classification
+ $this->assertEquals(CalDavBackend::CLASSIFICATION_PUBLIC, $object['classification']);
+ $this->backend->setClassification($object['id'], CalDavBackend::CLASSIFICATION_CONFIDENTIAL);
+ $object = $this->backend->getCalendarObject($calendarId, $eventUri);
+ $this->assertEquals(CalDavBackend::CLASSIFICATION_CONFIDENTIAL, $object['classification']);
+
+ // run migration
+ $c = new Classification($this->backend, $this->userManager);
+
+ /** @var IUser | \PHPUnit_Framework_MockObject_MockObject $user */
+ $user = $this->getMockBuilder('OCP\IUser')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $user->expects($this->once())->method('getUID')->willReturn('caldav-unit-test');
+
+ $c->runForUser($user);
+
+ // assert classification after migration
+ $object = $this->backend->getCalendarObject($calendarId, $eventUri);
+ $this->assertEquals(CalDavBackend::CLASSIFICATION_PUBLIC, $object['classification']);
+ }
+}
diff --git a/apps/encryption/l10n/pl.js b/apps/encryption/l10n/pl.js
index 164a4a36d57..17f73e4fdb7 100644
--- a/apps/encryption/l10n/pl.js
+++ b/apps/encryption/l10n/pl.js
@@ -27,6 +27,8 @@ OC.L10N.register(
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Nie można odszyfrować tego pliku, prawdopodobnie jest to plik udostępniony. Poproś właściciela pliku o ponowne udostępnianie pliku Tobie.",
"The share will expire on %s." : "Ten zasób wygaśnie %s",
"Cheers!" : "Dzięki!",
+ "Enable recovery key" : "Włącz klucz odzyskiwania",
+ "Disable recovery key" : "Wyłącz klucz odzyskiwania",
"Recovery key password" : "Hasło klucza odzyskiwania",
"Repeat recovery key password" : "Powtórz hasło klucza odzyskiwania",
"Change recovery key password:" : "Zmień hasło klucza odzyskiwania",
diff --git a/apps/encryption/l10n/pl.json b/apps/encryption/l10n/pl.json
index 2bd108ba4c6..f1ef3faf44d 100644
--- a/apps/encryption/l10n/pl.json
+++ b/apps/encryption/l10n/pl.json
@@ -25,6 +25,8 @@
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Nie można odszyfrować tego pliku, prawdopodobnie jest to plik udostępniony. Poproś właściciela pliku o ponowne udostępnianie pliku Tobie.",
"The share will expire on %s." : "Ten zasób wygaśnie %s",
"Cheers!" : "Dzięki!",
+ "Enable recovery key" : "Włącz klucz odzyskiwania",
+ "Disable recovery key" : "Wyłącz klucz odzyskiwania",
"Recovery key password" : "Hasło klucza odzyskiwania",
"Repeat recovery key password" : "Powtórz hasło klucza odzyskiwania",
"Change recovery key password:" : "Zmień hasło klucza odzyskiwania",
diff --git a/apps/encryption/l10n/pt_PT.js b/apps/encryption/l10n/pt_PT.js
index 35a41066b87..27206bf0da3 100644
--- a/apps/encryption/l10n/pt_PT.js
+++ b/apps/encryption/l10n/pt_PT.js
@@ -2,32 +2,32 @@ OC.L10N.register(
"encryption",
{
"Missing recovery key password" : "Palavra-passe da chave de recuperação em falta",
- "Please repeat the recovery key password" : "Por favor, repita a senha da chave de recuperação",
+ "Please repeat the recovery key password" : "Por favor, repita a palavra-passe da chave de recuperação",
"Repeated recovery key password does not match the provided recovery key password" : "A confirmação da palavra-passe da chave de recuperação não corresponde",
"Recovery key successfully enabled" : "A chave de recuperação foi ativada com sucesso",
- "Could not enable recovery key. Please check your recovery key password!" : "Não foi possível ativar a chave de recuperação. Por favor, verifique a sua senha da chave de recuperação!",
+ "Could not enable recovery key. Please check your recovery key password!" : "Não foi possível ativar a chave de recuperação. Por favor, verifique a sua palavra-passe da chave de recuperação!",
"Recovery key successfully disabled" : "A chave de recuperação foi desativada com sucesso",
- "Could not disable recovery key. Please check your recovery key password!" : "Não foi possível desativar a chave de recuperação. Por favor, verifique a senha da chave de recuperação.",
- "Missing parameters" : "Parametros em falta",
- "Please provide the old recovery password" : "Escreva a palavra-passe de recuperação antiga",
- "Please provide a new recovery password" : "Escreva a nova palavra-passe de recuperação",
- "Please repeat the new recovery password" : "Escreva de novo a nova palavra-passe de recuperação",
+ "Could not disable recovery key. Please check your recovery key password!" : "Não foi possível desativar a chave de recuperação. Por favor, verifique a palavra-passe da chave de recuperação.",
+ "Missing parameters" : "Parâmetros em falta",
+ "Please provide the old recovery password" : "Por favor, indique a palavra-passe de recuperação antiga",
+ "Please provide a new recovery password" : "Por favor, indique a nova palavra-passe de recuperação",
+ "Please repeat the new recovery password" : "Por favor, repita a nova palavra-passe de recuperação",
"Password successfully changed." : "Palavra-passe alterada com sucesso.",
- "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a senha. Possivelmente a senha antiga não está correta.",
- "Recovery Key disabled" : "Chave de recuperação desativada",
+ "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a palavra-passe. Possivelmente a palavra-passe antiga não está correta.",
+ "Recovery Key disabled" : "Chave de Recuperação desativada",
"Recovery Key enabled" : "Chave de Recuperação ativada",
"Could not enable the recovery key, please try again or contact your administrator" : "Não foi possível ativar a chave de recuperação, por favor, tente de novo ou contacte o seu administrador",
- "Could not update the private key password." : "Não foi possível atualizar a senha da chave privada.",
- "The old password was not correct, please try again." : "A senha antiga não estava correta, por favor, tente de novo.",
- "The current log-in password was not correct, please try again." : "A senha de iniciar a sessão atual não estava correta, por favor, tente de novo.",
- "Private key password successfully updated." : "A senha da chave privada foi atualizada com sucesso. ",
+ "Could not update the private key password." : "Não foi possível atualizar a palavra-passe da chave privada.",
+ "The old password was not correct, please try again." : "A palavra-passe antiga não estava correta, por favor, tente de novo.",
+ "The current log-in password was not correct, please try again." : "A palavra-passe de iniciar a sessão atual não estava correta, por favor, tente de novo.",
+ "Private key password successfully updated." : "A palavra-passe da chave privada foi atualizada com sucesso. ",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Precisa de migrar as suas chaves de encriptação da encriptação antiga (ownCloud <= 8.0) para a nova. Por favor, execute 'occ encryption:migrate' ou contacte o seu administrador",
- "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chave privada inválida da Aplicação de Encriptação. Por favor atualize a sua senha de chave privada nas definições pessoais, para recuperar o acesso aos seus ficheiros encriptados.",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A Aplicação de Encriptação está ativada, mas as suas chaves não inicializaram. Por favor termine e inicie a sessão novamente",
- "Encryption App is enabled and ready" : "A aplicação de encriptação está ativa e pronta",
+ "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chave privada inválida para a Aplicação de Encriptação. Por favor, atualize a sua palavra-passe da chave privada nas definições pessoais para recuperar o acesso aos seus ficheiros encriptados.",
+ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A Aplicação de Encriptação está ativada, mas as suas chaves não inicializaram. Por favor, termine a sessão e inicie-a novamente",
+ "Encryption App is enabled and ready" : "A aplicação de Encriptação está ativada e pronta",
"Bad Signature" : "Má Assinatura",
"Missing Signature" : "Assinatura em Falta",
- "one-time password for server-side-encryption" : "palavra-passe de uso único para encriptação do lado do servidor",
+ "one-time password for server-side-encryption" : "palavra-passe de utilização única para a encriptação do lado do servidor",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível desencriptar este ficheiro, provavelmente é um ficheiro partilhado. Por favor, peça ao proprietário do ficheiro para voltar a partilhar o ficheiro consigo.",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível ler este ficheiro, provavelmente isto é um ficheiro compartilhado. Por favor, peça ao dono do ficheiro para voltar a partilhar o ficheiro consigo.",
"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" : "Olá,\n\no administrador ativou a encriptação do lado do servidor. Os teus ficheiros foram encriptados usando a palavra-passe '%s'.\n\nPor favor, faz login via browser, vai à secção 'Módulo de encriptação básica ownCloud' nas tuas definições pessoais e atualiza a tua palavra-passe de encriptação ao introduzir esta palavra-passe no campo 'palavra-passe antiga' e também a tua palavra-passe atual.\n\n",
@@ -39,23 +39,23 @@ OC.L10N.register(
"Enable recovery key" : "Ativar a chave de recuperação",
"Disable recovery key" : "Desativar a chave de recuperação",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "A chave de recuperação é uma chave de encriptação extra que é utilizada para encriptar os ficheiros. Esta permite a recuperação dos ficheiros do utilizador se este esquecer a sua senha.",
- "Recovery key password" : "Senha da chave de recuperação",
- "Repeat recovery key password" : "Repetir a senha da chave de recuperação",
- "Change recovery key password:" : "Alterar a senha da chave de recuperação:",
- "Old recovery key password" : "Senha da chave de recuperação antiga",
- "New recovery key password" : "Nova senha da chave de recuperação",
- "Repeat new recovery key password" : "Repetir senha da chave de recuperação",
- "Change Password" : "Alterar a Senha",
+ "Recovery key password" : "Palavra-passe da chave de recuperação",
+ "Repeat recovery key password" : "Repetir a palavra-passe da chave de recuperação",
+ "Change recovery key password:" : "Alterar a palavra-passe da chave de recuperação:",
+ "Old recovery key password" : "Palavra-passe da chave de recuperação antiga",
+ "New recovery key password" : "Nova palavra-passe da chave de recuperação",
+ "Repeat new recovery key password" : "Repetir palavra-passe da chave de recuperação",
+ "Change Password" : "Alterar Palavra-passe",
"ownCloud basic encryption module" : "módulo de encriptação básico da ownCloud",
- "Your private key password no longer matches your log-in password." : "A Password da sua chave privada não coincide mais com a password do seu login.",
- "Set your old private key password to your current log-in password:" : "Altere a password antiga da chave privada para a nova password do login:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Se não se lembra da senha antiga pode pedir ao administrador para recuperar os seus ficheiros. ",
- "Old log-in password" : "Senha de iniciar sessão antiga",
- "Current log-in password" : "Senha de iniciar sessão atual",
- "Update Private Key Password" : "Atualizar Senha da Chave Privada ",
- "Enable password recovery:" : "Ativar a recuperação da senha:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ao ativar esta opção, irá poder obter o acesso aos seus ficheiros encriptados, se perder a senha",
+ "Your private key password no longer matches your log-in password." : "A palavra-passe da sua chave privada já não coincide com a palavra-passe da sua sessão.",
+ "Set your old private key password to your current log-in password:" : "Defina a sua palavra-passe antiga da chave privada para a sua palavra-passe atual da sessão:",
+ " If you don't remember your old password you can ask your administrator to recover your files." : "Se não se lembra da palavra-passe antiga pode pedir ao seu administrador para recuperar os seus ficheiros. ",
+ "Old log-in password" : "Palavra-passe antiga da sessão",
+ "Current log-in password" : "Palavra-passe atual da sessão",
+ "Update Private Key Password" : "Atualizar Palavra-passe da Chave Privada ",
+ "Enable password recovery:" : "Ativar a recuperação da palavra-passe:",
+ "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ao ativar esta opção, irá fazer com que volte a obter o acesso aos seus ficheiros encriptados, se perder a palavra-passe",
"Enabled" : "Ativada",
- "Disabled" : "Desactivada"
+ "Disabled" : "Desativada"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/encryption/l10n/pt_PT.json b/apps/encryption/l10n/pt_PT.json
index cf87cb413b7..32edf4df440 100644
--- a/apps/encryption/l10n/pt_PT.json
+++ b/apps/encryption/l10n/pt_PT.json
@@ -1,31 +1,31 @@
{ "translations": {
"Missing recovery key password" : "Palavra-passe da chave de recuperação em falta",
- "Please repeat the recovery key password" : "Por favor, repita a senha da chave de recuperação",
+ "Please repeat the recovery key password" : "Por favor, repita a palavra-passe da chave de recuperação",
"Repeated recovery key password does not match the provided recovery key password" : "A confirmação da palavra-passe da chave de recuperação não corresponde",
"Recovery key successfully enabled" : "A chave de recuperação foi ativada com sucesso",
- "Could not enable recovery key. Please check your recovery key password!" : "Não foi possível ativar a chave de recuperação. Por favor, verifique a sua senha da chave de recuperação!",
+ "Could not enable recovery key. Please check your recovery key password!" : "Não foi possível ativar a chave de recuperação. Por favor, verifique a sua palavra-passe da chave de recuperação!",
"Recovery key successfully disabled" : "A chave de recuperação foi desativada com sucesso",
- "Could not disable recovery key. Please check your recovery key password!" : "Não foi possível desativar a chave de recuperação. Por favor, verifique a senha da chave de recuperação.",
- "Missing parameters" : "Parametros em falta",
- "Please provide the old recovery password" : "Escreva a palavra-passe de recuperação antiga",
- "Please provide a new recovery password" : "Escreva a nova palavra-passe de recuperação",
- "Please repeat the new recovery password" : "Escreva de novo a nova palavra-passe de recuperação",
+ "Could not disable recovery key. Please check your recovery key password!" : "Não foi possível desativar a chave de recuperação. Por favor, verifique a palavra-passe da chave de recuperação.",
+ "Missing parameters" : "Parâmetros em falta",
+ "Please provide the old recovery password" : "Por favor, indique a palavra-passe de recuperação antiga",
+ "Please provide a new recovery password" : "Por favor, indique a nova palavra-passe de recuperação",
+ "Please repeat the new recovery password" : "Por favor, repita a nova palavra-passe de recuperação",
"Password successfully changed." : "Palavra-passe alterada com sucesso.",
- "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a senha. Possivelmente a senha antiga não está correta.",
- "Recovery Key disabled" : "Chave de recuperação desativada",
+ "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a palavra-passe. Possivelmente a palavra-passe antiga não está correta.",
+ "Recovery Key disabled" : "Chave de Recuperação desativada",
"Recovery Key enabled" : "Chave de Recuperação ativada",
"Could not enable the recovery key, please try again or contact your administrator" : "Não foi possível ativar a chave de recuperação, por favor, tente de novo ou contacte o seu administrador",
- "Could not update the private key password." : "Não foi possível atualizar a senha da chave privada.",
- "The old password was not correct, please try again." : "A senha antiga não estava correta, por favor, tente de novo.",
- "The current log-in password was not correct, please try again." : "A senha de iniciar a sessão atual não estava correta, por favor, tente de novo.",
- "Private key password successfully updated." : "A senha da chave privada foi atualizada com sucesso. ",
+ "Could not update the private key password." : "Não foi possível atualizar a palavra-passe da chave privada.",
+ "The old password was not correct, please try again." : "A palavra-passe antiga não estava correta, por favor, tente de novo.",
+ "The current log-in password was not correct, please try again." : "A palavra-passe de iniciar a sessão atual não estava correta, por favor, tente de novo.",
+ "Private key password successfully updated." : "A palavra-passe da chave privada foi atualizada com sucesso. ",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Precisa de migrar as suas chaves de encriptação da encriptação antiga (ownCloud <= 8.0) para a nova. Por favor, execute 'occ encryption:migrate' ou contacte o seu administrador",
- "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chave privada inválida da Aplicação de Encriptação. Por favor atualize a sua senha de chave privada nas definições pessoais, para recuperar o acesso aos seus ficheiros encriptados.",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A Aplicação de Encriptação está ativada, mas as suas chaves não inicializaram. Por favor termine e inicie a sessão novamente",
- "Encryption App is enabled and ready" : "A aplicação de encriptação está ativa e pronta",
+ "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chave privada inválida para a Aplicação de Encriptação. Por favor, atualize a sua palavra-passe da chave privada nas definições pessoais para recuperar o acesso aos seus ficheiros encriptados.",
+ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A Aplicação de Encriptação está ativada, mas as suas chaves não inicializaram. Por favor, termine a sessão e inicie-a novamente",
+ "Encryption App is enabled and ready" : "A aplicação de Encriptação está ativada e pronta",
"Bad Signature" : "Má Assinatura",
"Missing Signature" : "Assinatura em Falta",
- "one-time password for server-side-encryption" : "palavra-passe de uso único para encriptação do lado do servidor",
+ "one-time password for server-side-encryption" : "palavra-passe de utilização única para a encriptação do lado do servidor",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível desencriptar este ficheiro, provavelmente é um ficheiro partilhado. Por favor, peça ao proprietário do ficheiro para voltar a partilhar o ficheiro consigo.",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível ler este ficheiro, provavelmente isto é um ficheiro compartilhado. Por favor, peça ao dono do ficheiro para voltar a partilhar o ficheiro consigo.",
"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" : "Olá,\n\no administrador ativou a encriptação do lado do servidor. Os teus ficheiros foram encriptados usando a palavra-passe '%s'.\n\nPor favor, faz login via browser, vai à secção 'Módulo de encriptação básica ownCloud' nas tuas definições pessoais e atualiza a tua palavra-passe de encriptação ao introduzir esta palavra-passe no campo 'palavra-passe antiga' e também a tua palavra-passe atual.\n\n",
@@ -37,23 +37,23 @@
"Enable recovery key" : "Ativar a chave de recuperação",
"Disable recovery key" : "Desativar a chave de recuperação",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "A chave de recuperação é uma chave de encriptação extra que é utilizada para encriptar os ficheiros. Esta permite a recuperação dos ficheiros do utilizador se este esquecer a sua senha.",
- "Recovery key password" : "Senha da chave de recuperação",
- "Repeat recovery key password" : "Repetir a senha da chave de recuperação",
- "Change recovery key password:" : "Alterar a senha da chave de recuperação:",
- "Old recovery key password" : "Senha da chave de recuperação antiga",
- "New recovery key password" : "Nova senha da chave de recuperação",
- "Repeat new recovery key password" : "Repetir senha da chave de recuperação",
- "Change Password" : "Alterar a Senha",
+ "Recovery key password" : "Palavra-passe da chave de recuperação",
+ "Repeat recovery key password" : "Repetir a palavra-passe da chave de recuperação",
+ "Change recovery key password:" : "Alterar a palavra-passe da chave de recuperação:",
+ "Old recovery key password" : "Palavra-passe da chave de recuperação antiga",
+ "New recovery key password" : "Nova palavra-passe da chave de recuperação",
+ "Repeat new recovery key password" : "Repetir palavra-passe da chave de recuperação",
+ "Change Password" : "Alterar Palavra-passe",
"ownCloud basic encryption module" : "módulo de encriptação básico da ownCloud",
- "Your private key password no longer matches your log-in password." : "A Password da sua chave privada não coincide mais com a password do seu login.",
- "Set your old private key password to your current log-in password:" : "Altere a password antiga da chave privada para a nova password do login:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Se não se lembra da senha antiga pode pedir ao administrador para recuperar os seus ficheiros. ",
- "Old log-in password" : "Senha de iniciar sessão antiga",
- "Current log-in password" : "Senha de iniciar sessão atual",
- "Update Private Key Password" : "Atualizar Senha da Chave Privada ",
- "Enable password recovery:" : "Ativar a recuperação da senha:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ao ativar esta opção, irá poder obter o acesso aos seus ficheiros encriptados, se perder a senha",
+ "Your private key password no longer matches your log-in password." : "A palavra-passe da sua chave privada já não coincide com a palavra-passe da sua sessão.",
+ "Set your old private key password to your current log-in password:" : "Defina a sua palavra-passe antiga da chave privada para a sua palavra-passe atual da sessão:",
+ " If you don't remember your old password you can ask your administrator to recover your files." : "Se não se lembra da palavra-passe antiga pode pedir ao seu administrador para recuperar os seus ficheiros. ",
+ "Old log-in password" : "Palavra-passe antiga da sessão",
+ "Current log-in password" : "Palavra-passe atual da sessão",
+ "Update Private Key Password" : "Atualizar Palavra-passe da Chave Privada ",
+ "Enable password recovery:" : "Ativar a recuperação da palavra-passe:",
+ "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ao ativar esta opção, irá fazer com que volte a obter o acesso aos seus ficheiros encriptados, se perder a palavra-passe",
"Enabled" : "Ativada",
- "Disabled" : "Desactivada"
+ "Disabled" : "Desativada"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/ar.js b/apps/federatedfilesharing/l10n/ar.js
new file mode 100644
index 00000000000..451663a7b6b
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/ar.js
@@ -0,0 +1,6 @@
+OC.L10N.register(
+ "federatedfilesharing",
+ {
+ "Invalid Federated Cloud ID" : "معرّف السحابة المتحدة غير صالح"
+},
+"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
diff --git a/apps/federatedfilesharing/l10n/ar.json b/apps/federatedfilesharing/l10n/ar.json
new file mode 100644
index 00000000000..630ab95f64b
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/ar.json
@@ -0,0 +1,4 @@
+{ "translations": {
+ "Invalid Federated Cloud ID" : "معرّف السحابة المتحدة غير صالح"
+},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/gl.js b/apps/federatedfilesharing/l10n/gl.js
index 0c3acb791ff..3ea3fd5938f 100644
--- a/apps/federatedfilesharing/l10n/gl.js
+++ b/apps/federatedfilesharing/l10n/gl.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Sharing %s failed, because this item is already shared with %s" : "Fallou a compartición de %s, este elemento xa está compartido con %s",
"Not allowed to create a federated share with the same user" : "Non está permitido crear unha compartición federada co mesmo usuario",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Fallou a compartición de %s, non foi posíbel atopar %s,é probábel que o servidor non estea accesíbel.",
+ "Accept" : "Aceptar",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Comparte comigo a través do meu ID da nube federada do #ownCloud , vexa %s",
"Share with me through my #ownCloud Federated Cloud ID" : "Comparte comigo a través do meu ID da nube federada do #ownCloud",
"Federated Cloud Sharing" : "Nube federada compartida",
diff --git a/apps/federatedfilesharing/l10n/gl.json b/apps/federatedfilesharing/l10n/gl.json
index aeba950d052..e279098ab77 100644
--- a/apps/federatedfilesharing/l10n/gl.json
+++ b/apps/federatedfilesharing/l10n/gl.json
@@ -3,6 +3,7 @@
"Sharing %s failed, because this item is already shared with %s" : "Fallou a compartición de %s, este elemento xa está compartido con %s",
"Not allowed to create a federated share with the same user" : "Non está permitido crear unha compartición federada co mesmo usuario",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Fallou a compartición de %s, non foi posíbel atopar %s,é probábel que o servidor non estea accesíbel.",
+ "Accept" : "Aceptar",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Comparte comigo a través do meu ID da nube federada do #ownCloud , vexa %s",
"Share with me through my #ownCloud Federated Cloud ID" : "Comparte comigo a través do meu ID da nube federada do #ownCloud",
"Federated Cloud Sharing" : "Nube federada compartida",
diff --git a/apps/federatedfilesharing/l10n/hu_HU.js b/apps/federatedfilesharing/l10n/hu_HU.js
index 4e17934c032..0a4f26cb20d 100644
--- a/apps/federatedfilesharing/l10n/hu_HU.js
+++ b/apps/federatedfilesharing/l10n/hu_HU.js
@@ -1,10 +1,16 @@
OC.L10N.register(
"federatedfilesharing",
{
+ "Federated sharing" : "Egyesített megosztás",
"Invalid Federated Cloud ID" : "Érvénytelen Egyesített Felhő Azonosító",
"Sharing %s failed, because this item is already shared with %s" : "%s megosztása nem sikerült, mert ez már meg van osztva vele: %s",
"Not allowed to create a federated share with the same user" : "Azonos felhasználóval nem lehet létrehozni egyesített megosztást",
+ "File is already shared with %s" : "Fájl már megosztva vele: %s",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s megosztása sikertelen, mert %s nem található; talán a szerver jelenleg nem elérhető.",
+ "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Kapott egy távoli megosztást: \"/%3$s\", innen: %1$s (%2$s nevében)",
+ "You received \"/%3$s\" as a remote share from %1$s" : "Kapott egy távoli megosztást: \"/%3$s\", innen: %1$s",
+ "Accept" : "Elfogadás",
+ "Decline" : "Elutasítás",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével, lásd %s",
"Share with me through my #ownCloud Federated Cloud ID" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével ",
"Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
diff --git a/apps/federatedfilesharing/l10n/hu_HU.json b/apps/federatedfilesharing/l10n/hu_HU.json
index 0ceac624c27..77a12ece1a8 100644
--- a/apps/federatedfilesharing/l10n/hu_HU.json
+++ b/apps/federatedfilesharing/l10n/hu_HU.json
@@ -1,8 +1,14 @@
{ "translations": {
+ "Federated sharing" : "Egyesített megosztás",
"Invalid Federated Cloud ID" : "Érvénytelen Egyesített Felhő Azonosító",
"Sharing %s failed, because this item is already shared with %s" : "%s megosztása nem sikerült, mert ez már meg van osztva vele: %s",
"Not allowed to create a federated share with the same user" : "Azonos felhasználóval nem lehet létrehozni egyesített megosztást",
+ "File is already shared with %s" : "Fájl már megosztva vele: %s",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s megosztása sikertelen, mert %s nem található; talán a szerver jelenleg nem elérhető.",
+ "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Kapott egy távoli megosztást: \"/%3$s\", innen: %1$s (%2$s nevében)",
+ "You received \"/%3$s\" as a remote share from %1$s" : "Kapott egy távoli megosztást: \"/%3$s\", innen: %1$s",
+ "Accept" : "Elfogadás",
+ "Decline" : "Elutasítás",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével, lásd %s",
"Share with me through my #ownCloud Federated Cloud ID" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével ",
"Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
diff --git a/apps/federatedfilesharing/l10n/lt_LT.js b/apps/federatedfilesharing/l10n/lt_LT.js
index c6d05f617a4..89fe9525d8f 100644
--- a/apps/federatedfilesharing/l10n/lt_LT.js
+++ b/apps/federatedfilesharing/l10n/lt_LT.js
@@ -1,6 +1,8 @@
OC.L10N.register(
"federatedfilesharing",
{
+ "Accept" : "Priimti",
+ "Decline" : "Atmesti",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Pasidalink su manimi per #ownCloud padebesius, plačiau %s",
"Share with me through my #ownCloud Federated Cloud ID" : "Pasidalink su manimi per #ownCloud padebesius",
"Federated Cloud Sharing" : "Viešas dalijimasis padebesiu",
diff --git a/apps/federatedfilesharing/l10n/lt_LT.json b/apps/federatedfilesharing/l10n/lt_LT.json
index 4b295d4c1b7..318aa8d2771 100644
--- a/apps/federatedfilesharing/l10n/lt_LT.json
+++ b/apps/federatedfilesharing/l10n/lt_LT.json
@@ -1,4 +1,6 @@
{ "translations": {
+ "Accept" : "Priimti",
+ "Decline" : "Atmesti",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Pasidalink su manimi per #ownCloud padebesius, plačiau %s",
"Share with me through my #ownCloud Federated Cloud ID" : "Pasidalink su manimi per #ownCloud padebesius",
"Federated Cloud Sharing" : "Viešas dalijimasis padebesiu",
diff --git a/apps/federatedfilesharing/l10n/oc.js b/apps/federatedfilesharing/l10n/oc.js
index c337f1ca2b1..d491a9eb1b7 100644
--- a/apps/federatedfilesharing/l10n/oc.js
+++ b/apps/federatedfilesharing/l10n/oc.js
@@ -4,6 +4,8 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "ID Federated Cloud incorrècte",
"Sharing %s failed, because this item is already shared with %s" : "Lo partiment de %s a fracassat perque aqueste objècte es ja partejat amb %s",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Lo partiment de %s a fracassat : impossible de trobar %s. Benlèu que lo servidor es momentanèament injonhable.",
+ "Accept" : "Acceptar",
+ "Decline" : "Refusar",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud %s",
"Share with me through my #ownCloud Federated Cloud ID" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud",
"Federated Cloud Sharing" : "Federated Cloud Sharing",
diff --git a/apps/federatedfilesharing/l10n/oc.json b/apps/federatedfilesharing/l10n/oc.json
index 81bce1d1577..8047f9fc5bc 100644
--- a/apps/federatedfilesharing/l10n/oc.json
+++ b/apps/federatedfilesharing/l10n/oc.json
@@ -2,6 +2,8 @@
"Invalid Federated Cloud ID" : "ID Federated Cloud incorrècte",
"Sharing %s failed, because this item is already shared with %s" : "Lo partiment de %s a fracassat perque aqueste objècte es ja partejat amb %s",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Lo partiment de %s a fracassat : impossible de trobar %s. Benlèu que lo servidor es momentanèament injonhable.",
+ "Accept" : "Acceptar",
+ "Decline" : "Refusar",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud %s",
"Share with me through my #ownCloud Federated Cloud ID" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud",
"Federated Cloud Sharing" : "Federated Cloud Sharing",
diff --git a/apps/federatedfilesharing/l10n/pl.js b/apps/federatedfilesharing/l10n/pl.js
index 9bd5edd9b56..1d8b949c74a 100644
--- a/apps/federatedfilesharing/l10n/pl.js
+++ b/apps/federatedfilesharing/l10n/pl.js
@@ -2,6 +2,7 @@ OC.L10N.register(
"federatedfilesharing",
{
"Sharing %s failed, because this item is already shared with %s" : "Współdzielenie %s nie powiodło się, ponieważ element jest już współdzielony z %s",
+ "File is already shared with %s" : "Plik jest już współdzielony z %s",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Współdzielenie %s nie powiodło się, nie można odnaleźć %s. Prawdopobnie serwer nie jest teraz osiągalny.",
"Accept" : "Akceptuj",
"Open documentation" : "Otwórz dokumentację",
diff --git a/apps/federatedfilesharing/l10n/pl.json b/apps/federatedfilesharing/l10n/pl.json
index 5fd8fb130b7..c44eecbeeb7 100644
--- a/apps/federatedfilesharing/l10n/pl.json
+++ b/apps/federatedfilesharing/l10n/pl.json
@@ -1,5 +1,6 @@
{ "translations": {
"Sharing %s failed, because this item is already shared with %s" : "Współdzielenie %s nie powiodło się, ponieważ element jest już współdzielony z %s",
+ "File is already shared with %s" : "Plik jest już współdzielony z %s",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Współdzielenie %s nie powiodło się, nie można odnaleźć %s. Prawdopobnie serwer nie jest teraz osiągalny.",
"Accept" : "Akceptuj",
"Open documentation" : "Otwórz dokumentację",
diff --git a/apps/federatedfilesharing/l10n/pt_PT.js b/apps/federatedfilesharing/l10n/pt_PT.js
index e36442aade2..3f6b4c6af36 100644
--- a/apps/federatedfilesharing/l10n/pt_PT.js
+++ b/apps/federatedfilesharing/l10n/pt_PT.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"federatedfilesharing",
{
- "Federated sharing" : "Partilha federada",
+ "Federated sharing" : "Partilha Federada",
"Invalid Federated Cloud ID" : "Id. de Nuvem Federada Inválida",
"Sharing %s failed, because this item is already shared with %s" : "A partilha %s falhou, porque este item já está a ser partilhado com %s",
"Not allowed to create a federated share with the same user" : "Não é possível criar uma partilha federada com o mesmo utilizador",
@@ -18,8 +18,8 @@ OC.L10N.register(
"Allow users on this server to send shares to other servers" : "Permitir que os utilizadores neste servidor enviem as partilhas para outros servidores",
"Allow users on this server to receive shares from other servers" : "Permitir que os utilizadores neste servidor recebam as partilhas de outros servidores",
"Federated Cloud" : "Nuvem Federada",
- "Your Federated Cloud ID:" : "A Sua Id. da Nuvem Federada",
- "Share it:" : "Partilhe:",
+ "Your Federated Cloud ID:" : "A sua id. da Nuvem Federada:",
+ "Share it:" : "Partilhe-a:",
"Add to your website" : "Adicione ao seu site da Web",
"Share with me via ownCloud" : "Partilhe comigo via ownCloud",
"HTML Code:" : "Código HTML:"
diff --git a/apps/federatedfilesharing/l10n/pt_PT.json b/apps/federatedfilesharing/l10n/pt_PT.json
index 9f1e4d61551..edeb82c65d1 100644
--- a/apps/federatedfilesharing/l10n/pt_PT.json
+++ b/apps/federatedfilesharing/l10n/pt_PT.json
@@ -1,5 +1,5 @@
{ "translations": {
- "Federated sharing" : "Partilha federada",
+ "Federated sharing" : "Partilha Federada",
"Invalid Federated Cloud ID" : "Id. de Nuvem Federada Inválida",
"Sharing %s failed, because this item is already shared with %s" : "A partilha %s falhou, porque este item já está a ser partilhado com %s",
"Not allowed to create a federated share with the same user" : "Não é possível criar uma partilha federada com o mesmo utilizador",
@@ -16,8 +16,8 @@
"Allow users on this server to send shares to other servers" : "Permitir que os utilizadores neste servidor enviem as partilhas para outros servidores",
"Allow users on this server to receive shares from other servers" : "Permitir que os utilizadores neste servidor recebam as partilhas de outros servidores",
"Federated Cloud" : "Nuvem Federada",
- "Your Federated Cloud ID:" : "A Sua Id. da Nuvem Federada",
- "Share it:" : "Partilhe:",
+ "Your Federated Cloud ID:" : "A sua id. da Nuvem Federada:",
+ "Share it:" : "Partilhe-a:",
"Add to your website" : "Adicione ao seu site da Web",
"Share with me via ownCloud" : "Partilhe comigo via ownCloud",
"HTML Code:" : "Código HTML:"
diff --git a/apps/federatedfilesharing/l10n/sk_SK.js b/apps/federatedfilesharing/l10n/sk_SK.js
index 61bf85b79d5..fbced761dd5 100644
--- a/apps/federatedfilesharing/l10n/sk_SK.js
+++ b/apps/federatedfilesharing/l10n/sk_SK.js
@@ -4,6 +4,8 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Neplatné združené Cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Zdieľanie %s zlyhalo, pretože táto položka už je zdieľaná s %s",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Zdieľanie %s zlyhalo, nepodarilo sa nájsť %s, možno je server v súčasnej dobe nedostupný.",
+ "Accept" : "Schváliť",
+ "Decline" : "Odmietnuť",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID, viac n %s",
"Share with me through my #ownCloud Federated Cloud ID" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID",
"Federated Cloud Sharing" : "Združené cloudové zdieľanie",
diff --git a/apps/federatedfilesharing/l10n/sk_SK.json b/apps/federatedfilesharing/l10n/sk_SK.json
index 4c56aaa23b6..56fe356ba77 100644
--- a/apps/federatedfilesharing/l10n/sk_SK.json
+++ b/apps/federatedfilesharing/l10n/sk_SK.json
@@ -2,6 +2,8 @@
"Invalid Federated Cloud ID" : "Neplatné združené Cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Zdieľanie %s zlyhalo, pretože táto položka už je zdieľaná s %s",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Zdieľanie %s zlyhalo, nepodarilo sa nájsť %s, možno je server v súčasnej dobe nedostupný.",
+ "Accept" : "Schváliť",
+ "Decline" : "Odmietnuť",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID, viac n %s",
"Share with me through my #ownCloud Federated Cloud ID" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID",
"Federated Cloud Sharing" : "Združené cloudové zdieľanie",
diff --git a/apps/federatedfilesharing/l10n/sl.js b/apps/federatedfilesharing/l10n/sl.js
index 02444a59dfd..dd64f4a0770 100644
--- a/apps/federatedfilesharing/l10n/sl.js
+++ b/apps/federatedfilesharing/l10n/sl.js
@@ -1,11 +1,14 @@
OC.L10N.register(
"federatedfilesharing",
{
- "Federated sharing" : "Souporaba zveznega oblaka",
+ "Federated sharing" : "Souporaba v zveznem oblaku",
"Invalid Federated Cloud ID" : "Neveljaven ID zveznega oblaka ownCloud",
"Sharing %s failed, because this item is already shared with %s" : "Nastavljanje souporabe %s je spodletelo, ker je ima uporabnik %s predmet že v souporabi.",
"Not allowed to create a federated share with the same user" : "Ni dovoljeno ustvariti souporabe zveznega oblaka z istim uporabnikom",
+ "File is already shared with %s" : "Datoteka je že v souporabi pri %s",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Omogočanje souporabe %s je spodletelo, ker ni mogoče najti %s. Najverjetneje je strežnik nedosegljiv.",
+ "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Uporabnik %1$s vam je omogočil oddaljeno souporabo mape \"/%3$s\" (v imenu %2$s)",
+ "You received \"/%3$s\" as a remote share from %1$s" : "Uporabnik %1$s vam je omogočil oddaljeno souporabo mape \"/%3$s\"",
"Accept" : "Sprejmi",
"Decline" : "Zavrni",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Omogoči souporabo prek #ownCloud ID zveznega oblaka, več na %s",
diff --git a/apps/federatedfilesharing/l10n/sl.json b/apps/federatedfilesharing/l10n/sl.json
index 6e4f45574d1..f7a4ea9fb6d 100644
--- a/apps/federatedfilesharing/l10n/sl.json
+++ b/apps/federatedfilesharing/l10n/sl.json
@@ -1,9 +1,12 @@
{ "translations": {
- "Federated sharing" : "Souporaba zveznega oblaka",
+ "Federated sharing" : "Souporaba v zveznem oblaku",
"Invalid Federated Cloud ID" : "Neveljaven ID zveznega oblaka ownCloud",
"Sharing %s failed, because this item is already shared with %s" : "Nastavljanje souporabe %s je spodletelo, ker je ima uporabnik %s predmet že v souporabi.",
"Not allowed to create a federated share with the same user" : "Ni dovoljeno ustvariti souporabe zveznega oblaka z istim uporabnikom",
+ "File is already shared with %s" : "Datoteka je že v souporabi pri %s",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Omogočanje souporabe %s je spodletelo, ker ni mogoče najti %s. Najverjetneje je strežnik nedosegljiv.",
+ "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Uporabnik %1$s vam je omogočil oddaljeno souporabo mape \"/%3$s\" (v imenu %2$s)",
+ "You received \"/%3$s\" as a remote share from %1$s" : "Uporabnik %1$s vam je omogočil oddaljeno souporabo mape \"/%3$s\"",
"Accept" : "Sprejmi",
"Decline" : "Zavrni",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Omogoči souporabo prek #ownCloud ID zveznega oblaka, več na %s",
diff --git a/apps/federatedfilesharing/l10n/th_TH.js b/apps/federatedfilesharing/l10n/th_TH.js
index 2e2b76d374f..59c2ebdda62 100644
--- a/apps/federatedfilesharing/l10n/th_TH.js
+++ b/apps/federatedfilesharing/l10n/th_TH.js
@@ -1,10 +1,13 @@
OC.L10N.register(
"federatedfilesharing",
{
+ "Federated sharing" : "แบ่งปันสหพันธ์",
"Invalid Federated Cloud ID" : "ไอดีคลาวด์ในเครือไม่ถูกต้อง",
"Sharing %s failed, because this item is already shared with %s" : "การแชร์ %s ล้มเหลวเพราะรายการนี้ถูกแชร์กับ %s",
"Not allowed to create a federated share with the same user" : "ไม่อนุญาตให้สร้างแชร์สหพันธ์กับผู้ใช้เดียวกัน",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "การแชร์ %s ล้มเหลวไม่สามารถหา %s, บางทีอาจจะยังไม่สามารถเข้าถึงเซิร์ฟเวอร์ปัจจุบัน",
+ "Accept" : "ยอมรับ",
+ "Decline" : "ลดลง",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "แชร์กับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์สหพันธ์ สามารถดูได้ที่ %s",
"Share with me through my #ownCloud Federated Cloud ID" : "แชร์กับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์สหพันธ์",
"Federated Cloud Sharing" : "แชร์กับสหพันธ์คลาวด์",
diff --git a/apps/federatedfilesharing/l10n/th_TH.json b/apps/federatedfilesharing/l10n/th_TH.json
index f0669d0383e..718dd1ae978 100644
--- a/apps/federatedfilesharing/l10n/th_TH.json
+++ b/apps/federatedfilesharing/l10n/th_TH.json
@@ -1,8 +1,11 @@
{ "translations": {
+ "Federated sharing" : "แบ่งปันสหพันธ์",
"Invalid Federated Cloud ID" : "ไอดีคลาวด์ในเครือไม่ถูกต้อง",
"Sharing %s failed, because this item is already shared with %s" : "การแชร์ %s ล้มเหลวเพราะรายการนี้ถูกแชร์กับ %s",
"Not allowed to create a federated share with the same user" : "ไม่อนุญาตให้สร้างแชร์สหพันธ์กับผู้ใช้เดียวกัน",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "การแชร์ %s ล้มเหลวไม่สามารถหา %s, บางทีอาจจะยังไม่สามารถเข้าถึงเซิร์ฟเวอร์ปัจจุบัน",
+ "Accept" : "ยอมรับ",
+ "Decline" : "ลดลง",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "แชร์กับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์สหพันธ์ สามารถดูได้ที่ %s",
"Share with me through my #ownCloud Federated Cloud ID" : "แชร์กับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์สหพันธ์",
"Federated Cloud Sharing" : "แชร์กับสหพันธ์คลาวด์",
diff --git a/apps/federatedfilesharing/l10n/tr.js b/apps/federatedfilesharing/l10n/tr.js
index a4f4ad92329..e8d9fb2de35 100644
--- a/apps/federatedfilesharing/l10n/tr.js
+++ b/apps/federatedfilesharing/l10n/tr.js
@@ -1,10 +1,13 @@
OC.L10N.register(
"federatedfilesharing",
{
+ "Federated sharing" : "Birleşmiş paylaşım",
"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.",
+ "Accept" : "Kabul et",
+ "Decline" : "Reddet",
"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ş",
"Federated Cloud Sharing" : "Birleşmiş Bulut Paylaşımı",
diff --git a/apps/federatedfilesharing/l10n/tr.json b/apps/federatedfilesharing/l10n/tr.json
index 23477fdd9c3..5e51b3434c3 100644
--- a/apps/federatedfilesharing/l10n/tr.json
+++ b/apps/federatedfilesharing/l10n/tr.json
@@ -1,8 +1,11 @@
{ "translations": {
+ "Federated sharing" : "Birleşmiş paylaşım",
"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.",
+ "Accept" : "Kabul et",
+ "Decline" : "Reddet",
"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ş",
"Federated Cloud Sharing" : "Birleşmiş Bulut Paylaşımı",
diff --git a/apps/federatedfilesharing/l10n/zh_CN.js b/apps/federatedfilesharing/l10n/zh_CN.js
index 9126112cf8b..371b6706dbf 100644
--- a/apps/federatedfilesharing/l10n/zh_CN.js
+++ b/apps/federatedfilesharing/l10n/zh_CN.js
@@ -1,10 +1,13 @@
OC.L10N.register(
"federatedfilesharing",
{
+ "Federated sharing" : "联合云共享",
"Invalid Federated Cloud ID" : "联合云ID不正确",
"Sharing %s failed, because this item is already shared with %s" : "共享 %s 失败,因为它已经共享给 %s",
"Not allowed to create a federated share with the same user" : "不能给你自己分享文件",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "共享 %s 失败,联合云无法找到 %s,请检查设置或联系管理员。",
+ "Accept" : "接受",
+ "Decline" : "拒绝",
"Federated Cloud Sharing" : "联合云共享",
"Open documentation" : "打开文档",
"Allow users on this server to send shares to other servers" : "允许用户分享文件给其他服务器上的用户",
diff --git a/apps/federatedfilesharing/l10n/zh_CN.json b/apps/federatedfilesharing/l10n/zh_CN.json
index b8d473f2d12..b1ae37ba870 100644
--- a/apps/federatedfilesharing/l10n/zh_CN.json
+++ b/apps/federatedfilesharing/l10n/zh_CN.json
@@ -1,8 +1,11 @@
{ "translations": {
+ "Federated sharing" : "联合云共享",
"Invalid Federated Cloud ID" : "联合云ID不正确",
"Sharing %s failed, because this item is already shared with %s" : "共享 %s 失败,因为它已经共享给 %s",
"Not allowed to create a federated share with the same user" : "不能给你自己分享文件",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "共享 %s 失败,联合云无法找到 %s,请检查设置或联系管理员。",
+ "Accept" : "接受",
+ "Decline" : "拒绝",
"Federated Cloud Sharing" : "联合云共享",
"Open documentation" : "打开文档",
"Allow users on this server to send shares to other servers" : "允许用户分享文件给其他服务器上的用户",
diff --git a/apps/federation/css/settings-admin.css b/apps/federation/css/settings-admin.css
index 55b1dd64d15..150412c156f 100644
--- a/apps/federation/css/settings-admin.css
+++ b/apps/federation/css/settings-admin.css
@@ -17,10 +17,13 @@
cursor: pointer;
}
-#listOfTrustedServers li:hover {
- cursor: pointer;
-}
-
#listOfTrustedServers .status {
margin-right: 10px;
}
+
+#listOfTrustedServers .icon {
+ cursor: pointer;
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: 10px;
+}
diff --git a/apps/federation/js/settings-admin.js b/apps/federation/js/settings-admin.js
index 7d531b39d8c..45d5d62a5a3 100644
--- a/apps/federation/js/settings-admin.js
+++ b/apps/federation/js/settings-admin.js
@@ -42,8 +42,9 @@ $(document).ready(function () {
$('ul#listOfTrustedServers').prepend(
$('<li>')
.attr('id', data.id)
- .attr('class', 'icon-delete')
- .html('<span class="status indeterminate"></span>' + data.url)
+ .html('<span class="status indeterminate"></span>' +
+ data.url +
+ '<span class="icon icon-delete"></span>')
);
OC.msg.finishedSuccess('#ocFederationAddServer .msg', data.message);
})
@@ -56,10 +57,10 @@ $(document).ready(function () {
}
});
- // remove trusted server from list
- $( "#listOfTrustedServers" ).on('click', 'li', function() {
- var id = $(this).attr('id');
- var $this = $(this);
+// remove trusted server from list
+ $( "#listOfTrustedServers" ).on('click', 'li > .icon-delete', function() {
+ var $this = $(this).parent();
+ id = $this.attr('id');
$.ajax({
url: OC.generateUrl('/apps/federation/trusted-servers/' + id),
type: 'DELETE',
diff --git a/apps/federation/l10n/pt_PT.js b/apps/federation/l10n/pt_PT.js
index 38ec142b689..c227ab490b7 100644
--- a/apps/federation/l10n/pt_PT.js
+++ b/apps/federation/l10n/pt_PT.js
@@ -6,7 +6,7 @@ OC.L10N.register(
"No ownCloud server found" : "Nenhum servidor ownCloud encontrado",
"Could not add server" : "Não foi possível adicionar servidor",
"Federation" : "Federação",
- "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." : "Federação ownCloud permite-lhe conectar-se com outros ownClouds de confiança para partilhar directórios. Por exemplo, isto será utilizado para auto-completar utilizadores externos para partilhas federadas.",
+ "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." : "A Federação ownCloud permite-lhe conectar-se com outras ownClouds de confiança para partilhar directorias. Por exemplo, isto será utilizado para auto-completar utilizadores externos para partilhas federadas.",
"Add server automatically once a federated share was created successfully" : "Adicionar o servidor automaticamente assim que uma partilha federada tenha sido criada com sucesso",
"Trusted ownCloud Servers" : "Servidores ownCloud de confiança",
"+ Add ownCloud server" : "+ Adicionar servidor ownCloud",
diff --git a/apps/federation/l10n/pt_PT.json b/apps/federation/l10n/pt_PT.json
index 796a2127170..2316af9c253 100644
--- a/apps/federation/l10n/pt_PT.json
+++ b/apps/federation/l10n/pt_PT.json
@@ -4,7 +4,7 @@
"No ownCloud server found" : "Nenhum servidor ownCloud encontrado",
"Could not add server" : "Não foi possível adicionar servidor",
"Federation" : "Federação",
- "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." : "Federação ownCloud permite-lhe conectar-se com outros ownClouds de confiança para partilhar directórios. Por exemplo, isto será utilizado para auto-completar utilizadores externos para partilhas federadas.",
+ "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." : "A Federação ownCloud permite-lhe conectar-se com outras ownClouds de confiança para partilhar directorias. Por exemplo, isto será utilizado para auto-completar utilizadores externos para partilhas federadas.",
"Add server automatically once a federated share was created successfully" : "Adicionar o servidor automaticamente assim que uma partilha federada tenha sido criada com sucesso",
"Trusted ownCloud Servers" : "Servidores ownCloud de confiança",
"+ Add ownCloud server" : "+ Adicionar servidor ownCloud",
diff --git a/apps/federation/l10n/ro.js b/apps/federation/l10n/ro.js
index e3035955143..19f37f329a1 100644
--- a/apps/federation/l10n/ro.js
+++ b/apps/federation/l10n/ro.js
@@ -4,6 +4,12 @@ OC.L10N.register(
"Server added to the list of trusted ownClouds" : "Server adăugat la lista serverelor ownCloud de încredere",
"Server is already in the list of trusted servers." : "Serverul este deja pe lista celor de încredere.",
"No ownCloud server found" : "Nu s-a găsit niciun server ownCloud",
- "Could not add server" : "Nu s-a putut adăuga serverul"
+ "Could not add server" : "Nu s-a putut adăuga serverul",
+ "Federation" : "Federare",
+ "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." : "Federarea ownCloud îți permite să te conectezi la alte servere ownCloud de încredere pentru a partaja baza de utilizatori. De exemplu, va permite completarea automată a numelor utilizatorilor externi pentru partajarea federată.",
+ "Add server automatically once a federated share was created successfully" : "Adaugă serverul automat odată ce elementul partajat federat a fost creat cu succes",
+ "Trusted ownCloud Servers" : "Servere ownCloud de încredere",
+ "+ Add ownCloud server" : "+ Adaugă server ownCloud",
+ "ownCloud Server" : "Server ownCloud"
},
"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));");
diff --git a/apps/federation/l10n/ro.json b/apps/federation/l10n/ro.json
index 75c514fd8c8..0acb4ebd962 100644
--- a/apps/federation/l10n/ro.json
+++ b/apps/federation/l10n/ro.json
@@ -2,6 +2,12 @@
"Server added to the list of trusted ownClouds" : "Server adăugat la lista serverelor ownCloud de încredere",
"Server is already in the list of trusted servers." : "Serverul este deja pe lista celor de încredere.",
"No ownCloud server found" : "Nu s-a găsit niciun server ownCloud",
- "Could not add server" : "Nu s-a putut adăuga serverul"
+ "Could not add server" : "Nu s-a putut adăuga serverul",
+ "Federation" : "Federare",
+ "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." : "Federarea ownCloud îți permite să te conectezi la alte servere ownCloud de încredere pentru a partaja baza de utilizatori. De exemplu, va permite completarea automată a numelor utilizatorilor externi pentru partajarea federată.",
+ "Add server automatically once a federated share was created successfully" : "Adaugă serverul automat odată ce elementul partajat federat a fost creat cu succes",
+ "Trusted ownCloud Servers" : "Servere ownCloud de încredere",
+ "+ Add ownCloud server" : "+ Adaugă server ownCloud",
+ "ownCloud Server" : "Server ownCloud"
},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"
} \ No newline at end of file
diff --git a/apps/federation/lib/DAV/FedAuth.php b/apps/federation/lib/DAV/FedAuth.php
index bb1041adcdf..21c0d61487c 100644
--- a/apps/federation/lib/DAV/FedAuth.php
+++ b/apps/federation/lib/DAV/FedAuth.php
@@ -36,6 +36,10 @@ class FedAuth extends AbstractBasic {
public function __construct(DbHandler $db) {
$this->db = $db;
$this->principalPrefix = 'principals/system/';
+
+ // setup realm
+ $defaults = new \OC_Defaults();
+ $this->realm = $defaults->getName();
}
/**
diff --git a/apps/federation/templates/settings-admin.php b/apps/federation/templates/settings-admin.php
index 704fc9a9ace..ce66214de7c 100644
--- a/apps/federation/templates/settings-admin.php
+++ b/apps/federation/templates/settings-admin.php
@@ -23,7 +23,7 @@ style('federation', 'settings-admin')
</p>
<ul id="listOfTrustedServers">
<?php foreach($_['trustedServers'] as $trustedServer) { ?>
- <li id="<?php p($trustedServer['id']); ?>" class="icon-delete">
+ <li id="<?php p($trustedServer['id']); ?>">
<?php if((int)$trustedServer['status'] === TrustedServers::STATUS_OK) { ?>
<span class="status success"></span>
<?php
@@ -36,6 +36,7 @@ style('federation', 'settings-admin')
<span class="status error"></span>
<?php } ?>
<?php p($trustedServer['url']); ?>
+ <span class="icon icon-delete"></span>
</li>
<?php } ?>
</ul>
diff --git a/apps/files/js/app.js b/apps/files/js/app.js
index 7a3d78f9663..fbfa510e07e 100644
--- a/apps/files/js/app.js
+++ b/apps/files/js/app.js
@@ -53,6 +53,9 @@
this.$showHiddenFiles = $('input#showhiddenfilesToggle');
var showHidden = $('#showHiddenFiles').val() === "1";
this.$showHiddenFiles.prop('checked', showHidden);
+ if ($('#fileNotFound').val() === "1") {
+ OC.Notification.showTemporary(t('files', 'File could not be found'));
+ }
this._filesConfig = new OC.Backbone.Model({
showhidden: showHidden
diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js
index a9093c45a96..ae180fca235 100644
--- a/apps/files/l10n/ar.js
+++ b/apps/files/l10n/ar.js
@@ -41,6 +41,12 @@ OC.L10N.register(
"Pending" : "قيد الانتظار",
"Unable to determine date" : "تعذر تحديد التاريخ",
"This operation is forbidden" : "هذة العملية ممنوعة ",
+ "Could not rename \"{fileName}\"" : "إعادة تسمية الملف \"{fileName}\" لم تنجح",
+ "Could not create file \"{file}\"" : "لا يمكن إنشاء الملف\"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "لا يمكن إنشاء الملف \"{file}\" فهو موجود بالفعل",
+ "Could not create folder \"{dir}\"" : "لا يمكن إنشاء المجلد \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "لا يمكن إنشاء المجلد \"{dir}\" فهو موجود بالفعل",
+ "Error deleting file \"{fileName}\"." : "خطأ أثناء حذف الملف \"{fileName}\".",
"No entries in this folder match '{filter}'" : "لا يوجد مدخلات في هذا المجلد تتوافق مع '{filter}'",
"Name" : "اسم",
"Size" : "حجم",
diff --git a/apps/files/l10n/ar.json b/apps/files/l10n/ar.json
index fe07f30c033..257aa4f1bb4 100644
--- a/apps/files/l10n/ar.json
+++ b/apps/files/l10n/ar.json
@@ -39,6 +39,12 @@
"Pending" : "قيد الانتظار",
"Unable to determine date" : "تعذر تحديد التاريخ",
"This operation is forbidden" : "هذة العملية ممنوعة ",
+ "Could not rename \"{fileName}\"" : "إعادة تسمية الملف \"{fileName}\" لم تنجح",
+ "Could not create file \"{file}\"" : "لا يمكن إنشاء الملف\"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "لا يمكن إنشاء الملف \"{file}\" فهو موجود بالفعل",
+ "Could not create folder \"{dir}\"" : "لا يمكن إنشاء المجلد \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "لا يمكن إنشاء المجلد \"{dir}\" فهو موجود بالفعل",
+ "Error deleting file \"{fileName}\"." : "خطأ أثناء حذف الملف \"{fileName}\".",
"No entries in this folder match '{filter}'" : "لا يوجد مدخلات في هذا المجلد تتوافق مع '{filter}'",
"Name" : "اسم",
"Size" : "حجم",
diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js
index e1013bcafbb..e585ccacc1c 100644
--- a/apps/files/l10n/da.js
+++ b/apps/files/l10n/da.js
@@ -32,6 +32,8 @@ OC.L10N.register(
"Could not get result from server." : "Kunne ikke hente resultat fra server.",
"Uploading..." : "Uploader...",
"..." : "...",
+ "Any moment now..." : "Når som helst...",
+ "Soon..." : "Snart...",
"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",
"Download" : "Download",
@@ -47,6 +49,8 @@ OC.L10N.register(
"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}\"",
+ "{newName} already exists" : "{newName} eksistere allerede",
+ "Error deleting file \"{fileName}\"." : "Fejl under sletning af filen \"{fileName}\"",
"No entries in this folder match '{filter}'" : "Der er ingen poster i denne mappe, der matcher '{filter}'",
"Name" : "Navn",
"Size" : "Størrelse",
@@ -68,6 +72,7 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Gjort til foretrukken",
"Favorite" : "Foretrukken",
+ "Local link" : "Lokalt link",
"Folder" : "Mappe",
"New folder" : "Ny Mappe",
"{newname} already exists" : "{newname} eksistere allerede",
@@ -97,6 +102,7 @@ OC.L10N.register(
"Save" : "Gem",
"Missing permissions to edit from here." : "Rettighed mangler til at redigere på dette sted",
"Settings" : "Indstillinger",
+ "Show hidden files" : "Vis skjulte filer",
"WebDAV" : "WebDAV",
"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 3162770cc40..499533d77ba 100644
--- a/apps/files/l10n/da.json
+++ b/apps/files/l10n/da.json
@@ -30,6 +30,8 @@
"Could not get result from server." : "Kunne ikke hente resultat fra server.",
"Uploading..." : "Uploader...",
"..." : "...",
+ "Any moment now..." : "Når som helst...",
+ "Soon..." : "Snart...",
"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",
"Download" : "Download",
@@ -45,6 +47,8 @@
"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}\"",
+ "{newName} already exists" : "{newName} eksistere allerede",
+ "Error deleting file \"{fileName}\"." : "Fejl under sletning af filen \"{fileName}\"",
"No entries in this folder match '{filter}'" : "Der er ingen poster i denne mappe, der matcher '{filter}'",
"Name" : "Navn",
"Size" : "Størrelse",
@@ -66,6 +70,7 @@
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Gjort til foretrukken",
"Favorite" : "Foretrukken",
+ "Local link" : "Lokalt link",
"Folder" : "Mappe",
"New folder" : "Ny Mappe",
"{newname} already exists" : "{newname} eksistere allerede",
@@ -95,6 +100,7 @@
"Save" : "Gem",
"Missing permissions to edit from here." : "Rettighed mangler til at redigere på dette sted",
"Settings" : "Indstillinger",
+ "Show hidden files" : "Vis skjulte filer",
"WebDAV" : "WebDAV",
"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 068cbe85376..0866279a435 100644
--- a/apps/files/l10n/de.js
+++ b/apps/files/l10n/de.js
@@ -21,6 +21,7 @@ OC.L10N.register(
"Invalid directory." : "Ungültiges Verzeichnis.",
"Files" : "Dateien",
"All files" : "Alle Dateien",
+ "File could not be found" : "Datei konnte nicht gefunden werden",
"Home" : "Home",
"Close" : "Schließen",
"Favorites" : "Favoriten",
diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json
index 2169d228295..0f2939217d9 100644
--- a/apps/files/l10n/de.json
+++ b/apps/files/l10n/de.json
@@ -19,6 +19,7 @@
"Invalid directory." : "Ungültiges Verzeichnis.",
"Files" : "Dateien",
"All files" : "Alle Dateien",
+ "File could not be found" : "Datei konnte nicht gefunden werden",
"Home" : "Home",
"Close" : "Schließen",
"Favorites" : "Favoriten",
diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js
index 9a349357a99..6a2f0ab1f59 100644
--- a/apps/files/l10n/de_DE.js
+++ b/apps/files/l10n/de_DE.js
@@ -21,6 +21,7 @@ OC.L10N.register(
"Invalid directory." : "Ungültiges Verzeichnis.",
"Files" : "Dateien",
"All files" : "Alle Dateien",
+ "File could not be found" : "Datei konnte nicht gefunden werden",
"Home" : "Zuhause",
"Close" : "Schließen",
"Favorites" : "Favoriten",
diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json
index 9df557e8fa4..047299f9510 100644
--- a/apps/files/l10n/de_DE.json
+++ b/apps/files/l10n/de_DE.json
@@ -19,6 +19,7 @@
"Invalid directory." : "Ungültiges Verzeichnis.",
"Files" : "Dateien",
"All files" : "Alle Dateien",
+ "File could not be found" : "Datei konnte nicht gefunden werden",
"Home" : "Zuhause",
"Close" : "Schließen",
"Favorites" : "Favoriten",
diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js
index ec8b821c3e7..82ed2364dd6 100644
--- a/apps/files/l10n/en_GB.js
+++ b/apps/files/l10n/en_GB.js
@@ -21,6 +21,7 @@ OC.L10N.register(
"Invalid directory." : "Invalid directory.",
"Files" : "Files",
"All files" : "All files",
+ "File could not be found" : "File could not be found",
"Home" : "Home",
"Close" : "Close",
"Favorites" : "Favourites",
diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json
index 6dae8ba41b7..98b3d2000cb 100644
--- a/apps/files/l10n/en_GB.json
+++ b/apps/files/l10n/en_GB.json
@@ -19,6 +19,7 @@
"Invalid directory." : "Invalid directory.",
"Files" : "Files",
"All files" : "All files",
+ "File could not be found" : "File could not be found",
"Home" : "Home",
"Close" : "Close",
"Favorites" : "Favourites",
diff --git a/apps/files/l10n/fi_FI.js b/apps/files/l10n/fi_FI.js
index 325955a5492..8bf1c47612a 100644
--- a/apps/files/l10n/fi_FI.js
+++ b/apps/files/l10n/fi_FI.js
@@ -21,6 +21,7 @@ OC.L10N.register(
"Invalid directory." : "Virheellinen kansio.",
"Files" : "Tiedostot",
"All files" : "Kaikki tiedostot",
+ "File could not be found" : "TIedostoa ei löytynyt",
"Home" : "Koti",
"Close" : "Sulje",
"Favorites" : "Suosikit",
diff --git a/apps/files/l10n/fi_FI.json b/apps/files/l10n/fi_FI.json
index 966ef7074e4..dc8d168ffb5 100644
--- a/apps/files/l10n/fi_FI.json
+++ b/apps/files/l10n/fi_FI.json
@@ -19,6 +19,7 @@
"Invalid directory." : "Virheellinen kansio.",
"Files" : "Tiedostot",
"All files" : "Kaikki tiedostot",
+ "File could not be found" : "TIedostoa ei löytynyt",
"Home" : "Koti",
"Close" : "Sulje",
"Favorites" : "Suosikit",
diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js
index 7d85f952ed4..b560e6623ca 100644
--- a/apps/files/l10n/it.js
+++ b/apps/files/l10n/it.js
@@ -21,6 +21,7 @@ OC.L10N.register(
"Invalid directory." : "Cartella non valida.",
"Files" : "File",
"All files" : "Tutti i file",
+ "File could not be found" : "Il file non può essere trovato",
"Home" : "Home",
"Close" : "Chiudi",
"Favorites" : "Preferiti",
diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json
index ec7003f7382..253fc5198aa 100644
--- a/apps/files/l10n/it.json
+++ b/apps/files/l10n/it.json
@@ -19,6 +19,7 @@
"Invalid directory." : "Cartella non valida.",
"Files" : "File",
"All files" : "Tutti i file",
+ "File could not be found" : "Il file non può essere trovato",
"Home" : "Home",
"Close" : "Chiudi",
"Favorites" : "Preferiti",
diff --git a/apps/files/l10n/lb.js b/apps/files/l10n/lb.js
index d0d40965dab..30a86b000bb 100644
--- a/apps/files/l10n/lb.js
+++ b/apps/files/l10n/lb.js
@@ -21,6 +21,8 @@ OC.L10N.register(
"Unshare" : "Net méi deelen",
"Details" : "Detailer",
"Select" : "Auswielen",
+ "This operation is forbidden" : "Dës Operatioun ass verbueden.",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Dësen Dossier ass net disponibel, w.e.g. kontrolléiert d'Logs oder kontaktéiert den Administrateur",
"Name" : "Numm",
"Size" : "Gréisst",
"Modified" : "Geännert",
diff --git a/apps/files/l10n/lb.json b/apps/files/l10n/lb.json
index d4e81d1d0ba..99a6b4845da 100644
--- a/apps/files/l10n/lb.json
+++ b/apps/files/l10n/lb.json
@@ -19,6 +19,8 @@
"Unshare" : "Net méi deelen",
"Details" : "Detailer",
"Select" : "Auswielen",
+ "This operation is forbidden" : "Dës Operatioun ass verbueden.",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Dësen Dossier ass net disponibel, w.e.g. kontrolléiert d'Logs oder kontaktéiert den Administrateur",
"Name" : "Numm",
"Size" : "Gréisst",
"Modified" : "Geännert",
diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js
index 01259a538ab..a366c6a967c 100644
--- a/apps/files/l10n/pl.js
+++ b/apps/files/l10n/pl.js
@@ -32,6 +32,8 @@ OC.L10N.register(
"Could not get result from server." : "Nie można uzyskać wyniku z serwera.",
"Uploading..." : "Wgrywanie....",
"..." : "...",
+ "{seconds} second{plural_s} left" : "Pozostało sekund: {seconds}",
+ "{seconds}s" : "{seconds} s",
"File upload is in progress. Leaving the page now will cancel the upload." : "Wysyłanie pliku jest w toku. Jeśli opuścisz tę stronę, wysyłanie zostanie przerwane.",
"Actions" : "Akcje",
"Download" : "Pobierz",
@@ -45,6 +47,7 @@ OC.L10N.register(
"Unable to determine date" : "Nie można ustalić daty",
"This operation is forbidden" : "Ta operacja jest niedozwolona",
"This directory is unavailable, please check the logs or contact the administrator" : "Ten folder jest niedostępny, proszę sprawdzić logi lub skontaktować się z administratorem.",
+ "Could not move \"{file}\", target exists" : "Nie można było przenieść „{file}” – plik o takiej nazwie już istnieje",
"Could not move \"{file}\"" : "Nie można było przenieść \"{file}\"",
"Could not create file \"{file}\"" : "Nie można było utworzyć pliku \"{file}\"",
"Could not create file \"{file}\" because it already exists" : "Nie można było utworzyć pliku \"{file}\", ponieważ ten plik już istnieje.",
diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json
index fd4d5116953..05b65b2f84a 100644
--- a/apps/files/l10n/pl.json
+++ b/apps/files/l10n/pl.json
@@ -30,6 +30,8 @@
"Could not get result from server." : "Nie można uzyskać wyniku z serwera.",
"Uploading..." : "Wgrywanie....",
"..." : "...",
+ "{seconds} second{plural_s} left" : "Pozostało sekund: {seconds}",
+ "{seconds}s" : "{seconds} s",
"File upload is in progress. Leaving the page now will cancel the upload." : "Wysyłanie pliku jest w toku. Jeśli opuścisz tę stronę, wysyłanie zostanie przerwane.",
"Actions" : "Akcje",
"Download" : "Pobierz",
@@ -43,6 +45,7 @@
"Unable to determine date" : "Nie można ustalić daty",
"This operation is forbidden" : "Ta operacja jest niedozwolona",
"This directory is unavailable, please check the logs or contact the administrator" : "Ten folder jest niedostępny, proszę sprawdzić logi lub skontaktować się z administratorem.",
+ "Could not move \"{file}\", target exists" : "Nie można było przenieść „{file}” – plik o takiej nazwie już istnieje",
"Could not move \"{file}\"" : "Nie można było przenieść \"{file}\"",
"Could not create file \"{file}\"" : "Nie można było utworzyć pliku \"{file}\"",
"Could not create file \"{file}\" because it already exists" : "Nie można było utworzyć pliku \"{file}\", ponieważ ten plik już istnieje.",
diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js
index d8a7097161d..7bc2a94deb1 100644
--- a/apps/files/l10n/pt_BR.js
+++ b/apps/files/l10n/pt_BR.js
@@ -21,6 +21,7 @@ OC.L10N.register(
"Invalid directory." : "Diretório inválido.",
"Files" : "Arquivos",
"All files" : "Todos os arquivos",
+ "File could not be found" : "O arquivo não foi encontrado",
"Home" : "Home",
"Close" : "Fechar",
"Favorites" : "Favoritos",
diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json
index f5fa97a94af..f16c8c374a6 100644
--- a/apps/files/l10n/pt_BR.json
+++ b/apps/files/l10n/pt_BR.json
@@ -19,6 +19,7 @@
"Invalid directory." : "Diretório inválido.",
"Files" : "Arquivos",
"All files" : "Todos os arquivos",
+ "File could not be found" : "O arquivo não foi encontrado",
"Home" : "Home",
"Close" : "Fechar",
"Favorites" : "Favoritos",
diff --git a/apps/files/l10n/pt_PT.js b/apps/files/l10n/pt_PT.js
index 6418e0ac53c..ee1e3636066 100644
--- a/apps/files/l10n/pt_PT.js
+++ b/apps/files/l10n/pt_PT.js
@@ -1,11 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage not available" : "Armazenamento indisposinvel",
+ "Storage not available" : "Armazenamento indisponível",
"Storage invalid" : "Armazenamento inválido",
"Unknown error" : "Erro desconhecido",
"Unable to set upload directory." : "Não foi possível definir a diretoria de envio.",
- "Invalid Token" : "Token inválido",
+ "Invalid Token" : "Senha Inválida",
"No file was uploaded. Unknown error" : "Não foi enviado nenhum ficheiro. Erro desconhecido",
"There is no error, the file uploaded with success" : "Não ocorreram erros, o ficheiro foi enviado com sucesso",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "O ficheiro enviado excede a diretiva php.ini upload_max_filesize no php.ini",
@@ -34,18 +34,18 @@ OC.L10N.register(
"..." : "...",
"{hours}:{minutes}:{seconds} hour{plural_s} left" : "Tempo restante: {hours}:{minutes}:{seconds} hora{plural_s}",
"{hours}:{minutes}h" : "{hours}:{minutes}h",
- "{minutes}:{seconds} minute{plural_s} left" : "falta: {minutes}:{seconds} minute{plural_s}",
+ "{minutes}:{seconds} minute{plural_s} left" : "faltam: {minutes}:{seconds} minute{plural_s}",
"{minutes}:{seconds}m" : "{minutes}:{seconds}m",
- "{seconds} second{plural_s} left" : "Tempo restante: {seconds} segundo{plural_s}",
+ "{seconds} second{plural_s} left" : "faltam: {seconds} segundo{plural_s}",
"{seconds}s" : "{seconds}s",
"Any moment now..." : "Agora, a qualquer momento...",
"Soon..." : "Brevemente...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"File upload is in progress. Leaving the page now will cancel the upload." : "Envio de ficheiro em progresso. Se deixar a página agora, irá cancelar o envio.",
"Actions" : "Ações",
- "Download" : "Descarregar",
+ "Download" : "Transferir",
"Rename" : "Renomear",
- "Delete" : "Apagar",
+ "Delete" : "Eliminar",
"Disconnect storage" : "Desligue o armazenamento",
"Unshare" : "Cancelar partilha",
"Details" : "Detalhes",
@@ -54,17 +54,17 @@ OC.L10N.register(
"Unable to determine date" : "Não é possível determinar a data",
"This operation is forbidden" : "Esta operação é proibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esta diretoria está indisponível, por favor, verifique os registos ou contacte o administrador",
- "Could not move \"{file}\", target exists" : "Não foi possível mover \"{file}\", alvo já existe",
+ "Could not move \"{file}\", target exists" : "Não foi possível mover \"{file}\", destino já existe",
"Could not move \"{file}\"" : "Não foi possivel mover o ficheiro \"{file}\"",
"{newName} already exists" : "{newName} já existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\", pois já não existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está em uso na pasta \"{dir}\". Por favor escolha um nome diferente.",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\", este já não existe",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está em utilização na pasta \"{dir}\". Por favor, escolha um nome diferente.",
"Could not rename \"{fileName}\"" : "Não foi possível renomear \"{fileName}\"",
"Could not create file \"{file}\"" : "Não foi possível criar o ficheiro \"{file}\"",
"Could not create file \"{file}\" because it already exists" : "Não foi possível criar o ficheiro \"{file}\", porque este já existe",
"Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"",
"Could not create folder \"{dir}\" because it already exists" : "Não foi possível criar a pasta \"{dir}\", porque esta já existe",
- "Error deleting file \"{fileName}\"." : "Erro ao apagar o ficheiro \"{fileName}\".",
+ "Error deleting file \"{fileName}\"." : "Erro ao eliminar o ficheiro \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Nenhumas entradas nesta pasta correspondem a '{filter}'",
"Name" : "Nome",
"Size" : "Tamanho",
@@ -86,17 +86,17 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Nos Favoritos",
"Favorite" : "Favorito",
- "Local link" : "Ligação local",
+ "Local link" : "Hiperligação local",
"Folder" : "Pasta",
- "New folder" : "Nova Pasta",
+ "New folder" : "Nova pasta",
"{newname} already exists" : "{newname} já existe",
"Upload" : "Enviar",
- "An error occurred while trying to update the tags" : "Ocorreu um erro ao tentar atualizar as tags",
+ "An error occurred while trying to update the tags" : "Ocorreu um erro ao tentar atualizar as etiquetas",
"A new file or folder has been <strong>created</strong>" : "Foi <strong>criado</strong> um novo ficheiro ou pasta",
"A file or folder has been <strong>changed</strong>" : "Foi <strong>alterado</strong> um ficheiro ou pasta",
- "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limite notificações sobre a criação e modificações nos seus <strong>ficheiros favoritos</strong> <em>(apenas Stream)</em>",
- "A file or folder has been <strong>deleted</strong>" : "Foi <strong>apagado</strong> um ficheiro ou pasta",
- "A file or folder has been <strong>restored</strong>" : "Foi <strong>restaurado(a)</strong> um ficheiro ou pasta",
+ "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limite as notificações sobre a criação e alterações para os seus <strong>ficheiros favoritos</strong> <em>(apenas Emissão)</em>",
+ "A file or folder has been <strong>deleted</strong>" : "Foi <strong>eliminado</strong> um ficheiro ou pasta",
+ "A file or folder has been <strong>restored</strong>" : "Foi <strong>restaurado</strong> um ficheiro ou pasta",
"You created %1$s" : "Criou %1$s",
"%2$s created %1$s" : "%2$s criou %1$s",
"%1$s was created in a public folder" : "%1$s foi criado numa pasta pública",
@@ -116,14 +116,14 @@ OC.L10N.register(
"Save" : "Guardar",
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Com o PHP-FPM poderá demorar 5 minutos até que as alterações sejam aplicadas.",
"Missing permissions to edit from here." : "Faltam permissões para editar a partir daqui.",
- "Settings" : "Definições",
+ "Settings" : "Configurações",
"Show hidden files" : "Mostrar ficheiros ocultos",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Utilize este endereço para <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">aceder aos seus ficheiros via WebDAV</a>",
"No files in here" : "Nenhuns ficheiros aqui",
"Upload some content or sync with your devices!" : "Envie algum conteúdo ou sincronize com os seus dispositivos!",
"No entries found in this folder" : "Não foram encontradas entradas nesta pasta",
- "Select all" : "Seleccionar todos",
+ "Select all" : "Selecionar todos",
"Upload too large" : "Envio muito grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que está a tentar enviar excedem o tamanho máximo para os envios de ficheiro neste servidor.",
"No favorites" : "Sem favoritos",
diff --git a/apps/files/l10n/pt_PT.json b/apps/files/l10n/pt_PT.json
index bd50b941765..e08a3841470 100644
--- a/apps/files/l10n/pt_PT.json
+++ b/apps/files/l10n/pt_PT.json
@@ -1,9 +1,9 @@
{ "translations": {
- "Storage not available" : "Armazenamento indisposinvel",
+ "Storage not available" : "Armazenamento indisponível",
"Storage invalid" : "Armazenamento inválido",
"Unknown error" : "Erro desconhecido",
"Unable to set upload directory." : "Não foi possível definir a diretoria de envio.",
- "Invalid Token" : "Token inválido",
+ "Invalid Token" : "Senha Inválida",
"No file was uploaded. Unknown error" : "Não foi enviado nenhum ficheiro. Erro desconhecido",
"There is no error, the file uploaded with success" : "Não ocorreram erros, o ficheiro foi enviado com sucesso",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "O ficheiro enviado excede a diretiva php.ini upload_max_filesize no php.ini",
@@ -32,18 +32,18 @@
"..." : "...",
"{hours}:{minutes}:{seconds} hour{plural_s} left" : "Tempo restante: {hours}:{minutes}:{seconds} hora{plural_s}",
"{hours}:{minutes}h" : "{hours}:{minutes}h",
- "{minutes}:{seconds} minute{plural_s} left" : "falta: {minutes}:{seconds} minute{plural_s}",
+ "{minutes}:{seconds} minute{plural_s} left" : "faltam: {minutes}:{seconds} minute{plural_s}",
"{minutes}:{seconds}m" : "{minutes}:{seconds}m",
- "{seconds} second{plural_s} left" : "Tempo restante: {seconds} segundo{plural_s}",
+ "{seconds} second{plural_s} left" : "faltam: {seconds} segundo{plural_s}",
"{seconds}s" : "{seconds}s",
"Any moment now..." : "Agora, a qualquer momento...",
"Soon..." : "Brevemente...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"File upload is in progress. Leaving the page now will cancel the upload." : "Envio de ficheiro em progresso. Se deixar a página agora, irá cancelar o envio.",
"Actions" : "Ações",
- "Download" : "Descarregar",
+ "Download" : "Transferir",
"Rename" : "Renomear",
- "Delete" : "Apagar",
+ "Delete" : "Eliminar",
"Disconnect storage" : "Desligue o armazenamento",
"Unshare" : "Cancelar partilha",
"Details" : "Detalhes",
@@ -52,17 +52,17 @@
"Unable to determine date" : "Não é possível determinar a data",
"This operation is forbidden" : "Esta operação é proibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esta diretoria está indisponível, por favor, verifique os registos ou contacte o administrador",
- "Could not move \"{file}\", target exists" : "Não foi possível mover \"{file}\", alvo já existe",
+ "Could not move \"{file}\", target exists" : "Não foi possível mover \"{file}\", destino já existe",
"Could not move \"{file}\"" : "Não foi possivel mover o ficheiro \"{file}\"",
"{newName} already exists" : "{newName} já existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\", pois já não existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está em uso na pasta \"{dir}\". Por favor escolha um nome diferente.",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\", este já não existe",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está em utilização na pasta \"{dir}\". Por favor, escolha um nome diferente.",
"Could not rename \"{fileName}\"" : "Não foi possível renomear \"{fileName}\"",
"Could not create file \"{file}\"" : "Não foi possível criar o ficheiro \"{file}\"",
"Could not create file \"{file}\" because it already exists" : "Não foi possível criar o ficheiro \"{file}\", porque este já existe",
"Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"",
"Could not create folder \"{dir}\" because it already exists" : "Não foi possível criar a pasta \"{dir}\", porque esta já existe",
- "Error deleting file \"{fileName}\"." : "Erro ao apagar o ficheiro \"{fileName}\".",
+ "Error deleting file \"{fileName}\"." : "Erro ao eliminar o ficheiro \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Nenhumas entradas nesta pasta correspondem a '{filter}'",
"Name" : "Nome",
"Size" : "Tamanho",
@@ -84,17 +84,17 @@
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Nos Favoritos",
"Favorite" : "Favorito",
- "Local link" : "Ligação local",
+ "Local link" : "Hiperligação local",
"Folder" : "Pasta",
- "New folder" : "Nova Pasta",
+ "New folder" : "Nova pasta",
"{newname} already exists" : "{newname} já existe",
"Upload" : "Enviar",
- "An error occurred while trying to update the tags" : "Ocorreu um erro ao tentar atualizar as tags",
+ "An error occurred while trying to update the tags" : "Ocorreu um erro ao tentar atualizar as etiquetas",
"A new file or folder has been <strong>created</strong>" : "Foi <strong>criado</strong> um novo ficheiro ou pasta",
"A file or folder has been <strong>changed</strong>" : "Foi <strong>alterado</strong> um ficheiro ou pasta",
- "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limite notificações sobre a criação e modificações nos seus <strong>ficheiros favoritos</strong> <em>(apenas Stream)</em>",
- "A file or folder has been <strong>deleted</strong>" : "Foi <strong>apagado</strong> um ficheiro ou pasta",
- "A file or folder has been <strong>restored</strong>" : "Foi <strong>restaurado(a)</strong> um ficheiro ou pasta",
+ "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limite as notificações sobre a criação e alterações para os seus <strong>ficheiros favoritos</strong> <em>(apenas Emissão)</em>",
+ "A file or folder has been <strong>deleted</strong>" : "Foi <strong>eliminado</strong> um ficheiro ou pasta",
+ "A file or folder has been <strong>restored</strong>" : "Foi <strong>restaurado</strong> um ficheiro ou pasta",
"You created %1$s" : "Criou %1$s",
"%2$s created %1$s" : "%2$s criou %1$s",
"%1$s was created in a public folder" : "%1$s foi criado numa pasta pública",
@@ -114,14 +114,14 @@
"Save" : "Guardar",
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Com o PHP-FPM poderá demorar 5 minutos até que as alterações sejam aplicadas.",
"Missing permissions to edit from here." : "Faltam permissões para editar a partir daqui.",
- "Settings" : "Definições",
+ "Settings" : "Configurações",
"Show hidden files" : "Mostrar ficheiros ocultos",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Utilize este endereço para <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">aceder aos seus ficheiros via WebDAV</a>",
"No files in here" : "Nenhuns ficheiros aqui",
"Upload some content or sync with your devices!" : "Envie algum conteúdo ou sincronize com os seus dispositivos!",
"No entries found in this folder" : "Não foram encontradas entradas nesta pasta",
- "Select all" : "Seleccionar todos",
+ "Select all" : "Selecionar todos",
"Upload too large" : "Envio muito grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que está a tentar enviar excedem o tamanho máximo para os envios de ficheiro neste servidor.",
"No favorites" : "Sem favoritos",
diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js
index 1c54751807b..1121536e719 100644
--- a/apps/files/l10n/ru.js
+++ b/apps/files/l10n/ru.js
@@ -32,12 +32,12 @@ OC.L10N.register(
"Could not get result from server." : "Не удалось получить ответ от сервера.",
"Uploading..." : "Загрузка...",
"..." : "...",
- "{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} час{plural_s} осталось",
- "{hours}:{minutes}h" : "{hours}:{minutes}h",
- "{minutes}:{seconds} minute{plural_s} left" : "{minutes}:{seconds} минут{plural_s} осталось",
- "{minutes}:{seconds}m" : "{minutes}:{seconds}m",
- "{seconds} second{plural_s} left" : "{seconds} секунд{plural_s} осталось",
- "{seconds}s" : "{seconds}s",
+ "{hours}:{minutes}:{seconds} hour{plural_s} left" : "Осталось часов {hours}:{minutes}:{seconds} {plural_s}",
+ "{hours}:{minutes}h" : "{hours}:{minutes}ч",
+ "{minutes}:{seconds} minute{plural_s} left" : "Осталось минут {minutes}:{seconds} {plural_s}",
+ "{minutes}:{seconds}m" : "{minutes}:{seconds}м",
+ "{seconds} second{plural_s} left" : "Осталось секунд {seconds} {plural_s}",
+ "{seconds}s" : "{seconds}с",
"Any moment now..." : "В любой момент...",
"Soon..." : "Скоро...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} из {totalSize} ({bitrate})",
@@ -50,7 +50,7 @@ OC.L10N.register(
"Unshare" : "Закрыть доступ",
"Details" : "Подробно",
"Select" : "Выбрать",
- "Pending" : "Ожидание",
+ "Pending" : "Ожидается",
"Unable to determine date" : "Невозможно определить дату",
"This operation is forbidden" : "Операция запрещена",
"This directory is unavailable, please check the logs or contact the administrator" : "Директория недоступна, пожалуйста проверьте журнал сообщений или свяжитесь с администратором",
diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json
index 88cae3d0577..41162bf5c92 100644
--- a/apps/files/l10n/ru.json
+++ b/apps/files/l10n/ru.json
@@ -30,12 +30,12 @@
"Could not get result from server." : "Не удалось получить ответ от сервера.",
"Uploading..." : "Загрузка...",
"..." : "...",
- "{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} час{plural_s} осталось",
- "{hours}:{minutes}h" : "{hours}:{minutes}h",
- "{minutes}:{seconds} minute{plural_s} left" : "{minutes}:{seconds} минут{plural_s} осталось",
- "{minutes}:{seconds}m" : "{minutes}:{seconds}m",
- "{seconds} second{plural_s} left" : "{seconds} секунд{plural_s} осталось",
- "{seconds}s" : "{seconds}s",
+ "{hours}:{minutes}:{seconds} hour{plural_s} left" : "Осталось часов {hours}:{minutes}:{seconds} {plural_s}",
+ "{hours}:{minutes}h" : "{hours}:{minutes}ч",
+ "{minutes}:{seconds} minute{plural_s} left" : "Осталось минут {minutes}:{seconds} {plural_s}",
+ "{minutes}:{seconds}m" : "{minutes}:{seconds}м",
+ "{seconds} second{plural_s} left" : "Осталось секунд {seconds} {plural_s}",
+ "{seconds}s" : "{seconds}с",
"Any moment now..." : "В любой момент...",
"Soon..." : "Скоро...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} из {totalSize} ({bitrate})",
@@ -48,7 +48,7 @@
"Unshare" : "Закрыть доступ",
"Details" : "Подробно",
"Select" : "Выбрать",
- "Pending" : "Ожидание",
+ "Pending" : "Ожидается",
"Unable to determine date" : "Невозможно определить дату",
"This operation is forbidden" : "Операция запрещена",
"This directory is unavailable, please check the logs or contact the administrator" : "Директория недоступна, пожалуйста проверьте журнал сообщений или свяжитесь с администратором",
diff --git a/apps/files/l10n/sq.js b/apps/files/l10n/sq.js
index c1485c154d7..b104afdd723 100644
--- a/apps/files/l10n/sq.js
+++ b/apps/files/l10n/sq.js
@@ -21,6 +21,7 @@ OC.L10N.register(
"Invalid directory." : "Drejtori e pavlefshme.",
"Files" : "Kartela",
"All files" : "Krejt kartelat",
+ "File could not be found" : "Kartela s’u gjet dot",
"Home" : "Kreu",
"Close" : "Mbylle",
"Favorites" : "Të parapëlqyera",
diff --git a/apps/files/l10n/sq.json b/apps/files/l10n/sq.json
index 9b40e9f7c9d..80e5f104fa6 100644
--- a/apps/files/l10n/sq.json
+++ b/apps/files/l10n/sq.json
@@ -19,6 +19,7 @@
"Invalid directory." : "Drejtori e pavlefshme.",
"Files" : "Kartela",
"All files" : "Krejt kartelat",
+ "File could not be found" : "Kartela s’u gjet dot",
"Home" : "Kreu",
"Close" : "Mbylle",
"Favorites" : "Të parapëlqyera",
diff --git a/apps/files/lib/Controller/ViewController.php b/apps/files/lib/Controller/ViewController.php
index 1b0903b41d3..18b6cf719c5 100644
--- a/apps/files/lib/Controller/ViewController.php
+++ b/apps/files/lib/Controller/ViewController.php
@@ -27,9 +27,9 @@ namespace OCA\Files\Controller;
use OC\AppFramework\Http\Request;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\ContentSecurityPolicy;
-use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\TemplateResponse;
+use OCP\Files\NotFoundException;
use OCP\IConfig;
use OCP\IL10N;
use OCP\INavigationManager;
@@ -37,7 +37,6 @@ use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\IUserSession;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
-use OCP\AppFramework\Http\NotFoundResponse;
use OCP\Files\Folder;
use OCP\App\IAppManager;
@@ -142,11 +141,15 @@ class ViewController extends Controller {
* @param string $view
* @param string $fileid
* @return TemplateResponse
- * @throws \OCP\Files\NotFoundException
*/
public function index($dir = '', $view = '', $fileid = null) {
+ $fileNotFound = false;
if ($fileid !== null) {
- return $this->showFile($fileid);
+ try {
+ return $this->showFile($fileid);
+ } catch (NotFoundException $e) {
+ $fileNotFound = true;
+ }
}
$nav = new \OCP\Template('files', 'appnavigation', '');
@@ -245,6 +248,7 @@ class ViewController extends Controller {
$params['defaultFileSortingDirection'] = $this->config->getUserValue($user, 'files', 'file_sorting_direction', 'asc');
$showHidden = (bool) $this->config->getUserValue($this->userSession->getUser()->getUID(), 'files', 'show_hidden', false);
$params['showHiddenFiles'] = $showHidden ? 1 : 0;
+ $params['fileNotFound'] = $fileNotFound ? 1 : 0;
$params['appNavigation'] = $nav;
$params['appContents'] = $contentItems;
$this->navigationManager->setActiveEntry('files_index');
@@ -265,40 +269,37 @@ class ViewController extends Controller {
* Redirects to the file list and highlight the given file id
*
* @param string $fileId file id to show
- * @return Response redirect response or not found response
+ * @return RedirectResponse redirect response or not found response
+ * @throws \OCP\Files\NotFoundException
*
* @NoCSRFRequired
* @NoAdminRequired
*/
public function showFile($fileId) {
- try {
- $uid = $this->userSession->getUser()->getUID();
- $baseFolder = $this->rootFolder->get($uid . '/files/');
- $files = $baseFolder->getById($fileId);
- $params = [];
+ $uid = $this->userSession->getUser()->getUID();
+ $baseFolder = $this->rootFolder->get($uid . '/files/');
+ $files = $baseFolder->getById($fileId);
+ $params = [];
- if (empty($files) && $this->appManager->isEnabledForUser('files_trashbin')) {
- $baseFolder = $this->rootFolder->get($uid . '/files_trashbin/files/');
- $files = $baseFolder->getById($fileId);
- $params['view'] = 'trashbin';
- }
+ if (empty($files) && $this->appManager->isEnabledForUser('files_trashbin')) {
+ $baseFolder = $this->rootFolder->get($uid . '/files_trashbin/files/');
+ $files = $baseFolder->getById($fileId);
+ $params['view'] = 'trashbin';
+ }
- if (!empty($files)) {
- $file = current($files);
- if ($file instanceof Folder) {
- // set the full path to enter the folder
- $params['dir'] = $baseFolder->getRelativePath($file->getPath());
- } else {
- // set parent path as dir
- $params['dir'] = $baseFolder->getRelativePath($file->getParent()->getPath());
- // and scroll to the entry
- $params['scrollto'] = $file->getName();
- }
- return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index', $params));
+ if (!empty($files)) {
+ $file = current($files);
+ if ($file instanceof Folder) {
+ // set the full path to enter the folder
+ $params['dir'] = $baseFolder->getRelativePath($file->getPath());
+ } else {
+ // set parent path as dir
+ $params['dir'] = $baseFolder->getRelativePath($file->getParent()->getPath());
+ // and scroll to the entry
+ $params['scrollto'] = $file->getName();
}
- } catch (\OCP\Files\NotFoundException $e) {
- return new NotFoundResponse();
+ return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index', $params));
}
- return new NotFoundResponse();
+ throw new \OCP\Files\NotFoundException();
}
}
diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php
index 7281edd3aec..42ce941a4a5 100644
--- a/apps/files/templates/index.php
+++ b/apps/files/templates/index.php
@@ -14,6 +14,7 @@
<input type="hidden" name="usedSpacePercent" id="usedSpacePercent" value="<?php p($_['usedSpacePercent']); ?>" />
<input type="hidden" name="owner" id="owner" value="<?php p($_['owner']); ?>" />
<input type="hidden" name="ownerDisplayName" id="ownerDisplayName" value="<?php p($_['ownerDisplayName']); ?>" />
+<input type="hidden" name="fileNotFound" id="fileNotFound" value="<?php p($_['fileNotFound']); ?>"" />
<?php if (!$_['isPublic']) :?>
<input type="hidden" name="mailNotificationEnabled" id="mailNotificationEnabled" value="<?php p($_['mailNotificationEnabled']) ?>" />
<input type="hidden" name="mailPublicNotificationEnabled" id="mailPublicNotificationEnabled" value="<?php p($_['mailPublicNotificationEnabled']) ?>" />
diff --git a/apps/files/tests/Controller/ViewControllerTest.php b/apps/files/tests/Controller/ViewControllerTest.php
index 049f44fc0af..34c40ecea5c 100644
--- a/apps/files/tests/Controller/ViewControllerTest.php
+++ b/apps/files/tests/Controller/ViewControllerTest.php
@@ -26,6 +26,7 @@ namespace OCA\Files\Tests\Controller;
use OCA\Files\Controller\ViewController;
use OCP\AppFramework\Http;
+use OCP\Files\NotFoundException;
use OCP\IUser;
use OCP\Template;
use Test\TestCase;
@@ -259,7 +260,8 @@ class ViewControllerTest extends TestCase {
'isPublic' => false,
'defaultFileSorting' => 'name',
'defaultFileSortingDirection' => 'asc',
- 'showHiddenFiles' => false,
+ 'showHiddenFiles' => 0,
+ 'fileNotFound' => 0,
'mailNotificationEnabled' => 'no',
'mailPublicNotificationEnabled' => 'no',
'allowShareWithLink' => 'yes',
@@ -410,11 +412,14 @@ class ViewControllerTest extends TestCase {
->with(123)
->will($this->returnValue([]));
- $expected = new Http\NotFoundResponse();
if ($useShowFile) {
- $this->assertEquals($expected, $this->viewController->showFile(123));
+ $this->setExpectedException('OCP\Files\NotFoundException');
+ $this->viewController->showFile(123);
} else {
- $this->assertEquals($expected, $this->viewController->index('/whatever', '', '123'));
+ $response = $this->viewController->index('MyDir', 'MyView', '123');
+ $this->assertInstanceOf('OCP\AppFramework\Http\TemplateResponse', $response);
+ $params = $response->getParams();
+ $this->assertEquals(1, $params['fileNotFound']);
}
}
diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js
index 8d2cb52d67c..2477f513db3 100644
--- a/apps/files_external/js/settings.js
+++ b/apps/files_external/js/settings.js
@@ -299,7 +299,8 @@ StorageConfig.prototype = {
mountPoint: this.mountPoint,
backend: this.backend,
authMechanism: this.authMechanism,
- backendOptions: this.backendOptions
+ backendOptions: this.backendOptions,
+ testOnly: true
};
if (this.id) {
data.id = this.id;
@@ -326,6 +327,7 @@ StorageConfig.prototype = {
$.ajax({
type: 'GET',
url: OC.generateUrl(this._url + '/{id}', {id: this.id}),
+ data: {'testOnly': true},
success: options.success,
error: options.error
});
@@ -908,6 +910,7 @@ MountConfigListView.prototype = _.extend({
$.ajax({
type: 'GET',
url: OC.generateUrl('apps/files_external/userglobalstorages'),
+ data: {'testOnly' : true},
contentType: 'application/json',
success: function(result) {
var onCompletion = jQuery.Deferred();
diff --git a/apps/files_external/js/statusmanager.js b/apps/files_external/js/statusmanager.js
index 118ec17d246..91974f2d04d 100644
--- a/apps/files_external/js/statusmanager.js
+++ b/apps/files_external/js/statusmanager.js
@@ -78,6 +78,7 @@ OCA.External.StatusManager = {
defObj = $.ajax({
type: 'GET',
url: OC.webroot + '/index.php/apps/files_external/' + ((mountData.type === 'personal') ? 'userstorages' : 'userglobalstorages') + '/' + mountData.id,
+ data: {'testOnly' : false},
success: function (response) {
if (response && response.status === 0) {
self.mountStatus[mountData.mount_point] = response;
diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js
index 9bec74126bd..f75cec87c11 100644
--- a/apps/files_external/l10n/fr.js
+++ b/apps/files_external/l10n/fr.js
@@ -18,6 +18,7 @@ OC.L10N.register(
"Error generating key pair" : "Erreur lors de la génération des clés",
"All users. Type to select user or group." : "Tous les utilisateurs. Cliquez ici pour restreindre.",
"(group)" : "(groupe)",
+ "Compatibility with Mac NFD encoding (slow)" : "Compatibilité avec l'encodage Mac NFD (lent)",
"Admin defined" : "Défini par l'administrateur",
"Saved" : "Sauvegardé",
"Empty response from the server" : "Réponse vide du serveur",
diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json
index 71f2f05462c..856f6b06d9a 100644
--- a/apps/files_external/l10n/fr.json
+++ b/apps/files_external/l10n/fr.json
@@ -16,6 +16,7 @@
"Error generating key pair" : "Erreur lors de la génération des clés",
"All users. Type to select user or group." : "Tous les utilisateurs. Cliquez ici pour restreindre.",
"(group)" : "(groupe)",
+ "Compatibility with Mac NFD encoding (slow)" : "Compatibilité avec l'encodage Mac NFD (lent)",
"Admin defined" : "Défini par l'administrateur",
"Saved" : "Sauvegardé",
"Empty response from the server" : "Réponse vide du serveur",
diff --git a/apps/files_external/l10n/pl.js b/apps/files_external/l10n/pl.js
index 0ba2646601b..00ae59b27c6 100644
--- a/apps/files_external/l10n/pl.js
+++ b/apps/files_external/l10n/pl.js
@@ -2,6 +2,7 @@ OC.L10N.register(
"files_external",
{
"Fetching access tokens failed. Verify that your app key and secret are correct." : "Otrzymano błędne żądanie tokenów. Sprawdź, czy klucz aplikacji oraz klucz poufny są poprawne.",
+ "Please provide a valid app key and secret." : "Proszę podać prawidłowy klucz aplikacji i klucz sekretny.",
"Step 1 failed. Exception: %s" : "Krok 1 błędny. Błąd: %s",
"Step 2 failed. Exception: %s" : "Krok 2 błędny. Błąd: %s",
"External storage" : "Zewnętrzne zasoby dyskowe",
@@ -15,6 +16,7 @@ OC.L10N.register(
"Saved" : "Zapisano",
"Username" : "Nazwa użytkownika",
"Password" : "Hasło",
+ "Credentials required" : "Wymagane poświadczenia",
"Save" : "Zapisz",
"Storage with id \"%i\" not found" : "Id magazynu nie został znaleziony",
"Invalid mount point" : "Nieprawidłowy punkt montowania",
diff --git a/apps/files_external/l10n/pl.json b/apps/files_external/l10n/pl.json
index 8809813c9ba..235de7e9d10 100644
--- a/apps/files_external/l10n/pl.json
+++ b/apps/files_external/l10n/pl.json
@@ -1,5 +1,6 @@
{ "translations": {
"Fetching access tokens failed. Verify that your app key and secret are correct." : "Otrzymano błędne żądanie tokenów. Sprawdź, czy klucz aplikacji oraz klucz poufny są poprawne.",
+ "Please provide a valid app key and secret." : "Proszę podać prawidłowy klucz aplikacji i klucz sekretny.",
"Step 1 failed. Exception: %s" : "Krok 1 błędny. Błąd: %s",
"Step 2 failed. Exception: %s" : "Krok 2 błędny. Błąd: %s",
"External storage" : "Zewnętrzne zasoby dyskowe",
@@ -13,6 +14,7 @@
"Saved" : "Zapisano",
"Username" : "Nazwa użytkownika",
"Password" : "Hasło",
+ "Credentials required" : "Wymagane poświadczenia",
"Save" : "Zapisz",
"Storage with id \"%i\" not found" : "Id magazynu nie został znaleziony",
"Invalid mount point" : "Nieprawidłowy punkt montowania",
diff --git a/apps/files_external/l10n/pt_PT.js b/apps/files_external/l10n/pt_PT.js
index 9d3998d903b..68f183a36b3 100644
--- a/apps/files_external/l10n/pt_PT.js
+++ b/apps/files_external/l10n/pt_PT.js
@@ -7,13 +7,13 @@ OC.L10N.register(
"Step 1 failed. Exception: %s" : "Passo 1 falhou. Exceção: %s",
"Step 2 failed. Exception: %s" : "Passo 2 falhou. Exceção: %s",
"External storage" : "Armazenamento Externo",
- "Dropbox App Configuration" : "Configuração da app Dropbox",
- "Google Drive App Configuration" : "Configuração da app Google Drive",
+ "Dropbox App Configuration" : "Configuração da aplicação Dropbox",
+ "Google Drive App Configuration" : "Configuração da aplicação Google Drive",
"Personal" : "Pessoal",
"System" : "Sistema",
"Grant access" : "Conceder acesso",
- "Error configuring OAuth1" : "Erro de configuração OAuth1",
- "Error configuring OAuth2" : "Erro de configuração OAuth2",
+ "Error configuring OAuth1" : "Erro ao configurar OAuth1",
+ "Error configuring OAuth2" : "Erro ao configurar OAuth2",
"Generate keys" : "Gerar chaves",
"Error generating key pair" : "Erro ao gerar chave par",
"All users. Type to select user or group." : "Todos os utilizadores. Digite para selecionar o utilizador ou grupo.",
@@ -27,14 +27,14 @@ OC.L10N.register(
"Couldn't get the list of external mount points: {type}" : "Não foi possível conseguir a lista de pontos de montagem externos: {type}",
"There was an error with message: " : "Houve um erro com a mensagem:",
"External mount error" : "Erro de montagem externa",
- "external-storage" : "Armazenamento Externo",
+ "external-storage" : "armazenamento externo",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Não foi possível conseguir a lista de pontos de montagem Windows na rede: resposta vazia do servidor",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alguns dos pontos de montagem externos configurados não estão conectados. Por favor, clique na fila vermelha para mais informação",
"Please enter the credentials for the {mount} mount" : "Por favor, introduza as credenciais para {mount}",
"Username" : "Nome de utilizador",
"Password" : "Palavra-passe",
"Credentials saved" : "Credenciais guardadas",
- "Credentials saving failed" : "Falha ao salvar credenciais",
+ "Credentials saving failed" : "Falha ao guardar as credenciais",
"Credentials required" : "Credenciais necessárias",
"Save" : "Guardar",
"Storage with id \"%i\" not found" : "Não foi encontrado o armazenamento com a id. \"%i\"",
@@ -49,7 +49,7 @@ OC.L10N.register(
"Insufficient data: %s" : "Dados insuficientes: %s",
"%s" : "%s",
"Storage with id \"%i\" is not user editable" : "Armazenamento com id \"%i\" não é editável pelo utilizador",
- "Access key" : "Código de acesso",
+ "Access key" : "Chave de acesso",
"Secret key" : "Código secreto",
"Builtin" : "Integrado",
"None" : "Nenhum",
diff --git a/apps/files_external/l10n/pt_PT.json b/apps/files_external/l10n/pt_PT.json
index fab0f05a830..93922c67762 100644
--- a/apps/files_external/l10n/pt_PT.json
+++ b/apps/files_external/l10n/pt_PT.json
@@ -5,13 +5,13 @@
"Step 1 failed. Exception: %s" : "Passo 1 falhou. Exceção: %s",
"Step 2 failed. Exception: %s" : "Passo 2 falhou. Exceção: %s",
"External storage" : "Armazenamento Externo",
- "Dropbox App Configuration" : "Configuração da app Dropbox",
- "Google Drive App Configuration" : "Configuração da app Google Drive",
+ "Dropbox App Configuration" : "Configuração da aplicação Dropbox",
+ "Google Drive App Configuration" : "Configuração da aplicação Google Drive",
"Personal" : "Pessoal",
"System" : "Sistema",
"Grant access" : "Conceder acesso",
- "Error configuring OAuth1" : "Erro de configuração OAuth1",
- "Error configuring OAuth2" : "Erro de configuração OAuth2",
+ "Error configuring OAuth1" : "Erro ao configurar OAuth1",
+ "Error configuring OAuth2" : "Erro ao configurar OAuth2",
"Generate keys" : "Gerar chaves",
"Error generating key pair" : "Erro ao gerar chave par",
"All users. Type to select user or group." : "Todos os utilizadores. Digite para selecionar o utilizador ou grupo.",
@@ -25,14 +25,14 @@
"Couldn't get the list of external mount points: {type}" : "Não foi possível conseguir a lista de pontos de montagem externos: {type}",
"There was an error with message: " : "Houve um erro com a mensagem:",
"External mount error" : "Erro de montagem externa",
- "external-storage" : "Armazenamento Externo",
+ "external-storage" : "armazenamento externo",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Não foi possível conseguir a lista de pontos de montagem Windows na rede: resposta vazia do servidor",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alguns dos pontos de montagem externos configurados não estão conectados. Por favor, clique na fila vermelha para mais informação",
"Please enter the credentials for the {mount} mount" : "Por favor, introduza as credenciais para {mount}",
"Username" : "Nome de utilizador",
"Password" : "Palavra-passe",
"Credentials saved" : "Credenciais guardadas",
- "Credentials saving failed" : "Falha ao salvar credenciais",
+ "Credentials saving failed" : "Falha ao guardar as credenciais",
"Credentials required" : "Credenciais necessárias",
"Save" : "Guardar",
"Storage with id \"%i\" not found" : "Não foi encontrado o armazenamento com a id. \"%i\"",
@@ -47,7 +47,7 @@
"Insufficient data: %s" : "Dados insuficientes: %s",
"%s" : "%s",
"Storage with id \"%i\" is not user editable" : "Armazenamento com id \"%i\" não é editável pelo utilizador",
- "Access key" : "Código de acesso",
+ "Access key" : "Chave de acesso",
"Secret key" : "Código secreto",
"Builtin" : "Integrado",
"None" : "Nenhum",
diff --git a/apps/files_external/lib/Controller/GlobalStoragesController.php b/apps/files_external/lib/Controller/GlobalStoragesController.php
index 6f9278ce6f1..471e3b51593 100644
--- a/apps/files_external/lib/Controller/GlobalStoragesController.php
+++ b/apps/files_external/lib/Controller/GlobalStoragesController.php
@@ -139,7 +139,8 @@ class GlobalStoragesController extends StoragesController {
$mountOptions,
$applicableUsers,
$applicableGroups,
- $priority
+ $priority,
+ $testOnly = true
) {
$storage = $this->createStorage(
$mountPoint,
@@ -172,7 +173,7 @@ class GlobalStoragesController extends StoragesController {
);
}
- $this->updateStorageStatus($storage);
+ $this->updateStorageStatus($storage, $testOnly);
return new DataResponse(
$storage,
diff --git a/apps/files_external/lib/Controller/StoragesController.php b/apps/files_external/lib/Controller/StoragesController.php
index aa6a04ecb8d..e50426f4888 100644
--- a/apps/files_external/lib/Controller/StoragesController.php
+++ b/apps/files_external/lib/Controller/StoragesController.php
@@ -238,7 +238,7 @@ abstract class StoragesController extends Controller {
*
* @param StorageConfig $storage storage configuration
*/
- protected function updateStorageStatus(StorageConfig &$storage) {
+ protected function updateStorageStatus(StorageConfig &$storage, $testOnly = true) {
try {
$this->manipulateStorageConfig($storage);
@@ -249,7 +249,8 @@ abstract class StoragesController extends Controller {
\OC_Mount_Config::getBackendStatus(
$backend->getStorageClass(),
$storage->getBackendOptions(),
- false
+ false,
+ $testOnly
)
);
} catch (InsufficientDataForMeaningfulAnswerException $e) {
@@ -293,11 +294,11 @@ abstract class StoragesController extends Controller {
*
* @return DataResponse
*/
- public function show($id) {
+ public function show($id, $testOnly = true) {
try {
$storage = $this->service->getStorage($id);
- $this->updateStorageStatus($storage);
+ $this->updateStorageStatus($storage, $testOnly);
} catch (NotFoundException $e) {
return new DataResponse(
[
diff --git a/apps/files_external/lib/Controller/UserGlobalStoragesController.php b/apps/files_external/lib/Controller/UserGlobalStoragesController.php
index 1c94a1e9635..f65e578507d 100644
--- a/apps/files_external/lib/Controller/UserGlobalStoragesController.php
+++ b/apps/files_external/lib/Controller/UserGlobalStoragesController.php
@@ -111,11 +111,11 @@ class UserGlobalStoragesController extends StoragesController {
*
* @NoAdminRequired
*/
- public function show($id) {
+ public function show($id, $testOnly = true) {
try {
$storage = $this->service->getStorage($id);
- $this->updateStorageStatus($storage);
+ $this->updateStorageStatus($storage, $testOnly);
} catch (NotFoundException $e) {
return new DataResponse(
[
@@ -146,7 +146,8 @@ class UserGlobalStoragesController extends StoragesController {
*/
public function update(
$id,
- $backendOptions
+ $backendOptions,
+ $testOnly = true
) {
try {
$storage = $this->service->getStorage($id);
@@ -171,7 +172,7 @@ class UserGlobalStoragesController extends StoragesController {
);
}
- $this->updateStorageStatus($storage);
+ $this->updateStorageStatus($storage, $testOnly);
$this->sanitizeStorage($storage);
return new DataResponse(
diff --git a/apps/files_external/lib/Controller/UserStoragesController.php b/apps/files_external/lib/Controller/UserStoragesController.php
index 936da7ec5e2..28663090e89 100644
--- a/apps/files_external/lib/Controller/UserStoragesController.php
+++ b/apps/files_external/lib/Controller/UserStoragesController.php
@@ -101,8 +101,8 @@ class UserStoragesController extends StoragesController {
*
* {@inheritdoc}
*/
- public function show($id) {
- return parent::show($id);
+ public function show($id, $testOnly = true) {
+ return parent::show($id, $testOnly);
}
/**
@@ -170,7 +170,8 @@ class UserStoragesController extends StoragesController {
$backend,
$authMechanism,
$backendOptions,
- $mountOptions
+ $mountOptions,
+ $testOnly = true
) {
$storage = $this->createStorage(
$mountPoint,
@@ -200,7 +201,7 @@ class UserStoragesController extends StoragesController {
);
}
- $this->updateStorageStatus($storage);
+ $this->updateStorageStatus($storage, $testOnly);
return new DataResponse(
$storage,
diff --git a/apps/files_external/lib/Lib/Storage/Google.php b/apps/files_external/lib/Lib/Storage/Google.php
index 2a1ff768e2c..96f12800c10 100644
--- a/apps/files_external/lib/Lib/Storage/Google.php
+++ b/apps/files_external/lib/Lib/Storage/Google.php
@@ -97,6 +97,9 @@ class Google extends \OC\Files\Storage\Common {
private function getDriveFile($path) {
// Remove leading and trailing slashes
$path = trim($path, '/');
+ if ($path === '.') {
+ $path = '';
+ }
if (isset($this->driveFiles[$path])) {
return $this->driveFiles[$path];
} else if ($path === '') {
@@ -138,7 +141,7 @@ class Google extends \OC\Files\Storage\Common {
if ($pos !== false) {
$pathWithoutExt = substr($path, 0, $pos);
$file = $this->getDriveFile($pathWithoutExt);
- if ($file) {
+ if ($file && $this->isGoogleDocFile($file)) {
// Switch cached Google_Service_Drive_DriveFile to the correct index
unset($this->driveFiles[$pathWithoutExt]);
$this->driveFiles[$path] = $file;
@@ -208,6 +211,17 @@ class Google extends \OC\Files\Storage\Common {
}
}
+ /**
+ * Returns whether the given drive file is a Google Doc file
+ *
+ * @param \Google_Service_Drive_DriveFile
+ *
+ * @return true if the file is a Google Doc file, false otherwise
+ */
+ private function isGoogleDocFile($file) {
+ return $this->getGoogleDocExtension($file->getMimeType()) !== '';
+ }
+
public function mkdir($path) {
if (!$this->is_dir($path)) {
$parentFolder = $this->getDriveFile(dirname($path));
@@ -312,7 +326,7 @@ class Google extends \OC\Files\Storage\Common {
$stat['size'] = 0;
} else {
// Check if this is a Google Doc
- if ($this->getMimeType($path) !== $file->getMimeType()) {
+ if ($this->isGoogleDocFile($file)) {
// Return unknown file size
$stat['size'] = \OCP\Files\FileInfo::SPACE_UNKNOWN;
} else {
diff --git a/apps/files_external/lib/Lib/Storage/SMB.php b/apps/files_external/lib/Lib/Storage/SMB.php
index c08b730b02e..9f74aa881e0 100644
--- a/apps/files_external/lib/Lib/Storage/SMB.php
+++ b/apps/files_external/lib/Lib/Storage/SMB.php
@@ -181,6 +181,26 @@ class SMB extends \OC\Files\Storage\Common {
}
/**
+ * @param string $path1 the old name
+ * @param string $path2 the new name
+ * @return bool
+ */
+ public function rename($path1, $path2) {
+ try {
+ $this->remove($path2);
+ $path1 = $this->buildPath($path1);
+ $path2 = $this->buildPath($path2);
+ return $this->share->rename($path1, $path2);
+ } catch (NotFoundException $e) {
+ return false;
+ } catch (ForbiddenException $e) {
+ return false;
+ } catch (ConnectException $e) {
+ throw new StorageNotAvailableException($e->getMessage(), $e->getCode(), $e);
+ }
+ }
+
+ /**
* check if a file or folder has been updated since $time
*
* @param string $path
diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php
index 86aafcf5770..3510b675d4d 100644
--- a/apps/files_external/lib/config.php
+++ b/apps/files_external/lib/config.php
@@ -215,7 +215,7 @@ class OC_Mount_Config {
* @return int see self::STATUS_*
* @throws Exception
*/
- public static function getBackendStatus($class, $options, $isPersonal) {
+ public static function getBackendStatus($class, $options, $isPersonal, $testOnly = true) {
if (self::$skipTest) {
return StorageNotAvailableException::STATUS_SUCCESS;
}
@@ -228,7 +228,7 @@ class OC_Mount_Config {
$storage = new $class($options);
try {
- $result = $storage->test($isPersonal);
+ $result = $storage->test($isPersonal, $testOnly);
$storage->setAvailability($result);
if ($result) {
return StorageNotAvailableException::STATUS_SUCCESS;
diff --git a/apps/files_external/tests/Storage/GoogleTest.php b/apps/files_external/tests/Storage/GoogleTest.php
index 7684fec8429..eb19cc463b1 100644
--- a/apps/files_external/tests/Storage/GoogleTest.php
+++ b/apps/files_external/tests/Storage/GoogleTest.php
@@ -60,4 +60,13 @@ class GoogleTest extends \Test\Files\Storage\Storage {
parent::tearDown();
}
+
+ public function testSameNameAsFolderWithExtension() {
+ $this->assertTrue($this->instance->mkdir('testsamename'));
+ $this->assertEquals(13, $this->instance->file_put_contents('testsamename.txt', 'some contents'));
+ $this->assertEquals('some contents', $this->instance->file_get_contents('testsamename.txt'));
+ $this->assertTrue($this->instance->is_dir('testsamename'));
+ $this->assertTrue($this->instance->unlink('testsamename.txt'));
+ $this->assertTrue($this->instance->rmdir('testsamename'));
+ }
}
diff --git a/apps/files_external/tests/js/settingsSpec.js b/apps/files_external/tests/js/settingsSpec.js
index 7aa49b2c82a..8f01c16b38c 100644
--- a/apps/files_external/tests/js/settingsSpec.js
+++ b/apps/files_external/tests/js/settingsSpec.js
@@ -223,7 +223,8 @@ describe('OCA.External.Settings tests', function() {
applicableGroups: [],
mountOptions: {
'previews': true
- }
+ },
+ testOnly: true
});
// TODO: respond and check data-id
diff --git a/apps/files_sharing/l10n/cs_CZ.js b/apps/files_sharing/l10n/cs_CZ.js
index 40c9a981203..fbf9d981d6b 100644
--- a/apps/files_sharing/l10n/cs_CZ.js
+++ b/apps/files_sharing/l10n/cs_CZ.js
@@ -8,25 +8,6 @@ OC.L10N.register(
"Could not authenticate to remote share, password might be wrong" : "Nezdařilo se ověření vzdáleného úložiště, pravděpodobně chybné heslo",
"Storage not valid" : "Úložiště není platné",
"Couldn't add remote share" : "Nelze přidat vzdálené úložiště",
- "Share API is disabled" : "Sdílení API je zakázané",
- "Wrong share ID, share doesn't exist" : "Špatné ID sdílení, sdílení neexistuje",
- "Could not delete share" : "Nelze smazat sdílení",
- "Please specify a file or folder path" : "Prosím zadejte cestu adresáře nebo souboru",
- "Wrong path, file/folder doesn't exist" : "Špatná cesta, soubor/adresář neexistuje",
- "Please specify a valid user" : "Prosím zadejte platného uživatele",
- "Group sharing is disabled by the administrator" : "Skupinové sdílení bylo zakázáno administrátorem",
- "Please specify a valid group" : "Prosím zadejte platnou skupinu",
- "Public link sharing is disabled by the administrator" : "Veřejný odkaz sdílení je zakázán administrátorem",
- "Public upload disabled by the administrator" : "Veřejné nahrávání zakázáno administrátorem",
- "Public upload is only possible for publicly shared folders" : "Veřejné nahrávání je možné pouze do veřejně sdílených adresářů",
- "Invalid date, date format must be YYYY-MM-DD" : "Neplatné datum, formát data musí být YYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Sdílení %s selhalo, podpůrná vrstva nepodporuje typ sdílení %s",
- "Unknown share type" : "Neznámý typ sdílení",
- "Not a directory" : "Žádný adresář",
- "Could not lock path" : "Nepodařilo se uzamknout cestu",
- "Can't change permissions for public share links" : "Nelze změnit oprávnění pro veřejně sdílené odkazy",
- "Wrong or no update parameter given" : "Chyba nebo žádná aktualizace dle zadaných parametrů",
- "Cannot increase permissions" : "Nelze navýšit oprávnění",
"Shared with you" : "Sdíleno s vámi",
"Shared with others" : "Sdíleno s ostatními",
"Shared by link" : "Sdíleno pomocí odkazu",
@@ -46,6 +27,25 @@ OC.L10N.register(
"Invalid ownCloud url" : "Neplatná ownCloud url",
"Shared by" : "Sdílí",
"Sharing" : "Sdílení",
+ "Share API is disabled" : "Sdílení API je zakázané",
+ "Wrong share ID, share doesn't exist" : "Špatné ID sdílení, sdílení neexistuje",
+ "Could not delete share" : "Nelze smazat sdílení",
+ "Please specify a file or folder path" : "Prosím zadejte cestu adresáře nebo souboru",
+ "Wrong path, file/folder doesn't exist" : "Špatná cesta, soubor/adresář neexistuje",
+ "Please specify a valid user" : "Prosím zadejte platného uživatele",
+ "Group sharing is disabled by the administrator" : "Skupinové sdílení bylo zakázáno administrátorem",
+ "Please specify a valid group" : "Prosím zadejte platnou skupinu",
+ "Public link sharing is disabled by the administrator" : "Veřejný odkaz sdílení je zakázán administrátorem",
+ "Public upload disabled by the administrator" : "Veřejné nahrávání zakázáno administrátorem",
+ "Public upload is only possible for publicly shared folders" : "Veřejné nahrávání je možné pouze do veřejně sdílených adresářů",
+ "Invalid date, date format must be YYYY-MM-DD" : "Neplatné datum, formát data musí být YYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Sdílení %s selhalo, podpůrná vrstva nepodporuje typ sdílení %s",
+ "Unknown share type" : "Neznámý typ sdílení",
+ "Not a directory" : "Žádný adresář",
+ "Could not lock path" : "Nepodařilo se uzamknout cestu",
+ "Can't change permissions for public share links" : "Nelze změnit oprávnění pro veřejně sdílené odkazy",
+ "Wrong or no update parameter given" : "Chyba nebo žádná aktualizace dle zadaných parametrů",
+ "Cannot increase permissions" : "Nelze navýšit oprávnění",
"A file or folder has been <strong>shared</strong>" : "Soubor nebo adresář byl <strong>nasdílen</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Soubor nebo adresář byl nasdílen z <strong>jiného serveru</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Byl <strong>stažen</strong> veřejně sdílený soubor nebo adresář",
diff --git a/apps/files_sharing/l10n/cs_CZ.json b/apps/files_sharing/l10n/cs_CZ.json
index 393bdbc165b..fc62ee6253b 100644
--- a/apps/files_sharing/l10n/cs_CZ.json
+++ b/apps/files_sharing/l10n/cs_CZ.json
@@ -6,25 +6,6 @@
"Could not authenticate to remote share, password might be wrong" : "Nezdařilo se ověření vzdáleného úložiště, pravděpodobně chybné heslo",
"Storage not valid" : "Úložiště není platné",
"Couldn't add remote share" : "Nelze přidat vzdálené úložiště",
- "Share API is disabled" : "Sdílení API je zakázané",
- "Wrong share ID, share doesn't exist" : "Špatné ID sdílení, sdílení neexistuje",
- "Could not delete share" : "Nelze smazat sdílení",
- "Please specify a file or folder path" : "Prosím zadejte cestu adresáře nebo souboru",
- "Wrong path, file/folder doesn't exist" : "Špatná cesta, soubor/adresář neexistuje",
- "Please specify a valid user" : "Prosím zadejte platného uživatele",
- "Group sharing is disabled by the administrator" : "Skupinové sdílení bylo zakázáno administrátorem",
- "Please specify a valid group" : "Prosím zadejte platnou skupinu",
- "Public link sharing is disabled by the administrator" : "Veřejný odkaz sdílení je zakázán administrátorem",
- "Public upload disabled by the administrator" : "Veřejné nahrávání zakázáno administrátorem",
- "Public upload is only possible for publicly shared folders" : "Veřejné nahrávání je možné pouze do veřejně sdílených adresářů",
- "Invalid date, date format must be YYYY-MM-DD" : "Neplatné datum, formát data musí být YYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Sdílení %s selhalo, podpůrná vrstva nepodporuje typ sdílení %s",
- "Unknown share type" : "Neznámý typ sdílení",
- "Not a directory" : "Žádný adresář",
- "Could not lock path" : "Nepodařilo se uzamknout cestu",
- "Can't change permissions for public share links" : "Nelze změnit oprávnění pro veřejně sdílené odkazy",
- "Wrong or no update parameter given" : "Chyba nebo žádná aktualizace dle zadaných parametrů",
- "Cannot increase permissions" : "Nelze navýšit oprávnění",
"Shared with you" : "Sdíleno s vámi",
"Shared with others" : "Sdíleno s ostatními",
"Shared by link" : "Sdíleno pomocí odkazu",
@@ -44,6 +25,25 @@
"Invalid ownCloud url" : "Neplatná ownCloud url",
"Shared by" : "Sdílí",
"Sharing" : "Sdílení",
+ "Share API is disabled" : "Sdílení API je zakázané",
+ "Wrong share ID, share doesn't exist" : "Špatné ID sdílení, sdílení neexistuje",
+ "Could not delete share" : "Nelze smazat sdílení",
+ "Please specify a file or folder path" : "Prosím zadejte cestu adresáře nebo souboru",
+ "Wrong path, file/folder doesn't exist" : "Špatná cesta, soubor/adresář neexistuje",
+ "Please specify a valid user" : "Prosím zadejte platného uživatele",
+ "Group sharing is disabled by the administrator" : "Skupinové sdílení bylo zakázáno administrátorem",
+ "Please specify a valid group" : "Prosím zadejte platnou skupinu",
+ "Public link sharing is disabled by the administrator" : "Veřejný odkaz sdílení je zakázán administrátorem",
+ "Public upload disabled by the administrator" : "Veřejné nahrávání zakázáno administrátorem",
+ "Public upload is only possible for publicly shared folders" : "Veřejné nahrávání je možné pouze do veřejně sdílených adresářů",
+ "Invalid date, date format must be YYYY-MM-DD" : "Neplatné datum, formát data musí být YYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Sdílení %s selhalo, podpůrná vrstva nepodporuje typ sdílení %s",
+ "Unknown share type" : "Neznámý typ sdílení",
+ "Not a directory" : "Žádný adresář",
+ "Could not lock path" : "Nepodařilo se uzamknout cestu",
+ "Can't change permissions for public share links" : "Nelze změnit oprávnění pro veřejně sdílené odkazy",
+ "Wrong or no update parameter given" : "Chyba nebo žádná aktualizace dle zadaných parametrů",
+ "Cannot increase permissions" : "Nelze navýšit oprávnění",
"A file or folder has been <strong>shared</strong>" : "Soubor nebo adresář byl <strong>nasdílen</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Soubor nebo adresář byl nasdílen z <strong>jiného serveru</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Byl <strong>stažen</strong> veřejně sdílený soubor nebo adresář",
diff --git a/apps/files_sharing/l10n/de.js b/apps/files_sharing/l10n/de.js
index b38f4c9145b..602721d13c1 100644
--- a/apps/files_sharing/l10n/de.js
+++ b/apps/files_sharing/l10n/de.js
@@ -8,25 +8,6 @@ OC.L10N.register(
"Could not authenticate to remote share, password might be wrong" : "Die Authentifizierung an der entfernten Freigabe konnte nicht erfolgen, das Passwort könnte falsch sein",
"Storage not valid" : "Speicher ungültig",
"Couldn't add remote share" : "Remotefreigabe kann nicht hinzu gefügt werden",
- "Share API is disabled" : "Teilen-API ist deaktivert",
- "Wrong share ID, share doesn't exist" : "Fehlerhafte Freigabe-ID, Freigabe existiert nicht",
- "Could not delete share" : "Freigabe konnte nicht gelöscht werden",
- "Please specify a file or folder path" : "Bitte eine Datei oder Verzeichnis definieren",
- "Wrong path, file/folder doesn't exist" : "Falscher Pfad, Datei/Verzeichnis existiert nicht",
- "Please specify a valid user" : "Bitte gib einen gültigen Nutzer an",
- "Group sharing is disabled by the administrator" : "Die Gruppenfreigabe ist durch den Administrator deaktiviert",
- "Please specify a valid group" : "Bitte gib eine gültige Gruppe an",
- "Public link sharing is disabled by the administrator" : "Die öffentliche Freigabe von Links ist durch den Administrator deaktiviert",
- "Public upload disabled by the administrator" : "Das öffentliche Hochladen ist durch den Administrator deaktiviert",
- "Public upload is only possible for publicly shared folders" : "Das öffentliche Hochladen ist nur für öffentlich freigegebene Ordner erlaubt",
- "Invalid date, date format must be YYYY-MM-DD" : "Ungültiges Datum, das Datumsformat muss JJJJ-MM-TT sein",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Freigabe von %s fehlgeschlagen, da das Backend die Freigabe vom Typ %s nicht erlaubt.",
- "Unknown share type" : "Unbekannter Freigabetyp",
- "Not a directory" : "Kein Verzeichnis",
- "Could not lock path" : "Pfad konnte nicht gesperrt werden",
- "Can't change permissions for public share links" : "Berechtigungen für öffentlich freigegebene Links konnten nicht geändert werden",
- "Wrong or no update parameter given" : "Falscher oder kein Updateparameter wurde übergeben",
- "Cannot increase permissions" : "Berechtigungen können nicht erhöht werden",
"Shared with you" : "Mit Dir geteilt",
"Shared with others" : "Von Dir geteilt",
"Shared by link" : "Geteilt über einen Link",
@@ -46,6 +27,25 @@ OC.L10N.register(
"Invalid ownCloud url" : "Ungültige OwnCloud-URL",
"Shared by" : "Geteilt von ",
"Sharing" : "Teilen",
+ "Share API is disabled" : "Teilen-API ist deaktivert",
+ "Wrong share ID, share doesn't exist" : "Fehlerhafte Freigabe-ID, Freigabe existiert nicht",
+ "Could not delete share" : "Freigabe konnte nicht gelöscht werden",
+ "Please specify a file or folder path" : "Bitte eine Datei oder Verzeichnis definieren",
+ "Wrong path, file/folder doesn't exist" : "Falscher Pfad, Datei/Verzeichnis existiert nicht",
+ "Please specify a valid user" : "Bitte gib einen gültigen Nutzer an",
+ "Group sharing is disabled by the administrator" : "Die Gruppenfreigabe ist durch den Administrator deaktiviert",
+ "Please specify a valid group" : "Bitte gib eine gültige Gruppe an",
+ "Public link sharing is disabled by the administrator" : "Die öffentliche Freigabe von Links ist durch den Administrator deaktiviert",
+ "Public upload disabled by the administrator" : "Das öffentliche Hochladen ist durch den Administrator deaktiviert",
+ "Public upload is only possible for publicly shared folders" : "Das öffentliche Hochladen ist nur für öffentlich freigegebene Ordner erlaubt",
+ "Invalid date, date format must be YYYY-MM-DD" : "Ungültiges Datum, das Datumsformat muss JJJJ-MM-TT sein",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Freigabe von %s fehlgeschlagen, da das Backend die Freigabe vom Typ %s nicht erlaubt.",
+ "Unknown share type" : "Unbekannter Freigabetyp",
+ "Not a directory" : "Kein Verzeichnis",
+ "Could not lock path" : "Pfad konnte nicht gesperrt werden",
+ "Can't change permissions for public share links" : "Berechtigungen für öffentlich freigegebene Links konnten nicht geändert werden",
+ "Wrong or no update parameter given" : "Falscher oder kein Updateparameter wurde übergeben",
+ "Cannot increase permissions" : "Berechtigungen können nicht erhöht werden",
"A file or folder has been <strong>shared</strong>" : "Eine Datei oder ein Ordner wurde <strong>geteilt</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder ein Ordner wurde von <strong>einem anderen Server</strong> geteilt",
"A public shared file or folder was <strong>downloaded</strong>" : "Eine öffentliche geteilte Datei oder ein öffentlicher geteilter Ordner wurde <strong>heruntergeladen</strong>",
diff --git a/apps/files_sharing/l10n/de.json b/apps/files_sharing/l10n/de.json
index 7a349b79b7a..2d8b8e426e5 100644
--- a/apps/files_sharing/l10n/de.json
+++ b/apps/files_sharing/l10n/de.json
@@ -6,25 +6,6 @@
"Could not authenticate to remote share, password might be wrong" : "Die Authentifizierung an der entfernten Freigabe konnte nicht erfolgen, das Passwort könnte falsch sein",
"Storage not valid" : "Speicher ungültig",
"Couldn't add remote share" : "Remotefreigabe kann nicht hinzu gefügt werden",
- "Share API is disabled" : "Teilen-API ist deaktivert",
- "Wrong share ID, share doesn't exist" : "Fehlerhafte Freigabe-ID, Freigabe existiert nicht",
- "Could not delete share" : "Freigabe konnte nicht gelöscht werden",
- "Please specify a file or folder path" : "Bitte eine Datei oder Verzeichnis definieren",
- "Wrong path, file/folder doesn't exist" : "Falscher Pfad, Datei/Verzeichnis existiert nicht",
- "Please specify a valid user" : "Bitte gib einen gültigen Nutzer an",
- "Group sharing is disabled by the administrator" : "Die Gruppenfreigabe ist durch den Administrator deaktiviert",
- "Please specify a valid group" : "Bitte gib eine gültige Gruppe an",
- "Public link sharing is disabled by the administrator" : "Die öffentliche Freigabe von Links ist durch den Administrator deaktiviert",
- "Public upload disabled by the administrator" : "Das öffentliche Hochladen ist durch den Administrator deaktiviert",
- "Public upload is only possible for publicly shared folders" : "Das öffentliche Hochladen ist nur für öffentlich freigegebene Ordner erlaubt",
- "Invalid date, date format must be YYYY-MM-DD" : "Ungültiges Datum, das Datumsformat muss JJJJ-MM-TT sein",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Freigabe von %s fehlgeschlagen, da das Backend die Freigabe vom Typ %s nicht erlaubt.",
- "Unknown share type" : "Unbekannter Freigabetyp",
- "Not a directory" : "Kein Verzeichnis",
- "Could not lock path" : "Pfad konnte nicht gesperrt werden",
- "Can't change permissions for public share links" : "Berechtigungen für öffentlich freigegebene Links konnten nicht geändert werden",
- "Wrong or no update parameter given" : "Falscher oder kein Updateparameter wurde übergeben",
- "Cannot increase permissions" : "Berechtigungen können nicht erhöht werden",
"Shared with you" : "Mit Dir geteilt",
"Shared with others" : "Von Dir geteilt",
"Shared by link" : "Geteilt über einen Link",
@@ -44,6 +25,25 @@
"Invalid ownCloud url" : "Ungültige OwnCloud-URL",
"Shared by" : "Geteilt von ",
"Sharing" : "Teilen",
+ "Share API is disabled" : "Teilen-API ist deaktivert",
+ "Wrong share ID, share doesn't exist" : "Fehlerhafte Freigabe-ID, Freigabe existiert nicht",
+ "Could not delete share" : "Freigabe konnte nicht gelöscht werden",
+ "Please specify a file or folder path" : "Bitte eine Datei oder Verzeichnis definieren",
+ "Wrong path, file/folder doesn't exist" : "Falscher Pfad, Datei/Verzeichnis existiert nicht",
+ "Please specify a valid user" : "Bitte gib einen gültigen Nutzer an",
+ "Group sharing is disabled by the administrator" : "Die Gruppenfreigabe ist durch den Administrator deaktiviert",
+ "Please specify a valid group" : "Bitte gib eine gültige Gruppe an",
+ "Public link sharing is disabled by the administrator" : "Die öffentliche Freigabe von Links ist durch den Administrator deaktiviert",
+ "Public upload disabled by the administrator" : "Das öffentliche Hochladen ist durch den Administrator deaktiviert",
+ "Public upload is only possible for publicly shared folders" : "Das öffentliche Hochladen ist nur für öffentlich freigegebene Ordner erlaubt",
+ "Invalid date, date format must be YYYY-MM-DD" : "Ungültiges Datum, das Datumsformat muss JJJJ-MM-TT sein",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Freigabe von %s fehlgeschlagen, da das Backend die Freigabe vom Typ %s nicht erlaubt.",
+ "Unknown share type" : "Unbekannter Freigabetyp",
+ "Not a directory" : "Kein Verzeichnis",
+ "Could not lock path" : "Pfad konnte nicht gesperrt werden",
+ "Can't change permissions for public share links" : "Berechtigungen für öffentlich freigegebene Links konnten nicht geändert werden",
+ "Wrong or no update parameter given" : "Falscher oder kein Updateparameter wurde übergeben",
+ "Cannot increase permissions" : "Berechtigungen können nicht erhöht werden",
"A file or folder has been <strong>shared</strong>" : "Eine Datei oder ein Ordner wurde <strong>geteilt</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder ein Ordner wurde von <strong>einem anderen Server</strong> geteilt",
"A public shared file or folder was <strong>downloaded</strong>" : "Eine öffentliche geteilte Datei oder ein öffentlicher geteilter Ordner wurde <strong>heruntergeladen</strong>",
diff --git a/apps/files_sharing/l10n/de_DE.js b/apps/files_sharing/l10n/de_DE.js
index a45d29edac5..56e1ec25c1d 100644
--- a/apps/files_sharing/l10n/de_DE.js
+++ b/apps/files_sharing/l10n/de_DE.js
@@ -8,25 +8,6 @@ OC.L10N.register(
"Could not authenticate to remote share, password might be wrong" : "Die Authentifizierung an der entfernten Freigabe konnte nicht erfolgen, das Passwort könnte falsch sein",
"Storage not valid" : "Speicher ungültig",
"Couldn't add remote share" : "Entfernte Freigabe kann nicht hinzugefügt werden",
- "Share API is disabled" : "Teilen-API ist deaktivert",
- "Wrong share ID, share doesn't exist" : "Fehlerhafte Freigabe-ID, Freigabe existiert nicht",
- "Could not delete share" : "Freigabe konnte nicht gelöscht werden",
- "Please specify a file or folder path" : "Bitte eine Datei oder Verzeichnis definieren",
- "Wrong path, file/folder doesn't exist" : "Falscher Pfad, Datei/Verzeichnis existiert nicht",
- "Please specify a valid user" : "Bitte geben Sie einen gültigen Nutzer an",
- "Group sharing is disabled by the administrator" : "Die Gruppenfreigabe ist durch den Administrator deaktiviert",
- "Please specify a valid group" : "Bitte geben Sie eine gültige Gruppe an",
- "Public link sharing is disabled by the administrator" : "Die öffentliche Freigabe von Links ist durch den Administrator deaktiviert",
- "Public upload disabled by the administrator" : "Das öffentliche Hochladen ist durch den Administrator deaktiviert",
- "Public upload is only possible for publicly shared folders" : "Das öffentliche Hochladen ist nur für öffentlich freigegebene Ordner erlaubt",
- "Invalid date, date format must be YYYY-MM-DD" : "Ungültiges Datum, das Datumsformat muss JJJJ-MM-TT sein",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Freigabe von %s fehlgeschlagen, da das Backend die Freigabe vom Typ %s nicht erlaubt.",
- "Unknown share type" : "Unbekannter Freigabetyp",
- "Not a directory" : "Kein Verzeichnis",
- "Could not lock path" : "Pfad konnte nicht gesperrt werden",
- "Can't change permissions for public share links" : "Berechtigungen für öffentlich freigegebene Links konnten nicht geändert werden",
- "Wrong or no update parameter given" : "Falscher oder kein Updateparameter wurde übergeben",
- "Cannot increase permissions" : "Berechtigungen können nicht erhöht werden",
"Shared with you" : "Mit Ihnen geteilt",
"Shared with others" : "Von Ihnen geteilt",
"Shared by link" : "Geteilt über einen Link",
@@ -46,6 +27,25 @@ OC.L10N.register(
"Invalid ownCloud url" : "Ungültige OwnCloud-Adresse",
"Shared by" : "Geteilt von",
"Sharing" : "Teilen",
+ "Share API is disabled" : "Teilen-API ist deaktivert",
+ "Wrong share ID, share doesn't exist" : "Fehlerhafte Freigabe-ID, Freigabe existiert nicht",
+ "Could not delete share" : "Freigabe konnte nicht gelöscht werden",
+ "Please specify a file or folder path" : "Bitte eine Datei oder Verzeichnis definieren",
+ "Wrong path, file/folder doesn't exist" : "Falscher Pfad, Datei/Verzeichnis existiert nicht",
+ "Please specify a valid user" : "Bitte geben Sie einen gültigen Nutzer an",
+ "Group sharing is disabled by the administrator" : "Die Gruppenfreigabe ist durch den Administrator deaktiviert",
+ "Please specify a valid group" : "Bitte geben Sie eine gültige Gruppe an",
+ "Public link sharing is disabled by the administrator" : "Die öffentliche Freigabe von Links ist durch den Administrator deaktiviert",
+ "Public upload disabled by the administrator" : "Das öffentliche Hochladen ist durch den Administrator deaktiviert",
+ "Public upload is only possible for publicly shared folders" : "Das öffentliche Hochladen ist nur für öffentlich freigegebene Ordner erlaubt",
+ "Invalid date, date format must be YYYY-MM-DD" : "Ungültiges Datum, das Datumsformat muss JJJJ-MM-TT sein",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Freigabe von %s fehlgeschlagen, da das Backend die Freigabe vom Typ %s nicht erlaubt.",
+ "Unknown share type" : "Unbekannter Freigabetyp",
+ "Not a directory" : "Kein Verzeichnis",
+ "Could not lock path" : "Pfad konnte nicht gesperrt werden",
+ "Can't change permissions for public share links" : "Berechtigungen für öffentlich freigegebene Links konnten nicht geändert werden",
+ "Wrong or no update parameter given" : "Falscher oder kein Updateparameter wurde übergeben",
+ "Cannot increase permissions" : "Berechtigungen können nicht erhöht werden",
"A file or folder has been <strong>shared</strong>" : "Eine Datei oder ein Ordner wurde <strong>geteilt</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder ein Ordner wurde von <strong>einem anderen Server</strong> geteilt",
"A public shared file or folder was <strong>downloaded</strong>" : "Eine öffentliche geteilte Datei oder ein öffentlicher geteilter Ordner wurde <strong>heruntergeladen</strong>",
diff --git a/apps/files_sharing/l10n/de_DE.json b/apps/files_sharing/l10n/de_DE.json
index e9c23efaf30..205e0eeaadb 100644
--- a/apps/files_sharing/l10n/de_DE.json
+++ b/apps/files_sharing/l10n/de_DE.json
@@ -6,25 +6,6 @@
"Could not authenticate to remote share, password might be wrong" : "Die Authentifizierung an der entfernten Freigabe konnte nicht erfolgen, das Passwort könnte falsch sein",
"Storage not valid" : "Speicher ungültig",
"Couldn't add remote share" : "Entfernte Freigabe kann nicht hinzugefügt werden",
- "Share API is disabled" : "Teilen-API ist deaktivert",
- "Wrong share ID, share doesn't exist" : "Fehlerhafte Freigabe-ID, Freigabe existiert nicht",
- "Could not delete share" : "Freigabe konnte nicht gelöscht werden",
- "Please specify a file or folder path" : "Bitte eine Datei oder Verzeichnis definieren",
- "Wrong path, file/folder doesn't exist" : "Falscher Pfad, Datei/Verzeichnis existiert nicht",
- "Please specify a valid user" : "Bitte geben Sie einen gültigen Nutzer an",
- "Group sharing is disabled by the administrator" : "Die Gruppenfreigabe ist durch den Administrator deaktiviert",
- "Please specify a valid group" : "Bitte geben Sie eine gültige Gruppe an",
- "Public link sharing is disabled by the administrator" : "Die öffentliche Freigabe von Links ist durch den Administrator deaktiviert",
- "Public upload disabled by the administrator" : "Das öffentliche Hochladen ist durch den Administrator deaktiviert",
- "Public upload is only possible for publicly shared folders" : "Das öffentliche Hochladen ist nur für öffentlich freigegebene Ordner erlaubt",
- "Invalid date, date format must be YYYY-MM-DD" : "Ungültiges Datum, das Datumsformat muss JJJJ-MM-TT sein",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Freigabe von %s fehlgeschlagen, da das Backend die Freigabe vom Typ %s nicht erlaubt.",
- "Unknown share type" : "Unbekannter Freigabetyp",
- "Not a directory" : "Kein Verzeichnis",
- "Could not lock path" : "Pfad konnte nicht gesperrt werden",
- "Can't change permissions for public share links" : "Berechtigungen für öffentlich freigegebene Links konnten nicht geändert werden",
- "Wrong or no update parameter given" : "Falscher oder kein Updateparameter wurde übergeben",
- "Cannot increase permissions" : "Berechtigungen können nicht erhöht werden",
"Shared with you" : "Mit Ihnen geteilt",
"Shared with others" : "Von Ihnen geteilt",
"Shared by link" : "Geteilt über einen Link",
@@ -44,6 +25,25 @@
"Invalid ownCloud url" : "Ungültige OwnCloud-Adresse",
"Shared by" : "Geteilt von",
"Sharing" : "Teilen",
+ "Share API is disabled" : "Teilen-API ist deaktivert",
+ "Wrong share ID, share doesn't exist" : "Fehlerhafte Freigabe-ID, Freigabe existiert nicht",
+ "Could not delete share" : "Freigabe konnte nicht gelöscht werden",
+ "Please specify a file or folder path" : "Bitte eine Datei oder Verzeichnis definieren",
+ "Wrong path, file/folder doesn't exist" : "Falscher Pfad, Datei/Verzeichnis existiert nicht",
+ "Please specify a valid user" : "Bitte geben Sie einen gültigen Nutzer an",
+ "Group sharing is disabled by the administrator" : "Die Gruppenfreigabe ist durch den Administrator deaktiviert",
+ "Please specify a valid group" : "Bitte geben Sie eine gültige Gruppe an",
+ "Public link sharing is disabled by the administrator" : "Die öffentliche Freigabe von Links ist durch den Administrator deaktiviert",
+ "Public upload disabled by the administrator" : "Das öffentliche Hochladen ist durch den Administrator deaktiviert",
+ "Public upload is only possible for publicly shared folders" : "Das öffentliche Hochladen ist nur für öffentlich freigegebene Ordner erlaubt",
+ "Invalid date, date format must be YYYY-MM-DD" : "Ungültiges Datum, das Datumsformat muss JJJJ-MM-TT sein",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Freigabe von %s fehlgeschlagen, da das Backend die Freigabe vom Typ %s nicht erlaubt.",
+ "Unknown share type" : "Unbekannter Freigabetyp",
+ "Not a directory" : "Kein Verzeichnis",
+ "Could not lock path" : "Pfad konnte nicht gesperrt werden",
+ "Can't change permissions for public share links" : "Berechtigungen für öffentlich freigegebene Links konnten nicht geändert werden",
+ "Wrong or no update parameter given" : "Falscher oder kein Updateparameter wurde übergeben",
+ "Cannot increase permissions" : "Berechtigungen können nicht erhöht werden",
"A file or folder has been <strong>shared</strong>" : "Eine Datei oder ein Ordner wurde <strong>geteilt</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder ein Ordner wurde von <strong>einem anderen Server</strong> geteilt",
"A public shared file or folder was <strong>downloaded</strong>" : "Eine öffentliche geteilte Datei oder ein öffentlicher geteilter Ordner wurde <strong>heruntergeladen</strong>",
diff --git a/apps/files_sharing/l10n/en_GB.js b/apps/files_sharing/l10n/en_GB.js
index d9fe479ab0a..78d3630c674 100644
--- a/apps/files_sharing/l10n/en_GB.js
+++ b/apps/files_sharing/l10n/en_GB.js
@@ -8,25 +8,6 @@ OC.L10N.register(
"Could not authenticate to remote share, password might be wrong" : "Could not authenticate to remote share, password might be wrong",
"Storage not valid" : "Storage not valid",
"Couldn't add remote share" : "Couldn't add remote share",
- "Share API is disabled" : "Share API is disabled",
- "Wrong share ID, share doesn't exist" : "Wrong share ID, share doesn't exist",
- "Could not delete share" : "Could not delete share",
- "Please specify a file or folder path" : "Please specify a file or folder path",
- "Wrong path, file/folder doesn't exist" : "Wrong path, file/folder doesn't exist",
- "Please specify a valid user" : "Please specify a valid user",
- "Group sharing is disabled by the administrator" : "Group sharing is disabled by the administrator",
- "Please specify a valid group" : "Please specify a valid group",
- "Public link sharing is disabled by the administrator" : "Public link sharing is disabled by the administrator",
- "Public upload disabled by the administrator" : "Public upload disabled by the administrator",
- "Public upload is only possible for publicly shared folders" : "Public upload is only possible for publicly shared folders",
- "Invalid date, date format must be YYYY-MM-DD" : "Invalid date, date format must be YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Sharing %s failed because the back end does not allow shares from type %s",
- "Unknown share type" : "Unknown share type",
- "Not a directory" : "Not a directory",
- "Could not lock path" : "Could not lock path",
- "Can't change permissions for public share links" : "Can't change permissions for public share links",
- "Wrong or no update parameter given" : "Wrong or no update parameter given",
- "Cannot increase permissions" : "Cannot increase permissions",
"Shared with you" : "Shared with you",
"Shared with others" : "Shared with others",
"Shared by link" : "Shared by link",
@@ -46,6 +27,25 @@ OC.L10N.register(
"Invalid ownCloud url" : "Invalid ownCloud URL",
"Shared by" : "Shared by",
"Sharing" : "Sharing",
+ "Share API is disabled" : "Share API is disabled",
+ "Wrong share ID, share doesn't exist" : "Wrong share ID, share doesn't exist",
+ "Could not delete share" : "Could not delete share",
+ "Please specify a file or folder path" : "Please specify a file or folder path",
+ "Wrong path, file/folder doesn't exist" : "Wrong path, file/folder doesn't exist",
+ "Please specify a valid user" : "Please specify a valid user",
+ "Group sharing is disabled by the administrator" : "Group sharing is disabled by the administrator",
+ "Please specify a valid group" : "Please specify a valid group",
+ "Public link sharing is disabled by the administrator" : "Public link sharing is disabled by the administrator",
+ "Public upload disabled by the administrator" : "Public upload disabled by the administrator",
+ "Public upload is only possible for publicly shared folders" : "Public upload is only possible for publicly shared folders",
+ "Invalid date, date format must be YYYY-MM-DD" : "Invalid date, date format must be YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Sharing %s failed because the back end does not allow shares from type %s",
+ "Unknown share type" : "Unknown share type",
+ "Not a directory" : "Not a directory",
+ "Could not lock path" : "Could not lock path",
+ "Can't change permissions for public share links" : "Can't change permissions for public share links",
+ "Wrong or no update parameter given" : "Wrong or no update parameter given",
+ "Cannot increase permissions" : "Cannot increase permissions",
"A file or folder has been <strong>shared</strong>" : "A file or folder has been <strong>shared</strong>",
"A file or folder was shared from <strong>another server</strong>" : "A file or folder was shared from <strong>another server</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "A public shared file or folder was <strong>downloaded</strong>",
diff --git a/apps/files_sharing/l10n/en_GB.json b/apps/files_sharing/l10n/en_GB.json
index 36555427b67..eda362a6541 100644
--- a/apps/files_sharing/l10n/en_GB.json
+++ b/apps/files_sharing/l10n/en_GB.json
@@ -6,25 +6,6 @@
"Could not authenticate to remote share, password might be wrong" : "Could not authenticate to remote share, password might be wrong",
"Storage not valid" : "Storage not valid",
"Couldn't add remote share" : "Couldn't add remote share",
- "Share API is disabled" : "Share API is disabled",
- "Wrong share ID, share doesn't exist" : "Wrong share ID, share doesn't exist",
- "Could not delete share" : "Could not delete share",
- "Please specify a file or folder path" : "Please specify a file or folder path",
- "Wrong path, file/folder doesn't exist" : "Wrong path, file/folder doesn't exist",
- "Please specify a valid user" : "Please specify a valid user",
- "Group sharing is disabled by the administrator" : "Group sharing is disabled by the administrator",
- "Please specify a valid group" : "Please specify a valid group",
- "Public link sharing is disabled by the administrator" : "Public link sharing is disabled by the administrator",
- "Public upload disabled by the administrator" : "Public upload disabled by the administrator",
- "Public upload is only possible for publicly shared folders" : "Public upload is only possible for publicly shared folders",
- "Invalid date, date format must be YYYY-MM-DD" : "Invalid date, date format must be YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Sharing %s failed because the back end does not allow shares from type %s",
- "Unknown share type" : "Unknown share type",
- "Not a directory" : "Not a directory",
- "Could not lock path" : "Could not lock path",
- "Can't change permissions for public share links" : "Can't change permissions for public share links",
- "Wrong or no update parameter given" : "Wrong or no update parameter given",
- "Cannot increase permissions" : "Cannot increase permissions",
"Shared with you" : "Shared with you",
"Shared with others" : "Shared with others",
"Shared by link" : "Shared by link",
@@ -44,6 +25,25 @@
"Invalid ownCloud url" : "Invalid ownCloud URL",
"Shared by" : "Shared by",
"Sharing" : "Sharing",
+ "Share API is disabled" : "Share API is disabled",
+ "Wrong share ID, share doesn't exist" : "Wrong share ID, share doesn't exist",
+ "Could not delete share" : "Could not delete share",
+ "Please specify a file or folder path" : "Please specify a file or folder path",
+ "Wrong path, file/folder doesn't exist" : "Wrong path, file/folder doesn't exist",
+ "Please specify a valid user" : "Please specify a valid user",
+ "Group sharing is disabled by the administrator" : "Group sharing is disabled by the administrator",
+ "Please specify a valid group" : "Please specify a valid group",
+ "Public link sharing is disabled by the administrator" : "Public link sharing is disabled by the administrator",
+ "Public upload disabled by the administrator" : "Public upload disabled by the administrator",
+ "Public upload is only possible for publicly shared folders" : "Public upload is only possible for publicly shared folders",
+ "Invalid date, date format must be YYYY-MM-DD" : "Invalid date, date format must be YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Sharing %s failed because the back end does not allow shares from type %s",
+ "Unknown share type" : "Unknown share type",
+ "Not a directory" : "Not a directory",
+ "Could not lock path" : "Could not lock path",
+ "Can't change permissions for public share links" : "Can't change permissions for public share links",
+ "Wrong or no update parameter given" : "Wrong or no update parameter given",
+ "Cannot increase permissions" : "Cannot increase permissions",
"A file or folder has been <strong>shared</strong>" : "A file or folder has been <strong>shared</strong>",
"A file or folder was shared from <strong>another server</strong>" : "A file or folder was shared from <strong>another server</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "A public shared file or folder was <strong>downloaded</strong>",
diff --git a/apps/files_sharing/l10n/es.js b/apps/files_sharing/l10n/es.js
index c74088b6fca..4ae7c4e177e 100644
--- a/apps/files_sharing/l10n/es.js
+++ b/apps/files_sharing/l10n/es.js
@@ -8,25 +8,6 @@ OC.L10N.register(
"Could not authenticate to remote share, password might be wrong" : "No se ha podido autenticar para compartir remotamente, quizás esté mal la contraseña",
"Storage not valid" : "Almacenamiento inválido",
"Couldn't add remote share" : "No se puede añadir un compartido remoto",
- "Share API is disabled" : "El API de compartir está deshabilitado",
- "Wrong share ID, share doesn't exist" : "El ID del recurso compartido no es correcto, el recurso compartido no existe",
- "Could not delete share" : "No se ha podido eliminar el recurso compartido",
- "Please specify a file or folder path" : "Por favor, especifica la ubicación de un archivo o carpeta",
- "Wrong path, file/folder doesn't exist" : "Ubicación incorrecta, el archivo/carpeta no existe",
- "Please specify a valid user" : "Por favor, especifica un usuario válido",
- "Group sharing is disabled by the administrator" : "Compartir en grupo está deshabilitado por el administrador",
- "Please specify a valid group" : "Por favor, especifica un grupo válido",
- "Public link sharing is disabled by the administrator" : "Compartir enlaces de forma pública está deshabilitado por el administrador",
- "Public upload disabled by the administrator" : "La subida pública está deshabilitado por el administrador",
- "Public upload is only possible for publicly shared folders" : "La subida publica solo es posible poara las carpetas publicas compartidas",
- "Invalid date, date format must be YYYY-MM-DD" : "Fecha inválida, el formato de las fechas debe ser YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Compartir %s ha fallado porque el repositorio no admite compartidos del tipo %s",
- "Unknown share type" : "Tipo desconocido de recurso compartido",
- "Not a directory" : "No es un directorio",
- "Could not lock path" : "No se ha podido bloquear la ruta",
- "Can't change permissions for public share links" : "No se pueden cambiar los permisos para los enlaces de recursos compartidos públicos",
- "Wrong or no update parameter given" : "No se ha suministrado un parametro correcto",
- "Cannot increase permissions" : "No es posible aumentar permisos",
"Shared with you" : "Compartido contigo",
"Shared with others" : "Compartido con otros",
"Shared by link" : "Compartido por medio de enlaces",
@@ -46,6 +27,25 @@ OC.L10N.register(
"Invalid ownCloud url" : "URL de ownCloud inválida",
"Shared by" : "Compartido por",
"Sharing" : "Compartiendo",
+ "Share API is disabled" : "El API de compartir está deshabilitado",
+ "Wrong share ID, share doesn't exist" : "El ID del recurso compartido no es correcto, el recurso compartido no existe",
+ "Could not delete share" : "No se ha podido eliminar el recurso compartido",
+ "Please specify a file or folder path" : "Por favor, especifica la ubicación de un archivo o carpeta",
+ "Wrong path, file/folder doesn't exist" : "Ubicación incorrecta, el archivo/carpeta no existe",
+ "Please specify a valid user" : "Por favor, especifica un usuario válido",
+ "Group sharing is disabled by the administrator" : "Compartir en grupo está deshabilitado por el administrador",
+ "Please specify a valid group" : "Por favor, especifica un grupo válido",
+ "Public link sharing is disabled by the administrator" : "Compartir enlaces de forma pública está deshabilitado por el administrador",
+ "Public upload disabled by the administrator" : "La subida pública está deshabilitado por el administrador",
+ "Public upload is only possible for publicly shared folders" : "La subida publica solo es posible poara las carpetas publicas compartidas",
+ "Invalid date, date format must be YYYY-MM-DD" : "Fecha inválida, el formato de las fechas debe ser YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Compartir %s ha fallado porque el repositorio no admite compartidos del tipo %s",
+ "Unknown share type" : "Tipo desconocido de recurso compartido",
+ "Not a directory" : "No es un directorio",
+ "Could not lock path" : "No se ha podido bloquear la ruta",
+ "Can't change permissions for public share links" : "No se pueden cambiar los permisos para los enlaces de recursos compartidos públicos",
+ "Wrong or no update parameter given" : "No se ha suministrado un parametro correcto",
+ "Cannot increase permissions" : "No es posible aumentar permisos",
"A file or folder has been <strong>shared</strong>" : "Se ha <strong>compartido</strong> un archivo o carpeta",
"A file or folder was shared from <strong>another server</strong>" : "Se ha compartido un archivo o carpeta desde <strong>otro servidor</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Se ha <strong>descargado</strong> un archivo o carpeta compartido públicamente",
diff --git a/apps/files_sharing/l10n/es.json b/apps/files_sharing/l10n/es.json
index 2976007e3d7..026d7f72e9d 100644
--- a/apps/files_sharing/l10n/es.json
+++ b/apps/files_sharing/l10n/es.json
@@ -6,25 +6,6 @@
"Could not authenticate to remote share, password might be wrong" : "No se ha podido autenticar para compartir remotamente, quizás esté mal la contraseña",
"Storage not valid" : "Almacenamiento inválido",
"Couldn't add remote share" : "No se puede añadir un compartido remoto",
- "Share API is disabled" : "El API de compartir está deshabilitado",
- "Wrong share ID, share doesn't exist" : "El ID del recurso compartido no es correcto, el recurso compartido no existe",
- "Could not delete share" : "No se ha podido eliminar el recurso compartido",
- "Please specify a file or folder path" : "Por favor, especifica la ubicación de un archivo o carpeta",
- "Wrong path, file/folder doesn't exist" : "Ubicación incorrecta, el archivo/carpeta no existe",
- "Please specify a valid user" : "Por favor, especifica un usuario válido",
- "Group sharing is disabled by the administrator" : "Compartir en grupo está deshabilitado por el administrador",
- "Please specify a valid group" : "Por favor, especifica un grupo válido",
- "Public link sharing is disabled by the administrator" : "Compartir enlaces de forma pública está deshabilitado por el administrador",
- "Public upload disabled by the administrator" : "La subida pública está deshabilitado por el administrador",
- "Public upload is only possible for publicly shared folders" : "La subida publica solo es posible poara las carpetas publicas compartidas",
- "Invalid date, date format must be YYYY-MM-DD" : "Fecha inválida, el formato de las fechas debe ser YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Compartir %s ha fallado porque el repositorio no admite compartidos del tipo %s",
- "Unknown share type" : "Tipo desconocido de recurso compartido",
- "Not a directory" : "No es un directorio",
- "Could not lock path" : "No se ha podido bloquear la ruta",
- "Can't change permissions for public share links" : "No se pueden cambiar los permisos para los enlaces de recursos compartidos públicos",
- "Wrong or no update parameter given" : "No se ha suministrado un parametro correcto",
- "Cannot increase permissions" : "No es posible aumentar permisos",
"Shared with you" : "Compartido contigo",
"Shared with others" : "Compartido con otros",
"Shared by link" : "Compartido por medio de enlaces",
@@ -44,6 +25,25 @@
"Invalid ownCloud url" : "URL de ownCloud inválida",
"Shared by" : "Compartido por",
"Sharing" : "Compartiendo",
+ "Share API is disabled" : "El API de compartir está deshabilitado",
+ "Wrong share ID, share doesn't exist" : "El ID del recurso compartido no es correcto, el recurso compartido no existe",
+ "Could not delete share" : "No se ha podido eliminar el recurso compartido",
+ "Please specify a file or folder path" : "Por favor, especifica la ubicación de un archivo o carpeta",
+ "Wrong path, file/folder doesn't exist" : "Ubicación incorrecta, el archivo/carpeta no existe",
+ "Please specify a valid user" : "Por favor, especifica un usuario válido",
+ "Group sharing is disabled by the administrator" : "Compartir en grupo está deshabilitado por el administrador",
+ "Please specify a valid group" : "Por favor, especifica un grupo válido",
+ "Public link sharing is disabled by the administrator" : "Compartir enlaces de forma pública está deshabilitado por el administrador",
+ "Public upload disabled by the administrator" : "La subida pública está deshabilitado por el administrador",
+ "Public upload is only possible for publicly shared folders" : "La subida publica solo es posible poara las carpetas publicas compartidas",
+ "Invalid date, date format must be YYYY-MM-DD" : "Fecha inválida, el formato de las fechas debe ser YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Compartir %s ha fallado porque el repositorio no admite compartidos del tipo %s",
+ "Unknown share type" : "Tipo desconocido de recurso compartido",
+ "Not a directory" : "No es un directorio",
+ "Could not lock path" : "No se ha podido bloquear la ruta",
+ "Can't change permissions for public share links" : "No se pueden cambiar los permisos para los enlaces de recursos compartidos públicos",
+ "Wrong or no update parameter given" : "No se ha suministrado un parametro correcto",
+ "Cannot increase permissions" : "No es posible aumentar permisos",
"A file or folder has been <strong>shared</strong>" : "Se ha <strong>compartido</strong> un archivo o carpeta",
"A file or folder was shared from <strong>another server</strong>" : "Se ha compartido un archivo o carpeta desde <strong>otro servidor</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Se ha <strong>descargado</strong> un archivo o carpeta compartido públicamente",
diff --git a/apps/files_sharing/l10n/fr.js b/apps/files_sharing/l10n/fr.js
index 5d5e5a53388..5fddc9855af 100644
--- a/apps/files_sharing/l10n/fr.js
+++ b/apps/files_sharing/l10n/fr.js
@@ -8,25 +8,6 @@ OC.L10N.register(
"Could not authenticate to remote share, password might be wrong" : "Impossible de s'authentifier au partage distant : le mot de passe en probablement incorrect",
"Storage not valid" : "Support de stockage non valide",
"Couldn't add remote share" : "Impossible d'ajouter le partage distant",
- "Share API is disabled" : "l'API de partage est désactivée",
- "Wrong share ID, share doesn't exist" : "Mauvais ID de partage, le partage n'existe pas",
- "Could not delete share" : "Impossible de supprimer le partage",
- "Please specify a file or folder path" : "Veuillez spécifier un fichier ou dossier",
- "Wrong path, file/folder doesn't exist" : "Mauvais chemin, Le fichier/dossier n'existe pas",
- "Please specify a valid user" : "Veuillez entrer un utilisateur valide",
- "Group sharing is disabled by the administrator" : "Le partage de groupe a été désactivé par l'administrateur",
- "Please specify a valid group" : "Veuillez entrer un groupe valide",
- "Public link sharing is disabled by the administrator" : "Le partage de lien public a été désactivé par l'administrateur",
- "Public upload disabled by the administrator" : "Téléversement public désactivé par l'administrateur",
- "Public upload is only possible for publicly shared folders" : "Le téléversement public est possible uniquement pour les dossiers partagés publiquement",
- "Invalid date, date format must be YYYY-MM-DD" : "Date invalide, le format doit être YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Le partage %s a échoué parce que l'infrastructure n'autorise pas les partages du type %s",
- "Unknown share type" : "Type de partage inconnu",
- "Not a directory" : "N'est pas un répertoire",
- "Could not lock path" : "Impossible de verrouiller le chemin",
- "Can't change permissions for public share links" : "Impossible de changer les permissions pour les liens de partage public",
- "Wrong or no update parameter given" : "Mauvais ou aucun paramètre donné ",
- "Cannot increase permissions" : "Impossible d'augmenter les permissions",
"Shared with you" : "Partagés avec vous",
"Shared with others" : "Partagés avec d'autres",
"Shared by link" : "Partagés par lien",
@@ -46,6 +27,25 @@ OC.L10N.register(
"Invalid ownCloud url" : "URL ownCloud non valide",
"Shared by" : "Partagé par",
"Sharing" : "Partage",
+ "Share API is disabled" : "l'API de partage est désactivée",
+ "Wrong share ID, share doesn't exist" : "Mauvais ID de partage, le partage n'existe pas",
+ "Could not delete share" : "Impossible de supprimer le partage",
+ "Please specify a file or folder path" : "Veuillez spécifier un fichier ou dossier",
+ "Wrong path, file/folder doesn't exist" : "Mauvais chemin, Le fichier/dossier n'existe pas",
+ "Please specify a valid user" : "Veuillez entrer un utilisateur valide",
+ "Group sharing is disabled by the administrator" : "Le partage de groupe a été désactivé par l'administrateur",
+ "Please specify a valid group" : "Veuillez entrer un groupe valide",
+ "Public link sharing is disabled by the administrator" : "Le partage de lien public a été désactivé par l'administrateur",
+ "Public upload disabled by the administrator" : "Téléversement public désactivé par l'administrateur",
+ "Public upload is only possible for publicly shared folders" : "Le téléversement public est possible uniquement pour les dossiers partagés publiquement",
+ "Invalid date, date format must be YYYY-MM-DD" : "Date invalide, le format doit être YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Le partage %s a échoué parce que l'infrastructure n'autorise pas les partages du type %s",
+ "Unknown share type" : "Type de partage inconnu",
+ "Not a directory" : "N'est pas un répertoire",
+ "Could not lock path" : "Impossible de verrouiller le chemin",
+ "Can't change permissions for public share links" : "Impossible de changer les permissions pour les liens de partage public",
+ "Wrong or no update parameter given" : "Mauvais ou aucun paramètre donné ",
+ "Cannot increase permissions" : "Impossible d'augmenter les permissions",
"A file or folder has been <strong>shared</strong>" : "Un fichier ou un répertoire a été <strong>partagé</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Un fichier ou un répertoire a été partagé depuis <strong>un autre serveur</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Un fichier ou un répertoire partagé publiquement a été <strong>téléchargé</strong>",
diff --git a/apps/files_sharing/l10n/fr.json b/apps/files_sharing/l10n/fr.json
index 6f5f063fba4..254da51c315 100644
--- a/apps/files_sharing/l10n/fr.json
+++ b/apps/files_sharing/l10n/fr.json
@@ -6,25 +6,6 @@
"Could not authenticate to remote share, password might be wrong" : "Impossible de s'authentifier au partage distant : le mot de passe en probablement incorrect",
"Storage not valid" : "Support de stockage non valide",
"Couldn't add remote share" : "Impossible d'ajouter le partage distant",
- "Share API is disabled" : "l'API de partage est désactivée",
- "Wrong share ID, share doesn't exist" : "Mauvais ID de partage, le partage n'existe pas",
- "Could not delete share" : "Impossible de supprimer le partage",
- "Please specify a file or folder path" : "Veuillez spécifier un fichier ou dossier",
- "Wrong path, file/folder doesn't exist" : "Mauvais chemin, Le fichier/dossier n'existe pas",
- "Please specify a valid user" : "Veuillez entrer un utilisateur valide",
- "Group sharing is disabled by the administrator" : "Le partage de groupe a été désactivé par l'administrateur",
- "Please specify a valid group" : "Veuillez entrer un groupe valide",
- "Public link sharing is disabled by the administrator" : "Le partage de lien public a été désactivé par l'administrateur",
- "Public upload disabled by the administrator" : "Téléversement public désactivé par l'administrateur",
- "Public upload is only possible for publicly shared folders" : "Le téléversement public est possible uniquement pour les dossiers partagés publiquement",
- "Invalid date, date format must be YYYY-MM-DD" : "Date invalide, le format doit être YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Le partage %s a échoué parce que l'infrastructure n'autorise pas les partages du type %s",
- "Unknown share type" : "Type de partage inconnu",
- "Not a directory" : "N'est pas un répertoire",
- "Could not lock path" : "Impossible de verrouiller le chemin",
- "Can't change permissions for public share links" : "Impossible de changer les permissions pour les liens de partage public",
- "Wrong or no update parameter given" : "Mauvais ou aucun paramètre donné ",
- "Cannot increase permissions" : "Impossible d'augmenter les permissions",
"Shared with you" : "Partagés avec vous",
"Shared with others" : "Partagés avec d'autres",
"Shared by link" : "Partagés par lien",
@@ -44,6 +25,25 @@
"Invalid ownCloud url" : "URL ownCloud non valide",
"Shared by" : "Partagé par",
"Sharing" : "Partage",
+ "Share API is disabled" : "l'API de partage est désactivée",
+ "Wrong share ID, share doesn't exist" : "Mauvais ID de partage, le partage n'existe pas",
+ "Could not delete share" : "Impossible de supprimer le partage",
+ "Please specify a file or folder path" : "Veuillez spécifier un fichier ou dossier",
+ "Wrong path, file/folder doesn't exist" : "Mauvais chemin, Le fichier/dossier n'existe pas",
+ "Please specify a valid user" : "Veuillez entrer un utilisateur valide",
+ "Group sharing is disabled by the administrator" : "Le partage de groupe a été désactivé par l'administrateur",
+ "Please specify a valid group" : "Veuillez entrer un groupe valide",
+ "Public link sharing is disabled by the administrator" : "Le partage de lien public a été désactivé par l'administrateur",
+ "Public upload disabled by the administrator" : "Téléversement public désactivé par l'administrateur",
+ "Public upload is only possible for publicly shared folders" : "Le téléversement public est possible uniquement pour les dossiers partagés publiquement",
+ "Invalid date, date format must be YYYY-MM-DD" : "Date invalide, le format doit être YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Le partage %s a échoué parce que l'infrastructure n'autorise pas les partages du type %s",
+ "Unknown share type" : "Type de partage inconnu",
+ "Not a directory" : "N'est pas un répertoire",
+ "Could not lock path" : "Impossible de verrouiller le chemin",
+ "Can't change permissions for public share links" : "Impossible de changer les permissions pour les liens de partage public",
+ "Wrong or no update parameter given" : "Mauvais ou aucun paramètre donné ",
+ "Cannot increase permissions" : "Impossible d'augmenter les permissions",
"A file or folder has been <strong>shared</strong>" : "Un fichier ou un répertoire a été <strong>partagé</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Un fichier ou un répertoire a été partagé depuis <strong>un autre serveur</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Un fichier ou un répertoire partagé publiquement a été <strong>téléchargé</strong>",
diff --git a/apps/files_sharing/l10n/it.js b/apps/files_sharing/l10n/it.js
index b3da7169861..85231123e53 100644
--- a/apps/files_sharing/l10n/it.js
+++ b/apps/files_sharing/l10n/it.js
@@ -8,25 +8,6 @@ OC.L10N.register(
"Could not authenticate to remote share, password might be wrong" : "Impossibile autenticarsi sulla condivisione remota, la password potrebbe essere errata",
"Storage not valid" : "Archiviazione non valida",
"Couldn't add remote share" : "Impossibile aggiungere la condivisione remota",
- "Share API is disabled" : "API di condivisione disabilitate",
- "Wrong share ID, share doesn't exist" : "ID di condivisione errato, la condivisione non esiste",
- "Could not delete share" : "impossibile eliminare la condivisione",
- "Please specify a file or folder path" : "Specifica un percorso di un file o di una cartella",
- "Wrong path, file/folder doesn't exist" : "Percorso errato, file/cartella inesistente",
- "Please specify a valid user" : "Specifica un utente valido",
- "Group sharing is disabled by the administrator" : "La condivisione di gruppo è disabilitata dall'amministratore",
- "Please specify a valid group" : "Specifica un gruppo valido",
- "Public link sharing is disabled by the administrator" : "La condivisione pubblica di collegamenti è disabilitata dall'amministratore",
- "Public upload disabled by the administrator" : "Caricamento pubblico disabilitato dall'amministratore",
- "Public upload is only possible for publicly shared folders" : "Il caricamento pubblico è possibile solo per cartelle condivise pubblicamente",
- "Invalid date, date format must be YYYY-MM-DD" : "Data non valida, il formato della data deve essere YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Condivisione di %s non riuscita poiché il motore non consente condivisioni del tipo %s",
- "Unknown share type" : "Tipo di condivisione sconosciuto",
- "Not a directory" : "Non è una cartella",
- "Could not lock path" : "Impossibile bloccare il percorso",
- "Can't change permissions for public share links" : "Impossibile cambiare i permessi per i collegamenti di condivisione pubblici",
- "Wrong or no update parameter given" : "Parametro fornito non valido o non di aggiornamento",
- "Cannot increase permissions" : "Impossibile aumentare i permessi",
"Shared with you" : "Condivisi con te",
"Shared with others" : "Condivisi con altri",
"Shared by link" : "Condivisi tramite collegamento",
@@ -46,6 +27,25 @@ OC.L10N.register(
"Invalid ownCloud url" : "URL di ownCloud non valido",
"Shared by" : "Condiviso da",
"Sharing" : "Condivisione",
+ "Share API is disabled" : "API di condivisione disabilitate",
+ "Wrong share ID, share doesn't exist" : "ID di condivisione errato, la condivisione non esiste",
+ "Could not delete share" : "impossibile eliminare la condivisione",
+ "Please specify a file or folder path" : "Specifica un percorso di un file o di una cartella",
+ "Wrong path, file/folder doesn't exist" : "Percorso errato, file/cartella inesistente",
+ "Please specify a valid user" : "Specifica un utente valido",
+ "Group sharing is disabled by the administrator" : "La condivisione di gruppo è disabilitata dall'amministratore",
+ "Please specify a valid group" : "Specifica un gruppo valido",
+ "Public link sharing is disabled by the administrator" : "La condivisione pubblica di collegamenti è disabilitata dall'amministratore",
+ "Public upload disabled by the administrator" : "Caricamento pubblico disabilitato dall'amministratore",
+ "Public upload is only possible for publicly shared folders" : "Il caricamento pubblico è possibile solo per cartelle condivise pubblicamente",
+ "Invalid date, date format must be YYYY-MM-DD" : "Data non valida, il formato della data deve essere YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Condivisione di %s non riuscita poiché il motore non consente condivisioni del tipo %s",
+ "Unknown share type" : "Tipo di condivisione sconosciuto",
+ "Not a directory" : "Non è una cartella",
+ "Could not lock path" : "Impossibile bloccare il percorso",
+ "Can't change permissions for public share links" : "Impossibile cambiare i permessi per i collegamenti di condivisione pubblici",
+ "Wrong or no update parameter given" : "Parametro fornito non valido o non di aggiornamento",
+ "Cannot increase permissions" : "Impossibile aumentare i permessi",
"A file or folder has been <strong>shared</strong>" : "Un file o una cartella è stato <strong>condiviso</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Un file o una cartella è stato condiviso da <strong>un altro server</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Un file condiviso pubblicamente o una cartella è stato <strong>scaricato</strong>",
diff --git a/apps/files_sharing/l10n/it.json b/apps/files_sharing/l10n/it.json
index eeb4f845133..461b8602a1e 100644
--- a/apps/files_sharing/l10n/it.json
+++ b/apps/files_sharing/l10n/it.json
@@ -6,25 +6,6 @@
"Could not authenticate to remote share, password might be wrong" : "Impossibile autenticarsi sulla condivisione remota, la password potrebbe essere errata",
"Storage not valid" : "Archiviazione non valida",
"Couldn't add remote share" : "Impossibile aggiungere la condivisione remota",
- "Share API is disabled" : "API di condivisione disabilitate",
- "Wrong share ID, share doesn't exist" : "ID di condivisione errato, la condivisione non esiste",
- "Could not delete share" : "impossibile eliminare la condivisione",
- "Please specify a file or folder path" : "Specifica un percorso di un file o di una cartella",
- "Wrong path, file/folder doesn't exist" : "Percorso errato, file/cartella inesistente",
- "Please specify a valid user" : "Specifica un utente valido",
- "Group sharing is disabled by the administrator" : "La condivisione di gruppo è disabilitata dall'amministratore",
- "Please specify a valid group" : "Specifica un gruppo valido",
- "Public link sharing is disabled by the administrator" : "La condivisione pubblica di collegamenti è disabilitata dall'amministratore",
- "Public upload disabled by the administrator" : "Caricamento pubblico disabilitato dall'amministratore",
- "Public upload is only possible for publicly shared folders" : "Il caricamento pubblico è possibile solo per cartelle condivise pubblicamente",
- "Invalid date, date format must be YYYY-MM-DD" : "Data non valida, il formato della data deve essere YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Condivisione di %s non riuscita poiché il motore non consente condivisioni del tipo %s",
- "Unknown share type" : "Tipo di condivisione sconosciuto",
- "Not a directory" : "Non è una cartella",
- "Could not lock path" : "Impossibile bloccare il percorso",
- "Can't change permissions for public share links" : "Impossibile cambiare i permessi per i collegamenti di condivisione pubblici",
- "Wrong or no update parameter given" : "Parametro fornito non valido o non di aggiornamento",
- "Cannot increase permissions" : "Impossibile aumentare i permessi",
"Shared with you" : "Condivisi con te",
"Shared with others" : "Condivisi con altri",
"Shared by link" : "Condivisi tramite collegamento",
@@ -44,6 +25,25 @@
"Invalid ownCloud url" : "URL di ownCloud non valido",
"Shared by" : "Condiviso da",
"Sharing" : "Condivisione",
+ "Share API is disabled" : "API di condivisione disabilitate",
+ "Wrong share ID, share doesn't exist" : "ID di condivisione errato, la condivisione non esiste",
+ "Could not delete share" : "impossibile eliminare la condivisione",
+ "Please specify a file or folder path" : "Specifica un percorso di un file o di una cartella",
+ "Wrong path, file/folder doesn't exist" : "Percorso errato, file/cartella inesistente",
+ "Please specify a valid user" : "Specifica un utente valido",
+ "Group sharing is disabled by the administrator" : "La condivisione di gruppo è disabilitata dall'amministratore",
+ "Please specify a valid group" : "Specifica un gruppo valido",
+ "Public link sharing is disabled by the administrator" : "La condivisione pubblica di collegamenti è disabilitata dall'amministratore",
+ "Public upload disabled by the administrator" : "Caricamento pubblico disabilitato dall'amministratore",
+ "Public upload is only possible for publicly shared folders" : "Il caricamento pubblico è possibile solo per cartelle condivise pubblicamente",
+ "Invalid date, date format must be YYYY-MM-DD" : "Data non valida, il formato della data deve essere YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Condivisione di %s non riuscita poiché il motore non consente condivisioni del tipo %s",
+ "Unknown share type" : "Tipo di condivisione sconosciuto",
+ "Not a directory" : "Non è una cartella",
+ "Could not lock path" : "Impossibile bloccare il percorso",
+ "Can't change permissions for public share links" : "Impossibile cambiare i permessi per i collegamenti di condivisione pubblici",
+ "Wrong or no update parameter given" : "Parametro fornito non valido o non di aggiornamento",
+ "Cannot increase permissions" : "Impossibile aumentare i permessi",
"A file or folder has been <strong>shared</strong>" : "Un file o una cartella è stato <strong>condiviso</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Un file o una cartella è stato condiviso da <strong>un altro server</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Un file condiviso pubblicamente o una cartella è stato <strong>scaricato</strong>",
diff --git a/apps/files_sharing/l10n/ja.js b/apps/files_sharing/l10n/ja.js
index 6e7f688fece..bd40344053a 100644
--- a/apps/files_sharing/l10n/ja.js
+++ b/apps/files_sharing/l10n/ja.js
@@ -8,25 +8,6 @@ OC.L10N.register(
"Could not authenticate to remote share, password might be wrong" : "リモート共有が認証できませんでした,パスワードが間違っているかもしれません",
"Storage not valid" : "ストレージが無効です",
"Couldn't add remote share" : "リモート共有を追加できませんでした",
- "Share API is disabled" : "共有APIが無効です。",
- "Wrong share ID, share doesn't exist" : "共有IDが間違っています。共有がありません。",
- "Could not delete share" : "共有を削除できませんでした",
- "Please specify a file or folder path" : "ファイルかフォルダーのパスを指定してください",
- "Wrong path, file/folder doesn't exist" : "パスが間違っています。ファイル/フォルダーがありません",
- "Please specify a valid user" : "正しいユーザーを指定してください",
- "Group sharing is disabled by the administrator" : "グループ共有が管理者によって無効にされています。",
- "Please specify a valid group" : "正しいグループを指定してください",
- "Public link sharing is disabled by the administrator" : "URL共有が管理者によって無効されています。",
- "Public upload disabled by the administrator" : "URL共有へのアップロードが管理者によって無効されています。",
- "Public upload is only possible for publicly shared folders" : "公開共有されているフォルダーにしか公開アップロードはできません。",
- "Invalid date, date format must be YYYY-MM-DD" : "無効な日付です。YYYY-MM-DDのフォーマットで日付を指定してください。",
- "Sharing %s failed because the back end does not allow shares from type %s" : "%s の共有に失敗しました。バックエンド側で %s タイプの共有が許可されていません。",
- "Unknown share type" : "不明な共有タイプ",
- "Not a directory" : "ディレクトリではありません",
- "Could not lock path" : "パスをロックできませんでした",
- "Can't change permissions for public share links" : "URLリンク共有のパーミッションを変更できません",
- "Wrong or no update parameter given" : "間違っている、もしくはパラメータが更新されていません",
- "Cannot increase permissions" : "パーミッションを追加できません",
"Shared with you" : "他ユーザーがあなたと共有中",
"Shared with others" : "他ユーザーと共有中",
"Shared by link" : "URLリンクで共有中",
@@ -46,6 +27,25 @@ OC.L10N.register(
"Invalid ownCloud url" : "無効なownCloud URL です",
"Shared by" : "共有者:",
"Sharing" : "共有",
+ "Share API is disabled" : "共有APIが無効です。",
+ "Wrong share ID, share doesn't exist" : "共有IDが間違っています。共有がありません。",
+ "Could not delete share" : "共有を削除できませんでした",
+ "Please specify a file or folder path" : "ファイルかフォルダーのパスを指定してください",
+ "Wrong path, file/folder doesn't exist" : "パスが間違っています。ファイル/フォルダーがありません",
+ "Please specify a valid user" : "正しいユーザーを指定してください",
+ "Group sharing is disabled by the administrator" : "グループ共有が管理者によって無効にされています。",
+ "Please specify a valid group" : "正しいグループを指定してください",
+ "Public link sharing is disabled by the administrator" : "URL共有が管理者によって無効されています。",
+ "Public upload disabled by the administrator" : "URL共有へのアップロードが管理者によって無効されています。",
+ "Public upload is only possible for publicly shared folders" : "公開共有されているフォルダーにしか公開アップロードはできません。",
+ "Invalid date, date format must be YYYY-MM-DD" : "無効な日付です。YYYY-MM-DDのフォーマットで日付を指定してください。",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "%s の共有に失敗しました。バックエンド側で %s タイプの共有が許可されていません。",
+ "Unknown share type" : "不明な共有タイプ",
+ "Not a directory" : "ディレクトリではありません",
+ "Could not lock path" : "パスをロックできませんでした",
+ "Can't change permissions for public share links" : "URLリンク共有のパーミッションを変更できません",
+ "Wrong or no update parameter given" : "間違っている、もしくはパラメータが更新されていません",
+ "Cannot increase permissions" : "パーミッションを追加できません",
"A file or folder has been <strong>shared</strong>" : "ファイルまたはフォルダーが<strong>共有</strong>されたとき",
"A file or folder was shared from <strong>another server</strong>" : "ファイルまたはフォルダーが<strong>他のサーバー</strong>から共有されたとき",
"A public shared file or folder was <strong>downloaded</strong>" : "公開共有ファイルまたはフォルダーが<strong>ダウンロード</strong>されたとき",
diff --git a/apps/files_sharing/l10n/ja.json b/apps/files_sharing/l10n/ja.json
index 8a9961899f0..4b98342822d 100644
--- a/apps/files_sharing/l10n/ja.json
+++ b/apps/files_sharing/l10n/ja.json
@@ -6,25 +6,6 @@
"Could not authenticate to remote share, password might be wrong" : "リモート共有が認証できませんでした,パスワードが間違っているかもしれません",
"Storage not valid" : "ストレージが無効です",
"Couldn't add remote share" : "リモート共有を追加できませんでした",
- "Share API is disabled" : "共有APIが無効です。",
- "Wrong share ID, share doesn't exist" : "共有IDが間違っています。共有がありません。",
- "Could not delete share" : "共有を削除できませんでした",
- "Please specify a file or folder path" : "ファイルかフォルダーのパスを指定してください",
- "Wrong path, file/folder doesn't exist" : "パスが間違っています。ファイル/フォルダーがありません",
- "Please specify a valid user" : "正しいユーザーを指定してください",
- "Group sharing is disabled by the administrator" : "グループ共有が管理者によって無効にされています。",
- "Please specify a valid group" : "正しいグループを指定してください",
- "Public link sharing is disabled by the administrator" : "URL共有が管理者によって無効されています。",
- "Public upload disabled by the administrator" : "URL共有へのアップロードが管理者によって無効されています。",
- "Public upload is only possible for publicly shared folders" : "公開共有されているフォルダーにしか公開アップロードはできません。",
- "Invalid date, date format must be YYYY-MM-DD" : "無効な日付です。YYYY-MM-DDのフォーマットで日付を指定してください。",
- "Sharing %s failed because the back end does not allow shares from type %s" : "%s の共有に失敗しました。バックエンド側で %s タイプの共有が許可されていません。",
- "Unknown share type" : "不明な共有タイプ",
- "Not a directory" : "ディレクトリではありません",
- "Could not lock path" : "パスをロックできませんでした",
- "Can't change permissions for public share links" : "URLリンク共有のパーミッションを変更できません",
- "Wrong or no update parameter given" : "間違っている、もしくはパラメータが更新されていません",
- "Cannot increase permissions" : "パーミッションを追加できません",
"Shared with you" : "他ユーザーがあなたと共有中",
"Shared with others" : "他ユーザーと共有中",
"Shared by link" : "URLリンクで共有中",
@@ -44,6 +25,25 @@
"Invalid ownCloud url" : "無効なownCloud URL です",
"Shared by" : "共有者:",
"Sharing" : "共有",
+ "Share API is disabled" : "共有APIが無効です。",
+ "Wrong share ID, share doesn't exist" : "共有IDが間違っています。共有がありません。",
+ "Could not delete share" : "共有を削除できませんでした",
+ "Please specify a file or folder path" : "ファイルかフォルダーのパスを指定してください",
+ "Wrong path, file/folder doesn't exist" : "パスが間違っています。ファイル/フォルダーがありません",
+ "Please specify a valid user" : "正しいユーザーを指定してください",
+ "Group sharing is disabled by the administrator" : "グループ共有が管理者によって無効にされています。",
+ "Please specify a valid group" : "正しいグループを指定してください",
+ "Public link sharing is disabled by the administrator" : "URL共有が管理者によって無効されています。",
+ "Public upload disabled by the administrator" : "URL共有へのアップロードが管理者によって無効されています。",
+ "Public upload is only possible for publicly shared folders" : "公開共有されているフォルダーにしか公開アップロードはできません。",
+ "Invalid date, date format must be YYYY-MM-DD" : "無効な日付です。YYYY-MM-DDのフォーマットで日付を指定してください。",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "%s の共有に失敗しました。バックエンド側で %s タイプの共有が許可されていません。",
+ "Unknown share type" : "不明な共有タイプ",
+ "Not a directory" : "ディレクトリではありません",
+ "Could not lock path" : "パスをロックできませんでした",
+ "Can't change permissions for public share links" : "URLリンク共有のパーミッションを変更できません",
+ "Wrong or no update parameter given" : "間違っている、もしくはパラメータが更新されていません",
+ "Cannot increase permissions" : "パーミッションを追加できません",
"A file or folder has been <strong>shared</strong>" : "ファイルまたはフォルダーが<strong>共有</strong>されたとき",
"A file or folder was shared from <strong>another server</strong>" : "ファイルまたはフォルダーが<strong>他のサーバー</strong>から共有されたとき",
"A public shared file or folder was <strong>downloaded</strong>" : "公開共有ファイルまたはフォルダーが<strong>ダウンロード</strong>されたとき",
diff --git a/apps/files_sharing/l10n/lv.js b/apps/files_sharing/l10n/lv.js
index 41fcffb93ff..edbdb89fe89 100644
--- a/apps/files_sharing/l10n/lv.js
+++ b/apps/files_sharing/l10n/lv.js
@@ -7,22 +7,6 @@ OC.L10N.register(
"Could not authenticate to remote share, password might be wrong" : "Nesanāca autentificēties pie attālinātās koplietotnes, parole varētu būt nepareiza",
"Storage not valid" : "Glabātuve nav derīga",
"Couldn't add remote share" : "Nevarēja pievienot attālināto koplietotni",
- "Share API is disabled" : "Koplietošanas API ir atslēgta",
- "Wrong share ID, share doesn't exist" : "Nepareizs koplietošanas ID, koplietotne neeksistē",
- "Could not delete share" : "Neizdevās dzēst koplietotni",
- "Please specify a file or folder path" : "Lūdzu norādiet datnes vai mapes ceļu",
- "Wrong path, file/folder doesn't exist" : "Nepareizs ceļš, datne/mape neeksistē",
- "Please specify a valid user" : "Lūdzu norādiet derīgu lietotāju",
- "Group sharing is disabled by the administrator" : "Administrators grupas koplietošanu ir atslēdzis",
- "Please specify a valid group" : "Lūdzu norādiet derīgu grupu",
- "Public link sharing is disabled by the administrator" : "Administrators publisku saites koplietošanu ir atslēdzis",
- "Public upload disabled by the administrator" : "Administrators publisku augšupielādi ir atslēdzis",
- "Public upload is only possible for publicly shared folders" : "Publiska augšupielāde iespējama tikai publiski koplietotām mapēm",
- "Invalid date, date format must be YYYY-MM-DD" : "Nepareizs datums, datumam jābūt YYYY-MM-DD formātā",
- "Unknown share type" : "Nezināms koplietošanas tips",
- "Could not lock path" : "Nevarēja bloķēt ceļu",
- "Can't change permissions for public share links" : "Publiskai koplietošanas saitei nevar mainīt tiesības",
- "Cannot increase permissions" : "Nevar palielināt tiesības",
"Shared with you" : "Koplietots ar tevi",
"Shared with others" : "Koplietots ar citiem",
"Shared by link" : "Koplietots ar saiti",
@@ -42,6 +26,22 @@ OC.L10N.register(
"Invalid ownCloud url" : "Nederīga ownCloud saite",
"Shared by" : "Dalījās",
"Sharing" : "Dalīšanās",
+ "Share API is disabled" : "Koplietošanas API ir atslēgta",
+ "Wrong share ID, share doesn't exist" : "Nepareizs koplietošanas ID, koplietotne neeksistē",
+ "Could not delete share" : "Neizdevās dzēst koplietotni",
+ "Please specify a file or folder path" : "Lūdzu norādiet datnes vai mapes ceļu",
+ "Wrong path, file/folder doesn't exist" : "Nepareizs ceļš, datne/mape neeksistē",
+ "Please specify a valid user" : "Lūdzu norādiet derīgu lietotāju",
+ "Group sharing is disabled by the administrator" : "Administrators grupas koplietošanu ir atslēdzis",
+ "Please specify a valid group" : "Lūdzu norādiet derīgu grupu",
+ "Public link sharing is disabled by the administrator" : "Administrators publisku saites koplietošanu ir atslēdzis",
+ "Public upload disabled by the administrator" : "Administrators publisku augšupielādi ir atslēdzis",
+ "Public upload is only possible for publicly shared folders" : "Publiska augšupielāde iespējama tikai publiski koplietotām mapēm",
+ "Invalid date, date format must be YYYY-MM-DD" : "Nepareizs datums, datumam jābūt YYYY-MM-DD formātā",
+ "Unknown share type" : "Nezināms koplietošanas tips",
+ "Could not lock path" : "Nevarēja bloķēt ceļu",
+ "Can't change permissions for public share links" : "Publiskai koplietošanas saitei nevar mainīt tiesības",
+ "Cannot increase permissions" : "Nevar palielināt tiesības",
"A file or folder has been <strong>shared</strong>" : "<strong>Koplietota</strong> fails vai mape",
"A file or folder was shared from <strong>another server</strong>" : "Fails vai mape tika koplietota no <strong>cita servera</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Publiski koplietots fails vai mape tika <strong>lejupielādēts</strong>",
diff --git a/apps/files_sharing/l10n/lv.json b/apps/files_sharing/l10n/lv.json
index c4557eed842..74fc7041409 100644
--- a/apps/files_sharing/l10n/lv.json
+++ b/apps/files_sharing/l10n/lv.json
@@ -5,22 +5,6 @@
"Could not authenticate to remote share, password might be wrong" : "Nesanāca autentificēties pie attālinātās koplietotnes, parole varētu būt nepareiza",
"Storage not valid" : "Glabātuve nav derīga",
"Couldn't add remote share" : "Nevarēja pievienot attālināto koplietotni",
- "Share API is disabled" : "Koplietošanas API ir atslēgta",
- "Wrong share ID, share doesn't exist" : "Nepareizs koplietošanas ID, koplietotne neeksistē",
- "Could not delete share" : "Neizdevās dzēst koplietotni",
- "Please specify a file or folder path" : "Lūdzu norādiet datnes vai mapes ceļu",
- "Wrong path, file/folder doesn't exist" : "Nepareizs ceļš, datne/mape neeksistē",
- "Please specify a valid user" : "Lūdzu norādiet derīgu lietotāju",
- "Group sharing is disabled by the administrator" : "Administrators grupas koplietošanu ir atslēdzis",
- "Please specify a valid group" : "Lūdzu norādiet derīgu grupu",
- "Public link sharing is disabled by the administrator" : "Administrators publisku saites koplietošanu ir atslēdzis",
- "Public upload disabled by the administrator" : "Administrators publisku augšupielādi ir atslēdzis",
- "Public upload is only possible for publicly shared folders" : "Publiska augšupielāde iespējama tikai publiski koplietotām mapēm",
- "Invalid date, date format must be YYYY-MM-DD" : "Nepareizs datums, datumam jābūt YYYY-MM-DD formātā",
- "Unknown share type" : "Nezināms koplietošanas tips",
- "Could not lock path" : "Nevarēja bloķēt ceļu",
- "Can't change permissions for public share links" : "Publiskai koplietošanas saitei nevar mainīt tiesības",
- "Cannot increase permissions" : "Nevar palielināt tiesības",
"Shared with you" : "Koplietots ar tevi",
"Shared with others" : "Koplietots ar citiem",
"Shared by link" : "Koplietots ar saiti",
@@ -40,6 +24,22 @@
"Invalid ownCloud url" : "Nederīga ownCloud saite",
"Shared by" : "Dalījās",
"Sharing" : "Dalīšanās",
+ "Share API is disabled" : "Koplietošanas API ir atslēgta",
+ "Wrong share ID, share doesn't exist" : "Nepareizs koplietošanas ID, koplietotne neeksistē",
+ "Could not delete share" : "Neizdevās dzēst koplietotni",
+ "Please specify a file or folder path" : "Lūdzu norādiet datnes vai mapes ceļu",
+ "Wrong path, file/folder doesn't exist" : "Nepareizs ceļš, datne/mape neeksistē",
+ "Please specify a valid user" : "Lūdzu norādiet derīgu lietotāju",
+ "Group sharing is disabled by the administrator" : "Administrators grupas koplietošanu ir atslēdzis",
+ "Please specify a valid group" : "Lūdzu norādiet derīgu grupu",
+ "Public link sharing is disabled by the administrator" : "Administrators publisku saites koplietošanu ir atslēdzis",
+ "Public upload disabled by the administrator" : "Administrators publisku augšupielādi ir atslēdzis",
+ "Public upload is only possible for publicly shared folders" : "Publiska augšupielāde iespējama tikai publiski koplietotām mapēm",
+ "Invalid date, date format must be YYYY-MM-DD" : "Nepareizs datums, datumam jābūt YYYY-MM-DD formātā",
+ "Unknown share type" : "Nezināms koplietošanas tips",
+ "Could not lock path" : "Nevarēja bloķēt ceļu",
+ "Can't change permissions for public share links" : "Publiskai koplietošanas saitei nevar mainīt tiesības",
+ "Cannot increase permissions" : "Nevar palielināt tiesības",
"A file or folder has been <strong>shared</strong>" : "<strong>Koplietota</strong> fails vai mape",
"A file or folder was shared from <strong>another server</strong>" : "Fails vai mape tika koplietota no <strong>cita servera</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Publiski koplietots fails vai mape tika <strong>lejupielādēts</strong>",
diff --git a/apps/files_sharing/l10n/nl.js b/apps/files_sharing/l10n/nl.js
index 738ef8dee63..9bd9ba81331 100644
--- a/apps/files_sharing/l10n/nl.js
+++ b/apps/files_sharing/l10n/nl.js
@@ -8,25 +8,6 @@ OC.L10N.register(
"Could not authenticate to remote share, password might be wrong" : "Kon niet authenticeren bij externe share, misschien verkeerd wachtwoord",
"Storage not valid" : "Opslag ongeldig",
"Couldn't add remote share" : "Kon geen externe share toevoegen",
- "Share API is disabled" : "Delen API is uitgeschakeld",
- "Wrong share ID, share doesn't exist" : "Onjuist deel-ID, de share bestaat niet",
- "Could not delete share" : "Kon share niet verwijderen",
- "Please specify a file or folder path" : "Geef een bestand of pad van een map op",
- "Wrong path, file/folder doesn't exist" : "Onjuist pad, bestand/map bestaat niet",
- "Please specify a valid user" : "Geef een geldige gebruiker op",
- "Group sharing is disabled by the administrator" : "Delen voor groepen is uitgeschakeld door de beheerder",
- "Please specify a valid group" : "Geef een geldige groep op",
- "Public link sharing is disabled by the administrator" : "Delen van openbare links is uitgeschakeld door de beheerder",
- "Public upload disabled by the administrator" : "Publieke upload uitgeschakeld door de systeembeheerder",
- "Public upload is only possible for publicly shared folders" : "Publieke upload is alleen mogelijk voor publiek gedeelde mappen",
- "Invalid date, date format must be YYYY-MM-DD" : "Ongeldige datum, datumnotatie moet in de vorm YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Delen van %s mislukte omdat de backend het delen van type %s niet ondersteunt",
- "Unknown share type" : "Onbekend type share",
- "Not a directory" : "Geen directory",
- "Could not lock path" : "Kon pad niet blokkeren",
- "Can't change permissions for public share links" : "Kan permissies voor openbare share links niet wijzigen",
- "Wrong or no update parameter given" : "Verkeerde of geen update parameter gegeven",
- "Cannot increase permissions" : "Kan de rechten niet verruimen",
"Shared with you" : "Gedeeld met u",
"Shared with others" : "Gedeeld door u",
"Shared by link" : "Gedeeld via een link",
@@ -46,6 +27,25 @@ OC.L10N.register(
"Invalid ownCloud url" : "Ongeldige ownCloud url",
"Shared by" : "Gedeeld door",
"Sharing" : "Delen",
+ "Share API is disabled" : "Delen API is uitgeschakeld",
+ "Wrong share ID, share doesn't exist" : "Onjuist deel-ID, de share bestaat niet",
+ "Could not delete share" : "Kon share niet verwijderen",
+ "Please specify a file or folder path" : "Geef een bestand of pad van een map op",
+ "Wrong path, file/folder doesn't exist" : "Onjuist pad, bestand/map bestaat niet",
+ "Please specify a valid user" : "Geef een geldige gebruiker op",
+ "Group sharing is disabled by the administrator" : "Delen voor groepen is uitgeschakeld door de beheerder",
+ "Please specify a valid group" : "Geef een geldige groep op",
+ "Public link sharing is disabled by the administrator" : "Delen van openbare links is uitgeschakeld door de beheerder",
+ "Public upload disabled by the administrator" : "Publieke upload uitgeschakeld door de systeembeheerder",
+ "Public upload is only possible for publicly shared folders" : "Publieke upload is alleen mogelijk voor publiek gedeelde mappen",
+ "Invalid date, date format must be YYYY-MM-DD" : "Ongeldige datum, datumnotatie moet in de vorm YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Delen van %s mislukte omdat de backend het delen van type %s niet ondersteunt",
+ "Unknown share type" : "Onbekend type share",
+ "Not a directory" : "Geen directory",
+ "Could not lock path" : "Kon pad niet blokkeren",
+ "Can't change permissions for public share links" : "Kan permissies voor openbare share links niet wijzigen",
+ "Wrong or no update parameter given" : "Verkeerde of geen update parameter gegeven",
+ "Cannot increase permissions" : "Kan de rechten niet verruimen",
"A file or folder has been <strong>shared</strong>" : "Een bestand of map is <strong>gedeeld</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Een bestand of map werd gedeeld vanaf <strong>een andere server</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Een openbaar gedeeld bestand of map werd <strong>gedownloaded</strong>",
diff --git a/apps/files_sharing/l10n/nl.json b/apps/files_sharing/l10n/nl.json
index 7b0d2f0153b..01558fc5e73 100644
--- a/apps/files_sharing/l10n/nl.json
+++ b/apps/files_sharing/l10n/nl.json
@@ -6,25 +6,6 @@
"Could not authenticate to remote share, password might be wrong" : "Kon niet authenticeren bij externe share, misschien verkeerd wachtwoord",
"Storage not valid" : "Opslag ongeldig",
"Couldn't add remote share" : "Kon geen externe share toevoegen",
- "Share API is disabled" : "Delen API is uitgeschakeld",
- "Wrong share ID, share doesn't exist" : "Onjuist deel-ID, de share bestaat niet",
- "Could not delete share" : "Kon share niet verwijderen",
- "Please specify a file or folder path" : "Geef een bestand of pad van een map op",
- "Wrong path, file/folder doesn't exist" : "Onjuist pad, bestand/map bestaat niet",
- "Please specify a valid user" : "Geef een geldige gebruiker op",
- "Group sharing is disabled by the administrator" : "Delen voor groepen is uitgeschakeld door de beheerder",
- "Please specify a valid group" : "Geef een geldige groep op",
- "Public link sharing is disabled by the administrator" : "Delen van openbare links is uitgeschakeld door de beheerder",
- "Public upload disabled by the administrator" : "Publieke upload uitgeschakeld door de systeembeheerder",
- "Public upload is only possible for publicly shared folders" : "Publieke upload is alleen mogelijk voor publiek gedeelde mappen",
- "Invalid date, date format must be YYYY-MM-DD" : "Ongeldige datum, datumnotatie moet in de vorm YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Delen van %s mislukte omdat de backend het delen van type %s niet ondersteunt",
- "Unknown share type" : "Onbekend type share",
- "Not a directory" : "Geen directory",
- "Could not lock path" : "Kon pad niet blokkeren",
- "Can't change permissions for public share links" : "Kan permissies voor openbare share links niet wijzigen",
- "Wrong or no update parameter given" : "Verkeerde of geen update parameter gegeven",
- "Cannot increase permissions" : "Kan de rechten niet verruimen",
"Shared with you" : "Gedeeld met u",
"Shared with others" : "Gedeeld door u",
"Shared by link" : "Gedeeld via een link",
@@ -44,6 +25,25 @@
"Invalid ownCloud url" : "Ongeldige ownCloud url",
"Shared by" : "Gedeeld door",
"Sharing" : "Delen",
+ "Share API is disabled" : "Delen API is uitgeschakeld",
+ "Wrong share ID, share doesn't exist" : "Onjuist deel-ID, de share bestaat niet",
+ "Could not delete share" : "Kon share niet verwijderen",
+ "Please specify a file or folder path" : "Geef een bestand of pad van een map op",
+ "Wrong path, file/folder doesn't exist" : "Onjuist pad, bestand/map bestaat niet",
+ "Please specify a valid user" : "Geef een geldige gebruiker op",
+ "Group sharing is disabled by the administrator" : "Delen voor groepen is uitgeschakeld door de beheerder",
+ "Please specify a valid group" : "Geef een geldige groep op",
+ "Public link sharing is disabled by the administrator" : "Delen van openbare links is uitgeschakeld door de beheerder",
+ "Public upload disabled by the administrator" : "Publieke upload uitgeschakeld door de systeembeheerder",
+ "Public upload is only possible for publicly shared folders" : "Publieke upload is alleen mogelijk voor publiek gedeelde mappen",
+ "Invalid date, date format must be YYYY-MM-DD" : "Ongeldige datum, datumnotatie moet in de vorm YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Delen van %s mislukte omdat de backend het delen van type %s niet ondersteunt",
+ "Unknown share type" : "Onbekend type share",
+ "Not a directory" : "Geen directory",
+ "Could not lock path" : "Kon pad niet blokkeren",
+ "Can't change permissions for public share links" : "Kan permissies voor openbare share links niet wijzigen",
+ "Wrong or no update parameter given" : "Verkeerde of geen update parameter gegeven",
+ "Cannot increase permissions" : "Kan de rechten niet verruimen",
"A file or folder has been <strong>shared</strong>" : "Een bestand of map is <strong>gedeeld</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Een bestand of map werd gedeeld vanaf <strong>een andere server</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Een openbaar gedeeld bestand of map werd <strong>gedownloaded</strong>",
diff --git a/apps/files_sharing/l10n/pl.js b/apps/files_sharing/l10n/pl.js
index a703ef087ee..e1bec669533 100644
--- a/apps/files_sharing/l10n/pl.js
+++ b/apps/files_sharing/l10n/pl.js
@@ -21,9 +21,13 @@ OC.L10N.register(
"Remote share password" : "Hasło do zdalnego zasobu",
"Cancel" : "Anuluj",
"Add remote share" : "Dodaj zdalny zasób",
+ "No ownCloud installation (7 or higher) found at {remote}" : "Nie znaleziono instalacji ownCloud (w wersji 7 lub nowszej) na {remote}",
"Invalid ownCloud url" : "Błędny adres URL",
"Shared by" : "Udostępniane przez",
"Sharing" : "Udostępnianie",
+ "Public link sharing is disabled by the administrator" : "Udostępnianie linków publicznych zostało zablokowane przez twojego administratora",
+ "Public upload disabled by the administrator" : "Publiczne wczytywanie zostało zablokowane przez twojego administratora",
+ "Public upload is only possible for publicly shared folders" : "Publiczne wczytywanie jest możliwe wyłącznie do katalogów publicznych",
"A file or folder has been <strong>shared</strong>" : "Plik lub folder stał się <strong>współdzielony</strong>",
"You shared %1$s with %2$s" : "Współdzielisz %1$s z %2$s",
"You shared %1$s with group %2$s" : "Współdzielisz %1$s z grupą %2$s",
diff --git a/apps/files_sharing/l10n/pl.json b/apps/files_sharing/l10n/pl.json
index 62d6ef25b38..6190871b16f 100644
--- a/apps/files_sharing/l10n/pl.json
+++ b/apps/files_sharing/l10n/pl.json
@@ -19,9 +19,13 @@
"Remote share password" : "Hasło do zdalnego zasobu",
"Cancel" : "Anuluj",
"Add remote share" : "Dodaj zdalny zasób",
+ "No ownCloud installation (7 or higher) found at {remote}" : "Nie znaleziono instalacji ownCloud (w wersji 7 lub nowszej) na {remote}",
"Invalid ownCloud url" : "Błędny adres URL",
"Shared by" : "Udostępniane przez",
"Sharing" : "Udostępnianie",
+ "Public link sharing is disabled by the administrator" : "Udostępnianie linków publicznych zostało zablokowane przez twojego administratora",
+ "Public upload disabled by the administrator" : "Publiczne wczytywanie zostało zablokowane przez twojego administratora",
+ "Public upload is only possible for publicly shared folders" : "Publiczne wczytywanie jest możliwe wyłącznie do katalogów publicznych",
"A file or folder has been <strong>shared</strong>" : "Plik lub folder stał się <strong>współdzielony</strong>",
"You shared %1$s with %2$s" : "Współdzielisz %1$s z %2$s",
"You shared %1$s with group %2$s" : "Współdzielisz %1$s z grupą %2$s",
diff --git a/apps/files_sharing/l10n/pt_BR.js b/apps/files_sharing/l10n/pt_BR.js
index 5796acb8508..4d2963dba24 100644
--- a/apps/files_sharing/l10n/pt_BR.js
+++ b/apps/files_sharing/l10n/pt_BR.js
@@ -8,25 +8,6 @@ OC.L10N.register(
"Could not authenticate to remote share, password might be wrong" : "Não foi possível autenticação com o compartilhamento remoto, a senha deve estar errada",
"Storage not valid" : "Armazenamento não válido",
"Couldn't add remote share" : "Não foi possível adicionar compartilhamento remoto",
- "Share API is disabled" : "O compartilhamento de API está desabilitado.",
- "Wrong share ID, share doesn't exist" : "ID de compartilhamento errado, o compartilhamento não existe",
- "Could not delete share" : "Não foi possível eliminar o compartilhamento",
- "Please specify a file or folder path" : "Por favor especifique um arquivo ou caminho",
- "Wrong path, file/folder doesn't exist" : "Caminho errado, arquivo/pasta não existe",
- "Please specify a valid user" : "Por favor especifique um usuário válido",
- "Group sharing is disabled by the administrator" : "Grupo de compartilhamento foi desabilitado pelo administrador",
- "Please specify a valid group" : "Por favor especifique um grupo válido",
- "Public link sharing is disabled by the administrator" : "Link de compartilhamento público foi desativado pelo administrador",
- "Public upload disabled by the administrator" : "Envio público foi desativado pelo administrador",
- "Public upload is only possible for publicly shared folders" : "Envio pública só é possível para pastas compartilhadas publicamente",
- "Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato de data deve ser YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "O compartilhando %s falhou porque o backend não permite ações de tipo %s",
- "Unknown share type" : "Tipo de compartilhamento desconhecido",
- "Not a directory" : "Não é um diretório",
- "Could not lock path" : "Não foi possível bloquear o caminho",
- "Can't change permissions for public share links" : "Não é possível alterar permissões para compartilhar links públicos",
- "Wrong or no update parameter given" : "Está errado ou nenhum parâmetro de atualização foi fornecido",
- "Cannot increase permissions" : "Não pode haver aumento de permissões",
"Shared with you" : "Compartilhado com você",
"Shared with others" : "Compartilhado com outros",
"Shared by link" : "Compartilhado por link",
@@ -46,6 +27,25 @@ OC.L10N.register(
"Invalid ownCloud url" : "Url invalida para ownCloud",
"Shared by" : "Compartilhado por",
"Sharing" : "Compartilhamento",
+ "Share API is disabled" : "O compartilhamento de API está desabilitado.",
+ "Wrong share ID, share doesn't exist" : "ID de compartilhamento errado, o compartilhamento não existe",
+ "Could not delete share" : "Não foi possível eliminar o compartilhamento",
+ "Please specify a file or folder path" : "Por favor especifique um arquivo ou caminho",
+ "Wrong path, file/folder doesn't exist" : "Caminho errado, arquivo/pasta não existe",
+ "Please specify a valid user" : "Por favor especifique um usuário válido",
+ "Group sharing is disabled by the administrator" : "Grupo de compartilhamento foi desabilitado pelo administrador",
+ "Please specify a valid group" : "Por favor especifique um grupo válido",
+ "Public link sharing is disabled by the administrator" : "Link de compartilhamento público foi desativado pelo administrador",
+ "Public upload disabled by the administrator" : "Envio público foi desativado pelo administrador",
+ "Public upload is only possible for publicly shared folders" : "Envio pública só é possível para pastas compartilhadas publicamente",
+ "Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato de data deve ser YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "O compartilhando %s falhou porque o backend não permite ações de tipo %s",
+ "Unknown share type" : "Tipo de compartilhamento desconhecido",
+ "Not a directory" : "Não é um diretório",
+ "Could not lock path" : "Não foi possível bloquear o caminho",
+ "Can't change permissions for public share links" : "Não é possível alterar permissões para compartilhar links públicos",
+ "Wrong or no update parameter given" : "Está errado ou nenhum parâmetro de atualização foi fornecido",
+ "Cannot increase permissions" : "Não pode haver aumento de permissões",
"A file or folder has been <strong>shared</strong>" : "Um arquivo ou pasta foi <strong>compartilhado</strong> ",
"A file or folder was shared from <strong>another server</strong>" : "Um arquivo ou pasta foi compartilhado a partir de <strong>outro servidor</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhado publicamente foi <strong>baixado</strong>",
diff --git a/apps/files_sharing/l10n/pt_BR.json b/apps/files_sharing/l10n/pt_BR.json
index 8f34a67032b..2d4397efd94 100644
--- a/apps/files_sharing/l10n/pt_BR.json
+++ b/apps/files_sharing/l10n/pt_BR.json
@@ -6,25 +6,6 @@
"Could not authenticate to remote share, password might be wrong" : "Não foi possível autenticação com o compartilhamento remoto, a senha deve estar errada",
"Storage not valid" : "Armazenamento não válido",
"Couldn't add remote share" : "Não foi possível adicionar compartilhamento remoto",
- "Share API is disabled" : "O compartilhamento de API está desabilitado.",
- "Wrong share ID, share doesn't exist" : "ID de compartilhamento errado, o compartilhamento não existe",
- "Could not delete share" : "Não foi possível eliminar o compartilhamento",
- "Please specify a file or folder path" : "Por favor especifique um arquivo ou caminho",
- "Wrong path, file/folder doesn't exist" : "Caminho errado, arquivo/pasta não existe",
- "Please specify a valid user" : "Por favor especifique um usuário válido",
- "Group sharing is disabled by the administrator" : "Grupo de compartilhamento foi desabilitado pelo administrador",
- "Please specify a valid group" : "Por favor especifique um grupo válido",
- "Public link sharing is disabled by the administrator" : "Link de compartilhamento público foi desativado pelo administrador",
- "Public upload disabled by the administrator" : "Envio público foi desativado pelo administrador",
- "Public upload is only possible for publicly shared folders" : "Envio pública só é possível para pastas compartilhadas publicamente",
- "Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato de data deve ser YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "O compartilhando %s falhou porque o backend não permite ações de tipo %s",
- "Unknown share type" : "Tipo de compartilhamento desconhecido",
- "Not a directory" : "Não é um diretório",
- "Could not lock path" : "Não foi possível bloquear o caminho",
- "Can't change permissions for public share links" : "Não é possível alterar permissões para compartilhar links públicos",
- "Wrong or no update parameter given" : "Está errado ou nenhum parâmetro de atualização foi fornecido",
- "Cannot increase permissions" : "Não pode haver aumento de permissões",
"Shared with you" : "Compartilhado com você",
"Shared with others" : "Compartilhado com outros",
"Shared by link" : "Compartilhado por link",
@@ -44,6 +25,25 @@
"Invalid ownCloud url" : "Url invalida para ownCloud",
"Shared by" : "Compartilhado por",
"Sharing" : "Compartilhamento",
+ "Share API is disabled" : "O compartilhamento de API está desabilitado.",
+ "Wrong share ID, share doesn't exist" : "ID de compartilhamento errado, o compartilhamento não existe",
+ "Could not delete share" : "Não foi possível eliminar o compartilhamento",
+ "Please specify a file or folder path" : "Por favor especifique um arquivo ou caminho",
+ "Wrong path, file/folder doesn't exist" : "Caminho errado, arquivo/pasta não existe",
+ "Please specify a valid user" : "Por favor especifique um usuário válido",
+ "Group sharing is disabled by the administrator" : "Grupo de compartilhamento foi desabilitado pelo administrador",
+ "Please specify a valid group" : "Por favor especifique um grupo válido",
+ "Public link sharing is disabled by the administrator" : "Link de compartilhamento público foi desativado pelo administrador",
+ "Public upload disabled by the administrator" : "Envio público foi desativado pelo administrador",
+ "Public upload is only possible for publicly shared folders" : "Envio pública só é possível para pastas compartilhadas publicamente",
+ "Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato de data deve ser YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "O compartilhando %s falhou porque o backend não permite ações de tipo %s",
+ "Unknown share type" : "Tipo de compartilhamento desconhecido",
+ "Not a directory" : "Não é um diretório",
+ "Could not lock path" : "Não foi possível bloquear o caminho",
+ "Can't change permissions for public share links" : "Não é possível alterar permissões para compartilhar links públicos",
+ "Wrong or no update parameter given" : "Está errado ou nenhum parâmetro de atualização foi fornecido",
+ "Cannot increase permissions" : "Não pode haver aumento de permissões",
"A file or folder has been <strong>shared</strong>" : "Um arquivo ou pasta foi <strong>compartilhado</strong> ",
"A file or folder was shared from <strong>another server</strong>" : "Um arquivo ou pasta foi compartilhado a partir de <strong>outro servidor</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhado publicamente foi <strong>baixado</strong>",
diff --git a/apps/files_sharing/l10n/pt_PT.js b/apps/files_sharing/l10n/pt_PT.js
index f8a8b65b7ae..860c352aef2 100644
--- a/apps/files_sharing/l10n/pt_PT.js
+++ b/apps/files_sharing/l10n/pt_PT.js
@@ -12,21 +12,21 @@ OC.L10N.register(
"Shared with others" : "Partilhado com outros",
"Shared by link" : "Partilhado por hiperligação",
"Nothing shared with you yet" : "Ainda não foi partilhado nada consigo",
- "Files and folders others share with you will show up here" : "Os ficheiros e pastas que os outros partilham consigo, serão mostradaos aqui",
+ "Files and folders others share with you will show up here" : "Os ficheiros e pastas que os outros partilham consigo, serão mostrados aqui",
"Nothing shared yet" : "Ainda não foi partilhado nada",
"Files and folders you share will show up here" : "Os ficheiros e as pastas que partilha serão mostrados aqui",
"No shared links" : "Sem hiperligações partilhadas",
"Files and folders you share by link will show up here" : "Os ficheiros e as pastas que partilha com esta hiperligação, serão mostrados aqui",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Deseja adicionar a partilha remota {nome} de {proprietário}@{remoto}?",
"Remote share" : "Partilha remota",
- "Remote share password" : "Senha da partilha remota",
+ "Remote share password" : "Palavra-passe da partilha remota",
"Cancel" : "Cancelar",
"Add remote share" : "Adicionar partilha remota",
- "You can upload into this folder" : "Pode carregar para esta pasta",
+ "You can upload into this folder" : "Pode enviar para esta pasta",
"No ownCloud installation (7 or higher) found at {remote}" : "Não foi encontrada nenhuma instalação OwnCloud (7 ou superior) em {remote}",
- "Invalid ownCloud url" : "Url ownCloud inválido",
+ "Invalid ownCloud url" : "Url da ownCloud inválido",
"Shared by" : "Partilhado por",
- "Sharing" : "Partilhando",
+ "Sharing" : "Partilha",
"Share API is disabled" : "A partilha de API está desativada",
"Wrong share ID, share doesn't exist" : "Id. de partilha errada, a partilha não existe",
"Could not delete share" : "Não foi possível eliminar a partilha",
@@ -35,7 +35,7 @@ OC.L10N.register(
"Please specify a valid user" : "Por favor, especifique um utilizador válido",
"Group sharing is disabled by the administrator" : "A partilha em grupo está desativada pelo administrador",
"Please specify a valid group" : "Por favor, especifique um grupo válido",
- "Public link sharing is disabled by the administrator" : "A partilha da ligação pública está desativada pelo administrador",
+ "Public link sharing is disabled by the administrator" : "A partilha da hiperligação pública está desativada pelo administrador",
"Public upload disabled by the administrator" : "Envio público desativado pelo administrador",
"Public upload is only possible for publicly shared folders" : "O envio público só é possível para as pastas partilhadas publicamente",
"Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato da data deve ser AAAA-MM-DD",
@@ -48,14 +48,14 @@ OC.L10N.register(
"Cannot increase permissions" : "Não é possível incrementar as permissões",
"A file or folder has been <strong>shared</strong>" : "Foi <strong>partilhado</strong> um ficheiro ou uma pasta",
"A file or folder was shared from <strong>another server</strong>" : "Um ficheiro ou pasta foi partilhado a partir de <strong>outro servidor</strong>",
- "A public shared file or folder was <strong>downloaded</strong>" : "Foi <strong>descarregado</strong> um ficheiro ou uma pasta partilhada publicamente",
+ "A public shared file or folder was <strong>downloaded</strong>" : "Foi <strong>transferido</strong> um ficheiro ou uma pasta partilhada publicamente",
"You received a new remote share %2$s from %1$s" : "Recebeu uma nova partilha remota %2$s de %1$s",
"You received a new remote share from %s" : "Recebeu uma nova partilha remota de %s",
"%1$s accepted remote share %2$s" : "%1$s aceitou a partilha remota %2$s",
"%1$s declined remote share %2$s" : "%1$s rejeitou a partilha remota %2$s",
"%1$s unshared %2$s from you" : "%1$s cancelou a partilha %2$s consigo",
- "Public shared folder %1$s was downloaded" : "Foi descarregada a pasta partilhada publicamente %1$s",
- "Public shared file %1$s was downloaded" : "Foi descarregado o ficheiro %1$s partilhado publicamente",
+ "Public shared folder %1$s was downloaded" : "Foi transferida a pasta %1$s partilhada publicamente",
+ "Public shared file %1$s was downloaded" : "Foi transferido o ficheiro %1$s partilhado publicamente",
"You shared %1$s with %2$s" : "Partilhou %1$s com %2$s",
"%2$s shared %1$s with %3$s" : "%2$s partilhou %1$s com %3$s",
"You removed the share of %2$s for %1$s" : "Removeu a partilha de %2$s para %1$s",
@@ -66,13 +66,13 @@ OC.L10N.register(
"%2$s removed the share of group %3$s for %1$s" : "%2$s removeu a partilha do grupo %3$s para %1$s",
"%2$s shared %1$s via link" : "%2$s partilhou %1$s via hiperligação",
"You shared %1$s via link" : "Partilhou %1$s através de uma hiperligação",
- "You removed the public link for %1$s" : "Removeu a ligação pública para %1$s",
- "%2$s removed the public link for %1$s" : "%2$s removeu a ligação pública para %1$s",
- "Your public link for %1$s expired" : "A sua ligação pública para %1$s expirou",
- "The public link of %2$s for %1$s expired" : "O link público de %2$s para %1$s expirou",
+ "You removed the public link for %1$s" : "Removeu a hiperligação pública para %1$s",
+ "%2$s removed the public link for %1$s" : "%2$s removeu a hiperligação pública para %1$s",
+ "Your public link for %1$s expired" : "A sua hiperligação pública para %1$s expirou",
+ "The public link of %2$s for %1$s expired" : "A sua hiperligação pública de %2$s para %1$s expirou",
"%2$s shared %1$s with you" : "%2$s partilhou %1$s consigo",
"%2$s removed the share for %1$s" : "%2$s removeu a partilha para %1$s",
- "Downloaded via public link" : "Descarregado por uma ligação pública",
+ "Downloaded via public link" : "Transferido via hiperligação pública",
"Shared with %2$s" : "Partilhado com %2$s",
"Shared with %3$s by %2$s" : "Partilhado com %3$s por %2$s",
"Removed share for %2$s" : "Partilha removida para %2$s",
@@ -83,27 +83,27 @@ OC.L10N.register(
"%2$s removed share of group %3$s" : "%2$s removeu a partilha do grupo %3$s",
"Shared via link by %2$s" : "Partilhado via hiperligação por %2$s",
"Shared via public link" : "Partilhado via hiperligação pública",
- "Removed public link" : "Ligação pública removida",
- "%2$s removed public link" : "%2$s removeu a ligação pública",
- "Public link expired" : "A ligação pública expirou",
- "Public link of %2$s expired" : "A ligação pública de %2$s expirou",
+ "Removed public link" : "Hiperligação pública removida",
+ "%2$s removed public link" : "%2$s removeu a hiperligação pública",
+ "Public link expired" : "A hiperligação pública expirou",
+ "Public link of %2$s expired" : "A hiperligação pública de %2$s expirou",
"Shared by %2$s" : "Partilhado por %2$s",
"Shares" : "Partilhas",
- "This share is password-protected" : "Esta partilha está protegida por senha",
- "The password is wrong. Try again." : "A senha está errada. Por favor, tente de novo.",
- "Password" : "Senha",
+ "This share is password-protected" : "Esta partilha está protegida por palavra-passe",
+ "The password is wrong. Try again." : "A palavra-passe está errada. Por favor, tente de novo.",
+ "Password" : "Palavra-passe",
"No entries found in this folder" : "Não foram encontradas entradas nesta pasta",
"Name" : "Nome",
"Share time" : "Hora da Partilha",
"Sorry, this link doesn’t seem to work anymore." : "Desculpe, mas esta hiperligação parece já não estar a funcionar.",
"Reasons might be:" : "As razões poderão ser:",
"the item was removed" : "o item foi removido",
- "the link expired" : "A hiperligação expirou",
+ "the link expired" : "a hiperligação expirou",
"sharing is disabled" : "a partilha está desativada",
"For more info, please ask the person who sent this link." : "Para mais informação, por favor, pergunte à pessoa que lhe enviou esta hiperligação.",
"Add to your ownCloud" : "Adicionar à sua ownCloud",
- "Download" : "Descarregar",
- "Download %s" : "Descarregar %s",
+ "Download" : "Transferir",
+ "Download %s" : "Transferir %s",
"Direct link" : "Hiperligação direta"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/pt_PT.json b/apps/files_sharing/l10n/pt_PT.json
index 4d98a289b3c..9f85b1b1034 100644
--- a/apps/files_sharing/l10n/pt_PT.json
+++ b/apps/files_sharing/l10n/pt_PT.json
@@ -10,21 +10,21 @@
"Shared with others" : "Partilhado com outros",
"Shared by link" : "Partilhado por hiperligação",
"Nothing shared with you yet" : "Ainda não foi partilhado nada consigo",
- "Files and folders others share with you will show up here" : "Os ficheiros e pastas que os outros partilham consigo, serão mostradaos aqui",
+ "Files and folders others share with you will show up here" : "Os ficheiros e pastas que os outros partilham consigo, serão mostrados aqui",
"Nothing shared yet" : "Ainda não foi partilhado nada",
"Files and folders you share will show up here" : "Os ficheiros e as pastas que partilha serão mostrados aqui",
"No shared links" : "Sem hiperligações partilhadas",
"Files and folders you share by link will show up here" : "Os ficheiros e as pastas que partilha com esta hiperligação, serão mostrados aqui",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Deseja adicionar a partilha remota {nome} de {proprietário}@{remoto}?",
"Remote share" : "Partilha remota",
- "Remote share password" : "Senha da partilha remota",
+ "Remote share password" : "Palavra-passe da partilha remota",
"Cancel" : "Cancelar",
"Add remote share" : "Adicionar partilha remota",
- "You can upload into this folder" : "Pode carregar para esta pasta",
+ "You can upload into this folder" : "Pode enviar para esta pasta",
"No ownCloud installation (7 or higher) found at {remote}" : "Não foi encontrada nenhuma instalação OwnCloud (7 ou superior) em {remote}",
- "Invalid ownCloud url" : "Url ownCloud inválido",
+ "Invalid ownCloud url" : "Url da ownCloud inválido",
"Shared by" : "Partilhado por",
- "Sharing" : "Partilhando",
+ "Sharing" : "Partilha",
"Share API is disabled" : "A partilha de API está desativada",
"Wrong share ID, share doesn't exist" : "Id. de partilha errada, a partilha não existe",
"Could not delete share" : "Não foi possível eliminar a partilha",
@@ -33,7 +33,7 @@
"Please specify a valid user" : "Por favor, especifique um utilizador válido",
"Group sharing is disabled by the administrator" : "A partilha em grupo está desativada pelo administrador",
"Please specify a valid group" : "Por favor, especifique um grupo válido",
- "Public link sharing is disabled by the administrator" : "A partilha da ligação pública está desativada pelo administrador",
+ "Public link sharing is disabled by the administrator" : "A partilha da hiperligação pública está desativada pelo administrador",
"Public upload disabled by the administrator" : "Envio público desativado pelo administrador",
"Public upload is only possible for publicly shared folders" : "O envio público só é possível para as pastas partilhadas publicamente",
"Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato da data deve ser AAAA-MM-DD",
@@ -46,14 +46,14 @@
"Cannot increase permissions" : "Não é possível incrementar as permissões",
"A file or folder has been <strong>shared</strong>" : "Foi <strong>partilhado</strong> um ficheiro ou uma pasta",
"A file or folder was shared from <strong>another server</strong>" : "Um ficheiro ou pasta foi partilhado a partir de <strong>outro servidor</strong>",
- "A public shared file or folder was <strong>downloaded</strong>" : "Foi <strong>descarregado</strong> um ficheiro ou uma pasta partilhada publicamente",
+ "A public shared file or folder was <strong>downloaded</strong>" : "Foi <strong>transferido</strong> um ficheiro ou uma pasta partilhada publicamente",
"You received a new remote share %2$s from %1$s" : "Recebeu uma nova partilha remota %2$s de %1$s",
"You received a new remote share from %s" : "Recebeu uma nova partilha remota de %s",
"%1$s accepted remote share %2$s" : "%1$s aceitou a partilha remota %2$s",
"%1$s declined remote share %2$s" : "%1$s rejeitou a partilha remota %2$s",
"%1$s unshared %2$s from you" : "%1$s cancelou a partilha %2$s consigo",
- "Public shared folder %1$s was downloaded" : "Foi descarregada a pasta partilhada publicamente %1$s",
- "Public shared file %1$s was downloaded" : "Foi descarregado o ficheiro %1$s partilhado publicamente",
+ "Public shared folder %1$s was downloaded" : "Foi transferida a pasta %1$s partilhada publicamente",
+ "Public shared file %1$s was downloaded" : "Foi transferido o ficheiro %1$s partilhado publicamente",
"You shared %1$s with %2$s" : "Partilhou %1$s com %2$s",
"%2$s shared %1$s with %3$s" : "%2$s partilhou %1$s com %3$s",
"You removed the share of %2$s for %1$s" : "Removeu a partilha de %2$s para %1$s",
@@ -64,13 +64,13 @@
"%2$s removed the share of group %3$s for %1$s" : "%2$s removeu a partilha do grupo %3$s para %1$s",
"%2$s shared %1$s via link" : "%2$s partilhou %1$s via hiperligação",
"You shared %1$s via link" : "Partilhou %1$s através de uma hiperligação",
- "You removed the public link for %1$s" : "Removeu a ligação pública para %1$s",
- "%2$s removed the public link for %1$s" : "%2$s removeu a ligação pública para %1$s",
- "Your public link for %1$s expired" : "A sua ligação pública para %1$s expirou",
- "The public link of %2$s for %1$s expired" : "O link público de %2$s para %1$s expirou",
+ "You removed the public link for %1$s" : "Removeu a hiperligação pública para %1$s",
+ "%2$s removed the public link for %1$s" : "%2$s removeu a hiperligação pública para %1$s",
+ "Your public link for %1$s expired" : "A sua hiperligação pública para %1$s expirou",
+ "The public link of %2$s for %1$s expired" : "A sua hiperligação pública de %2$s para %1$s expirou",
"%2$s shared %1$s with you" : "%2$s partilhou %1$s consigo",
"%2$s removed the share for %1$s" : "%2$s removeu a partilha para %1$s",
- "Downloaded via public link" : "Descarregado por uma ligação pública",
+ "Downloaded via public link" : "Transferido via hiperligação pública",
"Shared with %2$s" : "Partilhado com %2$s",
"Shared with %3$s by %2$s" : "Partilhado com %3$s por %2$s",
"Removed share for %2$s" : "Partilha removida para %2$s",
@@ -81,27 +81,27 @@
"%2$s removed share of group %3$s" : "%2$s removeu a partilha do grupo %3$s",
"Shared via link by %2$s" : "Partilhado via hiperligação por %2$s",
"Shared via public link" : "Partilhado via hiperligação pública",
- "Removed public link" : "Ligação pública removida",
- "%2$s removed public link" : "%2$s removeu a ligação pública",
- "Public link expired" : "A ligação pública expirou",
- "Public link of %2$s expired" : "A ligação pública de %2$s expirou",
+ "Removed public link" : "Hiperligação pública removida",
+ "%2$s removed public link" : "%2$s removeu a hiperligação pública",
+ "Public link expired" : "A hiperligação pública expirou",
+ "Public link of %2$s expired" : "A hiperligação pública de %2$s expirou",
"Shared by %2$s" : "Partilhado por %2$s",
"Shares" : "Partilhas",
- "This share is password-protected" : "Esta partilha está protegida por senha",
- "The password is wrong. Try again." : "A senha está errada. Por favor, tente de novo.",
- "Password" : "Senha",
+ "This share is password-protected" : "Esta partilha está protegida por palavra-passe",
+ "The password is wrong. Try again." : "A palavra-passe está errada. Por favor, tente de novo.",
+ "Password" : "Palavra-passe",
"No entries found in this folder" : "Não foram encontradas entradas nesta pasta",
"Name" : "Nome",
"Share time" : "Hora da Partilha",
"Sorry, this link doesn’t seem to work anymore." : "Desculpe, mas esta hiperligação parece já não estar a funcionar.",
"Reasons might be:" : "As razões poderão ser:",
"the item was removed" : "o item foi removido",
- "the link expired" : "A hiperligação expirou",
+ "the link expired" : "a hiperligação expirou",
"sharing is disabled" : "a partilha está desativada",
"For more info, please ask the person who sent this link." : "Para mais informação, por favor, pergunte à pessoa que lhe enviou esta hiperligação.",
"Add to your ownCloud" : "Adicionar à sua ownCloud",
- "Download" : "Descarregar",
- "Download %s" : "Descarregar %s",
+ "Download" : "Transferir",
+ "Download %s" : "Transferir %s",
"Direct link" : "Hiperligação direta"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/ro.js b/apps/files_sharing/l10n/ro.js
index 2481f77bcc6..5cddb6e8cdf 100644
--- a/apps/files_sharing/l10n/ro.js
+++ b/apps/files_sharing/l10n/ro.js
@@ -12,12 +12,28 @@ OC.L10N.register(
"Shared with others" : "Partajat cu alții",
"Shared by link" : "Partajat prin link",
"Nothing shared with you yet" : "Nimic nu e partajat cu tine încă",
+ "Files and folders others share with you will show up here" : "Fișierele și directoarele partajate cu tine vor apărea aici",
"Nothing shared yet" : "Nimic partajat încă",
+ "Files and folders you share will show up here" : "Fișierele și directoarele pe care le partajezi vor apărea aici",
+ "No shared links" : "Nicio legătură partajată",
+ "Files and folders you share by link will show up here" : "Fișierele și directoarele pe care le partajezi prin legături vor apărea aici",
+ "Remote share" : "Element partajat la distanță",
+ "Remote share password" : "Parolă element partajat la distanță",
"Cancel" : "Anulare",
+ "Add remote share" : "Adaugă element partajat la distanță",
+ "You can upload into this folder" : "Poți încărca în acest director",
"No ownCloud installation (7 or higher) found at {remote}" : "Nu s-a găsit nicio instanță ownCloud (versiunea 7 sau mai mare) la {remote}",
"Invalid ownCloud url" : "URL ownCloud invalid",
"Shared by" : "impartite in ",
"Sharing" : "Partajare",
+ "Share API is disabled" : "API-ul de partajare este dezactivat",
+ "Wrong share ID, share doesn't exist" : "ID greșit al elementului partajat, acesta nu există",
+ "Could not delete share" : "Nu s-a putut șterge elementul partajat",
+ "Please specify a file or folder path" : "Specifică un fișier sau o cale către un director",
+ "Wrong path, file/folder doesn't exist" : "Cale greșită, fișierul/directorul nu există",
+ "Please specify a valid user" : "Specifică un utilizator valid",
+ "Please specify a valid group" : "Specifică un grup valid",
+ "Invalid date, date format must be YYYY-MM-DD" : "Dată invalidă, formatul trebuie să fie AAAA-LL-ZZ",
"Not a directory" : "Nu este un director",
"Could not lock path" : "Calea nu a putut fi blocată",
"Cannot increase permissions" : "Nu se pot extinde permisiunile",
@@ -26,6 +42,9 @@ OC.L10N.register(
"You shared %1$s with group %2$s" : "Ai partajat %1$s cu grupul %2$s",
"You shared %1$s via link" : "Ai partajat %1$s prin legătură",
"%2$s shared %1$s with you" : "%2$s a partajat %1$s cu tine",
+ "Shared with %2$s" : "Partajat cu %2$s",
+ "Shared with %3$s by %2$s" : "Partajat de %2$s cu %3$s",
+ "Shared with group %2$s" : "Partajat cu grupul %2$s",
"Shares" : "Partajări",
"This share is password-protected" : "Această partajare este protejată cu parolă",
"The password is wrong. Try again." : "Parola este incorectă. Încercaţi din nou.",
@@ -38,6 +57,7 @@ OC.L10N.register(
"sharing is disabled" : "Partajare este oprită",
"Add to your ownCloud" : "Adaugă propriul tău ownCloud",
"Download" : "Descarcă",
- "Download %s" : "Descarcă %s"
+ "Download %s" : "Descarcă %s",
+ "Direct link" : "Legătură directă"
},
"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));");
diff --git a/apps/files_sharing/l10n/ro.json b/apps/files_sharing/l10n/ro.json
index e3f9450bcb5..6d0d87037db 100644
--- a/apps/files_sharing/l10n/ro.json
+++ b/apps/files_sharing/l10n/ro.json
@@ -10,12 +10,28 @@
"Shared with others" : "Partajat cu alții",
"Shared by link" : "Partajat prin link",
"Nothing shared with you yet" : "Nimic nu e partajat cu tine încă",
+ "Files and folders others share with you will show up here" : "Fișierele și directoarele partajate cu tine vor apărea aici",
"Nothing shared yet" : "Nimic partajat încă",
+ "Files and folders you share will show up here" : "Fișierele și directoarele pe care le partajezi vor apărea aici",
+ "No shared links" : "Nicio legătură partajată",
+ "Files and folders you share by link will show up here" : "Fișierele și directoarele pe care le partajezi prin legături vor apărea aici",
+ "Remote share" : "Element partajat la distanță",
+ "Remote share password" : "Parolă element partajat la distanță",
"Cancel" : "Anulare",
+ "Add remote share" : "Adaugă element partajat la distanță",
+ "You can upload into this folder" : "Poți încărca în acest director",
"No ownCloud installation (7 or higher) found at {remote}" : "Nu s-a găsit nicio instanță ownCloud (versiunea 7 sau mai mare) la {remote}",
"Invalid ownCloud url" : "URL ownCloud invalid",
"Shared by" : "impartite in ",
"Sharing" : "Partajare",
+ "Share API is disabled" : "API-ul de partajare este dezactivat",
+ "Wrong share ID, share doesn't exist" : "ID greșit al elementului partajat, acesta nu există",
+ "Could not delete share" : "Nu s-a putut șterge elementul partajat",
+ "Please specify a file or folder path" : "Specifică un fișier sau o cale către un director",
+ "Wrong path, file/folder doesn't exist" : "Cale greșită, fișierul/directorul nu există",
+ "Please specify a valid user" : "Specifică un utilizator valid",
+ "Please specify a valid group" : "Specifică un grup valid",
+ "Invalid date, date format must be YYYY-MM-DD" : "Dată invalidă, formatul trebuie să fie AAAA-LL-ZZ",
"Not a directory" : "Nu este un director",
"Could not lock path" : "Calea nu a putut fi blocată",
"Cannot increase permissions" : "Nu se pot extinde permisiunile",
@@ -24,6 +40,9 @@
"You shared %1$s with group %2$s" : "Ai partajat %1$s cu grupul %2$s",
"You shared %1$s via link" : "Ai partajat %1$s prin legătură",
"%2$s shared %1$s with you" : "%2$s a partajat %1$s cu tine",
+ "Shared with %2$s" : "Partajat cu %2$s",
+ "Shared with %3$s by %2$s" : "Partajat de %2$s cu %3$s",
+ "Shared with group %2$s" : "Partajat cu grupul %2$s",
"Shares" : "Partajări",
"This share is password-protected" : "Această partajare este protejată cu parolă",
"The password is wrong. Try again." : "Parola este incorectă. Încercaţi din nou.",
@@ -36,6 +55,7 @@
"sharing is disabled" : "Partajare este oprită",
"Add to your ownCloud" : "Adaugă propriul tău ownCloud",
"Download" : "Descarcă",
- "Download %s" : "Descarcă %s"
+ "Download %s" : "Descarcă %s",
+ "Direct link" : "Legătură directă"
},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/sl.js b/apps/files_sharing/l10n/sl.js
index dbeadace10c..8ae00c40bae 100644
--- a/apps/files_sharing/l10n/sl.js
+++ b/apps/files_sharing/l10n/sl.js
@@ -8,23 +8,6 @@ OC.L10N.register(
"Could not authenticate to remote share, password might be wrong" : "Ni mogoče overiti istovetnosti oddaljene mape za souporabo. Najverjetneje je uporabljeno napačno geslo.",
"Storage not valid" : "Shramba ni veljavna",
"Couldn't add remote share" : "Ni mogoče dodati oddaljenega mesta za souporabo",
- "Wrong share ID, share doesn't exist" : "Napačen ID mesta uporabe; mesto ne obstaja!",
- "Could not delete share" : "Tega predmeta v souporabi ni mogoče izbrisati.",
- "Please specify a file or folder path" : "Določiti je treba datoteko ali pot do mape",
- "Wrong path, file/folder doesn't exist" : "Napačna pot; datoteka ali mapa ne obstaja",
- "Please specify a valid user" : "Navesti je treba veljavnega uporabnika.",
- "Group sharing is disabled by the administrator" : "Skupinska souporaba je skrbniško onemogočena",
- "Please specify a valid group" : "Navesti je treba veljavno skupino",
- "Public link sharing is disabled by the administrator" : "Souporaba prek javne povezave je skrbniško onemogočena",
- "Public upload disabled by the administrator" : "Javno pošiljanje v oblak je skrbniško onemogočeno",
- "Public upload is only possible for publicly shared folders" : "Javno pošiljanje v oblak je mogoče le za javne mape v skupni rabi.",
- "Invalid date, date format must be YYYY-MM-DD" : "Neveljaven zapis časa; biti mora v zapisu YYYY-MM-DD",
- "Unknown share type" : "Neznana vrsta mesta souporabe",
- "Not a directory" : "Predmet ni mapa",
- "Could not lock path" : "Poti ni mogoče zakleniti",
- "Can't change permissions for public share links" : "Za javne povezave souporabe, spreminjanje dovoljenj ni mogoče.",
- "Wrong or no update parameter given" : "Parameter posodobitve ni podan ali pa je navedena napačna vrednost",
- "Cannot increase permissions" : "Ni mogoče povišati dovoljenj",
"Shared with you" : "V souporabi z vami",
"Shared with others" : "V souporabi z drugimi",
"Shared by link" : "V souporabi prek povezave",
@@ -44,6 +27,23 @@ OC.L10N.register(
"Invalid ownCloud url" : "Naveden je neveljaven naslov URL strežnika ownCloud",
"Shared by" : "V souporabi z",
"Sharing" : "Souporaba",
+ "Wrong share ID, share doesn't exist" : "Napačen ID mesta uporabe; mesto ne obstaja!",
+ "Could not delete share" : "Tega predmeta v souporabi ni mogoče izbrisati.",
+ "Please specify a file or folder path" : "Določiti je treba datoteko ali pot do mape",
+ "Wrong path, file/folder doesn't exist" : "Napačna pot; datoteka ali mapa ne obstaja",
+ "Please specify a valid user" : "Navesti je treba veljavnega uporabnika.",
+ "Group sharing is disabled by the administrator" : "Skupinska souporaba je skrbniško onemogočena",
+ "Please specify a valid group" : "Navesti je treba veljavno skupino",
+ "Public link sharing is disabled by the administrator" : "Souporaba prek javne povezave je skrbniško onemogočena",
+ "Public upload disabled by the administrator" : "Javno pošiljanje v oblak je skrbniško onemogočeno",
+ "Public upload is only possible for publicly shared folders" : "Javno pošiljanje v oblak je mogoče le za javne mape v skupni rabi.",
+ "Invalid date, date format must be YYYY-MM-DD" : "Neveljaven zapis časa; biti mora v zapisu YYYY-MM-DD",
+ "Unknown share type" : "Neznana vrsta mesta souporabe",
+ "Not a directory" : "Predmet ni mapa",
+ "Could not lock path" : "Poti ni mogoče zakleniti",
+ "Can't change permissions for public share links" : "Za javne povezave souporabe, spreminjanje dovoljenj ni mogoče.",
+ "Wrong or no update parameter given" : "Parameter posodobitve ni podan ali pa je navedena napačna vrednost",
+ "Cannot increase permissions" : "Ni mogoče povišati dovoljenj",
"A file or folder has been <strong>shared</strong>" : "Za datoteko ali mapo je omogočena <strong>souporaba</strong>.",
"A file or folder was shared from <strong>another server</strong>" : "Souporaba datoteke ali mape <strong>z drugega strežnika</strong> je omogočena.",
"A public shared file or folder was <strong>downloaded</strong>" : "Mapa ali datoteka v souporabi je bila <strong>prejeta</strong>.",
@@ -63,8 +63,17 @@ OC.L10N.register(
"%2$s shared %1$s with you" : "Uporabnik %2$s je omogočil souporabo %1$s",
"Downloaded via public link" : "Prejeto preko javne povezave",
"Shared with %2$s" : "V souporabi z %2$s",
+ "Shared with %3$s by %2$s" : "Souporaba z %3$s in %2$s",
+ "Removed share for %2$s" : "Odstranitev souporabe za %2$s",
+ "%2$s removed share for %3$s" : "%2$s je odstranil souporabo za %3$s",
+ "Shared with group %2$s" : "V souporabi s skupino %2$s",
+ "Shared with group %3$s by %2$s" : "V souporabi s skupino %3$s in %2$s",
+ "Removed share of group %2$s" : "Odstranitev souporabe s skupino %2$s",
+ "%2$s removed share of group %3$s" : "%2$s je odstranil povezavo za skupino %3$s",
+ "Shared via link by %2$s" : "%2$s je omogočil souporabo prek povezave",
"Shared via public link" : "V souporabi prek javne povezave",
"Removed public link" : "Javno povezava je odstranjena",
+ "%2$s removed public link" : "%2$s je odstranil javno povezavo",
"Public link expired" : "Javna povezava je potekla",
"Public link of %2$s expired" : "Javna povezava %2$s je potekla",
"Shared by %2$s" : "Souporabo je omogočil uporabnik %2$s",
diff --git a/apps/files_sharing/l10n/sl.json b/apps/files_sharing/l10n/sl.json
index b7b566530ed..36f775d9766 100644
--- a/apps/files_sharing/l10n/sl.json
+++ b/apps/files_sharing/l10n/sl.json
@@ -6,23 +6,6 @@
"Could not authenticate to remote share, password might be wrong" : "Ni mogoče overiti istovetnosti oddaljene mape za souporabo. Najverjetneje je uporabljeno napačno geslo.",
"Storage not valid" : "Shramba ni veljavna",
"Couldn't add remote share" : "Ni mogoče dodati oddaljenega mesta za souporabo",
- "Wrong share ID, share doesn't exist" : "Napačen ID mesta uporabe; mesto ne obstaja!",
- "Could not delete share" : "Tega predmeta v souporabi ni mogoče izbrisati.",
- "Please specify a file or folder path" : "Določiti je treba datoteko ali pot do mape",
- "Wrong path, file/folder doesn't exist" : "Napačna pot; datoteka ali mapa ne obstaja",
- "Please specify a valid user" : "Navesti je treba veljavnega uporabnika.",
- "Group sharing is disabled by the administrator" : "Skupinska souporaba je skrbniško onemogočena",
- "Please specify a valid group" : "Navesti je treba veljavno skupino",
- "Public link sharing is disabled by the administrator" : "Souporaba prek javne povezave je skrbniško onemogočena",
- "Public upload disabled by the administrator" : "Javno pošiljanje v oblak je skrbniško onemogočeno",
- "Public upload is only possible for publicly shared folders" : "Javno pošiljanje v oblak je mogoče le za javne mape v skupni rabi.",
- "Invalid date, date format must be YYYY-MM-DD" : "Neveljaven zapis časa; biti mora v zapisu YYYY-MM-DD",
- "Unknown share type" : "Neznana vrsta mesta souporabe",
- "Not a directory" : "Predmet ni mapa",
- "Could not lock path" : "Poti ni mogoče zakleniti",
- "Can't change permissions for public share links" : "Za javne povezave souporabe, spreminjanje dovoljenj ni mogoče.",
- "Wrong or no update parameter given" : "Parameter posodobitve ni podan ali pa je navedena napačna vrednost",
- "Cannot increase permissions" : "Ni mogoče povišati dovoljenj",
"Shared with you" : "V souporabi z vami",
"Shared with others" : "V souporabi z drugimi",
"Shared by link" : "V souporabi prek povezave",
@@ -42,6 +25,23 @@
"Invalid ownCloud url" : "Naveden je neveljaven naslov URL strežnika ownCloud",
"Shared by" : "V souporabi z",
"Sharing" : "Souporaba",
+ "Wrong share ID, share doesn't exist" : "Napačen ID mesta uporabe; mesto ne obstaja!",
+ "Could not delete share" : "Tega predmeta v souporabi ni mogoče izbrisati.",
+ "Please specify a file or folder path" : "Določiti je treba datoteko ali pot do mape",
+ "Wrong path, file/folder doesn't exist" : "Napačna pot; datoteka ali mapa ne obstaja",
+ "Please specify a valid user" : "Navesti je treba veljavnega uporabnika.",
+ "Group sharing is disabled by the administrator" : "Skupinska souporaba je skrbniško onemogočena",
+ "Please specify a valid group" : "Navesti je treba veljavno skupino",
+ "Public link sharing is disabled by the administrator" : "Souporaba prek javne povezave je skrbniško onemogočena",
+ "Public upload disabled by the administrator" : "Javno pošiljanje v oblak je skrbniško onemogočeno",
+ "Public upload is only possible for publicly shared folders" : "Javno pošiljanje v oblak je mogoče le za javne mape v skupni rabi.",
+ "Invalid date, date format must be YYYY-MM-DD" : "Neveljaven zapis časa; biti mora v zapisu YYYY-MM-DD",
+ "Unknown share type" : "Neznana vrsta mesta souporabe",
+ "Not a directory" : "Predmet ni mapa",
+ "Could not lock path" : "Poti ni mogoče zakleniti",
+ "Can't change permissions for public share links" : "Za javne povezave souporabe, spreminjanje dovoljenj ni mogoče.",
+ "Wrong or no update parameter given" : "Parameter posodobitve ni podan ali pa je navedena napačna vrednost",
+ "Cannot increase permissions" : "Ni mogoče povišati dovoljenj",
"A file or folder has been <strong>shared</strong>" : "Za datoteko ali mapo je omogočena <strong>souporaba</strong>.",
"A file or folder was shared from <strong>another server</strong>" : "Souporaba datoteke ali mape <strong>z drugega strežnika</strong> je omogočena.",
"A public shared file or folder was <strong>downloaded</strong>" : "Mapa ali datoteka v souporabi je bila <strong>prejeta</strong>.",
@@ -61,8 +61,17 @@
"%2$s shared %1$s with you" : "Uporabnik %2$s je omogočil souporabo %1$s",
"Downloaded via public link" : "Prejeto preko javne povezave",
"Shared with %2$s" : "V souporabi z %2$s",
+ "Shared with %3$s by %2$s" : "Souporaba z %3$s in %2$s",
+ "Removed share for %2$s" : "Odstranitev souporabe za %2$s",
+ "%2$s removed share for %3$s" : "%2$s je odstranil souporabo za %3$s",
+ "Shared with group %2$s" : "V souporabi s skupino %2$s",
+ "Shared with group %3$s by %2$s" : "V souporabi s skupino %3$s in %2$s",
+ "Removed share of group %2$s" : "Odstranitev souporabe s skupino %2$s",
+ "%2$s removed share of group %3$s" : "%2$s je odstranil povezavo za skupino %3$s",
+ "Shared via link by %2$s" : "%2$s je omogočil souporabo prek povezave",
"Shared via public link" : "V souporabi prek javne povezave",
"Removed public link" : "Javno povezava je odstranjena",
+ "%2$s removed public link" : "%2$s je odstranil javno povezavo",
"Public link expired" : "Javna povezava je potekla",
"Public link of %2$s expired" : "Javna povezava %2$s je potekla",
"Shared by %2$s" : "Souporabo je omogočil uporabnik %2$s",
diff --git a/apps/files_sharing/l10n/sq.js b/apps/files_sharing/l10n/sq.js
index dba6bc0ee3e..3f0f72a6299 100644
--- a/apps/files_sharing/l10n/sq.js
+++ b/apps/files_sharing/l10n/sq.js
@@ -8,25 +8,6 @@ OC.L10N.register(
"Could not authenticate to remote share, password might be wrong" : "S’bëri dot mirëfilltësimin te ndarja e largët, fjalëkalimi mund të jetë i gabuar",
"Storage not valid" : "Depozitë jo e vlefshme",
"Couldn't add remote share" : "S’shtoi dotë ndarje të largët",
- "Share API is disabled" : "API i ndarjeve është çaktivizuar",
- "Wrong share ID, share doesn't exist" : "ID e gabuar ndarjeje, ndarja s’ekziston",
- "Could not delete share" : "Ndarja s’u fshi dot",
- "Please specify a file or folder path" : "Ju lutemi, tregoni një shteg kartele ose dosjeje",
- "Wrong path, file/folder doesn't exist" : "Shteg i gabuar, kratela/dosja s’ekziston",
- "Please specify a valid user" : "Ju lutemi, tregoni një përdorues të vlefshëm",
- "Group sharing is disabled by the administrator" : "Ndarja në grup është çaktivizuar nga përgjegjësi",
- "Please specify a valid group" : "Ju lutemi, tregoni një grup të vlefshëm",
- "Public link sharing is disabled by the administrator" : "Ndarja e lidhjeve publike është çaktivizuar nga përgjegjësi",
- "Public upload disabled by the administrator" : "Ngarkimi publik është çaktivizuar nga përgjegjësi",
- "Public upload is only possible for publicly shared folders" : "Ngarkimi publik është i mundshëm vetëm për dosje të ndara publikisht",
- "Invalid date, date format must be YYYY-MM-DD" : "Datë e pavlefshme, formati i datës duhet të jetë VVVV-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Ndarja e %s dështoi, ngaqë pjesa përgjegjëse e shërbyesit nuk lejon ndarje prej llojit %s",
- "Unknown share type" : "Lloj i panjohur ndarjesh",
- "Not a directory" : "S’është drejtori",
- "Could not lock path" : "S’u kyç dot shtegu",
- "Can't change permissions for public share links" : "S’mund të ndryshohen lejet për lidhje ndarjesh publike",
- "Wrong or no update parameter given" : "Ose u dha parametër i gabuar përditësimesh, pse s’u dha fare ",
- "Cannot increase permissions" : "S’mund të fuqizohen lejet",
"Shared with you" : "Të ndara me ju",
"Shared with others" : "Të ndara me të tjerët",
"Shared by link" : "Të ndara me lidhje",
@@ -46,6 +27,25 @@ OC.L10N.register(
"Invalid ownCloud url" : "URL ownCloud e pavlefshme",
"Shared by" : "Ndarë nga",
"Sharing" : "Ndarje",
+ "Share API is disabled" : "API i ndarjeve është çaktivizuar",
+ "Wrong share ID, share doesn't exist" : "ID e gabuar ndarjeje, ndarja s’ekziston",
+ "Could not delete share" : "Ndarja s’u fshi dot",
+ "Please specify a file or folder path" : "Ju lutemi, tregoni një shteg kartele ose dosjeje",
+ "Wrong path, file/folder doesn't exist" : "Shteg i gabuar, kratela/dosja s’ekziston",
+ "Please specify a valid user" : "Ju lutemi, tregoni një përdorues të vlefshëm",
+ "Group sharing is disabled by the administrator" : "Ndarja në grup është çaktivizuar nga përgjegjësi",
+ "Please specify a valid group" : "Ju lutemi, tregoni një grup të vlefshëm",
+ "Public link sharing is disabled by the administrator" : "Ndarja e lidhjeve publike është çaktivizuar nga përgjegjësi",
+ "Public upload disabled by the administrator" : "Ngarkimi publik është çaktivizuar nga përgjegjësi",
+ "Public upload is only possible for publicly shared folders" : "Ngarkimi publik është i mundshëm vetëm për dosje të ndara publikisht",
+ "Invalid date, date format must be YYYY-MM-DD" : "Datë e pavlefshme, formati i datës duhet të jetë VVVV-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Ndarja e %s dështoi, ngaqë pjesa përgjegjëse e shërbyesit nuk lejon ndarje prej llojit %s",
+ "Unknown share type" : "Lloj i panjohur ndarjesh",
+ "Not a directory" : "S’është drejtori",
+ "Could not lock path" : "S’u kyç dot shtegu",
+ "Can't change permissions for public share links" : "S’mund të ndryshohen lejet për lidhje ndarjesh publike",
+ "Wrong or no update parameter given" : "Ose u dha parametër i gabuar përditësimesh, pse s’u dha fare ",
+ "Cannot increase permissions" : "S’mund të fuqizohen lejet",
"A file or folder has been <strong>shared</strong>" : "U <strong>nda me të tjerë</strong> një kartelë ose dosje",
"A file or folder was shared from <strong>another server</strong>" : "Një kartelë ose dosje u nda prej një <strong>shërbyesi tjetër</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "<strong>U shkarkua</strong> një kartelë ose dosje e ndarë me të tjerët publikisht",
diff --git a/apps/files_sharing/l10n/sq.json b/apps/files_sharing/l10n/sq.json
index ba213e82736..763cf2389ba 100644
--- a/apps/files_sharing/l10n/sq.json
+++ b/apps/files_sharing/l10n/sq.json
@@ -6,25 +6,6 @@
"Could not authenticate to remote share, password might be wrong" : "S’bëri dot mirëfilltësimin te ndarja e largët, fjalëkalimi mund të jetë i gabuar",
"Storage not valid" : "Depozitë jo e vlefshme",
"Couldn't add remote share" : "S’shtoi dotë ndarje të largët",
- "Share API is disabled" : "API i ndarjeve është çaktivizuar",
- "Wrong share ID, share doesn't exist" : "ID e gabuar ndarjeje, ndarja s’ekziston",
- "Could not delete share" : "Ndarja s’u fshi dot",
- "Please specify a file or folder path" : "Ju lutemi, tregoni një shteg kartele ose dosjeje",
- "Wrong path, file/folder doesn't exist" : "Shteg i gabuar, kratela/dosja s’ekziston",
- "Please specify a valid user" : "Ju lutemi, tregoni një përdorues të vlefshëm",
- "Group sharing is disabled by the administrator" : "Ndarja në grup është çaktivizuar nga përgjegjësi",
- "Please specify a valid group" : "Ju lutemi, tregoni një grup të vlefshëm",
- "Public link sharing is disabled by the administrator" : "Ndarja e lidhjeve publike është çaktivizuar nga përgjegjësi",
- "Public upload disabled by the administrator" : "Ngarkimi publik është çaktivizuar nga përgjegjësi",
- "Public upload is only possible for publicly shared folders" : "Ngarkimi publik është i mundshëm vetëm për dosje të ndara publikisht",
- "Invalid date, date format must be YYYY-MM-DD" : "Datë e pavlefshme, formati i datës duhet të jetë VVVV-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "Ndarja e %s dështoi, ngaqë pjesa përgjegjëse e shërbyesit nuk lejon ndarje prej llojit %s",
- "Unknown share type" : "Lloj i panjohur ndarjesh",
- "Not a directory" : "S’është drejtori",
- "Could not lock path" : "S’u kyç dot shtegu",
- "Can't change permissions for public share links" : "S’mund të ndryshohen lejet për lidhje ndarjesh publike",
- "Wrong or no update parameter given" : "Ose u dha parametër i gabuar përditësimesh, pse s’u dha fare ",
- "Cannot increase permissions" : "S’mund të fuqizohen lejet",
"Shared with you" : "Të ndara me ju",
"Shared with others" : "Të ndara me të tjerët",
"Shared by link" : "Të ndara me lidhje",
@@ -44,6 +25,25 @@
"Invalid ownCloud url" : "URL ownCloud e pavlefshme",
"Shared by" : "Ndarë nga",
"Sharing" : "Ndarje",
+ "Share API is disabled" : "API i ndarjeve është çaktivizuar",
+ "Wrong share ID, share doesn't exist" : "ID e gabuar ndarjeje, ndarja s’ekziston",
+ "Could not delete share" : "Ndarja s’u fshi dot",
+ "Please specify a file or folder path" : "Ju lutemi, tregoni një shteg kartele ose dosjeje",
+ "Wrong path, file/folder doesn't exist" : "Shteg i gabuar, kratela/dosja s’ekziston",
+ "Please specify a valid user" : "Ju lutemi, tregoni një përdorues të vlefshëm",
+ "Group sharing is disabled by the administrator" : "Ndarja në grup është çaktivizuar nga përgjegjësi",
+ "Please specify a valid group" : "Ju lutemi, tregoni një grup të vlefshëm",
+ "Public link sharing is disabled by the administrator" : "Ndarja e lidhjeve publike është çaktivizuar nga përgjegjësi",
+ "Public upload disabled by the administrator" : "Ngarkimi publik është çaktivizuar nga përgjegjësi",
+ "Public upload is only possible for publicly shared folders" : "Ngarkimi publik është i mundshëm vetëm për dosje të ndara publikisht",
+ "Invalid date, date format must be YYYY-MM-DD" : "Datë e pavlefshme, formati i datës duhet të jetë VVVV-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Ndarja e %s dështoi, ngaqë pjesa përgjegjëse e shërbyesit nuk lejon ndarje prej llojit %s",
+ "Unknown share type" : "Lloj i panjohur ndarjesh",
+ "Not a directory" : "S’është drejtori",
+ "Could not lock path" : "S’u kyç dot shtegu",
+ "Can't change permissions for public share links" : "S’mund të ndryshohen lejet për lidhje ndarjesh publike",
+ "Wrong or no update parameter given" : "Ose u dha parametër i gabuar përditësimesh, pse s’u dha fare ",
+ "Cannot increase permissions" : "S’mund të fuqizohen lejet",
"A file or folder has been <strong>shared</strong>" : "U <strong>nda me të tjerë</strong> një kartelë ose dosje",
"A file or folder was shared from <strong>another server</strong>" : "Një kartelë ose dosje u nda prej një <strong>shërbyesi tjetër</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "<strong>U shkarkua</strong> një kartelë ose dosje e ndarë me të tjerët publikisht",
diff --git a/apps/files_sharing/l10n/th_TH.js b/apps/files_sharing/l10n/th_TH.js
index 2137eab6aba..9b8ad41a24e 100644
--- a/apps/files_sharing/l10n/th_TH.js
+++ b/apps/files_sharing/l10n/th_TH.js
@@ -8,25 +8,6 @@ OC.L10N.register(
"Could not authenticate to remote share, password might be wrong" : "ไม่สามารถรับรองความถูกต้องจากรีโมทแชร์ บางทีรหัสผ่านอาจจะผิด",
"Storage not valid" : "การจัดเก็บข้อมูลไม่ถูกต้อง",
"Couldn't add remote share" : "ไม่สามารถเพิ่มรีโมทแชร์",
- "Share API is disabled" : "แชร์ API ถูกปิดใช้งาน",
- "Wrong share ID, share doesn't exist" : "แชร์ไอดีผิด หรือ ไม่มีแชร์นั้นอยู่",
- "Could not delete share" : "ไม่สามารถลบแชร์",
- "Please specify a file or folder path" : "โปรดระบุเส้นทางของไฟล์หรือโฟลเดอร์",
- "Wrong path, file/folder doesn't exist" : "เส้นทางที่ผิด, ไม่มีไฟล์หรือโฟลเดอร์นั้นอยู่",
- "Please specify a valid user" : "โปรดระบุผู้ใช้ให้ถูกต้อง",
- "Group sharing is disabled by the administrator" : "การแชร์กลุ่มถูกปิดใช้งานโดยผู้ดูแลระบบ",
- "Please specify a valid group" : "โปรดระบุกลุ่มให้ถูกต้อง",
- "Public link sharing is disabled by the administrator" : "แชร์ลิงก์สาธารณะถูกปิดใช้งานโดยผู้ดูแลระบบ",
- "Public upload disabled by the administrator" : "อัพโหลดสาธารณะถูกปิดใช้งานโดยผู้ดูแลระบบ",
- "Public upload is only possible for publicly shared folders" : "อัพโหลดสาธารณะจะทำได้เฉพาะโฟลเดอร์ที่แชร์กับสาธารณะ",
- "Invalid date, date format must be YYYY-MM-DD" : "วันที่ไม่ถูกต้อง รูปแบบวันที่จะต้องเป็น YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "แชร์ %s ล้มเหลวเพราะแบ็กเอนด์ไม่อนุญาตให้แชร์ไฟล์ประเภท %s",
- "Unknown share type" : "ไม่รู้จักประเภทของแชร์",
- "Not a directory" : "ไม่ได้เป็นไดเรกทอรี",
- "Could not lock path" : "ไม่สามารถล็อคเส้นทาง",
- "Can't change permissions for public share links" : "ไม่สามารถเปลี่ยนสิทธิ์สำหรับลิงค์แชร์สาธารณะ",
- "Wrong or no update parameter given" : "ไม่ถูกต้องหรือไม่ได้อัพเดทพารามิเตอร์",
- "Cannot increase permissions" : "ไม่สามารถเพิ่มสิทธิ์",
"Shared with you" : "แชร์กับคุณ",
"Shared with others" : "แชร์กับผู้อื่น",
"Shared by link" : "แชร์โดยลิงค์",
@@ -46,6 +27,25 @@ OC.L10N.register(
"Invalid ownCloud url" : "URL ownCloud ไม่ถูกต้อง",
"Shared by" : "ถูกแชร์โดย",
"Sharing" : "แชร์ข้อมูล",
+ "Share API is disabled" : "แชร์ API ถูกปิดใช้งาน",
+ "Wrong share ID, share doesn't exist" : "แชร์ไอดีผิด หรือ ไม่มีแชร์นั้นอยู่",
+ "Could not delete share" : "ไม่สามารถลบแชร์",
+ "Please specify a file or folder path" : "โปรดระบุเส้นทางของไฟล์หรือโฟลเดอร์",
+ "Wrong path, file/folder doesn't exist" : "เส้นทางที่ผิด, ไม่มีไฟล์หรือโฟลเดอร์นั้นอยู่",
+ "Please specify a valid user" : "โปรดระบุผู้ใช้ให้ถูกต้อง",
+ "Group sharing is disabled by the administrator" : "การแชร์กลุ่มถูกปิดใช้งานโดยผู้ดูแลระบบ",
+ "Please specify a valid group" : "โปรดระบุกลุ่มให้ถูกต้อง",
+ "Public link sharing is disabled by the administrator" : "แชร์ลิงก์สาธารณะถูกปิดใช้งานโดยผู้ดูแลระบบ",
+ "Public upload disabled by the administrator" : "อัพโหลดสาธารณะถูกปิดใช้งานโดยผู้ดูแลระบบ",
+ "Public upload is only possible for publicly shared folders" : "อัพโหลดสาธารณะจะทำได้เฉพาะโฟลเดอร์ที่แชร์กับสาธารณะ",
+ "Invalid date, date format must be YYYY-MM-DD" : "วันที่ไม่ถูกต้อง รูปแบบวันที่จะต้องเป็น YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "แชร์ %s ล้มเหลวเพราะแบ็กเอนด์ไม่อนุญาตให้แชร์ไฟล์ประเภท %s",
+ "Unknown share type" : "ไม่รู้จักประเภทของแชร์",
+ "Not a directory" : "ไม่ได้เป็นไดเรกทอรี",
+ "Could not lock path" : "ไม่สามารถล็อคเส้นทาง",
+ "Can't change permissions for public share links" : "ไม่สามารถเปลี่ยนสิทธิ์สำหรับลิงค์แชร์สาธารณะ",
+ "Wrong or no update parameter given" : "ไม่ถูกต้องหรือไม่ได้อัพเดทพารามิเตอร์",
+ "Cannot increase permissions" : "ไม่สามารถเพิ่มสิทธิ์",
"A file or folder has been <strong>shared</strong>" : "ไฟล์หรือโฟลเดอร์ได้ถูก <strong>แชร์</strong>",
"A file or folder was shared from <strong>another server</strong>" : "ไฟล์หรือโฟลเดอร์จะถูกแชร์จาก <strong>เซิร์ฟเวอร์อื่นๆ</ strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "แชร์ไฟล์หรือโฟลเดอร์สาธารณะถูก <strong>ดาวน์โหลด</strong>",
diff --git a/apps/files_sharing/l10n/th_TH.json b/apps/files_sharing/l10n/th_TH.json
index 31d912c1462..809d272dc8d 100644
--- a/apps/files_sharing/l10n/th_TH.json
+++ b/apps/files_sharing/l10n/th_TH.json
@@ -6,25 +6,6 @@
"Could not authenticate to remote share, password might be wrong" : "ไม่สามารถรับรองความถูกต้องจากรีโมทแชร์ บางทีรหัสผ่านอาจจะผิด",
"Storage not valid" : "การจัดเก็บข้อมูลไม่ถูกต้อง",
"Couldn't add remote share" : "ไม่สามารถเพิ่มรีโมทแชร์",
- "Share API is disabled" : "แชร์ API ถูกปิดใช้งาน",
- "Wrong share ID, share doesn't exist" : "แชร์ไอดีผิด หรือ ไม่มีแชร์นั้นอยู่",
- "Could not delete share" : "ไม่สามารถลบแชร์",
- "Please specify a file or folder path" : "โปรดระบุเส้นทางของไฟล์หรือโฟลเดอร์",
- "Wrong path, file/folder doesn't exist" : "เส้นทางที่ผิด, ไม่มีไฟล์หรือโฟลเดอร์นั้นอยู่",
- "Please specify a valid user" : "โปรดระบุผู้ใช้ให้ถูกต้อง",
- "Group sharing is disabled by the administrator" : "การแชร์กลุ่มถูกปิดใช้งานโดยผู้ดูแลระบบ",
- "Please specify a valid group" : "โปรดระบุกลุ่มให้ถูกต้อง",
- "Public link sharing is disabled by the administrator" : "แชร์ลิงก์สาธารณะถูกปิดใช้งานโดยผู้ดูแลระบบ",
- "Public upload disabled by the administrator" : "อัพโหลดสาธารณะถูกปิดใช้งานโดยผู้ดูแลระบบ",
- "Public upload is only possible for publicly shared folders" : "อัพโหลดสาธารณะจะทำได้เฉพาะโฟลเดอร์ที่แชร์กับสาธารณะ",
- "Invalid date, date format must be YYYY-MM-DD" : "วันที่ไม่ถูกต้อง รูปแบบวันที่จะต้องเป็น YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "แชร์ %s ล้มเหลวเพราะแบ็กเอนด์ไม่อนุญาตให้แชร์ไฟล์ประเภท %s",
- "Unknown share type" : "ไม่รู้จักประเภทของแชร์",
- "Not a directory" : "ไม่ได้เป็นไดเรกทอรี",
- "Could not lock path" : "ไม่สามารถล็อคเส้นทาง",
- "Can't change permissions for public share links" : "ไม่สามารถเปลี่ยนสิทธิ์สำหรับลิงค์แชร์สาธารณะ",
- "Wrong or no update parameter given" : "ไม่ถูกต้องหรือไม่ได้อัพเดทพารามิเตอร์",
- "Cannot increase permissions" : "ไม่สามารถเพิ่มสิทธิ์",
"Shared with you" : "แชร์กับคุณ",
"Shared with others" : "แชร์กับผู้อื่น",
"Shared by link" : "แชร์โดยลิงค์",
@@ -44,6 +25,25 @@
"Invalid ownCloud url" : "URL ownCloud ไม่ถูกต้อง",
"Shared by" : "ถูกแชร์โดย",
"Sharing" : "แชร์ข้อมูล",
+ "Share API is disabled" : "แชร์ API ถูกปิดใช้งาน",
+ "Wrong share ID, share doesn't exist" : "แชร์ไอดีผิด หรือ ไม่มีแชร์นั้นอยู่",
+ "Could not delete share" : "ไม่สามารถลบแชร์",
+ "Please specify a file or folder path" : "โปรดระบุเส้นทางของไฟล์หรือโฟลเดอร์",
+ "Wrong path, file/folder doesn't exist" : "เส้นทางที่ผิด, ไม่มีไฟล์หรือโฟลเดอร์นั้นอยู่",
+ "Please specify a valid user" : "โปรดระบุผู้ใช้ให้ถูกต้อง",
+ "Group sharing is disabled by the administrator" : "การแชร์กลุ่มถูกปิดใช้งานโดยผู้ดูแลระบบ",
+ "Please specify a valid group" : "โปรดระบุกลุ่มให้ถูกต้อง",
+ "Public link sharing is disabled by the administrator" : "แชร์ลิงก์สาธารณะถูกปิดใช้งานโดยผู้ดูแลระบบ",
+ "Public upload disabled by the administrator" : "อัพโหลดสาธารณะถูกปิดใช้งานโดยผู้ดูแลระบบ",
+ "Public upload is only possible for publicly shared folders" : "อัพโหลดสาธารณะจะทำได้เฉพาะโฟลเดอร์ที่แชร์กับสาธารณะ",
+ "Invalid date, date format must be YYYY-MM-DD" : "วันที่ไม่ถูกต้อง รูปแบบวันที่จะต้องเป็น YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "แชร์ %s ล้มเหลวเพราะแบ็กเอนด์ไม่อนุญาตให้แชร์ไฟล์ประเภท %s",
+ "Unknown share type" : "ไม่รู้จักประเภทของแชร์",
+ "Not a directory" : "ไม่ได้เป็นไดเรกทอรี",
+ "Could not lock path" : "ไม่สามารถล็อคเส้นทาง",
+ "Can't change permissions for public share links" : "ไม่สามารถเปลี่ยนสิทธิ์สำหรับลิงค์แชร์สาธารณะ",
+ "Wrong or no update parameter given" : "ไม่ถูกต้องหรือไม่ได้อัพเดทพารามิเตอร์",
+ "Cannot increase permissions" : "ไม่สามารถเพิ่มสิทธิ์",
"A file or folder has been <strong>shared</strong>" : "ไฟล์หรือโฟลเดอร์ได้ถูก <strong>แชร์</strong>",
"A file or folder was shared from <strong>another server</strong>" : "ไฟล์หรือโฟลเดอร์จะถูกแชร์จาก <strong>เซิร์ฟเวอร์อื่นๆ</ strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "แชร์ไฟล์หรือโฟลเดอร์สาธารณะถูก <strong>ดาวน์โหลด</strong>",
diff --git a/apps/files_sharing/l10n/zh_CN.js b/apps/files_sharing/l10n/zh_CN.js
index 1938c962a21..e369424d0c9 100644
--- a/apps/files_sharing/l10n/zh_CN.js
+++ b/apps/files_sharing/l10n/zh_CN.js
@@ -8,25 +8,6 @@ OC.L10N.register(
"Could not authenticate to remote share, password might be wrong" : "无法验证远程共享,可能是密码错误",
"Storage not valid" : "存储无效",
"Couldn't add remote share" : "无法添加远程分享",
- "Share API is disabled" : "共享 API 已被禁用",
- "Wrong share ID, share doesn't exist" : "错误的共享 ID,共享不存在",
- "Could not delete share" : "不能删除共享",
- "Please specify a file or folder path" : "请指定一个文件或文件夹路径",
- "Wrong path, file/folder doesn't exist" : "路径错误,文件/文件夹不存在",
- "Please specify a valid user" : "请指定一个有效的用户",
- "Group sharing is disabled by the administrator" : "群组共享已被管理员禁用",
- "Please specify a valid group" : "请指定一个有效的组",
- "Public link sharing is disabled by the administrator" : "公共链接共享已被管理员禁用",
- "Public upload disabled by the administrator" : "公共上传已被管理员禁用",
- "Public upload is only possible for publicly shared folders" : "公共上传仅适用于公共共享文件夹",
- "Invalid date, date format must be YYYY-MM-DD" : "无效的日期,日期格式必须是 YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "共享 %s 失败,后端不允许共享 %s 类型",
- "Unknown share type" : "未知共享类型",
- "Not a directory" : "不是一个目录",
- "Could not lock path" : "无法锁定路径",
- "Can't change permissions for public share links" : "不能改变公共分享链接权限",
- "Wrong or no update parameter given" : "错误或没有更新参数给出",
- "Cannot increase permissions" : "不能增加权限",
"Shared with you" : "分享给您的文件",
"Shared with others" : "您分享的文件",
"Shared by link" : "分享链接的文件",
@@ -46,6 +27,25 @@ OC.L10N.register(
"Invalid ownCloud url" : "无效的 ownCloud 网址",
"Shared by" : "共享人",
"Sharing" : "共享",
+ "Share API is disabled" : "共享 API 已被禁用",
+ "Wrong share ID, share doesn't exist" : "错误的共享 ID,共享不存在",
+ "Could not delete share" : "不能删除共享",
+ "Please specify a file or folder path" : "请指定一个文件或文件夹路径",
+ "Wrong path, file/folder doesn't exist" : "路径错误,文件/文件夹不存在",
+ "Please specify a valid user" : "请指定一个有效的用户",
+ "Group sharing is disabled by the administrator" : "群组共享已被管理员禁用",
+ "Please specify a valid group" : "请指定一个有效的组",
+ "Public link sharing is disabled by the administrator" : "公共链接共享已被管理员禁用",
+ "Public upload disabled by the administrator" : "公共上传已被管理员禁用",
+ "Public upload is only possible for publicly shared folders" : "公共上传仅适用于公共共享文件夹",
+ "Invalid date, date format must be YYYY-MM-DD" : "无效的日期,日期格式必须是 YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "共享 %s 失败,后端不允许共享 %s 类型",
+ "Unknown share type" : "未知共享类型",
+ "Not a directory" : "不是一个目录",
+ "Could not lock path" : "无法锁定路径",
+ "Can't change permissions for public share links" : "不能改变公共分享链接权限",
+ "Wrong or no update parameter given" : "错误或没有更新参数给出",
+ "Cannot increase permissions" : "不能增加权限",
"A file or folder has been <strong>shared</strong>" : "一个文件或文件夹已<strong>共享</strong>。",
"A file or folder was shared from <strong>another server</strong>" : "<strong>其它服务器</strong> 中一个文件或者文件夹被共享 ",
"A public shared file or folder was <strong>downloaded</strong>" : "一个公共共享的文件或文件夹<strong>已下载</strong>",
diff --git a/apps/files_sharing/l10n/zh_CN.json b/apps/files_sharing/l10n/zh_CN.json
index 6b5e929188f..9ab230715d4 100644
--- a/apps/files_sharing/l10n/zh_CN.json
+++ b/apps/files_sharing/l10n/zh_CN.json
@@ -6,25 +6,6 @@
"Could not authenticate to remote share, password might be wrong" : "无法验证远程共享,可能是密码错误",
"Storage not valid" : "存储无效",
"Couldn't add remote share" : "无法添加远程分享",
- "Share API is disabled" : "共享 API 已被禁用",
- "Wrong share ID, share doesn't exist" : "错误的共享 ID,共享不存在",
- "Could not delete share" : "不能删除共享",
- "Please specify a file or folder path" : "请指定一个文件或文件夹路径",
- "Wrong path, file/folder doesn't exist" : "路径错误,文件/文件夹不存在",
- "Please specify a valid user" : "请指定一个有效的用户",
- "Group sharing is disabled by the administrator" : "群组共享已被管理员禁用",
- "Please specify a valid group" : "请指定一个有效的组",
- "Public link sharing is disabled by the administrator" : "公共链接共享已被管理员禁用",
- "Public upload disabled by the administrator" : "公共上传已被管理员禁用",
- "Public upload is only possible for publicly shared folders" : "公共上传仅适用于公共共享文件夹",
- "Invalid date, date format must be YYYY-MM-DD" : "无效的日期,日期格式必须是 YYYY-MM-DD",
- "Sharing %s failed because the back end does not allow shares from type %s" : "共享 %s 失败,后端不允许共享 %s 类型",
- "Unknown share type" : "未知共享类型",
- "Not a directory" : "不是一个目录",
- "Could not lock path" : "无法锁定路径",
- "Can't change permissions for public share links" : "不能改变公共分享链接权限",
- "Wrong or no update parameter given" : "错误或没有更新参数给出",
- "Cannot increase permissions" : "不能增加权限",
"Shared with you" : "分享给您的文件",
"Shared with others" : "您分享的文件",
"Shared by link" : "分享链接的文件",
@@ -44,6 +25,25 @@
"Invalid ownCloud url" : "无效的 ownCloud 网址",
"Shared by" : "共享人",
"Sharing" : "共享",
+ "Share API is disabled" : "共享 API 已被禁用",
+ "Wrong share ID, share doesn't exist" : "错误的共享 ID,共享不存在",
+ "Could not delete share" : "不能删除共享",
+ "Please specify a file or folder path" : "请指定一个文件或文件夹路径",
+ "Wrong path, file/folder doesn't exist" : "路径错误,文件/文件夹不存在",
+ "Please specify a valid user" : "请指定一个有效的用户",
+ "Group sharing is disabled by the administrator" : "群组共享已被管理员禁用",
+ "Please specify a valid group" : "请指定一个有效的组",
+ "Public link sharing is disabled by the administrator" : "公共链接共享已被管理员禁用",
+ "Public upload disabled by the administrator" : "公共上传已被管理员禁用",
+ "Public upload is only possible for publicly shared folders" : "公共上传仅适用于公共共享文件夹",
+ "Invalid date, date format must be YYYY-MM-DD" : "无效的日期,日期格式必须是 YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "共享 %s 失败,后端不允许共享 %s 类型",
+ "Unknown share type" : "未知共享类型",
+ "Not a directory" : "不是一个目录",
+ "Could not lock path" : "无法锁定路径",
+ "Can't change permissions for public share links" : "不能改变公共分享链接权限",
+ "Wrong or no update parameter given" : "错误或没有更新参数给出",
+ "Cannot increase permissions" : "不能增加权限",
"A file or folder has been <strong>shared</strong>" : "一个文件或文件夹已<strong>共享</strong>。",
"A file or folder was shared from <strong>another server</strong>" : "<strong>其它服务器</strong> 中一个文件或者文件夹被共享 ",
"A public shared file or folder was <strong>downloaded</strong>" : "一个公共共享的文件或文件夹<strong>已下载</strong>",
diff --git a/apps/files_sharing/lib/API/Share20OCS.php b/apps/files_sharing/lib/API/Share20OCS.php
index 90e1f19130c..53b27aae0b8 100644
--- a/apps/files_sharing/lib/API/Share20OCS.php
+++ b/apps/files_sharing/lib/API/Share20OCS.php
@@ -100,15 +100,8 @@ class Share20OCS {
*/
protected function formatShare(\OCP\Share\IShare $share) {
$sharedBy = $this->userManager->get($share->getSharedBy());
- // for federated shares the owner can be a remote user, in this
- // case we use the initiator
- if ($this->userManager->userExists($share->getShareOwner())) {
- $shareOwner = $this->userManager->get($share->getShareOwner());
- $localUser = $share->getShareOwner();
- } else {
- $shareOwner = $this->userManager->get($share->getSharedBy());
- $localUser = $share->getSharedBy();
- }
+ $shareOwner = $this->userManager->get($share->getShareOwner());
+
$result = [
'id' => $share->getId(),
'share_type' => $share->getShareType(),
@@ -123,8 +116,16 @@ class Share20OCS {
'displayname_file_owner' => $shareOwner !== null ? $shareOwner->getDisplayName() : $share->getShareOwner(),
];
- $node = $share->getNode();
- $result['path'] = $this->rootFolder->getUserFolder($localUser)->getRelativePath($node->getPath());
+ $userFolder = $this->rootFolder->getUserFolder($this->currentUser->getUID());
+ $nodes = $userFolder->getById($share->getNodeId());
+
+ if (empty($nodes)) {
+ throw new NotFoundException();
+ }
+
+ $node = $nodes[0];
+
+ $result['path'] = $userFolder->getRelativePath($node->getPath());
if ($node instanceOf \OCP\Files\Folder) {
$result['item_type'] = 'folder';
} else {
@@ -536,7 +537,6 @@ class Share20OCS {
$shares = array_merge($shares, $federatedShares);
}
-
$formatted = [];
foreach ($shares as $share) {
try {
diff --git a/apps/files_sharing/lib/Cache.php b/apps/files_sharing/lib/Cache.php
index 82d885a8ef3..a0519cadbaa 100644
--- a/apps/files_sharing/lib/Cache.php
+++ b/apps/files_sharing/lib/Cache.php
@@ -81,7 +81,7 @@ class Cache extends CacheJail {
}
protected function formatCacheEntry($entry) {
- $path = $entry['path'];
+ $path = isset($entry['path']) ? $entry['path'] : '';
$entry = parent::formatCacheEntry($entry);
$sharePermissions = $this->storage->getPermissions($path);
if (isset($entry['permissions'])) {
diff --git a/apps/files_sharing/lib/Controllers/ShareController.php b/apps/files_sharing/lib/Controllers/ShareController.php
index d6f497ed38e..96c0a0ca556 100644
--- a/apps/files_sharing/lib/Controllers/ShareController.php
+++ b/apps/files_sharing/lib/Controllers/ShareController.php
@@ -321,7 +321,7 @@ class ShareController extends Controller {
* The OC_Util methods require a view. This just uses the node API
*/
$freeSpace = $share->getNode()->getStorage()->free_space($share->getNode()->getInternalPath());
- if ($freeSpace !== \OCP\Files\FileInfo::SPACE_UNKNOWN) {
+ if ($freeSpace < \OCP\Files\FileInfo::SPACE_UNLIMITED) {
$freeSpace = max($freeSpace, 0);
} else {
$freeSpace = (INF > 0) ? INF: PHP_INT_MAX; // work around https://bugs.php.net/bug.php?id=69188
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index 965c4d36cad..b5b5e416884 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -415,4 +415,22 @@ class Shared extends \OC\Files\Storage\Wrapper\Jail implements ISharedStorage {
return $this->sourceStorage;
}
+ public function file_get_contents($path) {
+ $info = [
+ 'target' => $this->getMountPoint() . '/' . $path,
+ 'source' => $this->getSourcePath($path),
+ ];
+ \OCP\Util::emitHook('\OC\Files\Storage\Shared', 'file_get_contents', $info);
+ return parent::file_get_contents($path);
+ }
+
+ public function file_put_contents($path, $data) {
+ $info = [
+ 'target' => $this->getMountPoint() . '/' . $path,
+ 'source' => $this->getSourcePath($path),
+ ];
+ \OCP\Util::emitHook('\OC\Files\Storage\Shared', 'file_put_contents', $info);
+ return parent::file_put_contents($path, $data);
+ }
+
}
diff --git a/apps/files_sharing/tests/API/Share20OCSTest.php b/apps/files_sharing/tests/API/Share20OCSTest.php
index 02b16d7bf88..b760a0f47a0 100644
--- a/apps/files_sharing/tests/API/Share20OCSTest.php
+++ b/apps/files_sharing/tests/API/Share20OCSTest.php
@@ -433,8 +433,12 @@ class Share20OCSTest extends \Test\TestCase {
->method('getRelativePath')
->will($this->returnArgument(0));
+ $userFolder->method('getById')
+ ->with($share->getNodeId())
+ ->willReturn([$share->getNode()]);
+
$this->rootFolder->method('getUserFolder')
- ->with($share->getShareOwner())
+ ->with($this->currentUser->getUID())
->willReturn($userFolder);
$this->urlGenerator
@@ -2006,8 +2010,19 @@ class Share20OCSTest extends \Test\TestCase {
->willReturn('myLink');
- $this->rootFolder->method('getUserFolder')->with($share->getShareOwner())->will($this->returnSelf());
- $this->rootFolder->method('getRelativePath')->will($this->returnArgument(0));
+ $this->rootFolder->method('getUserFolder')
+ ->with($this->currentUser->getUID())
+ ->will($this->returnSelf());
+
+ if (!$exception) {
+ $this->rootFolder->method('getById')
+ ->with($share->getNodeId())
+ ->willReturn([$share->getNode()]);
+
+ $this->rootFolder->method('getRelativePath')
+ ->with($share->getNode()->getPath())
+ ->will($this->returnArgument(0));
+ }
try {
$result = $this->invokePrivate($this->ocs, 'formatShare', [$share]);
diff --git a/apps/files_sharing/tests/ApiTest.php b/apps/files_sharing/tests/ApiTest.php
index f44c346236e..058b0c4758c 100644
--- a/apps/files_sharing/tests/ApiTest.php
+++ b/apps/files_sharing/tests/ApiTest.php
@@ -764,8 +764,7 @@ class ApiTest extends TestCase {
// we should get exactly one result
$this->assertCount(1, $data);
- $expectedPath = $this->folder . $this->subfolder;
- $this->assertEquals($expectedPath, $data[0]['path']);
+ $this->assertEquals($this->subfolder, $data[0]['path']);
$this->shareManager->deleteShare($share2);
$this->shareManager->deleteShare($share1);
@@ -801,6 +800,9 @@ class ApiTest extends TestCase {
->setPermissions(1);
$share3 = $this->shareManager->createShare($share3);
+ /*
+ * Test as recipient
+ */
$request = $this->createRequest(['path' => '/', 'subfiles' => 'true']);
$ocs = $this->createOCS($request, self::TEST_FILES_SHARING_API_USER3);
$result = $ocs->getShares();
@@ -811,9 +813,37 @@ class ApiTest extends TestCase {
// we should get exactly one result
$this->assertCount(1, $data);
+ $this->assertEquals($this->subsubfolder, $data[0]['path']);
- $expectedPath = $this->folder . $this->subfolder . $this->subsubfolder;
- $this->assertEquals($expectedPath, $data[0]['path']);
+ /*
+ * Test for first owner/initiator
+ */
+ $request = $this->createRequest([]);
+ $ocs = $this->createOCS($request, self::TEST_FILES_SHARING_API_USER1);
+ $result = $ocs->getShares();
+ $this->assertTrue($result->succeeded());
+
+ // test should return one share within $this->folder
+ $data = $result->getData();
+
+ // we should get exactly one result
+ $this->assertCount(1, $data);
+ $this->assertEquals($this->folder . $this->subfolder, $data[0]['path']);
+
+ /*
+ * Test for second initiator
+ */
+ $request = $this->createRequest([]);
+ $ocs = $this->createOCS($request, self::TEST_FILES_SHARING_API_USER2);
+ $result = $ocs->getShares();
+ $this->assertTrue($result->succeeded());
+
+ // test should return one share within $this->folder
+ $data = $result->getData();
+
+ // we should get exactly one result
+ $this->assertCount(1, $data);
+ $this->assertEquals($this->subfolder . $this->subsubfolder, $data[0]['path']);
$this->shareManager->deleteShare($share1);
$this->shareManager->deleteShare($share2);
@@ -922,8 +952,7 @@ class ApiTest extends TestCase {
// we should get exactly one result
$this->assertCount(1, $data);
- $expectedPath = $this->folder.$this->subfolder.$this->filename;
- $this->assertEquals($expectedPath, $data[0]['path']);
+ $this->assertEquals($this->filename, $data[0]['path']);
$this->shareManager->deleteShare($share1);
$this->shareManager->deleteShare($share2);
diff --git a/apps/files_trashbin/l10n/ast.js b/apps/files_trashbin/l10n/ast.js
index f59457ad6d1..01e643f0db0 100644
--- a/apps/files_trashbin/l10n/ast.js
+++ b/apps/files_trashbin/l10n/ast.js
@@ -3,14 +3,12 @@ OC.L10N.register(
{
"Couldn't delete %s permanently" : "Nun pudo desaniciase %s dafechu",
"Couldn't restore %s" : "Nun pudo restaurase %s",
- "Deleted files" : "Ficheros desaniciaos",
"Restore" : "Restaurar",
"Delete" : "Desaniciar",
"Delete permanently" : "Desaniciar dafechu",
"Error" : "Fallu",
"This operation is forbidden" : "La operación ta prohibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador",
- "restored" : "recuperóse",
"No deleted files" : "Ensin ficheros desaniciaos",
"You will be able to recover deleted files from here" : "Dende equí podrás recureperar los ficheros desaniciaos",
"No entries found in this folder" : "Nenguna entrada en esta carpeta",
diff --git a/apps/files_trashbin/l10n/ast.json b/apps/files_trashbin/l10n/ast.json
index 65380e118d6..ea7423221ea 100644
--- a/apps/files_trashbin/l10n/ast.json
+++ b/apps/files_trashbin/l10n/ast.json
@@ -1,14 +1,12 @@
{ "translations": {
"Couldn't delete %s permanently" : "Nun pudo desaniciase %s dafechu",
"Couldn't restore %s" : "Nun pudo restaurase %s",
- "Deleted files" : "Ficheros desaniciaos",
"Restore" : "Restaurar",
"Delete" : "Desaniciar",
"Delete permanently" : "Desaniciar dafechu",
"Error" : "Fallu",
"This operation is forbidden" : "La operación ta prohibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador",
- "restored" : "recuperóse",
"No deleted files" : "Ensin ficheros desaniciaos",
"You will be able to recover deleted files from here" : "Dende equí podrás recureperar los ficheros desaniciaos",
"No entries found in this folder" : "Nenguna entrada en esta carpeta",
diff --git a/apps/files_trashbin/l10n/lb.js b/apps/files_trashbin/l10n/lb.js
index 9b2aad6d8b0..6c66f929f17 100644
--- a/apps/files_trashbin/l10n/lb.js
+++ b/apps/files_trashbin/l10n/lb.js
@@ -8,6 +8,8 @@ OC.L10N.register(
"Delete" : "Läschen",
"Delete permanently" : "Permanent läschen",
"Error" : "Fehler",
+ "This operation is forbidden" : "Dës Operatioun ass verbueden.",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Dësen Dossier ass net disponibel, w.e.g. kontrolléiert d'Protokoller oder kontaktéiert den Administrateur",
"restored" : "erëmhiergestallt",
"No deleted files" : "Keng geläscht Fichieren",
"You will be able to recover deleted files from here" : "Du kanns geläscht Fichieren aus desëm Dossier erëmhierstellen",
diff --git a/apps/files_trashbin/l10n/lb.json b/apps/files_trashbin/l10n/lb.json
index f9c13ce017f..645bf8e63bc 100644
--- a/apps/files_trashbin/l10n/lb.json
+++ b/apps/files_trashbin/l10n/lb.json
@@ -6,6 +6,8 @@
"Delete" : "Läschen",
"Delete permanently" : "Permanent läschen",
"Error" : "Fehler",
+ "This operation is forbidden" : "Dës Operatioun ass verbueden.",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Dësen Dossier ass net disponibel, w.e.g. kontrolléiert d'Protokoller oder kontaktéiert den Administrateur",
"restored" : "erëmhiergestallt",
"No deleted files" : "Keng geläscht Fichieren",
"You will be able to recover deleted files from here" : "Du kanns geläscht Fichieren aus desëm Dossier erëmhierstellen",
diff --git a/apps/files_trashbin/l10n/ru.js b/apps/files_trashbin/l10n/ru.js
index 337d0b0a575..bbd07cd54a3 100644
--- a/apps/files_trashbin/l10n/ru.js
+++ b/apps/files_trashbin/l10n/ru.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"files_trashbin",
{
- "Couldn't delete %s permanently" : "%s не может быть удалён окончательно",
+ "Couldn't delete %s permanently" : "Не удалось окончательно удалить %s",
"Couldn't restore %s" : "%s не может быть восстановлен",
"Deleted files" : "Удалённые файлы",
"Restore" : "Восстановить",
diff --git a/apps/files_trashbin/l10n/ru.json b/apps/files_trashbin/l10n/ru.json
index 2ab8d48476d..f24b9f75cf9 100644
--- a/apps/files_trashbin/l10n/ru.json
+++ b/apps/files_trashbin/l10n/ru.json
@@ -1,5 +1,5 @@
{ "translations": {
- "Couldn't delete %s permanently" : "%s не может быть удалён окончательно",
+ "Couldn't delete %s permanently" : "Не удалось окончательно удалить %s",
"Couldn't restore %s" : "%s не может быть восстановлен",
"Deleted files" : "Удалённые файлы",
"Restore" : "Восстановить",
diff --git a/apps/files_versions/lib/Storage.php b/apps/files_versions/lib/Storage.php
index ca50c85c88d..638a1916f6a 100644
--- a/apps/files_versions/lib/Storage.php
+++ b/apps/files_versions/lib/Storage.php
@@ -531,13 +531,15 @@ class Storage {
$files = $view->getDirectoryContent($dir);
foreach ($files as $file) {
+ $fileData = $file->getData();
+ $filePath = $dir . '/' . $fileData['name'];
if ($file['type'] === 'dir') {
- array_push($dirs, $file['path']);
+ array_push($dirs, $filePath);
} else {
- $versionsBegin = strrpos($file['path'], '.v');
+ $versionsBegin = strrpos($filePath, '.v');
$relPathStart = strlen(self::VERSIONS_ROOT);
- $version = substr($file['path'], $versionsBegin + 2);
- $relpath = substr($file['path'], $relPathStart, $versionsBegin - $relPathStart);
+ $version = substr($filePath, $versionsBegin + 2);
+ $relpath = substr($filePath, $relPathStart, $versionsBegin - $relPathStart);
$key = $version . '#' . $relpath;
$versions[$key] = array('path' => $relpath, 'timestamp' => $version);
}
diff --git a/apps/systemtags/l10n/fr.js b/apps/systemtags/l10n/fr.js
index 93c7d364b24..387bc45643c 100644
--- a/apps/systemtags/l10n/fr.js
+++ b/apps/systemtags/l10n/fr.js
@@ -7,20 +7,20 @@ OC.L10N.register(
"Please select tags to filter by" : "Veuillez sélectionner les étiquettes par lesquelles filtrer",
"No files found for the selected tags" : "Aucun fichier pour les étiquettes sélectionnées",
"<strong>System tags</strong> for a file have been modified" : "<strong>Les étiquettes systèmes</strong> pour un fichier ont été modifiées",
- "You assigned system tag %3$s" : "Vous avez attribué l'étiquette système %3$s",
+ "You assigned system tag %3$s" : "Vous avez attribué l'étiquette collaborative %3$s",
"%1$s assigned system tag %3$s" : "%1$s a attribué l'étiquette système %3$s",
- "You unassigned system tag %3$s" : "Vous avez retiré l'étiquette système %3$s",
+ "You unassigned system tag %3$s" : "Vous avez retiré l'étiquette collaborative %3$s",
"%1$s unassigned system tag %3$s" : "%1$s a retiré l'étiquette système %3$s",
- "You created system tag %2$s" : "Vous avez créé l'étiquette système %2$s",
+ "You created system tag %2$s" : "Vous avez créé l'étiquette collaborative %2$s",
"%1$s created system tag %2$s" : "%1$s a créé l'étiquette système %2$s",
- "You deleted system tag %2$s" : "Vous avez supprimé l'étiquette système %2$s",
- "%1$s deleted system tag %2$s" : "%1$s a supprimé l'étiquette système %2$s",
- "You updated system tag %3$s to %2$s" : "Vous avez renommé l'étiquette système %3$s en %2$s",
- "%1$s updated system tag %3$s to %2$s" : "%1$s a renommé l'étiquette système %3$s en %2$s",
- "You assigned system tag %3$s to %2$s" : "Vous avez attribué l'étiquette système %3$s à %2$s",
- "%1$s assigned system tag %3$s to %2$s" : "%1$s a attribué l'étiquette système %3$s à %2$s",
- "You unassigned system tag %3$s from %2$s" : "Vous avez retiré l'étiquette système %3$s de %2$s",
- "%1$s unassigned system tag %3$s from %2$s" : "%1$s a retiré l'étiquette système %3$s à %2$s",
+ "You deleted system tag %2$s" : "Vous avez supprimé l'étiquette collaborative %2$s",
+ "%1$s deleted system tag %2$s" : "%1$s a supprimé l'étiquette collaborative %2$s",
+ "You updated system tag %3$s to %2$s" : "Vous avez renommé l'étiquette collaborative %3$s en %2$s",
+ "%1$s updated system tag %3$s to %2$s" : "%1$s a renommé l'étiquette collaborative %3$s en %2$s",
+ "You assigned system tag %3$s to %2$s" : "Vous avez attribué l'étiquette collaborative %3$s à %2$s",
+ "%1$s assigned system tag %3$s to %2$s" : "%1$s a attribué l'étiquette collaborative %3$s à %2$s",
+ "You unassigned system tag %3$s from %2$s" : "Vous avez retiré l'étiquette collaborative %3$s à %2$s",
+ "%1$s unassigned system tag %3$s from %2$s" : "%1$s a retiré l'étiquette collaborative %3$s à %2$s",
"%s (restricted)" : "%s (restreint)",
"%s (invisible)" : "%s (invisible)",
"No files in here" : "Aucun fichier",
diff --git a/apps/systemtags/l10n/fr.json b/apps/systemtags/l10n/fr.json
index 94254c93ab0..66b4d246dac 100644
--- a/apps/systemtags/l10n/fr.json
+++ b/apps/systemtags/l10n/fr.json
@@ -5,20 +5,20 @@
"Please select tags to filter by" : "Veuillez sélectionner les étiquettes par lesquelles filtrer",
"No files found for the selected tags" : "Aucun fichier pour les étiquettes sélectionnées",
"<strong>System tags</strong> for a file have been modified" : "<strong>Les étiquettes systèmes</strong> pour un fichier ont été modifiées",
- "You assigned system tag %3$s" : "Vous avez attribué l'étiquette système %3$s",
+ "You assigned system tag %3$s" : "Vous avez attribué l'étiquette collaborative %3$s",
"%1$s assigned system tag %3$s" : "%1$s a attribué l'étiquette système %3$s",
- "You unassigned system tag %3$s" : "Vous avez retiré l'étiquette système %3$s",
+ "You unassigned system tag %3$s" : "Vous avez retiré l'étiquette collaborative %3$s",
"%1$s unassigned system tag %3$s" : "%1$s a retiré l'étiquette système %3$s",
- "You created system tag %2$s" : "Vous avez créé l'étiquette système %2$s",
+ "You created system tag %2$s" : "Vous avez créé l'étiquette collaborative %2$s",
"%1$s created system tag %2$s" : "%1$s a créé l'étiquette système %2$s",
- "You deleted system tag %2$s" : "Vous avez supprimé l'étiquette système %2$s",
- "%1$s deleted system tag %2$s" : "%1$s a supprimé l'étiquette système %2$s",
- "You updated system tag %3$s to %2$s" : "Vous avez renommé l'étiquette système %3$s en %2$s",
- "%1$s updated system tag %3$s to %2$s" : "%1$s a renommé l'étiquette système %3$s en %2$s",
- "You assigned system tag %3$s to %2$s" : "Vous avez attribué l'étiquette système %3$s à %2$s",
- "%1$s assigned system tag %3$s to %2$s" : "%1$s a attribué l'étiquette système %3$s à %2$s",
- "You unassigned system tag %3$s from %2$s" : "Vous avez retiré l'étiquette système %3$s de %2$s",
- "%1$s unassigned system tag %3$s from %2$s" : "%1$s a retiré l'étiquette système %3$s à %2$s",
+ "You deleted system tag %2$s" : "Vous avez supprimé l'étiquette collaborative %2$s",
+ "%1$s deleted system tag %2$s" : "%1$s a supprimé l'étiquette collaborative %2$s",
+ "You updated system tag %3$s to %2$s" : "Vous avez renommé l'étiquette collaborative %3$s en %2$s",
+ "%1$s updated system tag %3$s to %2$s" : "%1$s a renommé l'étiquette collaborative %3$s en %2$s",
+ "You assigned system tag %3$s to %2$s" : "Vous avez attribué l'étiquette collaborative %3$s à %2$s",
+ "%1$s assigned system tag %3$s to %2$s" : "%1$s a attribué l'étiquette collaborative %3$s à %2$s",
+ "You unassigned system tag %3$s from %2$s" : "Vous avez retiré l'étiquette collaborative %3$s à %2$s",
+ "%1$s unassigned system tag %3$s from %2$s" : "%1$s a retiré l'étiquette collaborative %3$s à %2$s",
"%s (restricted)" : "%s (restreint)",
"%s (invisible)" : "%s (invisible)",
"No files in here" : "Aucun fichier",
diff --git a/apps/systemtags/l10n/hu_HU.js b/apps/systemtags/l10n/hu_HU.js
index 13d1705ff1c..783b90ece8a 100644
--- a/apps/systemtags/l10n/hu_HU.js
+++ b/apps/systemtags/l10n/hu_HU.js
@@ -21,6 +21,7 @@ OC.L10N.register(
"%1$s assigned system tag %3$s to %2$s" : "%1$s hozzárendelte ezt a rendszer címkét: %3$s neki: %2$s",
"You unassigned system tag %3$s from %2$s" : "%3$s rendszer címke hozzárendelést elvette tőle: %2$s",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s elvette ezt a rendszer címkét %3$s tőle: %2$s",
+ "%s (restricted)" : "%s (korlátozott)",
"%s (invisible)" : "%s (láthatatlan)",
"No files in here" : "Itt nincsenek fájlok",
"No entries found in this folder" : "Nincsenek bejegyzések ebben a könyvtárban",
diff --git a/apps/systemtags/l10n/hu_HU.json b/apps/systemtags/l10n/hu_HU.json
index 6408b3a5314..f89da5d3dfd 100644
--- a/apps/systemtags/l10n/hu_HU.json
+++ b/apps/systemtags/l10n/hu_HU.json
@@ -19,6 +19,7 @@
"%1$s assigned system tag %3$s to %2$s" : "%1$s hozzárendelte ezt a rendszer címkét: %3$s neki: %2$s",
"You unassigned system tag %3$s from %2$s" : "%3$s rendszer címke hozzárendelést elvette tőle: %2$s",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s elvette ezt a rendszer címkét %3$s tőle: %2$s",
+ "%s (restricted)" : "%s (korlátozott)",
"%s (invisible)" : "%s (láthatatlan)",
"No files in here" : "Itt nincsenek fájlok",
"No entries found in this folder" : "Nincsenek bejegyzések ebben a könyvtárban",
diff --git a/apps/systemtags/l10n/pl.js b/apps/systemtags/l10n/pl.js
index fc3616bff26..f5e4775d540 100644
--- a/apps/systemtags/l10n/pl.js
+++ b/apps/systemtags/l10n/pl.js
@@ -3,6 +3,8 @@ OC.L10N.register(
{
"Tags" : "Etykiety",
"Tagged files" : "Otagowane pliki",
+ "Select tags to filter by" : "Wybierz tagi do filtru",
+ "Please select tags to filter by" : "Proszę wybrać tagi do filtrów",
"No files found for the selected tags" : "Nie znaleziono plików dla wybranych etykiet",
"<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",
diff --git a/apps/systemtags/l10n/pl.json b/apps/systemtags/l10n/pl.json
index 543aa3be58c..6cb103ed4a5 100644
--- a/apps/systemtags/l10n/pl.json
+++ b/apps/systemtags/l10n/pl.json
@@ -1,6 +1,8 @@
{ "translations": {
"Tags" : "Etykiety",
"Tagged files" : "Otagowane pliki",
+ "Select tags to filter by" : "Wybierz tagi do filtru",
+ "Please select tags to filter by" : "Proszę wybrać tagi do filtrów",
"No files found for the selected tags" : "Nie znaleziono plików dla wybranych etykiet",
"<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",
diff --git a/apps/updatenotification/l10n/hu_HU.js b/apps/updatenotification/l10n/hu_HU.js
index 1df38a6746f..cce4549f01e 100644
--- a/apps/updatenotification/l10n/hu_HU.js
+++ b/apps/updatenotification/l10n/hu_HU.js
@@ -1,8 +1,11 @@
OC.L10N.register(
"updatenotification",
{
+ "Update notifications" : "Frissítési értesítés",
"{version} is available. Get more information on how to update." : "{version} rendelkezésre áll. További információ a frissítéshez.",
"Updated channel" : "Frissített csatorna",
+ "ownCloud core" : "ownCloud mag",
+ "Update for %1$s to version %2$s is available." : "%1$s frissíthető %2$s verzióra.",
"Updater" : "Frissítéskezelő",
"A new version is available: %s" : "Új verzió érhető el: %s",
"Open updater" : "Frissítő megnyitása",
diff --git a/apps/updatenotification/l10n/hu_HU.json b/apps/updatenotification/l10n/hu_HU.json
index eb953669ab1..952b499d52a 100644
--- a/apps/updatenotification/l10n/hu_HU.json
+++ b/apps/updatenotification/l10n/hu_HU.json
@@ -1,6 +1,9 @@
{ "translations": {
+ "Update notifications" : "Frissítési értesítés",
"{version} is available. Get more information on how to update." : "{version} rendelkezésre áll. További információ a frissítéshez.",
"Updated channel" : "Frissített csatorna",
+ "ownCloud core" : "ownCloud mag",
+ "Update for %1$s to version %2$s is available." : "%1$s frissíthető %2$s verzióra.",
"Updater" : "Frissítéskezelő",
"A new version is available: %s" : "Új verzió érhető el: %s",
"Open updater" : "Frissítő megnyitása",
diff --git a/apps/updatenotification/l10n/pl.js b/apps/updatenotification/l10n/pl.js
index 6551d0808e3..d86fdf3c243 100644
--- a/apps/updatenotification/l10n/pl.js
+++ b/apps/updatenotification/l10n/pl.js
@@ -1,8 +1,11 @@
OC.L10N.register(
"updatenotification",
{
+ "Update notifications" : "Powiadomienia o aktualizacji",
"{version} is available. Get more information on how to update." : "Wersja {version} jest dostępna. Dowiedz się jak zaktualizować.",
"Updated channel" : "Zaktualizowano kanał",
+ "ownCloud core" : "Rdzeń ownCloud",
+ "Update for %1$s to version %2$s is available." : "Jest dostępna aktualizacja dla %1$s do wersji %2$s",
"Updater" : "Aktualizator",
"A new version is available: %s" : "Dostępna jest nowa wersja: %s",
"Open updater" : "Otwórz aktualizator",
diff --git a/apps/updatenotification/l10n/pl.json b/apps/updatenotification/l10n/pl.json
index fd859feae11..b5d7132d9f0 100644
--- a/apps/updatenotification/l10n/pl.json
+++ b/apps/updatenotification/l10n/pl.json
@@ -1,6 +1,9 @@
{ "translations": {
+ "Update notifications" : "Powiadomienia o aktualizacji",
"{version} is available. Get more information on how to update." : "Wersja {version} jest dostępna. Dowiedz się jak zaktualizować.",
"Updated channel" : "Zaktualizowano kanał",
+ "ownCloud core" : "Rdzeń ownCloud",
+ "Update for %1$s to version %2$s is available." : "Jest dostępna aktualizacja dla %1$s do wersji %2$s",
"Updater" : "Aktualizator",
"A new version is available: %s" : "Dostępna jest nowa wersja: %s",
"Open updater" : "Otwórz aktualizator",
diff --git a/apps/updatenotification/l10n/sl.js b/apps/updatenotification/l10n/sl.js
index 502ed2cf41f..8efd2561d12 100644
--- a/apps/updatenotification/l10n/sl.js
+++ b/apps/updatenotification/l10n/sl.js
@@ -1,14 +1,17 @@
OC.L10N.register(
"updatenotification",
{
+ "Update notifications" : "Posodobite obvestila",
"{version} is available. Get more information on how to update." : "Na voljo je nova različica {version}. Na voljo je več podrobnosti o nadgradnji.",
"Updated channel" : "Posodobljen kanal",
+ "Update for %1$s to version %2$s is available." : "Posodobitev %1$s na različico %2$s je na voljo.",
"Updater" : "Posodabljalnik",
"A new version is available: %s" : "Na voljo je nova različica: %s",
"Open updater" : "Odpri posodabljalnik",
"Your version is up to date." : "Nameščena je najnovejša različica.",
"Checked on %s" : "Zadnjič preverjeno %s",
"Update channel:" : "Posodobi kanal:",
- "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Nadgradnja na višjo različico ali preizkusni kanal je vedno mogoča, ne pa tudi povrnitev na predhodno, bolj stabilno različico."
+ "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Nadgradnja na višjo različico ali preizkusni kanal je vedno mogoča, ne pa tudi povrnitev na predhodno, bolj stabilno različico.",
+ "Notify members of the following groups about available updates:" : "Obvestite člane naslednjih skupin o posodobitvah, ki so na voljo:"
},
"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
diff --git a/apps/updatenotification/l10n/sl.json b/apps/updatenotification/l10n/sl.json
index 961f1b90fe2..2cda20b2a88 100644
--- a/apps/updatenotification/l10n/sl.json
+++ b/apps/updatenotification/l10n/sl.json
@@ -1,12 +1,15 @@
{ "translations": {
+ "Update notifications" : "Posodobite obvestila",
"{version} is available. Get more information on how to update." : "Na voljo je nova različica {version}. Na voljo je več podrobnosti o nadgradnji.",
"Updated channel" : "Posodobljen kanal",
+ "Update for %1$s to version %2$s is available." : "Posodobitev %1$s na različico %2$s je na voljo.",
"Updater" : "Posodabljalnik",
"A new version is available: %s" : "Na voljo je nova različica: %s",
"Open updater" : "Odpri posodabljalnik",
"Your version is up to date." : "Nameščena je najnovejša različica.",
"Checked on %s" : "Zadnjič preverjeno %s",
"Update channel:" : "Posodobi kanal:",
- "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Nadgradnja na višjo različico ali preizkusni kanal je vedno mogoča, ne pa tudi povrnitev na predhodno, bolj stabilno različico."
+ "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Nadgradnja na višjo različico ali preizkusni kanal je vedno mogoča, ne pa tudi povrnitev na predhodno, bolj stabilno različico.",
+ "Notify members of the following groups about available updates:" : "Obvestite člane naslednjih skupin o posodobitvah, ki so na voljo:"
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/user_ldap/l10n/pl.js b/apps/user_ldap/l10n/pl.js
index de8f1f49ad3..a75b38fc12f 100644
--- a/apps/user_ldap/l10n/pl.js
+++ b/apps/user_ldap/l10n/pl.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Confirm Deletion" : "Potwierdź usunięcie",
"Mappings cleared successfully!" : "Mapowanie wyczyszczone!",
"Error while clearing the mappings." : "Błąd podczas czyszczenia mapowania.",
+ "Mode switch" : "Przełącznik trybów",
"Select attributes" : "Wybierz atrybuty",
"_%s group found_::_%s groups found_" : ["%s znaleziona grupa","%s znalezionych grup","%s znalezionych grup"],
"_%s user found_::_%s users found_" : ["%s znaleziony użytkownik","%s znalezionych użytkowników","%s znalezionych użytkowników"],
diff --git a/apps/user_ldap/l10n/pl.json b/apps/user_ldap/l10n/pl.json
index 5a853c3abed..472148fa3b0 100644
--- a/apps/user_ldap/l10n/pl.json
+++ b/apps/user_ldap/l10n/pl.json
@@ -29,6 +29,7 @@
"Confirm Deletion" : "Potwierdź usunięcie",
"Mappings cleared successfully!" : "Mapowanie wyczyszczone!",
"Error while clearing the mappings." : "Błąd podczas czyszczenia mapowania.",
+ "Mode switch" : "Przełącznik trybów",
"Select attributes" : "Wybierz atrybuty",
"_%s group found_::_%s groups found_" : ["%s znaleziona grupa","%s znalezionych grup","%s znalezionych grup"],
"_%s user found_::_%s users found_" : ["%s znaleziony użytkownik","%s znalezionych użytkowników","%s znalezionych użytkowników"],
diff --git a/apps/user_ldap/l10n/ru.js b/apps/user_ldap/l10n/ru.js
index 2b0cecaab6a..a714cd00dbb 100644
--- a/apps/user_ldap/l10n/ru.js
+++ b/apps/user_ldap/l10n/ru.js
@@ -8,7 +8,7 @@ OC.L10N.register(
"The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Конфигурация корректна, но операция подключения завершилась неудачно. Проверьте настройки сервера и учетные данные.",
"The configuration is invalid. Please have a look at the logs for further details." : "Конфигурация некорректна. Проверьте журналы для уточнения деталей.",
"No action specified" : "Действие не указано",
- "No configuration specified" : "Конфигурация не создана",
+ "No configuration specified" : "Конфигурация не указана",
"No data specified" : "Нет данных",
" Could not set configuration %s" : "Невозможно создать конфигурацию %s",
"Action does not exist" : "Действия не существует",
@@ -26,7 +26,7 @@ OC.L10N.register(
"{nthServer}. Server" : "Сервер {nthServer}.",
"No object found in the given Base DN. Please revise." : "Не найдено объектов в Base DN. Пожалуйста перепроверьте.",
"More than 1,000 directory entries available." : "В каталоге доступно более 1,000 записей.",
- " entries available within the provided Base DN" : "элементы доступные в Базе",
+ " entries available within the provided Base DN" : "элементов доступно в предоставленном базовом DN",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Произошла ошибка. Пожалуйста проверьте базу поиска DN, а также настройки подключения и учетные данные.",
"Do you really want to delete the current Server Configuration?" : "Вы действительно хотите удалить существующую конфигурацию сервера?",
"Confirm Deletion" : "Подтверждение удаления",
@@ -42,11 +42,11 @@ OC.L10N.register(
"User found and settings verified." : "Пользователь найден и настройки проверены.",
"Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Настройки проверены, но найден один пользователь. Только первый сможет войти. Советуем пересмотреть фильтр.",
"An unspecified error occurred. Please check the settings and the log." : "Произошла неуказанная ошибка. Пожалуйста проверьте настройки и журнал.",
- "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Некорректный фильтр поиска, возможно из-за синтаксических ошибок, таких как незакрытые скобки или неточные числа. Пожалуйста проверьте.",
+ "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Некорректный фильтр поиска, возможно из-за синтаксических проблем, таких как несоответствие открывающих и закрывающих скобок. Пожалуйста проверьте.",
"A connection error to LDAP / AD occurred, please check host, port and credentials." : "Произошла ошибка подключения к LDAP / AD, пожалуйста проверьте настройки подключения и учетные данные.",
"The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Отсутствует заполнитель %uid. Он будет заменен на логин при запросе к LDAP / AD.",
"Please provide a login name to test against" : "Пожалуйста укажите логин для проверки",
- "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Группа была отключена, так как сервер LDAP / AD не поддерживает memberOf.",
+ "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Настройка групп была отключена, так как сервер LDAP / AD не поддерживает memberOf.",
"_%s group found_::_%s groups found_" : ["%s группа найдена","%s группы найдены","%s групп найдено","%s групп найдено"],
"_%s user found_::_%s users found_" : ["%s пользователь найден","%s пользователя найдено","%s пользователей найдено","%s пользователей найдено"],
"Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Не удалось автоматически определить атрибут содержащий отображаемое имя пользователя. Зайдите в расширенные настройки ldap и укажите его вручную.",
@@ -95,7 +95,7 @@ OC.L10N.register(
"Detect Base DN" : "Определить базу поиска DN",
"Test Base DN" : "Проверить базу поиска DN",
"Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Избегает отправки автоматических запросов LDAP. Эта опция подходит для крупных проектов, но требует некоторых знаний LDAP.",
- "Manually enter LDAP filters (recommended for large directories)" : "Ввести LDAP фильтры вручную (рекомендуется для больших директорий)",
+ "Manually enter LDAP filters (recommended for large directories)" : "Ввести LDAP фильтры вручную (рекомендуется для больших каталогов)",
"%s access is limited to users meeting these criteria:" : "%s доступ ограничен для пользователей, отвечающих следующим критериям:",
"The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Наиболее частые классы объектов для пользователей organizationalPerson, person, user и inetOrgPerson. Если вы не уверены какой класс объектов выбрать, пожалуйста обратитесь к администратору.",
"The filter specifies which LDAP users shall have access to the %s instance." : "Этот фильтр указывает, какие пользователи LDAP должны иметь доступ к экземпляру %s.",
@@ -117,8 +117,8 @@ OC.L10N.register(
"Disable Main Server" : "Отключить главный сервер",
"Only connect to the replica server." : "Подключаться только к резервному серверу",
"Turn off SSL certificate validation." : "Отключить проверку сертификата SSL.",
- "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Не рекомендуется, используйте только в режиме тестирования! Если соединение работает только с этой опцией, импортируйте на ваш %s сервер SSL-сертификат сервера LDAP.",
- "Cache Time-To-Live" : "Кэш времени жизни (TTL)",
+ "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Не рекомендуется, используйте только в режиме тестирования! Если соединение работает только с этой опцией, импортируйте на ваш сервер %s SSL-сертификат сервера LDAP.",
+ "Cache Time-To-Live" : "Время хранения кэша (TTL)",
"in seconds. A change empties the cache." : "в секундах. Изменение очистит кэш.",
"Directory Settings" : "Настройки каталога",
"User Display Name Field" : "Поле отображаемого имени пользователя",
@@ -127,7 +127,7 @@ OC.L10N.register(
"Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Не обязательно. Атрибут LDAP, который будет добавляться к отображаемому имени в скобках. Например, »John Doe (john.doe@example.org)«.",
"Base User Tree" : "База дерева пользователей",
"One User Base DN per line" : "По одной базовому DN пользователей в строке.",
- "User Search Attributes" : "Атрибуты поиска пользоватетелей",
+ "User Search Attributes" : "Атрибуты поиска пользователей",
"Optional; one attribute per line" : "Опционально; один атрибут в строке",
"Group Display Name Field" : "Поле отображаемого имени группы",
"The LDAP attribute to use to generate the groups's display name." : "Атрибут LDAP, который используется для генерации отображаемого имени группы.",
@@ -156,7 +156,7 @@ OC.L10N.register(
"UUID Attribute for Users:" : "UUID-атрибуты для пользователей:",
"UUID Attribute for Groups:" : "UUID-атрибуты для групп:",
"Username-LDAP User Mapping" : "Соответствия Имя-Пользователь LDAP",
- "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ownCloud использует имена пользователей для хранения и назначения метаданных. Для точной идентификации и распознавания пользователей, каждый пользователь LDAP будет иметь свое внутреннее имя пользователя. Это требует привязки имени пользователя ownCloud к пользователю LDAP. При создании имя пользователя назначается идентификатору UUID пользователя LDAP. Помимо этого кешируется доменное имя (DN) для уменьшения числа обращений к LDAP, однако оно не используется для идентификации. Если доменное имя было изменено, об этом станет известно ownCloud. Внутреннее имя ownCloud используется повсеместно в ownCloud. После сброса привязок в базе могут сохраниться остатки старой информации. Сброс привязок не привязан к конфигурации, он повлияет на все LDAP подключения! Ни в коем случае не рекомендуется сбрасывать привязки если система уже находится в эксплуатации, только на этапе тестирования.",
+ "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ownCloud использует имена пользователей для хранения и назначения метаданных. Для точной идентификации и распознавания пользователей, каждый пользователь LDAP будет иметь свое внутреннее имя пользователя. Это требует привязки имени пользователя ownCloud к пользователю LDAP. При создании имя пользователя назначается идентификатору UUID пользователя LDAP. Помимо этого кешируется DN для уменьшения числа обращений к LDAP, однако он не используется для идентификации. Если DN был изменён, то изменения будут найдены. Внутреннее имя ownCloud используется повсеместно в ownCloud. После сброса привязок в базе могут сохраниться остатки старой информации. Сброс привязок не привязан к конфигурации, он повлияет на все LDAP подключения! Ни в коем случае не рекомендуется сбрасывать привязки если система уже находится в эксплуатации, только на этапе тестирования.",
"Clear Username-LDAP User Mapping" : "Очистить соответствия Имя-Пользователь LDAP",
"Clear Groupname-LDAP Group Mapping" : "Очистить соответствия Группа-Группа LDAP"
},
diff --git a/apps/user_ldap/l10n/ru.json b/apps/user_ldap/l10n/ru.json
index fc9cc081787..ee74f282fd7 100644
--- a/apps/user_ldap/l10n/ru.json
+++ b/apps/user_ldap/l10n/ru.json
@@ -6,7 +6,7 @@
"The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Конфигурация корректна, но операция подключения завершилась неудачно. Проверьте настройки сервера и учетные данные.",
"The configuration is invalid. Please have a look at the logs for further details." : "Конфигурация некорректна. Проверьте журналы для уточнения деталей.",
"No action specified" : "Действие не указано",
- "No configuration specified" : "Конфигурация не создана",
+ "No configuration specified" : "Конфигурация не указана",
"No data specified" : "Нет данных",
" Could not set configuration %s" : "Невозможно создать конфигурацию %s",
"Action does not exist" : "Действия не существует",
@@ -24,7 +24,7 @@
"{nthServer}. Server" : "Сервер {nthServer}.",
"No object found in the given Base DN. Please revise." : "Не найдено объектов в Base DN. Пожалуйста перепроверьте.",
"More than 1,000 directory entries available." : "В каталоге доступно более 1,000 записей.",
- " entries available within the provided Base DN" : "элементы доступные в Базе",
+ " entries available within the provided Base DN" : "элементов доступно в предоставленном базовом DN",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Произошла ошибка. Пожалуйста проверьте базу поиска DN, а также настройки подключения и учетные данные.",
"Do you really want to delete the current Server Configuration?" : "Вы действительно хотите удалить существующую конфигурацию сервера?",
"Confirm Deletion" : "Подтверждение удаления",
@@ -40,11 +40,11 @@
"User found and settings verified." : "Пользователь найден и настройки проверены.",
"Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Настройки проверены, но найден один пользователь. Только первый сможет войти. Советуем пересмотреть фильтр.",
"An unspecified error occurred. Please check the settings and the log." : "Произошла неуказанная ошибка. Пожалуйста проверьте настройки и журнал.",
- "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Некорректный фильтр поиска, возможно из-за синтаксических ошибок, таких как незакрытые скобки или неточные числа. Пожалуйста проверьте.",
+ "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Некорректный фильтр поиска, возможно из-за синтаксических проблем, таких как несоответствие открывающих и закрывающих скобок. Пожалуйста проверьте.",
"A connection error to LDAP / AD occurred, please check host, port and credentials." : "Произошла ошибка подключения к LDAP / AD, пожалуйста проверьте настройки подключения и учетные данные.",
"The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Отсутствует заполнитель %uid. Он будет заменен на логин при запросе к LDAP / AD.",
"Please provide a login name to test against" : "Пожалуйста укажите логин для проверки",
- "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Группа была отключена, так как сервер LDAP / AD не поддерживает memberOf.",
+ "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Настройка групп была отключена, так как сервер LDAP / AD не поддерживает memberOf.",
"_%s group found_::_%s groups found_" : ["%s группа найдена","%s группы найдены","%s групп найдено","%s групп найдено"],
"_%s user found_::_%s users found_" : ["%s пользователь найден","%s пользователя найдено","%s пользователей найдено","%s пользователей найдено"],
"Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Не удалось автоматически определить атрибут содержащий отображаемое имя пользователя. Зайдите в расширенные настройки ldap и укажите его вручную.",
@@ -93,7 +93,7 @@
"Detect Base DN" : "Определить базу поиска DN",
"Test Base DN" : "Проверить базу поиска DN",
"Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Избегает отправки автоматических запросов LDAP. Эта опция подходит для крупных проектов, но требует некоторых знаний LDAP.",
- "Manually enter LDAP filters (recommended for large directories)" : "Ввести LDAP фильтры вручную (рекомендуется для больших директорий)",
+ "Manually enter LDAP filters (recommended for large directories)" : "Ввести LDAP фильтры вручную (рекомендуется для больших каталогов)",
"%s access is limited to users meeting these criteria:" : "%s доступ ограничен для пользователей, отвечающих следующим критериям:",
"The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Наиболее частые классы объектов для пользователей organizationalPerson, person, user и inetOrgPerson. Если вы не уверены какой класс объектов выбрать, пожалуйста обратитесь к администратору.",
"The filter specifies which LDAP users shall have access to the %s instance." : "Этот фильтр указывает, какие пользователи LDAP должны иметь доступ к экземпляру %s.",
@@ -115,8 +115,8 @@
"Disable Main Server" : "Отключить главный сервер",
"Only connect to the replica server." : "Подключаться только к резервному серверу",
"Turn off SSL certificate validation." : "Отключить проверку сертификата SSL.",
- "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Не рекомендуется, используйте только в режиме тестирования! Если соединение работает только с этой опцией, импортируйте на ваш %s сервер SSL-сертификат сервера LDAP.",
- "Cache Time-To-Live" : "Кэш времени жизни (TTL)",
+ "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Не рекомендуется, используйте только в режиме тестирования! Если соединение работает только с этой опцией, импортируйте на ваш сервер %s SSL-сертификат сервера LDAP.",
+ "Cache Time-To-Live" : "Время хранения кэша (TTL)",
"in seconds. A change empties the cache." : "в секундах. Изменение очистит кэш.",
"Directory Settings" : "Настройки каталога",
"User Display Name Field" : "Поле отображаемого имени пользователя",
@@ -125,7 +125,7 @@
"Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Не обязательно. Атрибут LDAP, который будет добавляться к отображаемому имени в скобках. Например, »John Doe (john.doe@example.org)«.",
"Base User Tree" : "База дерева пользователей",
"One User Base DN per line" : "По одной базовому DN пользователей в строке.",
- "User Search Attributes" : "Атрибуты поиска пользоватетелей",
+ "User Search Attributes" : "Атрибуты поиска пользователей",
"Optional; one attribute per line" : "Опционально; один атрибут в строке",
"Group Display Name Field" : "Поле отображаемого имени группы",
"The LDAP attribute to use to generate the groups's display name." : "Атрибут LDAP, который используется для генерации отображаемого имени группы.",
@@ -154,7 +154,7 @@
"UUID Attribute for Users:" : "UUID-атрибуты для пользователей:",
"UUID Attribute for Groups:" : "UUID-атрибуты для групп:",
"Username-LDAP User Mapping" : "Соответствия Имя-Пользователь LDAP",
- "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ownCloud использует имена пользователей для хранения и назначения метаданных. Для точной идентификации и распознавания пользователей, каждый пользователь LDAP будет иметь свое внутреннее имя пользователя. Это требует привязки имени пользователя ownCloud к пользователю LDAP. При создании имя пользователя назначается идентификатору UUID пользователя LDAP. Помимо этого кешируется доменное имя (DN) для уменьшения числа обращений к LDAP, однако оно не используется для идентификации. Если доменное имя было изменено, об этом станет известно ownCloud. Внутреннее имя ownCloud используется повсеместно в ownCloud. После сброса привязок в базе могут сохраниться остатки старой информации. Сброс привязок не привязан к конфигурации, он повлияет на все LDAP подключения! Ни в коем случае не рекомендуется сбрасывать привязки если система уже находится в эксплуатации, только на этапе тестирования.",
+ "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ownCloud использует имена пользователей для хранения и назначения метаданных. Для точной идентификации и распознавания пользователей, каждый пользователь LDAP будет иметь свое внутреннее имя пользователя. Это требует привязки имени пользователя ownCloud к пользователю LDAP. При создании имя пользователя назначается идентификатору UUID пользователя LDAP. Помимо этого кешируется DN для уменьшения числа обращений к LDAP, однако он не используется для идентификации. Если DN был изменён, то изменения будут найдены. Внутреннее имя ownCloud используется повсеместно в ownCloud. После сброса привязок в базе могут сохраниться остатки старой информации. Сброс привязок не привязан к конфигурации, он повлияет на все LDAP подключения! Ни в коем случае не рекомендуется сбрасывать привязки если система уже находится в эксплуатации, только на этапе тестирования.",
"Clear Username-LDAP User Mapping" : "Очистить соответствия Имя-Пользователь LDAP",
"Clear Groupname-LDAP Group Mapping" : "Очистить соответствия Группа-Группа LDAP"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
diff --git a/apps/user_ldap/l10n/tr.js b/apps/user_ldap/l10n/tr.js
index 5daf34cc58e..bef7664ab94 100644
--- a/apps/user_ldap/l10n/tr.js
+++ b/apps/user_ldap/l10n/tr.js
@@ -13,6 +13,7 @@ OC.L10N.register(
" Could not set configuration %s" : "%s yapılandırması ayarlanamadı",
"Action does not exist" : "Eylem mevcut değil",
"The Base DN appears to be wrong" : "Base DN yanlış gibi görünüyor",
+ "Testing configuration…" : "Yapılandırma sınanıyor...",
"Configuration incorrect" : "Yapılandırma geçersiz",
"Configuration incomplete" : "Yapılandırma tamamlanmamış",
"Configuration OK" : "Yapılandırma tamam",
diff --git a/apps/user_ldap/l10n/tr.json b/apps/user_ldap/l10n/tr.json
index 183ab05a12e..3edb0f9fc67 100644
--- a/apps/user_ldap/l10n/tr.json
+++ b/apps/user_ldap/l10n/tr.json
@@ -11,6 +11,7 @@
" Could not set configuration %s" : "%s yapılandırması ayarlanamadı",
"Action does not exist" : "Eylem mevcut değil",
"The Base DN appears to be wrong" : "Base DN yanlış gibi görünüyor",
+ "Testing configuration…" : "Yapılandırma sınanıyor...",
"Configuration incorrect" : "Yapılandırma geçersiz",
"Configuration incomplete" : "Yapılandırma tamamlanmamış",
"Configuration OK" : "Yapılandırma tamam",
diff --git a/apps/user_ldap/l10n/ur_PK.js b/apps/user_ldap/l10n/ur_PK.js
index 26ff7ae3d84..693a42b0543 100644
--- a/apps/user_ldap/l10n/ur_PK.js
+++ b/apps/user_ldap/l10n/ur_PK.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Users" : "صارفین",
"Help" : "مدد",
"Password" : "پاسورڈ",
- "Continue" : "جاری",
"Advanced" : "ایڈوانسڈ"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/user_ldap/l10n/ur_PK.json b/apps/user_ldap/l10n/ur_PK.json
index 738ebc145c8..26ff4cf5671 100644
--- a/apps/user_ldap/l10n/ur_PK.json
+++ b/apps/user_ldap/l10n/ur_PK.json
@@ -2,7 +2,6 @@
"Users" : "صارفین",
"Help" : "مدد",
"Password" : "پاسورڈ",
- "Continue" : "جاری",
"Advanced" : "ایڈوانسڈ"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/user_ldap/lib/Group_LDAP.php b/apps/user_ldap/lib/Group_LDAP.php
index 7c12613f34d..14d86fb0619 100644
--- a/apps/user_ldap/lib/Group_LDAP.php
+++ b/apps/user_ldap/lib/Group_LDAP.php
@@ -535,7 +535,7 @@ class Group_LDAP extends BackendUtility implements \OCP\GroupInterface {
}
if(isset($this->cachedGroupsByMember[$uid])) {
- $groups[] = $this->cachedGroupsByMember[$uid];
+ $groups = array_merge($groups, $this->cachedGroupsByMember[$uid]);
} else {
$groupsByMember = array_values($this->getGroupsByMember($uid));
$groupsByMember = $this->access->ownCloudGroupNames($groupsByMember);
diff --git a/apps/user_ldap/tests/Group_LDAPTest.php b/apps/user_ldap/tests/Group_LDAPTest.php
index 556c4b0b394..35d525068a6 100644
--- a/apps/user_ldap/tests/Group_LDAPTest.php
+++ b/apps/user_ldap/tests/Group_LDAPTest.php
@@ -454,4 +454,57 @@ class Group_LDAPTest extends \Test\TestCase {
$groupBackend->getUserGroups('userX');
}
+ public function testGetGroupsByMember() {
+ $access = $this->getAccessMock();
+
+ $access->connection->expects($this->any())
+ ->method('__get')
+ ->will($this->returnCallback(function($name) {
+ if($name === 'useMemberOfToDetectMembership') {
+ return 0;
+ } else if($name === 'ldapDynamicGroupMemberURL') {
+ return '';
+ } else if($name === 'ldapNestedGroups') {
+ return false;
+ }
+ return 1;
+ }));
+
+ $dn = 'cn=userX,dc=foobar';
+
+ $access->connection->hasPrimaryGroups = false;
+
+ $access->expects($this->exactly(2))
+ ->method('username2dn')
+ ->will($this->returnValue($dn));
+
+ $access->expects($this->never())
+ ->method('readAttribute')
+ ->with($dn, 'memberOf');
+
+ $group1 = [
+ 'cn' => 'group1',
+ 'dn' => ['cn=group1,ou=groups,dc=domain,dc=com'],
+ ];
+ $group2 = [
+ 'cn' => 'group2',
+ 'dn' => ['cn=group2,ou=groups,dc=domain,dc=com'],
+ ];
+
+ $access->expects($this->once())
+ ->method('ownCloudGroupNames')
+ ->with([$group1, $group2])
+ ->will($this->returnValue(['group1', 'group2']));
+
+ $access->expects($this->once())
+ ->method('fetchListOfGroups')
+ ->will($this->returnValue([$group1, $group2]));
+
+ $groupBackend = new GroupLDAP($access);
+ $groups = $groupBackend->getUserGroups('userX');
+ $this->assertEquals(['group1', 'group2'], $groups);
+
+ $groupsAgain = $groupBackend->getUserGroups('userX');
+ $this->assertEquals(['group1', 'group2'], $groupsAgain);
+ }
}
diff --git a/autotest.sh b/autotest.sh
index bd51cddefcf..e798157fe64 100755
--- a/autotest.sh
+++ b/autotest.sh
@@ -54,7 +54,7 @@ else
fi
if ! [ -x "$PHPUNIT" ]; then
- echo "phpunit executable not found, please install phpunit version >= 3.7" >&2
+ echo "phpunit executable not found, please install phpunit version >= 4.4" >&2
exit 3
fi
diff --git a/build/integration/features/bootstrap/BasicStructure.php b/build/integration/features/bootstrap/BasicStructure.php
index b8fb516fada..9248b2cd252 100644
--- a/build/integration/features/bootstrap/BasicStructure.php
+++ b/build/integration/features/bootstrap/BasicStructure.php
@@ -261,6 +261,17 @@ trait BasicStructure {
}
/**
+ * @Given User :user modifies text of :filename with text :text
+ * @param string $user
+ * @param string $filename
+ * @param string $text
+ */
+ public function modifyTextOfFile($user, $filename, $text) {
+ self::removeFile("../../data/$user/files", "$filename");
+ file_put_contents("../../data/$user/files" . "$filename", "$text");
+ }
+
+ /**
* @BeforeSuite
*/
public static function addFilesToSkeleton(){
diff --git a/build/integration/features/bootstrap/FederationContext.php b/build/integration/features/bootstrap/FederationContext.php
index 2809c6974fa..55f3a55da0d 100644
--- a/build/integration/features/bootstrap/FederationContext.php
+++ b/build/integration/features/bootstrap/FederationContext.php
@@ -12,7 +12,7 @@ require __DIR__ . '/../../vendor/autoload.php';
*/
class FederationContext implements Context, SnippetAcceptingContext {
- use Sharing;
+ use WebDav;
/**
* @Given /^User "([^"]*)" from server "(LOCAL|REMOTE)" shares "([^"]*)" with user "([^"]*)" from server "(LOCAL|REMOTE)"$/
diff --git a/build/integration/features/webdav-related.feature b/build/integration/features/webdav-related.feature
index f4d40615fa7..14ff505463c 100644
--- a/build/integration/features/webdav-related.feature
+++ b/build/integration/features/webdav-related.feature
@@ -82,7 +82,7 @@ Feature: webdav-related
And As an "admin"
When Downloading file "/welcome.txt"
Then The following headers should be set
- |Content-Disposition|attachment|
+ |Content-Disposition|attachment; filename*=UTF-8''welcome.txt; filename="welcome.txt"|
|Content-Security-Policy|default-src 'none';|
|X-Content-Type-Options |nosniff|
|X-Download-Options|noopen|
@@ -97,7 +97,7 @@ Feature: webdav-related
And As an "admin"
When Downloading file "/welcome.txt"
Then The following headers should be set
- |Content-Disposition|attachment|
+ |Content-Disposition|attachment; filename*=UTF-8''welcome.txt; filename="welcome.txt"|
|Content-Security-Policy|default-src 'none';|
|X-Content-Type-Options |nosniff|
|X-Download-Options|noopen|
diff --git a/build/integration/federation_features/federated.feature b/build/integration/federation_features/federated.feature
index acd1f91e908..8bf8e921b0f 100644
--- a/build/integration/federation_features/federated.feature
+++ b/build/integration/federation_features/federated.feature
@@ -120,6 +120,67 @@ Feature: federated
| share_with | user2 |
| share_with_displayname | user2 |
+ Scenario: Overwrite a federated shared file as recipient
+ Given Using server "REMOTE"
+ And user "user1" exists
+ And user "user2" exists
+ And Using server "LOCAL"
+ And user "user0" exists
+ And User "user0" from server "LOCAL" shares "/textfile0.txt" with user "user1" from server "REMOTE"
+ And User "user1" from server "REMOTE" accepts last pending share
+ And Using server "REMOTE"
+ And As an "user1"
+ And User "user1" modifies text of "/textfile0.txt" with text "BLABLABLA"
+ When User "user1" uploads file "../../data/user1/files/textfile0.txt" to "/textfile0 (2).txt"
+ And Downloading file "/textfile0 (2).txt" with range "bytes=0-8"
+ Then Downloaded content should be "BLABLABLA"
+
+ Scenario: Overwrite a federated shared folder as recipient
+ Given Using server "REMOTE"
+ And user "user1" exists
+ And user "user2" exists
+ And Using server "LOCAL"
+ And user "user0" exists
+ And User "user0" from server "LOCAL" shares "/PARENT" with user "user1" from server "REMOTE"
+ And User "user1" from server "REMOTE" accepts last pending share
+ And Using server "REMOTE"
+ And As an "user1"
+ And User "user1" modifies text of "/textfile0.txt" with text "BLABLABLA"
+ When User "user1" uploads file "../../data/user1/files/textfile0.txt" to "/PARENT (2)/textfile0.txt"
+ And Downloading file "/PARENT (2)/textfile0.txt" with range "bytes=0-8"
+ Then Downloaded content should be "BLABLABLA"
+
+ Scenario: Overwrite a federated shared file as recipient using old chunking
+ Given Using server "REMOTE"
+ And user "user1" exists
+ And user "user2" exists
+ And Using server "LOCAL"
+ And user "user0" exists
+ And User "user0" from server "LOCAL" shares "/textfile0.txt" with user "user1" from server "REMOTE"
+ And User "user1" from server "REMOTE" accepts last pending share
+ And Using server "REMOTE"
+ And As an "user1"
+ And user "user1" uploads chunk file "1" of "3" with "AAAAA" to "/textfile0 (2).txt"
+ And user "user1" uploads chunk file "2" of "3" with "BBBBB" to "/textfile0 (2).txt"
+ And user "user1" uploads chunk file "3" of "3" with "CCCCC" to "/textfile0 (2).txt"
+ When Downloading file "/textfile0 (2).txt" with range "bytes=0-4"
+ Then Downloaded content should be "AAAAA"
+
+ Scenario: Overwrite a federated shared folder as recipient using old chunking
+ Given Using server "REMOTE"
+ And user "user1" exists
+ And user "user2" exists
+ And Using server "LOCAL"
+ And user "user0" exists
+ And User "user0" from server "LOCAL" shares "/PARENT" with user "user1" from server "REMOTE"
+ And User "user1" from server "REMOTE" accepts last pending share
+ And Using server "REMOTE"
+ And As an "user1"
+ And user "user1" uploads chunk file "1" of "3" with "AAAAA" to "/PARENT (2)/textfile0.txt"
+ And user "user1" uploads chunk file "2" of "3" with "BBBBB" to "/PARENT (2)/textfile0.txt"
+ And user "user1" uploads chunk file "3" of "3" with "CCCCC" to "/PARENT (2)/textfile0.txt"
+ When Downloading file "/PARENT (2)/textfile0.txt" with range "bytes=3-13"
+ Then Downloaded content should be "AABBBBBCCCC"
diff --git a/core/Application.php b/core/Application.php
index 25e2fa76273..a87917b626a 100644
--- a/core/Application.php
+++ b/core/Application.php
@@ -120,7 +120,8 @@ class Application extends App {
$c->query('AppName'),
$c->query('Request'),
$c->query('UserManager'),
- $c->query('OC\Authentication\Token\DefaultTokenProvider'),
+ $c->query('ServerContainer')->query('OC\Authentication\Token\IProvider'),
+ $c->query('TwoFactorAuthManager'),
$c->query('SecureRandom')
);
});
diff --git a/core/Command/Encryption/DecryptAll.php b/core/Command/Encryption/DecryptAll.php
index 8d7d26f3d23..83c6c1dc168 100644
--- a/core/Command/Encryption/DecryptAll.php
+++ b/core/Command/Encryption/DecryptAll.php
@@ -111,7 +111,8 @@ class DecryptAll extends Command {
$this->addArgument(
'user',
InputArgument::OPTIONAL,
- 'user for which you want to decrypt all files (optional)'
+ 'user for which you want to decrypt all files (optional)',
+ ''
);
}
@@ -127,8 +128,15 @@ class DecryptAll extends Command {
return;
}
+ $uid = $input->getArgument('user');
+ if ($uid === '') {
+ $message = 'your ownCloud';
+ } else {
+ $message = "$uid's account";
+ }
+
$output->writeln("\n");
- $output->writeln('You are about to start to decrypt all files stored in your ownCloud.');
+ $output->writeln("You are about to start to decrypt all files stored in $message.");
$output->writeln('It will depend on the encryption module and your setup if this is possible.');
$output->writeln('Depending on the number and size of your files this can take some time');
$output->writeln('Please make sure that no user access his files during this process!');
@@ -140,6 +148,7 @@ class DecryptAll extends Command {
$result = $this->decryptAll->decryptAll($input, $output, $user);
if ($result === false) {
$output->writeln(' aborted.');
+ $output->writeln('Server side encryption remains enabled');
$this->config->setAppValue('core', 'encryption_enabled', 'yes');
}
$this->resetSingleUserAndTrashbin();
diff --git a/core/Command/Maintenance/Install.php b/core/Command/Maintenance/Install.php
index b1b63b9b3bd..12a61d6341a 100644
--- a/core/Command/Maintenance/Install.php
+++ b/core/Command/Maintenance/Install.php
@@ -106,7 +106,12 @@ class Install extends Command {
$dbUser = $input->getOption('database-user');
$dbPass = $input->getOption('database-pass');
$dbName = $input->getOption('database-name');
- $dbHost = $input->getOption('database-host');
+ if ($db === 'oci') {
+ // an empty hostname needs to be read from the raw parameters
+ $dbHost = $input->getParameterOption('--database-host', '');
+ } else {
+ $dbHost = $input->getOption('database-host');
+ }
$dbTablePrefix = 'oc_';
if ($input->hasParameterOption('--database-table-prefix')) {
$dbTablePrefix = (string) $input->getOption('database-table-prefix');
diff --git a/core/Controller/LoginController.php b/core/Controller/LoginController.php
index c64f58ae2cc..7806e1de904 100644
--- a/core/Controller/LoginController.php
+++ b/core/Controller/LoginController.php
@@ -171,6 +171,7 @@ class LoginController extends Controller {
* @return RedirectResponse
*/
public function tryLogin($user, $password, $redirect_url) {
+ $originalUser = $user;
// TODO: Add all the insane error handling
/* @var $loginResult IUser */
$loginResult = $this->userManager->checkPassword($user, $password);
@@ -186,8 +187,8 @@ class LoginController extends Controller {
$this->session->set('loginMessages', [
['invalidpassword']
]);
- // Read current user and append if possible
- $args = !is_null($user) ? ['user' => $user] : [];
+ // Read current user and append if possible - we need to return the unmodified user otherwise we will leak the login name
+ $args = !is_null($user) ? ['user' => $originalUser] : [];
return new RedirectResponse($this->urlGenerator->linkToRoute('core.login.showLoginForm', $args));
}
// TODO: remove password checks from above and let the user session handle failures
diff --git a/core/Controller/TokenController.php b/core/Controller/TokenController.php
index 42cc29bad10..13b1db9044a 100644
--- a/core/Controller/TokenController.php
+++ b/core/Controller/TokenController.php
@@ -1,4 +1,5 @@
<?php
+
/**
* @author Christoph Wurst <christoph@owncloud.com>
*
@@ -23,22 +24,27 @@ namespace OC\Core\Controller;
use OC\AppFramework\Http;
use OC\Authentication\Token\DefaultTokenProvider;
+use OC\Authentication\Token\IProvider;
use OC\Authentication\Token\IToken;
-use OC\User\Manager;
+use OC\Authentication\TwoFactorAuth\Manager as TwoFactorAuthManager;
+use OC\User\Manager as UserManager;
+use OCA\User_LDAP\User\Manager;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\JSONResponse;
-use OCP\AppFramework\Http\Response;
use OCP\IRequest;
use OCP\Security\ISecureRandom;
class TokenController extends Controller {
- /** @var Manager */
+ /** @var UserManager */
private $userManager;
- /** @var DefaultTokenProvider */
+ /** @var IProvider */
private $tokenProvider;
+ /** @var TwoFactorAuthManager */
+ private $twoFactorAuthManager;
+
/** @var ISecureRandom */
private $secureRandom;
@@ -49,12 +55,12 @@ class TokenController extends Controller {
* @param DefaultTokenProvider $tokenProvider
* @param ISecureRandom $secureRandom
*/
- public function __construct($appName, IRequest $request, Manager $userManager, DefaultTokenProvider $tokenProvider,
- ISecureRandom $secureRandom) {
+ public function __construct($appName, IRequest $request, UserManager $userManager, IProvider $tokenProvider, TwoFactorAuthManager $twoFactorAuthManager, ISecureRandom $secureRandom) {
parent::__construct($appName, $request);
$this->userManager = $userManager;
$this->tokenProvider = $tokenProvider;
$this->secureRandom = $secureRandom;
+ $this->twoFactorAuthManager = $twoFactorAuthManager;
}
/**
@@ -70,18 +76,26 @@ class TokenController extends Controller {
*/
public function generateToken($user, $password, $name = 'unknown client') {
if (is_null($user) || is_null($password)) {
- $response = new Response();
+ $response = new JSONResponse();
$response->setStatus(Http::STATUS_UNPROCESSABLE_ENTITY);
return $response;
}
- $loginResult = $this->userManager->checkPassword($user, $password);
- if ($loginResult === false) {
- $response = new Response();
+ $loginName = $user;
+ $user = $this->userManager->checkPassword($loginName, $password);
+ if ($user === false) {
+ $response = new JSONResponse();
$response->setStatus(Http::STATUS_UNAUTHORIZED);
return $response;
}
+
+ if ($this->twoFactorAuthManager->isTwoFactorAuthenticated($user)) {
+ $resp = new JSONResponse();
+ $resp->setStatus(Http::STATUS_UNAUTHORIZED);
+ return $resp;
+ }
+
$token = $this->secureRandom->generate(128);
- $this->tokenProvider->generateToken($token, $loginResult->getUID(), $user, $password, $name, IToken::PERMANENT_TOKEN);
+ $this->tokenProvider->generateToken($token, $user->getUID(), $loginName, $password, $name, IToken::PERMANENT_TOKEN);
return [
'token' => $token,
];
diff --git a/core/Controller/TwoFactorChallengeController.php b/core/Controller/TwoFactorChallengeController.php
index 499898de3bc..edaf3378cd8 100644
--- a/core/Controller/TwoFactorChallengeController.php
+++ b/core/Controller/TwoFactorChallengeController.php
@@ -62,6 +62,13 @@ class TwoFactorChallengeController extends Controller {
}
/**
+ * @return string
+ */
+ protected function getLogoutAttribute() {
+ return \OC_User::getLogoutAttribute();
+ }
+
+ /**
* @NoAdminRequired
* @NoCSRFRequired
*
@@ -75,6 +82,7 @@ class TwoFactorChallengeController extends Controller {
$data = [
'providers' => $providers,
'redirect_url' => $redirect_url,
+ 'logout_attribute' => $this->getLogoutAttribute(),
];
return new TemplateResponse($this->appName, 'twofactorselectchallenge', $data, 'guest');
}
@@ -106,6 +114,7 @@ class TwoFactorChallengeController extends Controller {
$data = [
'error' => $error,
'provider' => $provider,
+ 'logout_attribute' => $this->getLogoutAttribute(),
'template' => $tmpl->fetchPage(),
];
return new TemplateResponse($this->appName, 'twofactorshowchallenge', $data, 'guest');
diff --git a/core/Middleware/TwoFactorMiddleware.php b/core/Middleware/TwoFactorMiddleware.php
index aa82897ad46..0bad8a2c40f 100644
--- a/core/Middleware/TwoFactorMiddleware.php
+++ b/core/Middleware/TwoFactorMiddleware.php
@@ -82,6 +82,11 @@ class TwoFactorMiddleware extends Middleware {
return;
}
+ if ($controller instanceof \OC\Core\Controller\LoginController && $methodName === 'logout') {
+ // Don't block the logout page, to allow canceling the 2FA
+ return;
+ }
+
if ($this->userSession->isLoggedIn()) {
$user = $this->userSession->getUser();
diff --git a/core/css/styles.css b/core/css/styles.css
index 837b3259781..0d7a5576e0c 100644
--- a/core/css/styles.css
+++ b/core/css/styles.css
@@ -37,6 +37,10 @@ body {
display: inline-block;
}
+a.two-factor-cancel {
+ color: #fff;
+}
+
.float-spinner {
height: 32px;
display: none;
diff --git a/core/css/tooltip.css b/core/css/tooltip.css
index 34d0ec6c70f..af25fd5533d 100644
--- a/core/css/tooltip.css
+++ b/core/css/tooltip.css
@@ -47,7 +47,7 @@
padding: 0 5px;
}
.tooltip-inner {
- max-width: 200px;
+ max-width: 350px;
padding: 3px 8px;
color: #ffffff;
text-align: center;
diff --git a/core/img/background.jpg b/core/img/background.jpg
index a4ede839cb5..ab1d7e6d7a8 100644
--- a/core/img/background.jpg
+++ b/core/img/background.jpg
Binary files differ
diff --git a/core/img/favicon.ico b/core/img/favicon.ico
index 96bee5656a9..2e75f57f00d 100644
--- a/core/img/favicon.ico
+++ b/core/img/favicon.ico
Binary files differ
diff --git a/core/js/setupchecks.js b/core/js/setupchecks.js
index 4cc50e51ae6..f987c9f04e6 100644
--- a/core/js/setupchecks.js
+++ b/core/js/setupchecks.js
@@ -197,7 +197,7 @@
}
var afterCall = function(xhr) {
var messages = [];
- if (xhr.status !== 403 && xhr.status !== 307 && xhr.status !== 301 && xhr.responseText === '') {
+ if (xhr.status !== 403 && xhr.status !== 307 && xhr.status !== 301 && xhr.responseText !== '') {
messages.push({
msg: t('core', 'Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root.'),
type: OC.SetupChecks.MESSAGE_TYPE_ERROR
@@ -208,7 +208,7 @@
$.ajax({
type: 'GET',
- url: OC.linkTo('', oc_dataURL+'/.ocdata'),
+ url: OC.linkTo('', oc_dataURL+'/htaccesstest.txt?t=' + (new Date()).getTime()),
complete: afterCall
});
return deferred.promise();
diff --git a/core/js/tests/specs/setupchecksSpec.js b/core/js/tests/specs/setupchecksSpec.js
index 4931ca990da..172e6e27135 100644
--- a/core/js/tests/specs/setupchecksSpec.js
+++ b/core/js/tests/specs/setupchecksSpec.js
@@ -103,7 +103,7 @@ describe('OC.SetupChecks tests', function() {
it('should return an error if data directory is not protected', function(done) {
var async = OC.SetupChecks.checkDataProtected();
- suite.server.requests[0].respond(200);
+ suite.server.requests[0].respond(200, {'Content-Type': 'text/plain'}, 'file contents');
async.done(function( data, s, x ){
expect(data).toEqual([
diff --git a/core/l10n/de.js b/core/l10n/de.js
index 177376c3802..52e1639efff 100644
--- a/core/l10n/de.js
+++ b/core/l10n/de.js
@@ -298,6 +298,7 @@ OC.L10N.register(
"Thank you for your patience." : "Vielen Dank für Deine Geduld.",
"Two-step verification" : "Bestätigung in zwei Schritten",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Die erweiterte Sicherheit wurde für dich Konto aktiviert. Bitte authentifiziere dich mit einem zweiten Faktor. ",
+ "Cancel login" : "Anmelden abbrechen",
"Please authenticate using the selected factor." : "Bitte authentifiziere dich mit dem ausgewählten zweiten Faktor. ",
"An error occured while verifying the token" : "Es ist ein Fehler bei der Verifizierung des Tokens aufgetreten",
"You are accessing the server from an untrusted domain." : "Du greifst von einer nicht vertrauenswürdigen Domain auf den Server zu.",
diff --git a/core/l10n/de.json b/core/l10n/de.json
index a66abe70162..d713c507248 100644
--- a/core/l10n/de.json
+++ b/core/l10n/de.json
@@ -296,6 +296,7 @@
"Thank you for your patience." : "Vielen Dank für Deine Geduld.",
"Two-step verification" : "Bestätigung in zwei Schritten",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Die erweiterte Sicherheit wurde für dich Konto aktiviert. Bitte authentifiziere dich mit einem zweiten Faktor. ",
+ "Cancel login" : "Anmelden abbrechen",
"Please authenticate using the selected factor." : "Bitte authentifiziere dich mit dem ausgewählten zweiten Faktor. ",
"An error occured while verifying the token" : "Es ist ein Fehler bei der Verifizierung des Tokens aufgetreten",
"You are accessing the server from an untrusted domain." : "Du greifst von einer nicht vertrauenswürdigen Domain auf den Server zu.",
diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js
index f10a73798d6..9e379c2c025 100644
--- a/core/l10n/de_DE.js
+++ b/core/l10n/de_DE.js
@@ -298,6 +298,7 @@ OC.L10N.register(
"Thank you for your patience." : "Vielen Dank für Ihre Geduld.",
"Two-step verification" : "Bestätigung in zwei Schritten",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Die erweiterte Sicherheit wurde für Ihr Konto aktiviert. Bitte authentifizieren Sie sich mit einem zweiten Faktor. ",
+ "Cancel login" : "Anmelden abbrechen",
"Please authenticate using the selected factor." : "Bitte authentifizieren Sie sich mit dem ausgewählten zweiten Faktor. ",
"An error occured while verifying the token" : "Es ist ein Fehler bei der Verifizierung des Tokens aufgetreten",
"You are accessing the server from an untrusted domain." : "Sie greifen von einer nicht vertrauenswürdigen Domain auf den Server zu.",
diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json
index 3b6267dca62..bcdf1f52795 100644
--- a/core/l10n/de_DE.json
+++ b/core/l10n/de_DE.json
@@ -296,6 +296,7 @@
"Thank you for your patience." : "Vielen Dank für Ihre Geduld.",
"Two-step verification" : "Bestätigung in zwei Schritten",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Die erweiterte Sicherheit wurde für Ihr Konto aktiviert. Bitte authentifizieren Sie sich mit einem zweiten Faktor. ",
+ "Cancel login" : "Anmelden abbrechen",
"Please authenticate using the selected factor." : "Bitte authentifizieren Sie sich mit dem ausgewählten zweiten Faktor. ",
"An error occured while verifying the token" : "Es ist ein Fehler bei der Verifizierung des Tokens aufgetreten",
"You are accessing the server from an untrusted domain." : "Sie greifen von einer nicht vertrauenswürdigen Domain auf den Server zu.",
diff --git a/core/l10n/en_GB.js b/core/l10n/en_GB.js
index 6f5859aae3e..76045cf033d 100644
--- a/core/l10n/en_GB.js
+++ b/core/l10n/en_GB.js
@@ -298,6 +298,7 @@ OC.L10N.register(
"Thank you for your patience." : "Thank you for your patience.",
"Two-step verification" : "Two-step verification",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Enhanced security has been enabled for your account. Please authenticate using a second factor.",
+ "Cancel login" : "Cancel login",
"Please authenticate using the selected factor." : "Please authenticate using the selected factor.",
"An error occured while verifying the token" : "An error occured while verifying the token",
"You are accessing the server from an untrusted domain." : "You are accessing the server from an untrusted domain.",
diff --git a/core/l10n/en_GB.json b/core/l10n/en_GB.json
index 7aedc2a730f..d71ff3f8ada 100644
--- a/core/l10n/en_GB.json
+++ b/core/l10n/en_GB.json
@@ -296,6 +296,7 @@
"Thank you for your patience." : "Thank you for your patience.",
"Two-step verification" : "Two-step verification",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Enhanced security has been enabled for your account. Please authenticate using a second factor.",
+ "Cancel login" : "Cancel login",
"Please authenticate using the selected factor." : "Please authenticate using the selected factor.",
"An error occured while verifying the token" : "An error occured while verifying the token",
"You are accessing the server from an untrusted domain." : "You are accessing the server from an untrusted domain.",
diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js
index d15457022a2..d491cf213fc 100644
--- a/core/l10n/fi_FI.js
+++ b/core/l10n/fi_FI.js
@@ -187,6 +187,7 @@ OC.L10N.register(
"Warning" : "Varoitus",
"Error while sending notification" : "Virhe ilmoitusta lähettäessä",
"Non-existing tag #{tag}" : "Ei olemassa oleva tunniste #{tag}",
+ "restricted" : "rajoitettu",
"invisible" : "näkymätön",
"({scope})" : "({scope})",
"Delete" : "Poista",
@@ -289,6 +290,7 @@ OC.L10N.register(
"Thank you for your patience." : "Kiitos kärsivällisyydestäsi.",
"Two-step verification" : "Kaksivaiheinen vahvistus",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Tililläsi on käytössä lisäturvatoimia. Tunnistaudu käyttäen kaksivaiheista vahvistusta.",
+ "Cancel login" : "Peru kirjautuminen",
"Please authenticate using the selected factor." : "Tunnistaudu käyttäen valittua vahvistusta.",
"You are accessing the server from an untrusted domain." : "Olet yhteydessä palvelimeen epäluotettavasta verkko-osoitteesta.",
"Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Ota yhteys ylläpitoon. Jos olet tämän asennuksen ylläpitäjä, määritä \"trusted_domains\"-asetus config/config.php-tiedostossa. Esimerkkimääritys on tarjolla tiedostossa config/config.sample.php.",
diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json
index 14565b0b46e..e3f7fb28a8c 100644
--- a/core/l10n/fi_FI.json
+++ b/core/l10n/fi_FI.json
@@ -185,6 +185,7 @@
"Warning" : "Varoitus",
"Error while sending notification" : "Virhe ilmoitusta lähettäessä",
"Non-existing tag #{tag}" : "Ei olemassa oleva tunniste #{tag}",
+ "restricted" : "rajoitettu",
"invisible" : "näkymätön",
"({scope})" : "({scope})",
"Delete" : "Poista",
@@ -287,6 +288,7 @@
"Thank you for your patience." : "Kiitos kärsivällisyydestäsi.",
"Two-step verification" : "Kaksivaiheinen vahvistus",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Tililläsi on käytössä lisäturvatoimia. Tunnistaudu käyttäen kaksivaiheista vahvistusta.",
+ "Cancel login" : "Peru kirjautuminen",
"Please authenticate using the selected factor." : "Tunnistaudu käyttäen valittua vahvistusta.",
"You are accessing the server from an untrusted domain." : "Olet yhteydessä palvelimeen epäluotettavasta verkko-osoitteesta.",
"Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Ota yhteys ylläpitoon. Jos olet tämän asennuksen ylläpitäjä, määritä \"trusted_domains\"-asetus config/config.php-tiedostossa. Esimerkkimääritys on tarjolla tiedostossa config/config.sample.php.",
diff --git a/core/l10n/it.js b/core/l10n/it.js
index 7daff3e0dad..6769455e669 100644
--- a/core/l10n/it.js
+++ b/core/l10n/it.js
@@ -298,6 +298,7 @@ OC.L10N.register(
"Thank you for your patience." : "Grazie per la pazienza.",
"Two-step verification" : "Verifica in due fasi",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "La sicurezza migliorata è stata abilitata per il tuo account. Autenticati utilizzando un secondo fattore.",
+ "Cancel login" : "Annulla l'accesso",
"Please authenticate using the selected factor." : "Autentica utilizzando il fattore selezionato.",
"An error occured while verifying the token" : "Si è verificato un errore durante la verifica del token",
"You are accessing the server from an untrusted domain." : "Stai accedendo al server da un dominio non attendibile.",
diff --git a/core/l10n/it.json b/core/l10n/it.json
index 9d403e4f724..ac6d16d90b9 100644
--- a/core/l10n/it.json
+++ b/core/l10n/it.json
@@ -296,6 +296,7 @@
"Thank you for your patience." : "Grazie per la pazienza.",
"Two-step verification" : "Verifica in due fasi",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "La sicurezza migliorata è stata abilitata per il tuo account. Autenticati utilizzando un secondo fattore.",
+ "Cancel login" : "Annulla l'accesso",
"Please authenticate using the selected factor." : "Autentica utilizzando il fattore selezionato.",
"An error occured while verifying the token" : "Si è verificato un errore durante la verifica del token",
"You are accessing the server from an untrusted domain." : "Stai accedendo al server da un dominio non attendibile.",
diff --git a/core/l10n/ja.js b/core/l10n/ja.js
index 397a417eb9d..a45c8620c6e 100644
--- a/core/l10n/ja.js
+++ b/core/l10n/ja.js
@@ -295,6 +295,7 @@ OC.L10N.register(
"This means only administrators can use the instance." : "これは、管理者のみがインスタンスを利用できることを意味しています。",
"Contact your system administrator if this message persists or appeared unexpectedly." : "このメッセージが引き続きもしくは予期せず現れる場合は、システム管理者に問い合わせてください。",
"Thank you for your patience." : "しばらくお待ちください。",
+ "Two-step verification" : "2段階認証",
"You are accessing the server from an untrusted domain." : "信頼されていないドメインからサーバーにアクセスしています。",
"Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "管理者に問い合わせてください。このサーバーの管理者の場合は、\"trusted_domain\" の設定を config/config.php に設定してください。config/config.sample.php にサンプルの設定方法が記載してあります。",
"Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "環境により、下のボタンで信頼するドメインに追加する必要があるかもしれません。",
diff --git a/core/l10n/ja.json b/core/l10n/ja.json
index 11c88968ee2..b5e9ba9b9d0 100644
--- a/core/l10n/ja.json
+++ b/core/l10n/ja.json
@@ -293,6 +293,7 @@
"This means only administrators can use the instance." : "これは、管理者のみがインスタンスを利用できることを意味しています。",
"Contact your system administrator if this message persists or appeared unexpectedly." : "このメッセージが引き続きもしくは予期せず現れる場合は、システム管理者に問い合わせてください。",
"Thank you for your patience." : "しばらくお待ちください。",
+ "Two-step verification" : "2段階認証",
"You are accessing the server from an untrusted domain." : "信頼されていないドメインからサーバーにアクセスしています。",
"Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "管理者に問い合わせてください。このサーバーの管理者の場合は、\"trusted_domain\" の設定を config/config.php に設定してください。config/config.sample.php にサンプルの設定方法が記載してあります。",
"Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "環境により、下のボタンで信頼するドメインに追加する必要があるかもしれません。",
diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js
index a0ed6ee2aba..e793cab7836 100644
--- a/core/l10n/pt_BR.js
+++ b/core/l10n/pt_BR.js
@@ -298,6 +298,7 @@ OC.L10N.register(
"Thank you for your patience." : "Obrigado pela sua paciência.",
"Two-step verification" : "Verificação em dois passos",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Segurança reforçada foi ativada para sua conta. Por favor autenticar usando um segundo fator.",
+ "Cancel login" : "Cancelar o login",
"Please authenticate using the selected factor." : "Por favor autenticar usando o fator selecionado.",
"An error occured while verifying the token" : "Ocorreu um erro ao verificar o token",
"You are accessing the server from an untrusted domain." : "Você está acessando o servidor a partir de um domínio não confiável.",
diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json
index 8642980d766..c6a944e1775 100644
--- a/core/l10n/pt_BR.json
+++ b/core/l10n/pt_BR.json
@@ -296,6 +296,7 @@
"Thank you for your patience." : "Obrigado pela sua paciência.",
"Two-step verification" : "Verificação em dois passos",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Segurança reforçada foi ativada para sua conta. Por favor autenticar usando um segundo fator.",
+ "Cancel login" : "Cancelar o login",
"Please authenticate using the selected factor." : "Por favor autenticar usando o fator selecionado.",
"An error occured while verifying the token" : "Ocorreu um erro ao verificar o token",
"You are accessing the server from an untrusted domain." : "Você está acessando o servidor a partir de um domínio não confiável.",
diff --git a/core/l10n/pt_PT.js b/core/l10n/pt_PT.js
index 64651114478..4b7d47d4b7b 100644
--- a/core/l10n/pt_PT.js
+++ b/core/l10n/pt_PT.js
@@ -4,52 +4,52 @@ OC.L10N.register(
"Please select a file." : "Por favor, selecione um ficheiro.",
"File is too big" : "O ficheiro é demasiado grande",
"Invalid file provided" : "Ficheiro indicado inválido",
- "No image or file provided" : "Não foi fornecido nenhum ficheiro ou imagem",
+ "No image or file provided" : "Não foi indicado nenhum ficheiro ou imagem",
"Unknown filetype" : "Tipo de ficheiro desconhecido",
"Invalid image" : "Imagem inválida",
"An error occurred. Please contact your admin." : "Ocorreu um erro. Por favor, contacte o seu administrador.",
- "No temporary profile picture available, try again" : "Fotografia temporária do perfil indisponível, tente novamente",
+ "No temporary profile picture available, try again" : "Nenhuma imagem de perfil temporária disponível, tente novamente",
"No crop data provided" : "Não foram fornecidos dados de recorte",
"No valid crop data provided" : "Não foram indicados dados de recorte válidos",
"Crop is not square" : "O recorte não é quadrado",
"Couldn't reset password because the token is invalid" : "Não foi possível repor a palavra-passe porque a senha é inválida",
"Couldn't reset password because the token is expired" : "Não foi possível repor a palavra-passe porque a senha expirou",
- "Couldn't send reset email. Please make sure your username is correct." : "Ocorreu um problema com o envio do e-mail, por favor confirme o seu utilizador.",
- "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar o email de reposição porque não existe nenhum email associado a este utilizador. Por favor contacte o administrador.",
+ "Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar a mensagem de reposição. Por favor, confirme se o seu nome de utilizador está correto.",
+ "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar a mensagem de reposição porque não existe nenhum endereço de e-mail associado para este utilizador. Por favor, contacte o seu administrador.",
"%s password reset" : "%s reposição da palavra-passe",
- "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar o e-mail de reposição. Por favor, contacte o administrador.",
- "Error loading tags" : "Erro ao carregar etiquetas",
+ "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar a mensagem de reposição. Por favor, contacte o seu administrador.",
+ "Error loading tags" : "Erro ao carregar as etiquetas",
"Tag already exists" : "A etiqueta já existe",
- "Error deleting tag(s)" : "Ocorreu um erro ao apagar etiqueta(s)",
+ "Error deleting tag(s)" : "Erro ao eliminar a(s) etiqueta(s)",
"Error tagging" : "Erro ao etiquetar",
- "Error untagging" : "Erro ao remover etiqueta",
- "Error favoriting" : "Erro a definir como favorito",
- "Error unfavoriting" : "Erro a remover como favorito",
+ "Error untagging" : "Erro ao remover a etiqueta",
+ "Error favoriting" : "Erro ao definir como favorito",
+ "Error unfavoriting" : "Erro ao remover como favorito",
"Couldn't send mail to following users: %s " : "Não foi possível enviar a mensagem para os seguintes utilizadores: %s",
"Preparing update" : "A preparar atualização",
"[%d / %d]: %s" : "[%d / %d]: %s",
- "Repair warning: " : "Aviso de reparação:",
- "Repair error: " : "Corrija o erro:",
- "Please use the command line updater because automatic updating is disabled in the config.php." : "Por favor utilize o actualizador disponível na linha de comandos pois a actualização automática está inibida em config.php.",
- "[%d / %d]: Checking table %s" : "[%d / %d]: A verificar a tabela %s",
+ "Repair warning: " : "Aviso de correção:",
+ "Repair error: " : "Erro de correção:",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Por favor, utilize o atualizador de linha de comando porque a atualização automática está desativada em config.php.",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: a verificar a tabela %s",
"Turned on maintenance mode" : "Ativado o modo de manutenção",
"Turned off maintenance mode" : "Desativado o modo de manutenção",
"Maintenance mode is kept active" : "O modo de manutenção é mantido ativo",
- "Updating database schema" : "A actualizar o esquema da base de dados",
+ "Updating database schema" : "A atualizar o esquema da base de dados",
"Updated database" : "Base de dados atualizada",
"Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "A verificar se o esquema da base de dados pode ser atualizado (isto pode demorar algum tempo dependendo do tamanho da base de dados)",
"Checked database schema update" : "Atualização do esquema da base de dados verificada.",
- "Checking updates of apps" : "A procurar por atualizações das apps",
+ "Checking updates of apps" : "A procurar por atualizações das aplicações",
"Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "A verificar se o esquema da base de dados para %s pode ser atualizado (isto pode demorar algum tempo dependendo do tamanho da base de dados)",
- "Checked database schema update for apps" : "Atualização do esquema da base de dados verificada.",
+ "Checked database schema update for apps" : "Atualização do esquema da base de dados para as aplicações verificada.",
"Updated \"%s\" to %s" : "Atualizado \"%s\" para %s",
- "Set log level to debug" : "Definir depuração como o nível de log",
+ "Set log level to debug" : "Definir nível de registo para depurar",
"Reset log level" : "Reiniciar nível de registo",
- "Starting code integrity check" : "A iniciar verificação de integridade do código",
- "Finished code integrity check" : "Terminada a verificação de integridade do código",
+ "Starting code integrity check" : "A iniciar a verificação da integridade do código",
+ "Finished code integrity check" : "Terminada a verificação da integridade do código",
"%s (3rdparty)" : "%s (terceiros)",
"%s (incompatible)" : "%s (incompatível)",
- "Following apps have been disabled: %s" : "As seguintes apps foram desativadas: %s",
+ "Following apps have been disabled: %s" : "Foram desativadas as seguintes aplicações: %s",
"Already up to date" : "Já está atualizado",
"Sunday" : "Domingo",
"Monday" : "Segunda",
@@ -97,9 +97,9 @@ OC.L10N.register(
"Nov." : "Nov.",
"Dec." : "Dez.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Existiram alguns problemas com a verificação de integridade do código. Mais informação…</a>",
- "Settings" : "Definições",
- "Problem loading page, reloading in 5 seconds" : "Problema a carregar a página, recarregando dentro de 5 segundos",
- "Saving..." : "A guardar ...",
+ "Settings" : "Configurações",
+ "Problem loading page, reloading in 5 seconds" : "Problema a carregar a página, a recarregar em 5 segundos",
+ "Saving..." : "A guardar...",
"Dismiss" : "Rejeitar",
"seconds ago" : "segundos atrás",
"The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A hiperligação para reiniciar a sua senha foi enviada para o seu correio eletrónico. Se não a receber dentro de um tempo aceitável, verifique as suas pastas de span/lixo.<br> Se não a encontrar, pergunte ao seu administrador local.",
@@ -109,13 +109,13 @@ OC.L10N.register(
"No" : "Não",
"Yes" : "Sim",
"Choose" : "Escolher",
- "Error loading file picker template: {error}" : "Ocorreu um erro ao carregar o modelo do selecionador de ficheiro: {error}",
+ "Error loading file picker template: {error}" : "Ocorreu um erro ao carregar o modelo de seleção de ficheiro: {error}",
"Ok" : "CONFIRMAR",
"Error loading message template: {error}" : "Ocorreu um erro ao carregar o modelo: {error}",
- "read-only" : "só-de-leitura",
+ "read-only" : "só de leitura",
"_{count} file conflict_::_{count} file conflicts_" : ["{count} conflito de ficheiro","{count} conflitos de ficheiro"],
"One file conflict" : "Um conflito de ficheiro",
- "New Files" : "Ficheiros Novos",
+ "New Files" : "Novos Ficheiros",
"Already existing files" : "Ficheiros já existentes",
"Which files do you want to keep?" : "Quais os ficheiros que pretende manter?",
"If you select both versions, the copied file will have a number added to its name." : "Se selecionar ambas as versões, o ficheiro copiado irá ter um número adicionado ao seu nome.",
@@ -148,49 +148,49 @@ OC.L10N.register(
"Error" : "Erro",
"Error while sharing" : "Erro ao partilhar",
"Error while unsharing" : "Erro ao remover a partilha",
- "Error setting expiration date" : "Erro ao aplicar a data de expiração",
- "The public link will expire no later than {days} days after it is created" : "O link público expira, o mais tardar {days} dias após sua criação",
+ "Error setting expiration date" : "Erro ao definir a data de expiração",
+ "The public link will expire no later than {days} days after it is created" : "A hiperligação pública irá expirar, o mais tardar {days} dias depois da sua criação",
"Set expiration date" : "Definir a data de expiração",
- "Expiration" : "Data de expiração",
+ "Expiration" : "Expiração",
"Expiration date" : "Data de expiração",
"Choose a password for the public link" : "Defina a palavra-passe para a hiperligação pública",
- "Resharing is not allowed" : "Não é permitido partilhar de novo",
+ "Resharing is not allowed" : "Não é permitido voltar a partilhar",
"Share link" : "Compartilhar hiperligação",
"Link" : "Hiperligação",
- "Password protect" : "Proteger com Palavra-passe",
+ "Password protect" : "Proteger com palavra-passe",
"Password" : "Palavra-passe",
"Allow editing" : "Permitir edição",
- "Email link to person" : "Enviar a hiperligação para a pessoa",
+ "Email link to person" : "Enviar hiperligação por mensagem para a pessoa",
"Send" : "Enviar",
- "Sending ..." : "A Enviar...",
+ "Sending ..." : "A enviar...",
"Email sent" : "Mensagem enviada",
- "Send link via email" : "Enviar hiperligação por correio eletrónico",
+ "Send link via email" : "Enviar hiperligação por mensagem",
"Shared with you and the group {group} by {owner}" : "Partilhado consigo e com o grupo {group} por {owner}",
"Shared with you by {owner}" : "Partilhado consigo por {owner}",
"group" : "grupo",
"remote" : "remoto",
- "notify by email" : "Notificar por correio eletrónico",
+ "notify by email" : "Notificar por mensagem",
"Unshare" : "Cancelar partilha",
"can share" : "pode partilhar",
"can edit" : "pode editar",
"create" : "criar",
"change" : "alterar",
- "delete" : "apagar",
+ "delete" : "eliminar",
"access control" : "controlo de acesso",
"Could not unshare" : "Não foi possível cancelar a partilha",
"Share details could not be loaded for this item." : "Não foi possível carregar os detalhes de partilha para este item.",
- "No users or groups found for {search}" : "Nenhuns utilizadores ou grupos encontrados para {search}",
- "No users found for {search}" : "Nenhum utilizador encontrado para {search}",
- "An error occurred. Please try again" : "Ocorreu um erro. Por favor, tente de novo",
+ "No users or groups found for {search}" : "Não foram encontrados nenhuns utilizadores ou grupos para {search}",
+ "No users found for {search}" : "Não foram encontrados utilizadores para {search}",
+ "An error occurred. Please try again" : "Ocorreu um erro. Por favor, tente de novo.",
"{sharee} (group)" : "{sharee} (grupo)",
"{sharee} (at {server})" : "{sharee} (em {server})",
"{sharee} (remote)" : "{sharee} (remoto)",
"Share" : "Compartilhar",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Compartilhe com as pessoas nas outras ownClouds utilizando a sintaxe username@example.com/owncloud",
- "Share with users…" : "Partilhar com utilizadores...",
- "Share with users, groups or remote users…" : "Partilhar com utilizadores, grupos ou utilizadores remotos...",
- "Share with users or groups…" : "Partilhar com utilizadores ou grupos...",
- "Share with users or remote users…" : "Partilhar com utilizadores ou utilizadores remotos...",
+ "Share with users…" : "Compartilhe com os utilizadores...",
+ "Share with users, groups or remote users…" : "Compartilhe com os utilizadores, grupos ou utilizadores remotos...",
+ "Share with users or groups…" : "Compartilhe com os utilizadores ou grupos...",
+ "Share with users or remote users…" : "Compartilhe com os utilizadores ou utilizadores remotos...",
"Error removing share" : "Erro ao remover partilha",
"Warning" : "Aviso",
"Error while sending notification" : "Erro enquanto estava a enviar a notificação",
@@ -198,7 +198,7 @@ OC.L10N.register(
"restricted" : "limitado",
"invisible" : "invisível",
"({scope})" : "({scope})",
- "Delete" : "Apagar",
+ "Delete" : "Eliminar",
"Rename" : "Renomear",
"Collaborative tags" : "Etiquetas colaborativas",
"The object type is not specified." : "O tipo de objeto não está especificado.",
@@ -206,16 +206,16 @@ OC.L10N.register(
"Add" : "Adicionar",
"Edit tags" : "Editar etiquetas",
"Error loading dialog template: {error}" : "Ocorreu um erro ao carregar o modelo de janela: {error}",
- "No tags selected for deletion." : "Não foram escolhidas etiquetas para apagar.",
+ "No tags selected for deletion." : "Não foram selecionadas etiquetas para eliminação.",
"unknown text" : "texto desconhecido",
- "Hello world!" : "Olá mundo!",
+ "Hello world!" : "Olá, mundo!",
"sunny" : "soalheiro",
"Hello {name}, the weather is {weather}" : "Olá {name}, o tempo está {weather}",
"Hello {name}" : "Olá {name}",
"new" : "novo",
"_download %n file_::_download %n files_" : ["transferir %n ficheiro","transferir %n ficheiros"],
- "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "A atualização está em curso. Deixar esta página agora poderá interromper o processo nalguns ambientes.",
- "Updating to {version}" : "A actualizar para {version}",
+ "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "A atualização está em curso. Se deixar esta página agora poderá interromper o processo em alguns ambientes.",
+ "Updating to {version}" : "A atualizar para {version}",
"An error occurred." : "Ocorreu um erro.",
"Please reload the page." : "Por favor, recarregue a página.",
"The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "A atualização falhou. Para mais informação <a href=\"{url}\">verifique o nosso fórum</a> sobre como resolver este problema.",
@@ -227,10 +227,10 @@ OC.L10N.register(
"_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultado de pesquisa noutra pasta","{count} resultados de pesquisa noutras pastas"],
"Personal" : "Pessoal",
"Users" : "Utilizadores",
- "Apps" : "Apps",
+ "Apps" : "Aplicações",
"Admin" : "Administração",
"Help" : "Ajuda",
- "Access forbidden" : "Acesso interdito",
+ "Access forbidden" : "Acesso proibido",
"File not found" : "Ficheiro não encontrado",
"The specified document has not been found on the server." : "O documento especificado não foi encontrado no servidor.",
"You can click here to return to %s." : "Pode clicar aqui para voltar para %s.",
@@ -243,7 +243,7 @@ OC.L10N.register(
"More details can be found in the server log." : "Mais detalhes podem ser encontrados no log do servidor.",
"Technical details" : "Detalhes técnicos",
"Remote Address: %s" : "Endereço remoto: %s",
- "Request ID: %s" : "Id. do Pedido: %s",
+ "Request ID: %s" : "Id. do pedido: %s",
"Type: %s" : "Tipo: %s",
"Code: %s" : "Código: %s",
"Message: %s" : "Mensagem: %s",
@@ -273,50 +273,50 @@ OC.L10N.register(
"Finish setup" : "Terminar consiguração",
"Finishing …" : "A terminar...",
"Need help?" : "Precisa de ajuda?",
- "See the documentation" : "Veja a documentação",
+ "See the documentation" : "Consulte a documentação",
"Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Olá,<br><br>apenas para informar que %s partilhou <strong>%s</strong> consigo.<br><a href=\"%s\">Consulte aqui!</a><br><br>",
- "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Esta aplicação requer JavaScript para funcionar correctamente. Por favor, {linkstart}active o JavaScript{linkend} e recarregue a página.",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Esta aplicação requer o JavaScript para funcionar corretamente. Por favor, {linkstart}ative o JavaScript{linkend} e recarregue a página.",
"Log out" : "Terminar sessão",
"Search" : "Procurar",
"Server side authentication failed!" : "Autenticação do lado do servidor falhou!",
- "Please contact your administrator." : "Por favor contacte o administrador.",
+ "Please contact your administrator." : "Por favor, contacte o seu administrador.",
"An internal error occurred." : "Ocorreu um erro interno.",
- "Please try again or contact your administrator." : "Por favor tente de novo ou contacte o administrador.",
- "Username or email" : "Nome de utilizador ou e-mail:",
+ "Please try again or contact your administrator." : "Por favor, tente de novo ou contacte o seu administrador.",
+ "Username or email" : "Nome de utilizador ou e-mail",
"Log in" : "Iniciar Sessão",
- "Wrong password. Reset it?" : "Senha errada. Repô-la?",
+ "Wrong password. Reset it?" : "Palavra-passe errada. Redefini-la?",
"Wrong password." : "Palavra-passe errada.",
"Stay logged in" : "Manter sessão iniciada",
- "Alternative Logins" : "Contas de acesso alternativas",
+ "Alternative Logins" : "Contas de Acesso Alternativas",
"Use the following link to reset your password: {link}" : "Utilize a seguinte hiperligação para repor a sua palavra-passe: {link}",
- "New password" : "Nova palavra-chave",
+ "New password" : "Nova palavra-passe",
"New Password" : "Nova palavra-passe",
"Reset password" : "Repor palavra-passe",
- "This ownCloud instance is currently in single user mode." : "Esta instância do ownCloud está actualmente configurada no modo de utilizador único.",
- "This means only administrators can use the instance." : "Isto significa que apenas os administradores podem usar a instância.",
- "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte o seu administrador de sistema se esta mensagem continuar a aparecer ou apareceu inesperadamente.",
+ "This ownCloud instance is currently in single user mode." : "Esta instância do ownCloud está atualmente configurada no modo de único utilizador.",
+ "This means only administrators can use the instance." : "Isto significa que apenas os administradores podem utilizar a instância.",
+ "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte o seu administrador do sistema se esta mensagem persistir ou apareceu inesperadamente.",
"Thank you for your patience." : "Obrigado pela sua paciência.",
"Two-step verification" : "Verificação de dois passos:",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "A segurança reforçada foi ativada para a sua conta. Por favor, autentique utilizando um segundo fator.",
"Please authenticate using the selected factor." : "Por favor, autentique utilizando um segundo fator.",
- "An error occured while verifying the token" : "Ocorreu um erro durante a verificação do token",
+ "An error occured while verifying the token" : "Ocorreu um erro durante a verificação da senha",
"You are accessing the server from an untrusted domain." : "Está a aceder ao servidor a partir de um domínio que não é de confiança.",
- "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Por favor contacte o seu administrador. Se é um administrador desta instância, configure as definições \"trusted_domains\" em config/config.php. Um exemplo de configuração é fornecido em config/config.sample.php.",
- "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Dependendo da configuração, como administrador, você também pode ser capaz de usar o botão abaixo para confiar neste domínio.",
+ "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Por favor, contacte o seu administrador. Se é um administrador desta instância, configure a definição \"trusted_domains\" em config/config.php. É fornecido um exemplo de configuração em config/config.sample.php.",
+ "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Dependendo da sua configuração, como um administrador também pode conseguir utilizar o botão abaixo para confiar neste domínio.",
"Add \"%s\" as trusted domain" : "Adicionar \"%s\" como um domínio de confiança",
- "App update required" : "É necessário atualizar a app",
+ "App update required" : "É necessário atualizar a aplicação",
"%s will be updated to version %s" : "%s será atualizada para a versão %s.",
- "These apps will be updated:" : "Estas apps irão ser atualizadas.",
- "These incompatible apps will be disabled:" : "Estas apps incompatíveis irão ser desativadas:",
+ "These apps will be updated:" : "Estas aplicações irão ser atualizadas.",
+ "These incompatible apps will be disabled:" : "Estas aplicações incompatíveis irão ser desativadas:",
"The theme %s has been disabled." : "O tema %s foi desativado.",
- "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Por favor garanta a cópia de segurança da base de dados e das pastas 'config' e 'data' antes de prosseguir.",
+ "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Por favor, certifique-se de que foi efetuada uma cópia de segurança da base de dados, pasta de configuração e de dados antes de prosseguir.",
"Start update" : "Iniciar atualização",
- "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Para evitar tempos de espera com instalações maiores, você pode em vez disso, executar o seguinte comando a partir do diretório de instalação:",
+ "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Para evitar tempos expirados com instalações maiores, em vez disso, pode executar o seguinte comando a partir da diretoria de instalação:",
"Detailed logs" : "Registos detalhados",
- "Update needed" : "Necessária atualização",
- "Please use the command line updater because you have a big instance." : "Por favor utilize o actualizador disponível na linha de comandos pois a sua instância é grande.",
+ "Update needed" : "É necessário atualizar",
+ "Please use the command line updater because you have a big instance." : "Por favor, utilize o atualizador de linha de comando porque a sua instância é grande.",
"For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Para obter ajuda, consulte a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentação</a>.",
- "This %s instance is currently in maintenance mode, which may take a while." : "Esta instância %s está actualmente em modo de manutenção, o que poderá demorar algum tempo.",
- "This page will refresh itself when the %s instance is available again." : "Esta página irá ser recarregada novamente quando a instância %s ficar novamente disponível."
+ "This %s instance is currently in maintenance mode, which may take a while." : "Esta instância %s está atualmente no modo de manutenção, o que poderá demorar algum tempo.",
+ "This page will refresh itself when the %s instance is available again." : "Esta página irá ser atualizada quando a instância %s ficar novamente disponível."
},
"nplurals=2; plural=(n != 1);");
diff --git a/core/l10n/pt_PT.json b/core/l10n/pt_PT.json
index d65cfc4a4d5..c392bd51edb 100644
--- a/core/l10n/pt_PT.json
+++ b/core/l10n/pt_PT.json
@@ -2,52 +2,52 @@
"Please select a file." : "Por favor, selecione um ficheiro.",
"File is too big" : "O ficheiro é demasiado grande",
"Invalid file provided" : "Ficheiro indicado inválido",
- "No image or file provided" : "Não foi fornecido nenhum ficheiro ou imagem",
+ "No image or file provided" : "Não foi indicado nenhum ficheiro ou imagem",
"Unknown filetype" : "Tipo de ficheiro desconhecido",
"Invalid image" : "Imagem inválida",
"An error occurred. Please contact your admin." : "Ocorreu um erro. Por favor, contacte o seu administrador.",
- "No temporary profile picture available, try again" : "Fotografia temporária do perfil indisponível, tente novamente",
+ "No temporary profile picture available, try again" : "Nenhuma imagem de perfil temporária disponível, tente novamente",
"No crop data provided" : "Não foram fornecidos dados de recorte",
"No valid crop data provided" : "Não foram indicados dados de recorte válidos",
"Crop is not square" : "O recorte não é quadrado",
"Couldn't reset password because the token is invalid" : "Não foi possível repor a palavra-passe porque a senha é inválida",
"Couldn't reset password because the token is expired" : "Não foi possível repor a palavra-passe porque a senha expirou",
- "Couldn't send reset email. Please make sure your username is correct." : "Ocorreu um problema com o envio do e-mail, por favor confirme o seu utilizador.",
- "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar o email de reposição porque não existe nenhum email associado a este utilizador. Por favor contacte o administrador.",
+ "Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar a mensagem de reposição. Por favor, confirme se o seu nome de utilizador está correto.",
+ "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar a mensagem de reposição porque não existe nenhum endereço de e-mail associado para este utilizador. Por favor, contacte o seu administrador.",
"%s password reset" : "%s reposição da palavra-passe",
- "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar o e-mail de reposição. Por favor, contacte o administrador.",
- "Error loading tags" : "Erro ao carregar etiquetas",
+ "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar a mensagem de reposição. Por favor, contacte o seu administrador.",
+ "Error loading tags" : "Erro ao carregar as etiquetas",
"Tag already exists" : "A etiqueta já existe",
- "Error deleting tag(s)" : "Ocorreu um erro ao apagar etiqueta(s)",
+ "Error deleting tag(s)" : "Erro ao eliminar a(s) etiqueta(s)",
"Error tagging" : "Erro ao etiquetar",
- "Error untagging" : "Erro ao remover etiqueta",
- "Error favoriting" : "Erro a definir como favorito",
- "Error unfavoriting" : "Erro a remover como favorito",
+ "Error untagging" : "Erro ao remover a etiqueta",
+ "Error favoriting" : "Erro ao definir como favorito",
+ "Error unfavoriting" : "Erro ao remover como favorito",
"Couldn't send mail to following users: %s " : "Não foi possível enviar a mensagem para os seguintes utilizadores: %s",
"Preparing update" : "A preparar atualização",
"[%d / %d]: %s" : "[%d / %d]: %s",
- "Repair warning: " : "Aviso de reparação:",
- "Repair error: " : "Corrija o erro:",
- "Please use the command line updater because automatic updating is disabled in the config.php." : "Por favor utilize o actualizador disponível na linha de comandos pois a actualização automática está inibida em config.php.",
- "[%d / %d]: Checking table %s" : "[%d / %d]: A verificar a tabela %s",
+ "Repair warning: " : "Aviso de correção:",
+ "Repair error: " : "Erro de correção:",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Por favor, utilize o atualizador de linha de comando porque a atualização automática está desativada em config.php.",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: a verificar a tabela %s",
"Turned on maintenance mode" : "Ativado o modo de manutenção",
"Turned off maintenance mode" : "Desativado o modo de manutenção",
"Maintenance mode is kept active" : "O modo de manutenção é mantido ativo",
- "Updating database schema" : "A actualizar o esquema da base de dados",
+ "Updating database schema" : "A atualizar o esquema da base de dados",
"Updated database" : "Base de dados atualizada",
"Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "A verificar se o esquema da base de dados pode ser atualizado (isto pode demorar algum tempo dependendo do tamanho da base de dados)",
"Checked database schema update" : "Atualização do esquema da base de dados verificada.",
- "Checking updates of apps" : "A procurar por atualizações das apps",
+ "Checking updates of apps" : "A procurar por atualizações das aplicações",
"Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "A verificar se o esquema da base de dados para %s pode ser atualizado (isto pode demorar algum tempo dependendo do tamanho da base de dados)",
- "Checked database schema update for apps" : "Atualização do esquema da base de dados verificada.",
+ "Checked database schema update for apps" : "Atualização do esquema da base de dados para as aplicações verificada.",
"Updated \"%s\" to %s" : "Atualizado \"%s\" para %s",
- "Set log level to debug" : "Definir depuração como o nível de log",
+ "Set log level to debug" : "Definir nível de registo para depurar",
"Reset log level" : "Reiniciar nível de registo",
- "Starting code integrity check" : "A iniciar verificação de integridade do código",
- "Finished code integrity check" : "Terminada a verificação de integridade do código",
+ "Starting code integrity check" : "A iniciar a verificação da integridade do código",
+ "Finished code integrity check" : "Terminada a verificação da integridade do código",
"%s (3rdparty)" : "%s (terceiros)",
"%s (incompatible)" : "%s (incompatível)",
- "Following apps have been disabled: %s" : "As seguintes apps foram desativadas: %s",
+ "Following apps have been disabled: %s" : "Foram desativadas as seguintes aplicações: %s",
"Already up to date" : "Já está atualizado",
"Sunday" : "Domingo",
"Monday" : "Segunda",
@@ -95,9 +95,9 @@
"Nov." : "Nov.",
"Dec." : "Dez.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Existiram alguns problemas com a verificação de integridade do código. Mais informação…</a>",
- "Settings" : "Definições",
- "Problem loading page, reloading in 5 seconds" : "Problema a carregar a página, recarregando dentro de 5 segundos",
- "Saving..." : "A guardar ...",
+ "Settings" : "Configurações",
+ "Problem loading page, reloading in 5 seconds" : "Problema a carregar a página, a recarregar em 5 segundos",
+ "Saving..." : "A guardar...",
"Dismiss" : "Rejeitar",
"seconds ago" : "segundos atrás",
"The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A hiperligação para reiniciar a sua senha foi enviada para o seu correio eletrónico. Se não a receber dentro de um tempo aceitável, verifique as suas pastas de span/lixo.<br> Se não a encontrar, pergunte ao seu administrador local.",
@@ -107,13 +107,13 @@
"No" : "Não",
"Yes" : "Sim",
"Choose" : "Escolher",
- "Error loading file picker template: {error}" : "Ocorreu um erro ao carregar o modelo do selecionador de ficheiro: {error}",
+ "Error loading file picker template: {error}" : "Ocorreu um erro ao carregar o modelo de seleção de ficheiro: {error}",
"Ok" : "CONFIRMAR",
"Error loading message template: {error}" : "Ocorreu um erro ao carregar o modelo: {error}",
- "read-only" : "só-de-leitura",
+ "read-only" : "só de leitura",
"_{count} file conflict_::_{count} file conflicts_" : ["{count} conflito de ficheiro","{count} conflitos de ficheiro"],
"One file conflict" : "Um conflito de ficheiro",
- "New Files" : "Ficheiros Novos",
+ "New Files" : "Novos Ficheiros",
"Already existing files" : "Ficheiros já existentes",
"Which files do you want to keep?" : "Quais os ficheiros que pretende manter?",
"If you select both versions, the copied file will have a number added to its name." : "Se selecionar ambas as versões, o ficheiro copiado irá ter um número adicionado ao seu nome.",
@@ -146,49 +146,49 @@
"Error" : "Erro",
"Error while sharing" : "Erro ao partilhar",
"Error while unsharing" : "Erro ao remover a partilha",
- "Error setting expiration date" : "Erro ao aplicar a data de expiração",
- "The public link will expire no later than {days} days after it is created" : "O link público expira, o mais tardar {days} dias após sua criação",
+ "Error setting expiration date" : "Erro ao definir a data de expiração",
+ "The public link will expire no later than {days} days after it is created" : "A hiperligação pública irá expirar, o mais tardar {days} dias depois da sua criação",
"Set expiration date" : "Definir a data de expiração",
- "Expiration" : "Data de expiração",
+ "Expiration" : "Expiração",
"Expiration date" : "Data de expiração",
"Choose a password for the public link" : "Defina a palavra-passe para a hiperligação pública",
- "Resharing is not allowed" : "Não é permitido partilhar de novo",
+ "Resharing is not allowed" : "Não é permitido voltar a partilhar",
"Share link" : "Compartilhar hiperligação",
"Link" : "Hiperligação",
- "Password protect" : "Proteger com Palavra-passe",
+ "Password protect" : "Proteger com palavra-passe",
"Password" : "Palavra-passe",
"Allow editing" : "Permitir edição",
- "Email link to person" : "Enviar a hiperligação para a pessoa",
+ "Email link to person" : "Enviar hiperligação por mensagem para a pessoa",
"Send" : "Enviar",
- "Sending ..." : "A Enviar...",
+ "Sending ..." : "A enviar...",
"Email sent" : "Mensagem enviada",
- "Send link via email" : "Enviar hiperligação por correio eletrónico",
+ "Send link via email" : "Enviar hiperligação por mensagem",
"Shared with you and the group {group} by {owner}" : "Partilhado consigo e com o grupo {group} por {owner}",
"Shared with you by {owner}" : "Partilhado consigo por {owner}",
"group" : "grupo",
"remote" : "remoto",
- "notify by email" : "Notificar por correio eletrónico",
+ "notify by email" : "Notificar por mensagem",
"Unshare" : "Cancelar partilha",
"can share" : "pode partilhar",
"can edit" : "pode editar",
"create" : "criar",
"change" : "alterar",
- "delete" : "apagar",
+ "delete" : "eliminar",
"access control" : "controlo de acesso",
"Could not unshare" : "Não foi possível cancelar a partilha",
"Share details could not be loaded for this item." : "Não foi possível carregar os detalhes de partilha para este item.",
- "No users or groups found for {search}" : "Nenhuns utilizadores ou grupos encontrados para {search}",
- "No users found for {search}" : "Nenhum utilizador encontrado para {search}",
- "An error occurred. Please try again" : "Ocorreu um erro. Por favor, tente de novo",
+ "No users or groups found for {search}" : "Não foram encontrados nenhuns utilizadores ou grupos para {search}",
+ "No users found for {search}" : "Não foram encontrados utilizadores para {search}",
+ "An error occurred. Please try again" : "Ocorreu um erro. Por favor, tente de novo.",
"{sharee} (group)" : "{sharee} (grupo)",
"{sharee} (at {server})" : "{sharee} (em {server})",
"{sharee} (remote)" : "{sharee} (remoto)",
"Share" : "Compartilhar",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Compartilhe com as pessoas nas outras ownClouds utilizando a sintaxe username@example.com/owncloud",
- "Share with users…" : "Partilhar com utilizadores...",
- "Share with users, groups or remote users…" : "Partilhar com utilizadores, grupos ou utilizadores remotos...",
- "Share with users or groups…" : "Partilhar com utilizadores ou grupos...",
- "Share with users or remote users…" : "Partilhar com utilizadores ou utilizadores remotos...",
+ "Share with users…" : "Compartilhe com os utilizadores...",
+ "Share with users, groups or remote users…" : "Compartilhe com os utilizadores, grupos ou utilizadores remotos...",
+ "Share with users or groups…" : "Compartilhe com os utilizadores ou grupos...",
+ "Share with users or remote users…" : "Compartilhe com os utilizadores ou utilizadores remotos...",
"Error removing share" : "Erro ao remover partilha",
"Warning" : "Aviso",
"Error while sending notification" : "Erro enquanto estava a enviar a notificação",
@@ -196,7 +196,7 @@
"restricted" : "limitado",
"invisible" : "invisível",
"({scope})" : "({scope})",
- "Delete" : "Apagar",
+ "Delete" : "Eliminar",
"Rename" : "Renomear",
"Collaborative tags" : "Etiquetas colaborativas",
"The object type is not specified." : "O tipo de objeto não está especificado.",
@@ -204,16 +204,16 @@
"Add" : "Adicionar",
"Edit tags" : "Editar etiquetas",
"Error loading dialog template: {error}" : "Ocorreu um erro ao carregar o modelo de janela: {error}",
- "No tags selected for deletion." : "Não foram escolhidas etiquetas para apagar.",
+ "No tags selected for deletion." : "Não foram selecionadas etiquetas para eliminação.",
"unknown text" : "texto desconhecido",
- "Hello world!" : "Olá mundo!",
+ "Hello world!" : "Olá, mundo!",
"sunny" : "soalheiro",
"Hello {name}, the weather is {weather}" : "Olá {name}, o tempo está {weather}",
"Hello {name}" : "Olá {name}",
"new" : "novo",
"_download %n file_::_download %n files_" : ["transferir %n ficheiro","transferir %n ficheiros"],
- "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "A atualização está em curso. Deixar esta página agora poderá interromper o processo nalguns ambientes.",
- "Updating to {version}" : "A actualizar para {version}",
+ "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "A atualização está em curso. Se deixar esta página agora poderá interromper o processo em alguns ambientes.",
+ "Updating to {version}" : "A atualizar para {version}",
"An error occurred." : "Ocorreu um erro.",
"Please reload the page." : "Por favor, recarregue a página.",
"The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "A atualização falhou. Para mais informação <a href=\"{url}\">verifique o nosso fórum</a> sobre como resolver este problema.",
@@ -225,10 +225,10 @@
"_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultado de pesquisa noutra pasta","{count} resultados de pesquisa noutras pastas"],
"Personal" : "Pessoal",
"Users" : "Utilizadores",
- "Apps" : "Apps",
+ "Apps" : "Aplicações",
"Admin" : "Administração",
"Help" : "Ajuda",
- "Access forbidden" : "Acesso interdito",
+ "Access forbidden" : "Acesso proibido",
"File not found" : "Ficheiro não encontrado",
"The specified document has not been found on the server." : "O documento especificado não foi encontrado no servidor.",
"You can click here to return to %s." : "Pode clicar aqui para voltar para %s.",
@@ -241,7 +241,7 @@
"More details can be found in the server log." : "Mais detalhes podem ser encontrados no log do servidor.",
"Technical details" : "Detalhes técnicos",
"Remote Address: %s" : "Endereço remoto: %s",
- "Request ID: %s" : "Id. do Pedido: %s",
+ "Request ID: %s" : "Id. do pedido: %s",
"Type: %s" : "Tipo: %s",
"Code: %s" : "Código: %s",
"Message: %s" : "Mensagem: %s",
@@ -271,50 +271,50 @@
"Finish setup" : "Terminar consiguração",
"Finishing …" : "A terminar...",
"Need help?" : "Precisa de ajuda?",
- "See the documentation" : "Veja a documentação",
+ "See the documentation" : "Consulte a documentação",
"Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Olá,<br><br>apenas para informar que %s partilhou <strong>%s</strong> consigo.<br><a href=\"%s\">Consulte aqui!</a><br><br>",
- "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Esta aplicação requer JavaScript para funcionar correctamente. Por favor, {linkstart}active o JavaScript{linkend} e recarregue a página.",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Esta aplicação requer o JavaScript para funcionar corretamente. Por favor, {linkstart}ative o JavaScript{linkend} e recarregue a página.",
"Log out" : "Terminar sessão",
"Search" : "Procurar",
"Server side authentication failed!" : "Autenticação do lado do servidor falhou!",
- "Please contact your administrator." : "Por favor contacte o administrador.",
+ "Please contact your administrator." : "Por favor, contacte o seu administrador.",
"An internal error occurred." : "Ocorreu um erro interno.",
- "Please try again or contact your administrator." : "Por favor tente de novo ou contacte o administrador.",
- "Username or email" : "Nome de utilizador ou e-mail:",
+ "Please try again or contact your administrator." : "Por favor, tente de novo ou contacte o seu administrador.",
+ "Username or email" : "Nome de utilizador ou e-mail",
"Log in" : "Iniciar Sessão",
- "Wrong password. Reset it?" : "Senha errada. Repô-la?",
+ "Wrong password. Reset it?" : "Palavra-passe errada. Redefini-la?",
"Wrong password." : "Palavra-passe errada.",
"Stay logged in" : "Manter sessão iniciada",
- "Alternative Logins" : "Contas de acesso alternativas",
+ "Alternative Logins" : "Contas de Acesso Alternativas",
"Use the following link to reset your password: {link}" : "Utilize a seguinte hiperligação para repor a sua palavra-passe: {link}",
- "New password" : "Nova palavra-chave",
+ "New password" : "Nova palavra-passe",
"New Password" : "Nova palavra-passe",
"Reset password" : "Repor palavra-passe",
- "This ownCloud instance is currently in single user mode." : "Esta instância do ownCloud está actualmente configurada no modo de utilizador único.",
- "This means only administrators can use the instance." : "Isto significa que apenas os administradores podem usar a instância.",
- "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte o seu administrador de sistema se esta mensagem continuar a aparecer ou apareceu inesperadamente.",
+ "This ownCloud instance is currently in single user mode." : "Esta instância do ownCloud está atualmente configurada no modo de único utilizador.",
+ "This means only administrators can use the instance." : "Isto significa que apenas os administradores podem utilizar a instância.",
+ "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte o seu administrador do sistema se esta mensagem persistir ou apareceu inesperadamente.",
"Thank you for your patience." : "Obrigado pela sua paciência.",
"Two-step verification" : "Verificação de dois passos:",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "A segurança reforçada foi ativada para a sua conta. Por favor, autentique utilizando um segundo fator.",
"Please authenticate using the selected factor." : "Por favor, autentique utilizando um segundo fator.",
- "An error occured while verifying the token" : "Ocorreu um erro durante a verificação do token",
+ "An error occured while verifying the token" : "Ocorreu um erro durante a verificação da senha",
"You are accessing the server from an untrusted domain." : "Está a aceder ao servidor a partir de um domínio que não é de confiança.",
- "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Por favor contacte o seu administrador. Se é um administrador desta instância, configure as definições \"trusted_domains\" em config/config.php. Um exemplo de configuração é fornecido em config/config.sample.php.",
- "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Dependendo da configuração, como administrador, você também pode ser capaz de usar o botão abaixo para confiar neste domínio.",
+ "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Por favor, contacte o seu administrador. Se é um administrador desta instância, configure a definição \"trusted_domains\" em config/config.php. É fornecido um exemplo de configuração em config/config.sample.php.",
+ "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Dependendo da sua configuração, como um administrador também pode conseguir utilizar o botão abaixo para confiar neste domínio.",
"Add \"%s\" as trusted domain" : "Adicionar \"%s\" como um domínio de confiança",
- "App update required" : "É necessário atualizar a app",
+ "App update required" : "É necessário atualizar a aplicação",
"%s will be updated to version %s" : "%s será atualizada para a versão %s.",
- "These apps will be updated:" : "Estas apps irão ser atualizadas.",
- "These incompatible apps will be disabled:" : "Estas apps incompatíveis irão ser desativadas:",
+ "These apps will be updated:" : "Estas aplicações irão ser atualizadas.",
+ "These incompatible apps will be disabled:" : "Estas aplicações incompatíveis irão ser desativadas:",
"The theme %s has been disabled." : "O tema %s foi desativado.",
- "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Por favor garanta a cópia de segurança da base de dados e das pastas 'config' e 'data' antes de prosseguir.",
+ "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Por favor, certifique-se de que foi efetuada uma cópia de segurança da base de dados, pasta de configuração e de dados antes de prosseguir.",
"Start update" : "Iniciar atualização",
- "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Para evitar tempos de espera com instalações maiores, você pode em vez disso, executar o seguinte comando a partir do diretório de instalação:",
+ "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Para evitar tempos expirados com instalações maiores, em vez disso, pode executar o seguinte comando a partir da diretoria de instalação:",
"Detailed logs" : "Registos detalhados",
- "Update needed" : "Necessária atualização",
- "Please use the command line updater because you have a big instance." : "Por favor utilize o actualizador disponível na linha de comandos pois a sua instância é grande.",
+ "Update needed" : "É necessário atualizar",
+ "Please use the command line updater because you have a big instance." : "Por favor, utilize o atualizador de linha de comando porque a sua instância é grande.",
"For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Para obter ajuda, consulte a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentação</a>.",
- "This %s instance is currently in maintenance mode, which may take a while." : "Esta instância %s está actualmente em modo de manutenção, o que poderá demorar algum tempo.",
- "This page will refresh itself when the %s instance is available again." : "Esta página irá ser recarregada novamente quando a instância %s ficar novamente disponível."
+ "This %s instance is currently in maintenance mode, which may take a while." : "Esta instância %s está atualmente no modo de manutenção, o que poderá demorar algum tempo.",
+ "This page will refresh itself when the %s instance is available again." : "Esta página irá ser atualizada quando a instância %s ficar novamente disponível."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/core/l10n/ro.js b/core/l10n/ro.js
index 7b4cf2c8957..e73ec5cf79f 100644
--- a/core/l10n/ro.js
+++ b/core/l10n/ro.js
@@ -8,23 +8,37 @@ OC.L10N.register(
"Unknown filetype" : "Tip fișier necunoscut",
"Invalid image" : "Imagine invalidă",
"An error occurred. Please contact your admin." : "A apărut o eroare. Te rugăm să contactezi administratorul.",
+ "No temporary profile picture available, try again" : "Nu este disponibilă nicio imagine temporară a profilului, încearcă din nou",
"%s password reset" : "%s resetare parola",
"Couldn't send reset email. Please contact your administrator." : "Expedierea email-ului de resetare a eşuat. Vă rugăm să contactaţi administratorul dvs.",
"Error loading tags" : "Eroare la încărcarea etichetelor",
"Tag already exists" : "Eticheta deja există",
+ "Error deleting tag(s)" : "Eroare la ștergerea etichetei(-lor)",
"Error tagging" : "Eroare la etichetare",
"Error untagging" : "Eroare la scoaterea etichetei",
+ "Error favoriting" : "Eroare la adăugarea la favorite",
+ "Error unfavoriting" : "Eroare la scoaterea de la favorite",
"Couldn't send mail to following users: %s " : "Nu s-a putut trimite mesajul către următorii utilizatori: %s",
"Preparing update" : "Se pregătește actualizarea",
+ "[%d / %d]: %s" : "[%d / %d]: %s",
"Repair warning: " : "Alerte reparare:",
"Repair error: " : "Eroare de reparare:",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: Se verifică tabela %s",
"Turned on maintenance mode" : "Modul mentenanță a fost activat",
"Turned off maintenance mode" : "Modul mentenanță a fost dezactivat",
+ "Maintenance mode is kept active" : "Modul de mentenanță este menținut activ",
"Updating database schema" : "Se actualizează schema bazei de date",
"Updated database" : "Bază de date actualizată",
"Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "Se verifică dacă schema bazei de date poate fi actualizată (această verificare poate lua mult timp în funcție de mărimea bazei de date)",
+ "Checking updates of apps" : "Se verifică actualizările aplicațiilor",
"Updated \"%s\" to %s" : "\"%s\" a fost actualizat până la %s",
+ "Set log level to debug" : "Setează nivelul de logare la \"debug\"",
+ "Reset log level" : "Resetează nivelul de logare",
+ "Starting code integrity check" : "Începe verificarea integrității codului",
+ "Finished code integrity check" : "Verificarea integrității codului a fost finalizată",
+ "%s (3rdparty)" : "%s (terță parte)",
"%s (incompatible)" : "%s (incompatibil)",
+ "Following apps have been disabled: %s" : "Următoarele aplicații au fost dezactivate: %s",
"Already up to date" : "Deja actualizat",
"Sunday" : "Duminică",
"Monday" : "Luni",
@@ -71,9 +85,11 @@ OC.L10N.register(
"Oct." : "Oct.",
"Nov." : "Noi.",
"Dec." : "Dec.",
+ "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Au apărut probleme la verificarea integrității codului. Mai multe informații…</a>",
"Settings" : "Setări",
"Problem loading page, reloading in 5 seconds" : "A apărut o problemă la încărcarea paginii, se reîncearcă în 5 secunde",
"Saving..." : "Se salvează...",
+ "Dismiss" : "Înlătură",
"seconds ago" : "secunde în urmă",
"I know what I'm doing" : "Eu știu ce fac",
"Password can not be changed. Please contact your administrator." : "Parola nu poate fi modificată. Vă rugăm să contactați administratorul dvs.",
@@ -135,24 +151,39 @@ OC.L10N.register(
"access control" : "control acces",
"Could not unshare" : "Nu s-a putut elimina partajarea",
"Share details could not be loaded for this item." : "Nu s-au putut încărca detaliile de partajare pentru acest element.",
+ "An error occurred. Please try again" : "A apărut o eroare. Încearcă din nou",
"Share" : "Partajează",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Partajează cu persoane din alte instanțe ownCloud folosind sintaxa nume_utilizator@exemplu.com/owncloud",
"Share with users…" : "Partajează cu utilizatori...",
+ "Share with users or groups…" : "Partajează cu utilizatori sau grupuri...",
+ "Error removing share" : "Eroare la înlăturarea elementului partajat",
"Warning" : "Atenție",
+ "Error while sending notification" : "Eroare la trimiterea notificării",
+ "Non-existing tag #{tag}" : "Etichetă inexistentă #{tag}",
+ "restricted" : "restricționat",
"invisible" : "invizibil",
"Delete" : "Șterge",
"Rename" : "Redenumește",
+ "Collaborative tags" : "Etichete colaborative",
"The object type is not specified." : "Tipul obiectului nu este specificat.",
"Enter new" : "Introducere nou",
"Add" : "Adaugă",
"Edit tags" : "Editează etichete",
+ "No tags selected for deletion." : "Nu au fost selectate etichete pentru ștergere.",
"unknown text" : "text necunoscut",
+ "Hello world!" : "Hello world!",
"sunny" : "însorit",
+ "Hello {name}" : "Salut {name}",
"new" : "nou",
+ "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Actualizarea este în progres, părăsirea acestei pagini ar putea duce la întreruperea procesului în unele medii.",
+ "Updating to {version}" : "Actualizare la {version}",
"An error occurred." : "A apărut o eroare.",
"Please reload the page." : "Te rugăm să reîncarci pagina.",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." : "Actualizarea a eșuat! Raportați problema către <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">comunitatea ownCloud</a>.",
+ "The update was successful. There were warnings." : "Actualizarea nu a avut loc cu succes. Au existat avertismente.",
"The update was successful. Redirecting you to ownCloud now." : "Actualizare reușită. Ești redirecționat către ownCloud.",
+ "Searching other places" : "Se caută în alte locuri",
+ "No search results in other folders" : "Nu există rezultate ale căutării în alte directoare",
"Personal" : "Personal",
"Users" : "Utilizatori",
"Apps" : "Aplicații",
@@ -160,8 +191,12 @@ OC.L10N.register(
"Help" : "Ajutor",
"Access forbidden" : "Acces restricționat",
"File not found" : "Fișierul nu a fost găsit",
+ "The specified document has not been found on the server." : "Documentul specificat nu a fost găsit pe server.",
+ "You can click here to return to %s." : "Poți da click aici pentru a te întoarce la %s.",
"The share will expire on %s." : "Partajarea va expira în data de %s.",
"Cheers!" : "Noroc!",
+ "Internal Server Error" : "Eroare internă a serverului",
+ "The server encountered an internal error and was unable to complete your request." : "Serverul a întâmpinat o eroare și nu îți poate îndeplini cererea.",
"Technical details" : "Detalii tehnice",
"Type: %s" : "Tip: %s",
"Code: %s" : "Cod: %s",
@@ -190,16 +225,35 @@ OC.L10N.register(
"See the documentation" : "Vezi documentația",
"Log out" : "Ieșire",
"Search" : "Căutare",
+ "Please contact your administrator." : "Contactează-ți administratorul.",
"An internal error occurred." : "A apărut o eroare internă.",
+ "Please try again or contact your administrator." : "Încearcă din nou sau contactează-ți administratorul.",
"Username or email" : "Nume de utilizator sau adresă email",
"Log in" : "Autentificare",
+ "Wrong password. Reset it?" : "Parolă greșită. O resetezi?",
+ "Wrong password." : "Parolă greșită.",
+ "Stay logged in" : "Rămâi autentificat",
"Alternative Logins" : "Conectări alternative",
"Use the following link to reset your password: {link}" : "Folosește următorul link pentru a reseta parola: {link}",
"New password" : "Noua parolă",
"New Password" : "Noua parolă",
"Reset password" : "Resetează parola",
"Thank you for your patience." : "Îți mulțumim pentru răbdare.",
+ "Two-step verification" : "Verificare în doi pași",
+ "Cancel login" : "Anulează autentificarea",
+ "Please authenticate using the selected factor." : "Autentifică-te folosind factorul ales.",
+ "An error occured while verifying the token" : "A apărut o eroare la verificarea jetonului",
"You are accessing the server from an untrusted domain." : "Accesezi serverul dintr-un domeniu care nu a fost configurat ca fiind de încredere.",
- "Start update" : "Începe actualizarea"
+ "Add \"%s\" as trusted domain" : "Adaugă \"%s\" ca domeniu de încredere",
+ "App update required" : "E necesară o actualizare a aplicației",
+ "%s will be updated to version %s" : "%s va fi actualizat la versiunea %s",
+ "These apps will be updated:" : "Aceste aplicații vor fi actualizate:",
+ "These incompatible apps will be disabled:" : "Aceste aplicații incompatibile vor fi dezactivate:",
+ "The theme %s has been disabled." : "Tema %s a fost dezactivată.",
+ "Start update" : "Începe actualizarea",
+ "Detailed logs" : "Loguri detaliate",
+ "Update needed" : "E necesară actualizarea",
+ "Please use the command line updater because you have a big instance." : "Folosește actualizarea din linia de comandă deoarece ai o instanță mare.",
+ "This %s instance is currently in maintenance mode, which may take a while." : "Instanța %s este acum în modul de mentenanță, ceea ce ar putea dura o vreme."
},
"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));");
diff --git a/core/l10n/ro.json b/core/l10n/ro.json
index cea43ae3142..c154312dab6 100644
--- a/core/l10n/ro.json
+++ b/core/l10n/ro.json
@@ -6,23 +6,37 @@
"Unknown filetype" : "Tip fișier necunoscut",
"Invalid image" : "Imagine invalidă",
"An error occurred. Please contact your admin." : "A apărut o eroare. Te rugăm să contactezi administratorul.",
+ "No temporary profile picture available, try again" : "Nu este disponibilă nicio imagine temporară a profilului, încearcă din nou",
"%s password reset" : "%s resetare parola",
"Couldn't send reset email. Please contact your administrator." : "Expedierea email-ului de resetare a eşuat. Vă rugăm să contactaţi administratorul dvs.",
"Error loading tags" : "Eroare la încărcarea etichetelor",
"Tag already exists" : "Eticheta deja există",
+ "Error deleting tag(s)" : "Eroare la ștergerea etichetei(-lor)",
"Error tagging" : "Eroare la etichetare",
"Error untagging" : "Eroare la scoaterea etichetei",
+ "Error favoriting" : "Eroare la adăugarea la favorite",
+ "Error unfavoriting" : "Eroare la scoaterea de la favorite",
"Couldn't send mail to following users: %s " : "Nu s-a putut trimite mesajul către următorii utilizatori: %s",
"Preparing update" : "Se pregătește actualizarea",
+ "[%d / %d]: %s" : "[%d / %d]: %s",
"Repair warning: " : "Alerte reparare:",
"Repair error: " : "Eroare de reparare:",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: Se verifică tabela %s",
"Turned on maintenance mode" : "Modul mentenanță a fost activat",
"Turned off maintenance mode" : "Modul mentenanță a fost dezactivat",
+ "Maintenance mode is kept active" : "Modul de mentenanță este menținut activ",
"Updating database schema" : "Se actualizează schema bazei de date",
"Updated database" : "Bază de date actualizată",
"Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "Se verifică dacă schema bazei de date poate fi actualizată (această verificare poate lua mult timp în funcție de mărimea bazei de date)",
+ "Checking updates of apps" : "Se verifică actualizările aplicațiilor",
"Updated \"%s\" to %s" : "\"%s\" a fost actualizat până la %s",
+ "Set log level to debug" : "Setează nivelul de logare la \"debug\"",
+ "Reset log level" : "Resetează nivelul de logare",
+ "Starting code integrity check" : "Începe verificarea integrității codului",
+ "Finished code integrity check" : "Verificarea integrității codului a fost finalizată",
+ "%s (3rdparty)" : "%s (terță parte)",
"%s (incompatible)" : "%s (incompatibil)",
+ "Following apps have been disabled: %s" : "Următoarele aplicații au fost dezactivate: %s",
"Already up to date" : "Deja actualizat",
"Sunday" : "Duminică",
"Monday" : "Luni",
@@ -69,9 +83,11 @@
"Oct." : "Oct.",
"Nov." : "Noi.",
"Dec." : "Dec.",
+ "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Au apărut probleme la verificarea integrității codului. Mai multe informații…</a>",
"Settings" : "Setări",
"Problem loading page, reloading in 5 seconds" : "A apărut o problemă la încărcarea paginii, se reîncearcă în 5 secunde",
"Saving..." : "Se salvează...",
+ "Dismiss" : "Înlătură",
"seconds ago" : "secunde în urmă",
"I know what I'm doing" : "Eu știu ce fac",
"Password can not be changed. Please contact your administrator." : "Parola nu poate fi modificată. Vă rugăm să contactați administratorul dvs.",
@@ -133,24 +149,39 @@
"access control" : "control acces",
"Could not unshare" : "Nu s-a putut elimina partajarea",
"Share details could not be loaded for this item." : "Nu s-au putut încărca detaliile de partajare pentru acest element.",
+ "An error occurred. Please try again" : "A apărut o eroare. Încearcă din nou",
"Share" : "Partajează",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Partajează cu persoane din alte instanțe ownCloud folosind sintaxa nume_utilizator@exemplu.com/owncloud",
"Share with users…" : "Partajează cu utilizatori...",
+ "Share with users or groups…" : "Partajează cu utilizatori sau grupuri...",
+ "Error removing share" : "Eroare la înlăturarea elementului partajat",
"Warning" : "Atenție",
+ "Error while sending notification" : "Eroare la trimiterea notificării",
+ "Non-existing tag #{tag}" : "Etichetă inexistentă #{tag}",
+ "restricted" : "restricționat",
"invisible" : "invizibil",
"Delete" : "Șterge",
"Rename" : "Redenumește",
+ "Collaborative tags" : "Etichete colaborative",
"The object type is not specified." : "Tipul obiectului nu este specificat.",
"Enter new" : "Introducere nou",
"Add" : "Adaugă",
"Edit tags" : "Editează etichete",
+ "No tags selected for deletion." : "Nu au fost selectate etichete pentru ștergere.",
"unknown text" : "text necunoscut",
+ "Hello world!" : "Hello world!",
"sunny" : "însorit",
+ "Hello {name}" : "Salut {name}",
"new" : "nou",
+ "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Actualizarea este în progres, părăsirea acestei pagini ar putea duce la întreruperea procesului în unele medii.",
+ "Updating to {version}" : "Actualizare la {version}",
"An error occurred." : "A apărut o eroare.",
"Please reload the page." : "Te rugăm să reîncarci pagina.",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." : "Actualizarea a eșuat! Raportați problema către <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">comunitatea ownCloud</a>.",
+ "The update was successful. There were warnings." : "Actualizarea nu a avut loc cu succes. Au existat avertismente.",
"The update was successful. Redirecting you to ownCloud now." : "Actualizare reușită. Ești redirecționat către ownCloud.",
+ "Searching other places" : "Se caută în alte locuri",
+ "No search results in other folders" : "Nu există rezultate ale căutării în alte directoare",
"Personal" : "Personal",
"Users" : "Utilizatori",
"Apps" : "Aplicații",
@@ -158,8 +189,12 @@
"Help" : "Ajutor",
"Access forbidden" : "Acces restricționat",
"File not found" : "Fișierul nu a fost găsit",
+ "The specified document has not been found on the server." : "Documentul specificat nu a fost găsit pe server.",
+ "You can click here to return to %s." : "Poți da click aici pentru a te întoarce la %s.",
"The share will expire on %s." : "Partajarea va expira în data de %s.",
"Cheers!" : "Noroc!",
+ "Internal Server Error" : "Eroare internă a serverului",
+ "The server encountered an internal error and was unable to complete your request." : "Serverul a întâmpinat o eroare și nu îți poate îndeplini cererea.",
"Technical details" : "Detalii tehnice",
"Type: %s" : "Tip: %s",
"Code: %s" : "Cod: %s",
@@ -188,16 +223,35 @@
"See the documentation" : "Vezi documentația",
"Log out" : "Ieșire",
"Search" : "Căutare",
+ "Please contact your administrator." : "Contactează-ți administratorul.",
"An internal error occurred." : "A apărut o eroare internă.",
+ "Please try again or contact your administrator." : "Încearcă din nou sau contactează-ți administratorul.",
"Username or email" : "Nume de utilizator sau adresă email",
"Log in" : "Autentificare",
+ "Wrong password. Reset it?" : "Parolă greșită. O resetezi?",
+ "Wrong password." : "Parolă greșită.",
+ "Stay logged in" : "Rămâi autentificat",
"Alternative Logins" : "Conectări alternative",
"Use the following link to reset your password: {link}" : "Folosește următorul link pentru a reseta parola: {link}",
"New password" : "Noua parolă",
"New Password" : "Noua parolă",
"Reset password" : "Resetează parola",
"Thank you for your patience." : "Îți mulțumim pentru răbdare.",
+ "Two-step verification" : "Verificare în doi pași",
+ "Cancel login" : "Anulează autentificarea",
+ "Please authenticate using the selected factor." : "Autentifică-te folosind factorul ales.",
+ "An error occured while verifying the token" : "A apărut o eroare la verificarea jetonului",
"You are accessing the server from an untrusted domain." : "Accesezi serverul dintr-un domeniu care nu a fost configurat ca fiind de încredere.",
- "Start update" : "Începe actualizarea"
+ "Add \"%s\" as trusted domain" : "Adaugă \"%s\" ca domeniu de încredere",
+ "App update required" : "E necesară o actualizare a aplicației",
+ "%s will be updated to version %s" : "%s va fi actualizat la versiunea %s",
+ "These apps will be updated:" : "Aceste aplicații vor fi actualizate:",
+ "These incompatible apps will be disabled:" : "Aceste aplicații incompatibile vor fi dezactivate:",
+ "The theme %s has been disabled." : "Tema %s a fost dezactivată.",
+ "Start update" : "Începe actualizarea",
+ "Detailed logs" : "Loguri detaliate",
+ "Update needed" : "E necesară actualizarea",
+ "Please use the command line updater because you have a big instance." : "Folosește actualizarea din linia de comandă deoarece ai o instanță mare.",
+ "This %s instance is currently in maintenance mode, which may take a while." : "Instanța %s este acum în modul de mentenanță, ceea ce ar putea dura o vreme."
},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"
} \ No newline at end of file
diff --git a/core/l10n/ru.js b/core/l10n/ru.js
index 398fe84160f..619d007c851 100644
--- a/core/l10n/ru.js
+++ b/core/l10n/ru.js
@@ -298,6 +298,7 @@ OC.L10N.register(
"Thank you for your patience." : "Спасибо за терпение.",
"Two-step verification" : "Двухшаговая проверка",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Для вашей учётной записи включена повышенная безопасность. Пожалуйста, аутентифицируйтесь через второй фактор.",
+ "Cancel login" : "Отменить вход",
"Please authenticate using the selected factor." : "Пожалуйста, аутентифицируйтесь выбранным фактором.",
"An error occured while verifying the token" : "При проверке токена возникла ошибка.",
"You are accessing the server from an untrusted domain." : "Вы пытаетесь получить доступ к серверу с недоверенного домена.",
diff --git a/core/l10n/ru.json b/core/l10n/ru.json
index fb4bf2a1052..9fe8d22feae 100644
--- a/core/l10n/ru.json
+++ b/core/l10n/ru.json
@@ -296,6 +296,7 @@
"Thank you for your patience." : "Спасибо за терпение.",
"Two-step verification" : "Двухшаговая проверка",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Для вашей учётной записи включена повышенная безопасность. Пожалуйста, аутентифицируйтесь через второй фактор.",
+ "Cancel login" : "Отменить вход",
"Please authenticate using the selected factor." : "Пожалуйста, аутентифицируйтесь выбранным фактором.",
"An error occured while verifying the token" : "При проверке токена возникла ошибка.",
"You are accessing the server from an untrusted domain." : "Вы пытаетесь получить доступ к серверу с недоверенного домена.",
diff --git a/core/l10n/sl.js b/core/l10n/sl.js
index 0e105dec45e..7481a2df970 100644
--- a/core/l10n/sl.js
+++ b/core/l10n/sl.js
@@ -192,6 +192,7 @@ OC.L10N.register(
"Warning" : "Opozorilo",
"Error while sending notification" : "Napaka med pošiljanjem obvestila",
"Non-existing tag #{tag}" : "Neobstoječa oznaka #{tag}",
+ "restricted" : "omejeno",
"invisible" : "nevidno",
"({scope})" : "({scope})",
"Delete" : "Izbriši",
@@ -291,6 +292,7 @@ OC.L10N.register(
"This means only administrators can use the instance." : "To pomeni, da lahko oblak uporabljajo le osebe s skrbniškimi dovoljenji.",
"Contact your system administrator if this message persists or appeared unexpectedly." : "Stopite v stik s skrbnikom sistema, če se bo sporočilo še naprej nepričakovano prikazovalo.",
"Thank you for your patience." : "Hvala za potrpežljivost!",
+ "Two-step verification" : "Dvostopenjsko overjanje",
"You are accessing the server from an untrusted domain." : "Trenutno je vzpostavljena povezava s strežnikom preko ne-varne domene.",
"Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Glede na nastavitve bi lahko kot skrbnik uporabili spodnji gumb in domeno ročno določili kot varno.",
"Add \"%s\" as trusted domain" : "Dodaj \"%s\" kot varno domeno",
diff --git a/core/l10n/sl.json b/core/l10n/sl.json
index 495cef55eab..bf1a36f731e 100644
--- a/core/l10n/sl.json
+++ b/core/l10n/sl.json
@@ -190,6 +190,7 @@
"Warning" : "Opozorilo",
"Error while sending notification" : "Napaka med pošiljanjem obvestila",
"Non-existing tag #{tag}" : "Neobstoječa oznaka #{tag}",
+ "restricted" : "omejeno",
"invisible" : "nevidno",
"({scope})" : "({scope})",
"Delete" : "Izbriši",
@@ -289,6 +290,7 @@
"This means only administrators can use the instance." : "To pomeni, da lahko oblak uporabljajo le osebe s skrbniškimi dovoljenji.",
"Contact your system administrator if this message persists or appeared unexpectedly." : "Stopite v stik s skrbnikom sistema, če se bo sporočilo še naprej nepričakovano prikazovalo.",
"Thank you for your patience." : "Hvala za potrpežljivost!",
+ "Two-step verification" : "Dvostopenjsko overjanje",
"You are accessing the server from an untrusted domain." : "Trenutno je vzpostavljena povezava s strežnikom preko ne-varne domene.",
"Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Glede na nastavitve bi lahko kot skrbnik uporabili spodnji gumb in domeno ročno določili kot varno.",
"Add \"%s\" as trusted domain" : "Dodaj \"%s\" kot varno domeno",
diff --git a/core/l10n/sq.js b/core/l10n/sq.js
index 06da819b5a0..049f33d3355 100644
--- a/core/l10n/sq.js
+++ b/core/l10n/sq.js
@@ -298,6 +298,7 @@ OC.L10N.register(
"Thank you for your patience." : "Ju faleminderit për durimin.",
"Two-step verification" : "Verifikim dyhapësh",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Siguria e zgjeruar është aktivizuar për llogarinë tuaj. Ju lutemi, bëni mirëfilltësimin duke përdorur një faktor të dytë.",
+ "Cancel login" : "Anuloje hyrjen",
"Please authenticate using the selected factor." : "Ju lutemi, bëni mirëfilltësimin duke përdorur faktorin e përzgjedhur.",
"An error occured while verifying the token" : "Ndodhi një gabim gjatë verifikimit të token-it",
"You are accessing the server from an untrusted domain." : "Po hyni në shërbyes nga një përkatësi jo e besuar.",
diff --git a/core/l10n/sq.json b/core/l10n/sq.json
index 91d40b34e97..d6dee599bf7 100644
--- a/core/l10n/sq.json
+++ b/core/l10n/sq.json
@@ -296,6 +296,7 @@
"Thank you for your patience." : "Ju faleminderit për durimin.",
"Two-step verification" : "Verifikim dyhapësh",
"Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Siguria e zgjeruar është aktivizuar për llogarinë tuaj. Ju lutemi, bëni mirëfilltësimin duke përdorur një faktor të dytë.",
+ "Cancel login" : "Anuloje hyrjen",
"Please authenticate using the selected factor." : "Ju lutemi, bëni mirëfilltësimin duke përdorur faktorin e përzgjedhur.",
"An error occured while verifying the token" : "Ndodhi një gabim gjatë verifikimit të token-it",
"You are accessing the server from an untrusted domain." : "Po hyni në shërbyes nga një përkatësi jo e besuar.",
diff --git a/core/templates/twofactorselectchallenge.php b/core/templates/twofactorselectchallenge.php
index 14d599aab3e..4209beac4e6 100644
--- a/core/templates/twofactorselectchallenge.php
+++ b/core/templates/twofactorselectchallenge.php
@@ -18,4 +18,5 @@
</li>
<?php endforeach; ?>
</ul>
-</fieldset> \ No newline at end of file
+</fieldset>
+<a class="two-factor-cancel" <?php print_unescaped($_['logout_attribute']); ?>><?php p($l->t('Cancel login')) ?></a>
diff --git a/core/templates/twofactorshowchallenge.php b/core/templates/twofactorshowchallenge.php
index 66f5ed312ec..c5ee9aca4b4 100644
--- a/core/templates/twofactorshowchallenge.php
+++ b/core/templates/twofactorshowchallenge.php
@@ -17,3 +17,4 @@ $template = $_['template'];
<span class="warning"><?php p($l->t('An error occured while verifying the token')); ?></span>
<?php endif; ?>
<?php print_unescaped($template); ?>
+<a class="two-factor-cancel" <?php print_unescaped($_['logout_attribute']); ?>><?php p($l->t('Cancel login')) ?></a>
diff --git a/lib/l10n/ar.js b/lib/l10n/ar.js
index 21a67883ac3..a7a3e4e4c31 100644
--- a/lib/l10n/ar.js
+++ b/lib/l10n/ar.js
@@ -1,18 +1,46 @@
OC.L10N.register(
"lib",
{
+ "Cannot write into \"config\" directory!" : "الكتابة في مجلد \"config\" غير ممكنة!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "يمكن حل هذا عادة بإعطاء خادم الوب صلاحية الكتابة في مجلد config",
+ "See %s" : "أنظر %s",
+ "Sample configuration detected" : "تم اكتشاف إعدادات عيّنة",
+ "PHP %s or higher is required." : "إصدار PHP %s أو أحدث منه مطلوب.",
+ "PHP with a version lower than %s is required." : "PHP الإصدار %s أو أقل مطلوب.",
+ "%sbit or higher PHP required." : "مكتبات PHP ذات %s بت أو أعلى مطلوبة.",
+ "Following databases are supported: %s" : "قواعد البيانات التالية مدعومة: %s",
+ "The command line tool %s could not be found" : "لم يتم العثور على أداة سطر الأوامر %s",
+ "The library %s is not available." : "مكتبة %s غير متوفرة.",
"Unknown filetype" : "نوع الملف غير معروف",
"Invalid image" : "الصورة غير صالحة",
"today" : "اليوم",
"yesterday" : "يوم أمس",
+ "_%n day ago_::_%n days ago_" : ["قبل ساعات","قبل يوم","قبل يومين","قبل %n يوماً","قبل %n يوماً","قبل %n يوماً"],
"last month" : "الشهر الماضي",
+ "_%n month ago_::_%n months ago_" : ["قبل عدة أيام","قبل شهر","قبل شهرين","قبل %n شهراً","قبل %n شهراً","قبل %n شهراً"],
"last year" : "السنةالماضية",
"seconds ago" : "منذ ثواني",
+ "Empty filename is not allowed" : "لا يسمح بأسماء فارغة للملفات",
+ "4-byte characters are not supported in file names" : "المحارف ذات 4 بايت غير مسموح بها في أسماء الملفات",
+ "File name is a reserved word" : "اسم الملف كلمة محجوزة",
+ "File name contains at least one invalid character" : "اسم الملف به ، على الأقل ، حرف غير صالح",
+ "File name is too long" : "اسم الملف طويل جداً",
"App directory already exists" : "مجلد التطبيق موجود مسبقا",
"Can't create app folder. Please fix permissions. %s" : "لا يمكن إنشاء مجلد التطبيق. يرجى تعديل الصلاحيات. %s",
+ "Archive does not contain a directory named %s" : "الأرشيف لا يحتوي مجلداً اسمه %s",
"No source specified when installing app" : "لم يتم تحديد المصدر عن تثبيت البرنامج",
+ "No href specified when installing app from http" : "لم يتم تحديد href عند تثبيت التطبيق من http",
+ "No path specified when installing app from local file" : "لم يتم تحديد مسار عند تثبيت التطبيق من ملف محلّي",
"Archives of type %s are not supported" : "الأرشيفات من نوع %s غير مدعومة",
+ "Failed to open archive when installing app" : "فشل فتح الأرشيف أثناء تثبيت التطبيق",
"App does not provide an info.xml file" : "التطبيق لا يتوفر على ملف info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "لا يمكن تثبيت التطبيق لأن ملف appinfo غير ممكنة قراءته.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "لم يتم التحقق من التوقيع. فضلاً اتصل بمطوّر التطبيق و تحقق من شاشة الإدارة في حسابك.",
+ "App can't be installed because of not allowed code in the App" : "لم يتم تثبيت التطبيق لوجود شفرة غير مسموح بها في التطبيق",
+ "App can't be installed because it is not compatible with this version of ownCloud" : "لم يتم تثبيت التطبيق لأنه غير متوافق مع هذا الإصدار من ownCloud",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "لم يتم تثبيت التطبيق لأن به علامة <shipped>true</shipped> التي لايسمح بها في التطبيقات غير المشحونة",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "لم يتم تثبيت التطبيق لأن الإصدار في info.xml مختلف عن الإصدار المذكور في متجر التطبيقات",
+ "%s enter the database username and name." : "%s أدخِل اسم قاعدة البيانات واسم مستخدمها.",
"%s enter the database username." : "%s ادخل اسم المستخدم الخاص بقاعدة البيانات.",
"%s enter the database name." : "%s ادخل اسم فاعدة البيانات",
"%s you may not use dots in the database name" : "%s لا يسمح لك باستخدام نقطه (.) في اسم قاعدة البيانات",
@@ -23,9 +51,20 @@ OC.L10N.register(
"You need to enter either an existing account or the administrator." : "انت بحاجة لكتابة اسم مستخدم موجود أو حساب المدير.",
"Offending command was: \"%s\", name: %s, password: %s" : "الأمر المخالف كان : \"%s\", اسم المستخدم : %s, كلمة المرور: %s",
"PostgreSQL username and/or password not valid" : "اسم المستخدم / أو كلمة المرور الخاصة بـPostgreSQL غير صحيحة",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "نظام ماك الإصدار X غير مدعوم و %s لن يعمل بشكل صحيح على هذه المنصة. استخدمه على مسؤوليتك!",
+ "For the best results, please consider using a GNU/Linux server instead." : "فضلاً ضع في الاعتبار استخدام نظام GNU/Linux بدل الأنظمة الأخرى للحصول على أفضل النتائج.",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "فضلاً إحذف إعداد open_basedir من ملف php.ini لديك أو حوّل إلى PHP إصدار 64 بت.",
"Set an admin username." : "اعداد اسم مستخدم للمدير",
"Set an admin password." : "اعداد كلمة مرور للمدير",
+ "Can't create or write into the data directory %s" : "لا يمكن الإنشاء أو الكتابة في مجلد البيانات %s",
+ "Invalid Federated Cloud ID" : "معرّف سحابة الاتحاد غير صالح",
"%s shared »%s« with you" : "%s شارك »%s« معك",
+ "%s via %s" : "%s عبر %s",
+ "Sharing %s failed, because the file does not exist" : "فشلت مشاركة %s فالملف غير موجود",
+ "You are not allowed to share %s" : "أنت غير مسموح لك أن تشارك %s",
+ "Sharing %s failed, because you can not share with yourself" : "فشلت مشاركة %s لأنك لايمكنك المشاركة مع نفسك",
+ "Sharing %s failed, because the user %s does not exist" : "فشلت مشاركة %s لأن المستخدم %s غير موجود",
+ "Share type %s is not valid for %s" : "مشاركة النوع %s غير صالحة لـ %s",
"Could not find category \"%s\"" : "تعذر العثور على المجلد \"%s\"",
"Apps" : "التطبيقات",
"A valid username must be provided" : "يجب ادخال اسم مستخدم صحيح",
diff --git a/lib/l10n/ar.json b/lib/l10n/ar.json
index eb91606bb52..86284a03538 100644
--- a/lib/l10n/ar.json
+++ b/lib/l10n/ar.json
@@ -1,16 +1,44 @@
{ "translations": {
+ "Cannot write into \"config\" directory!" : "الكتابة في مجلد \"config\" غير ممكنة!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "يمكن حل هذا عادة بإعطاء خادم الوب صلاحية الكتابة في مجلد config",
+ "See %s" : "أنظر %s",
+ "Sample configuration detected" : "تم اكتشاف إعدادات عيّنة",
+ "PHP %s or higher is required." : "إصدار PHP %s أو أحدث منه مطلوب.",
+ "PHP with a version lower than %s is required." : "PHP الإصدار %s أو أقل مطلوب.",
+ "%sbit or higher PHP required." : "مكتبات PHP ذات %s بت أو أعلى مطلوبة.",
+ "Following databases are supported: %s" : "قواعد البيانات التالية مدعومة: %s",
+ "The command line tool %s could not be found" : "لم يتم العثور على أداة سطر الأوامر %s",
+ "The library %s is not available." : "مكتبة %s غير متوفرة.",
"Unknown filetype" : "نوع الملف غير معروف",
"Invalid image" : "الصورة غير صالحة",
"today" : "اليوم",
"yesterday" : "يوم أمس",
+ "_%n day ago_::_%n days ago_" : ["قبل ساعات","قبل يوم","قبل يومين","قبل %n يوماً","قبل %n يوماً","قبل %n يوماً"],
"last month" : "الشهر الماضي",
+ "_%n month ago_::_%n months ago_" : ["قبل عدة أيام","قبل شهر","قبل شهرين","قبل %n شهراً","قبل %n شهراً","قبل %n شهراً"],
"last year" : "السنةالماضية",
"seconds ago" : "منذ ثواني",
+ "Empty filename is not allowed" : "لا يسمح بأسماء فارغة للملفات",
+ "4-byte characters are not supported in file names" : "المحارف ذات 4 بايت غير مسموح بها في أسماء الملفات",
+ "File name is a reserved word" : "اسم الملف كلمة محجوزة",
+ "File name contains at least one invalid character" : "اسم الملف به ، على الأقل ، حرف غير صالح",
+ "File name is too long" : "اسم الملف طويل جداً",
"App directory already exists" : "مجلد التطبيق موجود مسبقا",
"Can't create app folder. Please fix permissions. %s" : "لا يمكن إنشاء مجلد التطبيق. يرجى تعديل الصلاحيات. %s",
+ "Archive does not contain a directory named %s" : "الأرشيف لا يحتوي مجلداً اسمه %s",
"No source specified when installing app" : "لم يتم تحديد المصدر عن تثبيت البرنامج",
+ "No href specified when installing app from http" : "لم يتم تحديد href عند تثبيت التطبيق من http",
+ "No path specified when installing app from local file" : "لم يتم تحديد مسار عند تثبيت التطبيق من ملف محلّي",
"Archives of type %s are not supported" : "الأرشيفات من نوع %s غير مدعومة",
+ "Failed to open archive when installing app" : "فشل فتح الأرشيف أثناء تثبيت التطبيق",
"App does not provide an info.xml file" : "التطبيق لا يتوفر على ملف info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "لا يمكن تثبيت التطبيق لأن ملف appinfo غير ممكنة قراءته.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "لم يتم التحقق من التوقيع. فضلاً اتصل بمطوّر التطبيق و تحقق من شاشة الإدارة في حسابك.",
+ "App can't be installed because of not allowed code in the App" : "لم يتم تثبيت التطبيق لوجود شفرة غير مسموح بها في التطبيق",
+ "App can't be installed because it is not compatible with this version of ownCloud" : "لم يتم تثبيت التطبيق لأنه غير متوافق مع هذا الإصدار من ownCloud",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "لم يتم تثبيت التطبيق لأن به علامة <shipped>true</shipped> التي لايسمح بها في التطبيقات غير المشحونة",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "لم يتم تثبيت التطبيق لأن الإصدار في info.xml مختلف عن الإصدار المذكور في متجر التطبيقات",
+ "%s enter the database username and name." : "%s أدخِل اسم قاعدة البيانات واسم مستخدمها.",
"%s enter the database username." : "%s ادخل اسم المستخدم الخاص بقاعدة البيانات.",
"%s enter the database name." : "%s ادخل اسم فاعدة البيانات",
"%s you may not use dots in the database name" : "%s لا يسمح لك باستخدام نقطه (.) في اسم قاعدة البيانات",
@@ -21,9 +49,20 @@
"You need to enter either an existing account or the administrator." : "انت بحاجة لكتابة اسم مستخدم موجود أو حساب المدير.",
"Offending command was: \"%s\", name: %s, password: %s" : "الأمر المخالف كان : \"%s\", اسم المستخدم : %s, كلمة المرور: %s",
"PostgreSQL username and/or password not valid" : "اسم المستخدم / أو كلمة المرور الخاصة بـPostgreSQL غير صحيحة",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "نظام ماك الإصدار X غير مدعوم و %s لن يعمل بشكل صحيح على هذه المنصة. استخدمه على مسؤوليتك!",
+ "For the best results, please consider using a GNU/Linux server instead." : "فضلاً ضع في الاعتبار استخدام نظام GNU/Linux بدل الأنظمة الأخرى للحصول على أفضل النتائج.",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "فضلاً إحذف إعداد open_basedir من ملف php.ini لديك أو حوّل إلى PHP إصدار 64 بت.",
"Set an admin username." : "اعداد اسم مستخدم للمدير",
"Set an admin password." : "اعداد كلمة مرور للمدير",
+ "Can't create or write into the data directory %s" : "لا يمكن الإنشاء أو الكتابة في مجلد البيانات %s",
+ "Invalid Federated Cloud ID" : "معرّف سحابة الاتحاد غير صالح",
"%s shared »%s« with you" : "%s شارك »%s« معك",
+ "%s via %s" : "%s عبر %s",
+ "Sharing %s failed, because the file does not exist" : "فشلت مشاركة %s فالملف غير موجود",
+ "You are not allowed to share %s" : "أنت غير مسموح لك أن تشارك %s",
+ "Sharing %s failed, because you can not share with yourself" : "فشلت مشاركة %s لأنك لايمكنك المشاركة مع نفسك",
+ "Sharing %s failed, because the user %s does not exist" : "فشلت مشاركة %s لأن المستخدم %s غير موجود",
+ "Share type %s is not valid for %s" : "مشاركة النوع %s غير صالحة لـ %s",
"Could not find category \"%s\"" : "تعذر العثور على المجلد \"%s\"",
"Apps" : "التطبيقات",
"A valid username must be provided" : "يجب ادخال اسم مستخدم صحيح",
diff --git a/lib/l10n/cs_CZ.js b/lib/l10n/cs_CZ.js
index 8074111faed..92cb8d68e2c 100644
--- a/lib/l10n/cs_CZ.js
+++ b/lib/l10n/cs_CZ.js
@@ -167,8 +167,6 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Nekompletní konfigurace úložiště. %s",
"Storage connection error. %s" : "Chyba připojení úložiště. %s",
"Storage not available" : "Úložiště není dostupné",
- "Storage connection timeout. %s" : "Vypršení připojení k úložišti. %s",
- "_%n file_::_%n files_" : ["%n soubor","%n soubory","%n souborů"],
- "_%n window_::_%n windows_" : ["%n okno","%n okna","%n oken"]
+ "Storage connection timeout. %s" : "Vypršení připojení k úložišti. %s"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/lib/l10n/cs_CZ.json b/lib/l10n/cs_CZ.json
index 1657a4b2dc0..c55c186641c 100644
--- a/lib/l10n/cs_CZ.json
+++ b/lib/l10n/cs_CZ.json
@@ -165,8 +165,6 @@
"Storage incomplete configuration. %s" : "Nekompletní konfigurace úložiště. %s",
"Storage connection error. %s" : "Chyba připojení úložiště. %s",
"Storage not available" : "Úložiště není dostupné",
- "Storage connection timeout. %s" : "Vypršení připojení k úložišti. %s",
- "_%n file_::_%n files_" : ["%n soubor","%n soubory","%n souborů"],
- "_%n window_::_%n windows_" : ["%n okno","%n okna","%n oken"]
+ "Storage connection timeout. %s" : "Vypršení připojení k úložišti. %s"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/lib/l10n/de.js b/lib/l10n/de.js
index 74f845ba6d9..ac65d37ecba 100644
--- a/lib/l10n/de.js
+++ b/lib/l10n/de.js
@@ -167,8 +167,6 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Unvollständige Konfiguration des Storage. %s",
"Storage connection error. %s" : "Verbindungsfehler zum Storage. %s",
"Storage not available" : "Speicher nicht verfügbar",
- "Storage connection timeout. %s" : "Zeitüberschreitung der Verbindung zum Storage. %s",
- "_%n file_::_%n files_" : ["%n Datei","%n Dateien"],
- "_%n window_::_%n windows_" : ["%n Fenster","%n Fenster"]
+ "Storage connection timeout. %s" : "Zeitüberschreitung der Verbindung zum Storage. %s"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/de.json b/lib/l10n/de.json
index 65bd3e97edf..97a5b59fea3 100644
--- a/lib/l10n/de.json
+++ b/lib/l10n/de.json
@@ -165,8 +165,6 @@
"Storage incomplete configuration. %s" : "Unvollständige Konfiguration des Storage. %s",
"Storage connection error. %s" : "Verbindungsfehler zum Storage. %s",
"Storage not available" : "Speicher nicht verfügbar",
- "Storage connection timeout. %s" : "Zeitüberschreitung der Verbindung zum Storage. %s",
- "_%n file_::_%n files_" : ["%n Datei","%n Dateien"],
- "_%n window_::_%n windows_" : ["%n Fenster","%n Fenster"]
+ "Storage connection timeout. %s" : "Zeitüberschreitung der Verbindung zum Storage. %s"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js
index 5e9900fd395..ab4fa068c47 100644
--- a/lib/l10n/de_DE.js
+++ b/lib/l10n/de_DE.js
@@ -167,8 +167,6 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Speicher-Konfiguration unvollständig. %s",
"Storage connection error. %s" : "Speicher-Verbindungsfehler. %s",
"Storage not available" : "Speicher nicht verfügbar",
- "Storage connection timeout. %s" : "Speicher-Verbindungszeitüberschreitung. %s",
- "_%n file_::_%n files_" : ["%n Datei","%n Dateien"],
- "_%n window_::_%n windows_" : ["%n Fenster","%n Fenster"]
+ "Storage connection timeout. %s" : "Speicher-Verbindungszeitüberschreitung. %s"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json
index 5d0114eadf1..8d3fe907524 100644
--- a/lib/l10n/de_DE.json
+++ b/lib/l10n/de_DE.json
@@ -165,8 +165,6 @@
"Storage incomplete configuration. %s" : "Speicher-Konfiguration unvollständig. %s",
"Storage connection error. %s" : "Speicher-Verbindungsfehler. %s",
"Storage not available" : "Speicher nicht verfügbar",
- "Storage connection timeout. %s" : "Speicher-Verbindungszeitüberschreitung. %s",
- "_%n file_::_%n files_" : ["%n Datei","%n Dateien"],
- "_%n window_::_%n windows_" : ["%n Fenster","%n Fenster"]
+ "Storage connection timeout. %s" : "Speicher-Verbindungszeitüberschreitung. %s"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/en_GB.js b/lib/l10n/en_GB.js
index 293b8c8cfbf..df2c1b2dd15 100644
--- a/lib/l10n/en_GB.js
+++ b/lib/l10n/en_GB.js
@@ -167,8 +167,6 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Storage incomplete configuration. %s",
"Storage connection error. %s" : "Storage connection error. %s",
"Storage not available" : "Storage not available",
- "Storage connection timeout. %s" : "Storage connection timeout. %s",
- "_%n file_::_%n files_" : ["%n file","%n files"],
- "_%n window_::_%n windows_" : ["%n window","%n windows"]
+ "Storage connection timeout. %s" : "Storage connection timeout. %s"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/en_GB.json b/lib/l10n/en_GB.json
index 13383016924..7b92825e7d2 100644
--- a/lib/l10n/en_GB.json
+++ b/lib/l10n/en_GB.json
@@ -165,8 +165,6 @@
"Storage incomplete configuration. %s" : "Storage incomplete configuration. %s",
"Storage connection error. %s" : "Storage connection error. %s",
"Storage not available" : "Storage not available",
- "Storage connection timeout. %s" : "Storage connection timeout. %s",
- "_%n file_::_%n files_" : ["%n file","%n files"],
- "_%n window_::_%n windows_" : ["%n window","%n windows"]
+ "Storage connection timeout. %s" : "Storage connection timeout. %s"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/es.js b/lib/l10n/es.js
index dbf8ba89b48..9e108b52ec7 100644
--- a/lib/l10n/es.js
+++ b/lib/l10n/es.js
@@ -167,8 +167,6 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Configuración de almacenamiento incompleta. %s",
"Storage connection error. %s" : "Error de conexión de almacenamiento. %s",
"Storage not available" : "Almacenamiento no disponible",
- "Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s",
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "_%n window_::_%n windows_" : ["%n window","%n windows"]
+ "Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/es.json b/lib/l10n/es.json
index 723d8699949..36f8a63c317 100644
--- a/lib/l10n/es.json
+++ b/lib/l10n/es.json
@@ -165,8 +165,6 @@
"Storage incomplete configuration. %s" : "Configuración de almacenamiento incompleta. %s",
"Storage connection error. %s" : "Error de conexión de almacenamiento. %s",
"Storage not available" : "Almacenamiento no disponible",
- "Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s",
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "_%n window_::_%n windows_" : ["%n window","%n windows"]
+ "Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/fi_FI.js b/lib/l10n/fi_FI.js
index b82b6a7b513..11e50686a15 100644
--- a/lib/l10n/fi_FI.js
+++ b/lib/l10n/fi_FI.js
@@ -146,8 +146,6 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Tallennustilan puutteellinen määritys. %s",
"Storage connection error. %s" : "Tallennustilan yhteysvirhe. %s",
"Storage not available" : "Tallennustila ei ole käytettävissä",
- "Storage connection timeout. %s" : "Tallennustilan yhteyden aikakatkaisu. %s",
- "_%n file_::_%n files_" : ["%n tiedosto","%n tiedostoa"],
- "_%n window_::_%n windows_" : ["%n ikkuna","%n ikkunaa"]
+ "Storage connection timeout. %s" : "Tallennustilan yhteyden aikakatkaisu. %s"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/fi_FI.json b/lib/l10n/fi_FI.json
index 4bdddef1c57..f1c35d271f2 100644
--- a/lib/l10n/fi_FI.json
+++ b/lib/l10n/fi_FI.json
@@ -144,8 +144,6 @@
"Storage incomplete configuration. %s" : "Tallennustilan puutteellinen määritys. %s",
"Storage connection error. %s" : "Tallennustilan yhteysvirhe. %s",
"Storage not available" : "Tallennustila ei ole käytettävissä",
- "Storage connection timeout. %s" : "Tallennustilan yhteyden aikakatkaisu. %s",
- "_%n file_::_%n files_" : ["%n tiedosto","%n tiedostoa"],
- "_%n window_::_%n windows_" : ["%n ikkuna","%n ikkunaa"]
+ "Storage connection timeout. %s" : "Tallennustilan yhteyden aikakatkaisu. %s"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js
index e49d9acf0c2..78f0edfa41d 100644
--- a/lib/l10n/fr.js
+++ b/lib/l10n/fr.js
@@ -167,7 +167,6 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Configuration de l'espace de stockage incomplète. %s",
"Storage connection error. %s" : "Erreur de connexion à l'espace stockage. %s",
"Storage not available" : "Support de stockage non disponible",
- "Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s",
- "_%n file_::_%n files_" : ["%n fichier","%n fichiers"]
+ "Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s"
},
"nplurals=2; plural=(n > 1);");
diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json
index 0f8967f57e2..6ccd58b4ed1 100644
--- a/lib/l10n/fr.json
+++ b/lib/l10n/fr.json
@@ -165,7 +165,6 @@
"Storage incomplete configuration. %s" : "Configuration de l'espace de stockage incomplète. %s",
"Storage connection error. %s" : "Erreur de connexion à l'espace stockage. %s",
"Storage not available" : "Support de stockage non disponible",
- "Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s",
- "_%n file_::_%n files_" : ["%n fichier","%n fichiers"]
+ "Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/lib/l10n/it.js b/lib/l10n/it.js
index fbc26530db4..ca940ac94c5 100644
--- a/lib/l10n/it.js
+++ b/lib/l10n/it.js
@@ -167,8 +167,6 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Configurazione dell'archiviazione incompleta.%s",
"Storage connection error. %s" : "Errore di connessione all'archiviazione. %s",
"Storage not available" : "Archiviazione non disponibile",
- "Storage connection timeout. %s" : "Timeout di connessione all'archiviazione. %s",
- "_%n file_::_%n files_" : ["%n file","%n file"],
- "_%n window_::_%n windows_" : ["%n finestra","%n finestre"]
+ "Storage connection timeout. %s" : "Timeout di connessione all'archiviazione. %s"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/it.json b/lib/l10n/it.json
index 3955bf27508..f74f2e818ab 100644
--- a/lib/l10n/it.json
+++ b/lib/l10n/it.json
@@ -165,8 +165,6 @@
"Storage incomplete configuration. %s" : "Configurazione dell'archiviazione incompleta.%s",
"Storage connection error. %s" : "Errore di connessione all'archiviazione. %s",
"Storage not available" : "Archiviazione non disponibile",
- "Storage connection timeout. %s" : "Timeout di connessione all'archiviazione. %s",
- "_%n file_::_%n files_" : ["%n file","%n file"],
- "_%n window_::_%n windows_" : ["%n finestra","%n finestre"]
+ "Storage connection timeout. %s" : "Timeout di connessione all'archiviazione. %s"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js
index b5d501bd115..661f8ad96fb 100644
--- a/lib/l10n/ja.js
+++ b/lib/l10n/ja.js
@@ -167,8 +167,6 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "設定が未完了のストレージです。 %s",
"Storage connection error. %s" : "ストレージへの接続エラー。 %s",
"Storage not available" : "ストレージが利用できません",
- "Storage connection timeout. %s" : "ストレージへの接続がタイムアウト。 %s",
- "_%n file_::_%n files_" : ["%n ファイル"],
- "_%n window_::_%n windows_" : ["%n ウィンドウ"]
+ "Storage connection timeout. %s" : "ストレージへの接続がタイムアウト。 %s"
},
"nplurals=1; plural=0;");
diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json
index 6f23dc07308..a3fc2514eb8 100644
--- a/lib/l10n/ja.json
+++ b/lib/l10n/ja.json
@@ -165,8 +165,6 @@
"Storage incomplete configuration. %s" : "設定が未完了のストレージです。 %s",
"Storage connection error. %s" : "ストレージへの接続エラー。 %s",
"Storage not available" : "ストレージが利用できません",
- "Storage connection timeout. %s" : "ストレージへの接続がタイムアウト。 %s",
- "_%n file_::_%n files_" : ["%n ファイル"],
- "_%n window_::_%n windows_" : ["%n ウィンドウ"]
+ "Storage connection timeout. %s" : "ストレージへの接続がタイムアウト。 %s"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/lib/l10n/pl.js b/lib/l10n/pl.js
index 3124a335261..1a36e960779 100644
--- a/lib/l10n/pl.js
+++ b/lib/l10n/pl.js
@@ -30,6 +30,7 @@ OC.L10N.register(
"_%n minute ago_::_%n minutes ago_" : ["%n minute temu","%n minut temu","%n minut temu"],
"seconds ago" : "sekund temu",
"Empty filename is not allowed" : "Pusta nazwa nie jest dozwolona.",
+ "4-byte characters are not supported in file names" : "Znaki 4-bajtowe są niedozwolone w nazwach plików",
"File name contains at least one invalid character" : "Nazwa pliku zawiera co najmniej jeden nieprawidłowy znak",
"File name is too long" : "Nazwa pliku zbyt długa",
"App directory already exists" : "Katalog aplikacji już isnieje",
diff --git a/lib/l10n/pl.json b/lib/l10n/pl.json
index bbb4cc7b5ea..048530779e1 100644
--- a/lib/l10n/pl.json
+++ b/lib/l10n/pl.json
@@ -28,6 +28,7 @@
"_%n minute ago_::_%n minutes ago_" : ["%n minute temu","%n minut temu","%n minut temu"],
"seconds ago" : "sekund temu",
"Empty filename is not allowed" : "Pusta nazwa nie jest dozwolona.",
+ "4-byte characters are not supported in file names" : "Znaki 4-bajtowe są niedozwolone w nazwach plików",
"File name contains at least one invalid character" : "Nazwa pliku zawiera co najmniej jeden nieprawidłowy znak",
"File name is too long" : "Nazwa pliku zbyt długa",
"App directory already exists" : "Katalog aplikacji już isnieje",
diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js
index 379bd79d5b0..dd33cb7b1c3 100644
--- a/lib/l10n/pt_BR.js
+++ b/lib/l10n/pt_BR.js
@@ -167,8 +167,6 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Incompleta configuração de armazenamento. %s",
"Storage connection error. %s" : "Erro na conexão de armazenamento. %s",
"Storage not available" : "Armazanamento não disponível",
- "Storage connection timeout. %s" : "Tempo limite de conexão de armazenamento. %s",
- "_%n file_::_%n files_" : ["%n arquivo","%n arquivos"],
- "_%n window_::_%n windows_" : ["%n janela","%n janelas"]
+ "Storage connection timeout. %s" : "Tempo limite de conexão de armazenamento. %s"
},
"nplurals=2; plural=(n > 1);");
diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json
index 8643c703184..7bcb4f5a267 100644
--- a/lib/l10n/pt_BR.json
+++ b/lib/l10n/pt_BR.json
@@ -165,8 +165,6 @@
"Storage incomplete configuration. %s" : "Incompleta configuração de armazenamento. %s",
"Storage connection error. %s" : "Erro na conexão de armazenamento. %s",
"Storage not available" : "Armazanamento não disponível",
- "Storage connection timeout. %s" : "Tempo limite de conexão de armazenamento. %s",
- "_%n file_::_%n files_" : ["%n arquivo","%n arquivos"],
- "_%n window_::_%n windows_" : ["%n janela","%n janelas"]
+ "Storage connection timeout. %s" : "Tempo limite de conexão de armazenamento. %s"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/lib/l10n/pt_PT.js b/lib/l10n/pt_PT.js
index 26b54247765..f069531895d 100644
--- a/lib/l10n/pt_PT.js
+++ b/lib/l10n/pt_PT.js
@@ -1,29 +1,29 @@
OC.L10N.register(
"lib",
{
- "Cannot write into \"config\" directory!" : "Não é possível gravar na directoria \"configurar\"!",
- "This can usually be fixed by giving the webserver write access to the config directory" : "Isto pode ser resolvido normalmente dando ao servidor web direitos de escrita ao directório de configuração",
+ "Cannot write into \"config\" directory!" : "Não é possível gravar na diretoria \"configurar\"!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "Isto normalmente pode ser resolvido, dando ao servidor da Web direitos de gravação para a diretoria de configuração",
"See %s" : "Ver %s",
- "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Isto pode ser resolvido normalmente %sdando priviégios de escrita no directório de configuração ao serviço web%s.",
- "Sample configuration detected" : "Exemplo de configuração detectada",
+ "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Isto normalmente pode ser resolvido, %sdando ao servidor da Web acesso de gravação para a diretoria de configuração %s.",
+ "Sample configuration detected" : "Detetado exemplo de configuração",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Foi detectado que a configuração de amostra foi copiada. Isso pode danificar a sua instalação e não é suportado. Por favor, leia a documentação antes de realizar mudanças no config.php",
- "PHP %s or higher is required." : "Necessário PHP %s ou maior.",
+ "PHP %s or higher is required." : "Necessário PHP %s ou superior.",
"PHP with a version lower than %s is required." : "É necessário um PHP com uma versão inferir a %s.",
- "%sbit or higher PHP required." : "HÃ???????.",
- "Following databases are supported: %s" : "As seguintes bases de dados são suportadas: %s",
- "The command line tool %s could not be found" : "A ferramenta de linha de comento %s não foi encontrada",
+ "%sbit or higher PHP required." : "Necessário PHP %sbit ou superior.",
+ "Following databases are supported: %s" : "São suportadas as seguintes bases de dados: %s",
+ "The command line tool %s could not be found" : "Não foi encontrada a ferramenta de linha de comando %s",
"The library %s is not available." : "A biblioteca %s não está disponível.",
- "Library %s with a version higher than %s is required - available version %s." : "É necessário que a biblioteca %s tenha uma versão superior a %s - versão disponível: %s.",
- "Library %s with a version lower than %s is required - available version %s." : "É necessário que a biblioteca %s tenha uma versão inferior a %s - versão disponível: %s.",
- "Following platforms are supported: %s" : "As seguintes plataformas são suportadas: %s",
+ "Library %s with a version higher than %s is required - available version %s." : "É necessário a biblioteca %s com uma versão superior a %s - versão disponível: %s.",
+ "Library %s with a version lower than %s is required - available version %s." : "É necessário a biblioteca %s com uma versão inferior a %s - versão disponível: %s.",
+ "Following platforms are supported: %s" : "São suportadas as seguintes plataformas: %s",
"ownCloud %s or higher is required." : "É necessário ownCloud %s ou superior.",
"ownCloud %s or lower is required." : "É necessário ownCloud %s ou inferior.",
- "Unknown filetype" : "Ficheiro desconhecido",
+ "Unknown filetype" : "Tipo de ficheiro desconhecido",
"Invalid image" : "Imagem inválida",
"today" : "hoje",
"yesterday" : "ontem",
"_%n day ago_::_%n days ago_" : ["%n dia atrás","%n dias atrás"],
- "last month" : "ultímo mês",
+ "last month" : "ultimo mês",
"last year" : "ano passado",
"_%n year ago_::_%n years ago_" : ["%n ano atrás","%n anos atrás"],
"seconds ago" : "Minutos atrás",
@@ -164,8 +164,6 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Configuração incompleta do armazenamento. %s",
"Storage connection error. %s" : "Erro de ligação ao armazenamento. %s",
"Storage not available" : "Armazenamento indisposinvel",
- "Storage connection timeout. %s" : "Tempo de ligação ao armazenamento expirou. %s",
- "_%n file_::_%n files_" : ["%n ficheiro","%n ficheiros"],
- "_%n window_::_%n windows_" : ["%n janela","%n janelas"]
+ "Storage connection timeout. %s" : "Tempo de ligação ao armazenamento expirou. %s"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/pt_PT.json b/lib/l10n/pt_PT.json
index 16021456764..55492d0f14c 100644
--- a/lib/l10n/pt_PT.json
+++ b/lib/l10n/pt_PT.json
@@ -1,27 +1,27 @@
{ "translations": {
- "Cannot write into \"config\" directory!" : "Não é possível gravar na directoria \"configurar\"!",
- "This can usually be fixed by giving the webserver write access to the config directory" : "Isto pode ser resolvido normalmente dando ao servidor web direitos de escrita ao directório de configuração",
+ "Cannot write into \"config\" directory!" : "Não é possível gravar na diretoria \"configurar\"!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "Isto normalmente pode ser resolvido, dando ao servidor da Web direitos de gravação para a diretoria de configuração",
"See %s" : "Ver %s",
- "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Isto pode ser resolvido normalmente %sdando priviégios de escrita no directório de configuração ao serviço web%s.",
- "Sample configuration detected" : "Exemplo de configuração detectada",
+ "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Isto normalmente pode ser resolvido, %sdando ao servidor da Web acesso de gravação para a diretoria de configuração %s.",
+ "Sample configuration detected" : "Detetado exemplo de configuração",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Foi detectado que a configuração de amostra foi copiada. Isso pode danificar a sua instalação e não é suportado. Por favor, leia a documentação antes de realizar mudanças no config.php",
- "PHP %s or higher is required." : "Necessário PHP %s ou maior.",
+ "PHP %s or higher is required." : "Necessário PHP %s ou superior.",
"PHP with a version lower than %s is required." : "É necessário um PHP com uma versão inferir a %s.",
- "%sbit or higher PHP required." : "HÃ???????.",
- "Following databases are supported: %s" : "As seguintes bases de dados são suportadas: %s",
- "The command line tool %s could not be found" : "A ferramenta de linha de comento %s não foi encontrada",
+ "%sbit or higher PHP required." : "Necessário PHP %sbit ou superior.",
+ "Following databases are supported: %s" : "São suportadas as seguintes bases de dados: %s",
+ "The command line tool %s could not be found" : "Não foi encontrada a ferramenta de linha de comando %s",
"The library %s is not available." : "A biblioteca %s não está disponível.",
- "Library %s with a version higher than %s is required - available version %s." : "É necessário que a biblioteca %s tenha uma versão superior a %s - versão disponível: %s.",
- "Library %s with a version lower than %s is required - available version %s." : "É necessário que a biblioteca %s tenha uma versão inferior a %s - versão disponível: %s.",
- "Following platforms are supported: %s" : "As seguintes plataformas são suportadas: %s",
+ "Library %s with a version higher than %s is required - available version %s." : "É necessário a biblioteca %s com uma versão superior a %s - versão disponível: %s.",
+ "Library %s with a version lower than %s is required - available version %s." : "É necessário a biblioteca %s com uma versão inferior a %s - versão disponível: %s.",
+ "Following platforms are supported: %s" : "São suportadas as seguintes plataformas: %s",
"ownCloud %s or higher is required." : "É necessário ownCloud %s ou superior.",
"ownCloud %s or lower is required." : "É necessário ownCloud %s ou inferior.",
- "Unknown filetype" : "Ficheiro desconhecido",
+ "Unknown filetype" : "Tipo de ficheiro desconhecido",
"Invalid image" : "Imagem inválida",
"today" : "hoje",
"yesterday" : "ontem",
"_%n day ago_::_%n days ago_" : ["%n dia atrás","%n dias atrás"],
- "last month" : "ultímo mês",
+ "last month" : "ultimo mês",
"last year" : "ano passado",
"_%n year ago_::_%n years ago_" : ["%n ano atrás","%n anos atrás"],
"seconds ago" : "Minutos atrás",
@@ -162,8 +162,6 @@
"Storage incomplete configuration. %s" : "Configuração incompleta do armazenamento. %s",
"Storage connection error. %s" : "Erro de ligação ao armazenamento. %s",
"Storage not available" : "Armazenamento indisposinvel",
- "Storage connection timeout. %s" : "Tempo de ligação ao armazenamento expirou. %s",
- "_%n file_::_%n files_" : ["%n ficheiro","%n ficheiros"],
- "_%n window_::_%n windows_" : ["%n janela","%n janelas"]
+ "Storage connection timeout. %s" : "Tempo de ligação ao armazenamento expirou. %s"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/ro.js b/lib/l10n/ro.js
index 5c5b7844cf7..de13cd796d6 100644
--- a/lib/l10n/ro.js
+++ b/lib/l10n/ro.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modulul cu id-ul %s nu există. Activează-l în setările tale de aplicație sau contactează-ți administratorul.",
"Empty filename is not allowed" : "Nu este permis fișier fără nume",
"Dot files are not allowed" : "Fișierele care încep cu caracterul punct nu sunt permise",
+ "4-byte characters are not supported in file names" : "Caracterele stocate în 4 octeți nu sunt suportate în denumirile fișierelor",
"File name is a reserved word" : "Numele fișierului este un cuvânt rezervat",
"File name contains at least one invalid character" : "Numele fișierului conține măcar un caracter invalid",
"File name is too long" : "Numele fișierului este prea lung",
@@ -36,6 +37,8 @@ OC.L10N.register(
"Can't create app folder. Please fix permissions. %s" : "Nu se poate crea directorul de aplicație. Repară permisiunile. %s",
"Archive does not contain a directory named %s" : "Arhiva nu conține vreun director cu numele %s",
"No source specified when installing app" : "Nu a fost specificată vreo sursă la instalarea aplicației",
+ "No href specified when installing app from http" : "Nu s-a specificat adresa la instalarea aplicației dintr-o sursă de pe Internet",
+ "No path specified when installing app from local file" : "Nu s-a specificat vreo cale la instalarea aplicației de pe un fișier local",
"Archives of type %s are not supported" : "Arhivele de tip %s nu sunt suportate",
"Failed to open archive when installing app" : "Deschiderea arhivei a eșuat în timpul instalării aplicației",
"App does not provide an info.xml file" : "Aplicația nu furnizează un fișier info.xml",
@@ -51,10 +54,12 @@ OC.L10N.register(
"DB Error: \"%s\"" : "Eroare Bază de Date: \"%s\"",
"Offending command was: \"%s\"" : "Comanda cauză a fost: \"%s\"",
"PostgreSQL username and/or password not valid" : "Nume utilizator și/sau parolă PostgreSQL greșită",
+ "For the best results, please consider using a GNU/Linux server instead." : "Pentru cele mai bune rezultate, ia în calcul folosirea unui server care rulează un sistem de operare GNU/Linux.",
"Set an admin username." : "Setează un nume de administrator.",
"Set an admin password." : "Setează o parolă de administrator.",
"Invalid Federated Cloud ID" : "ID invalid cloud federalizat",
"%s shared »%s« with you" : "%s Partajat »%s« cu tine de",
+ "%s via %s" : "%s via %s",
"You are not allowed to share %s" : "Nu există permisiunea de partajare %s",
"Sharing %s failed, because this item is already shared with %s" : "Partajarea %s a eșuat deoarece acest element este deja partajat cu %s",
"Not allowed to create a federated share with the same user" : "Nu este permisă crearea unei partajări federalizate cu acelaşi utilizator",
diff --git a/lib/l10n/ro.json b/lib/l10n/ro.json
index 566f6d01123..9149650a015 100644
--- a/lib/l10n/ro.json
+++ b/lib/l10n/ro.json
@@ -27,6 +27,7 @@
"Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modulul cu id-ul %s nu există. Activează-l în setările tale de aplicație sau contactează-ți administratorul.",
"Empty filename is not allowed" : "Nu este permis fișier fără nume",
"Dot files are not allowed" : "Fișierele care încep cu caracterul punct nu sunt permise",
+ "4-byte characters are not supported in file names" : "Caracterele stocate în 4 octeți nu sunt suportate în denumirile fișierelor",
"File name is a reserved word" : "Numele fișierului este un cuvânt rezervat",
"File name contains at least one invalid character" : "Numele fișierului conține măcar un caracter invalid",
"File name is too long" : "Numele fișierului este prea lung",
@@ -34,6 +35,8 @@
"Can't create app folder. Please fix permissions. %s" : "Nu se poate crea directorul de aplicație. Repară permisiunile. %s",
"Archive does not contain a directory named %s" : "Arhiva nu conține vreun director cu numele %s",
"No source specified when installing app" : "Nu a fost specificată vreo sursă la instalarea aplicației",
+ "No href specified when installing app from http" : "Nu s-a specificat adresa la instalarea aplicației dintr-o sursă de pe Internet",
+ "No path specified when installing app from local file" : "Nu s-a specificat vreo cale la instalarea aplicației de pe un fișier local",
"Archives of type %s are not supported" : "Arhivele de tip %s nu sunt suportate",
"Failed to open archive when installing app" : "Deschiderea arhivei a eșuat în timpul instalării aplicației",
"App does not provide an info.xml file" : "Aplicația nu furnizează un fișier info.xml",
@@ -49,10 +52,12 @@
"DB Error: \"%s\"" : "Eroare Bază de Date: \"%s\"",
"Offending command was: \"%s\"" : "Comanda cauză a fost: \"%s\"",
"PostgreSQL username and/or password not valid" : "Nume utilizator și/sau parolă PostgreSQL greșită",
+ "For the best results, please consider using a GNU/Linux server instead." : "Pentru cele mai bune rezultate, ia în calcul folosirea unui server care rulează un sistem de operare GNU/Linux.",
"Set an admin username." : "Setează un nume de administrator.",
"Set an admin password." : "Setează o parolă de administrator.",
"Invalid Federated Cloud ID" : "ID invalid cloud federalizat",
"%s shared »%s« with you" : "%s Partajat »%s« cu tine de",
+ "%s via %s" : "%s via %s",
"You are not allowed to share %s" : "Nu există permisiunea de partajare %s",
"Sharing %s failed, because this item is already shared with %s" : "Partajarea %s a eșuat deoarece acest element este deja partajat cu %s",
"Not allowed to create a federated share with the same user" : "Nu este permisă crearea unei partajări federalizate cu acelaşi utilizator",
diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js
index 44688918cbd..9f072b32efe 100644
--- a/lib/l10n/ru.js
+++ b/lib/l10n/ru.js
@@ -167,8 +167,6 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Неполная конфигурация хранилища. %s",
"Storage connection error. %s" : "Ошибка подключения к хранилищу. %s",
"Storage not available" : "Хранилище недоступно",
- "Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s",
- "_%n file_::_%n files_" : ["%n файл","%n файла","%n файлов","%n файлов"],
- "_%n window_::_%n windows_" : ["%n окно","%n окна","%n окон","%n окон"]
+ "Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json
index 71a9ad0e807..258cc1f03e8 100644
--- a/lib/l10n/ru.json
+++ b/lib/l10n/ru.json
@@ -165,8 +165,6 @@
"Storage incomplete configuration. %s" : "Неполная конфигурация хранилища. %s",
"Storage connection error. %s" : "Ошибка подключения к хранилищу. %s",
"Storage not available" : "Хранилище недоступно",
- "Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s",
- "_%n file_::_%n files_" : ["%n файл","%n файла","%n файлов","%n файлов"],
- "_%n window_::_%n windows_" : ["%n окно","%n окна","%n окон","%n окон"]
+ "Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
} \ No newline at end of file
diff --git a/lib/l10n/sl.js b/lib/l10n/sl.js
index cad4334f3d4..5c6ba6afa25 100644
--- a/lib/l10n/sl.js
+++ b/lib/l10n/sl.js
@@ -52,6 +52,7 @@ OC.L10N.register(
"App can't be installed because it is not compatible with this version of ownCloud" : "Programa ni mogoče namestiti, ker ni skladen z trenutno nameščeno različico oblaka ownCloud.",
"App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Programa ni mogoče namestiti, ker vsebuje oznako <shipped>potrditve</shipped>, ki pa ni dovoljena za javne programe.",
"App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Program ni mogoče namestiti zaradi neustrezne različice datoteke info.xml. Ta ni enaka različici programa.",
+ "%s enter the database username and name." : "%s - vnos uporabniškega imena in imena podatkovne zbirke.",
"%s enter the database username." : "%s - vnos uporabniškega imena podatkovne zbirke.",
"%s enter the database name." : "%s - vnos imena podatkovne zbirke.",
"%s you may not use dots in the database name" : "%s - v imenu podatkovne zbirke ni dovoljeno uporabljati pik.",
@@ -64,6 +65,7 @@ OC.L10N.register(
"PostgreSQL username and/or password not valid" : "Uporabniško ime ali geslo PostgreSQL ni veljavno",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Sistem Mac OS X ni podprt, zato %s v tem okolju ne bo deloval zanesljivo. Program uporabljate na lastno odgovornost! ",
"For the best results, please consider using a GNU/Linux server instead." : "Za najbolj še rezultate je priporočljivo uporabljati strežnik GNU/Linux.",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Videti je, da je dejavna seja %s zagnana v 32-bitnem okolju PHP in, da je v datoteki php.ini nastavljen open_basedir . Tako delovanje ni priporočljivo, saj se lahko pojavijo težave z datotekami, večjimi od 4GB.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Odstraniti je treba nastavitev open_basedir v datoteki php.ini ali pa preklopiti na 64-bitno okolje PHP.",
"Set an admin username." : "Nastavi uporabniško ime skrbnika.",
"Set an admin password." : "Nastavi geslo skrbnika.",
@@ -74,9 +76,11 @@ OC.L10N.register(
"Sharing %s failed, because the backend does not allow shares from type %i" : "Omogočanje souporabe %s je spodletelo, ker ozadnji program ne dopušča souporabe vrste %i.",
"Sharing %s failed, because the file does not exist" : "Souporaba %s je spodletela, ker ta datoteka ne obstaja",
"You are not allowed to share %s" : "Omogočanje souporabe %s brez ustreznih dovoljenj ni mogoče.",
+ "Sharing %s failed, because you can not share with yourself" : "Nastavitev %s souporabe je spodletela, ker souporaba s samim seboj ni mogoča.",
"Sharing %s failed, because the user %s does not exist" : "Nastavljanje souporabe %s je spodletelo, ker uporabnik %s ne obstaja.",
"Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Nastavljanje souporabe %s je spodletelo, ker uporabnik %s ni član nobene skupine, v kateri je tudi uporabnik %s.",
"Sharing %s failed, because this item is already shared with %s" : "Nastavljanje souporabe %s je spodletela, ker je ima uporabnik %s predmet že v souporabi.",
+ "Sharing %s failed, because this item is already shared with user %s" : "Nastavljanje souporabe %s je spodletelo, ker je predmet že v souporabi z uporabnikom %s.",
"Sharing %s failed, because the group %s does not exist" : "Nastavljanje souporabe %s je spodletelo, ker je skupina %s ne obstaja.",
"Sharing %s failed, because %s is not a member of the group %s" : "Nastavljanje souporabe %s je spodletelo, ker uporabnik %s ni član skupine %s.",
"You need to provide a password to create a public link, only protected links are allowed" : "Navesti je treba geslo za ustvarjanje javne povezave, saj so dovoljene le zaščitene.",
@@ -92,19 +96,25 @@ OC.L10N.register(
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Souporaba ozadnjega programa %s mora vsebovati tudi vmesnik OCP\\Share_Backend",
"Sharing backend %s not found" : "Ozadnjega programa %s za souporabo ni mogoče najti",
"Sharing backend for %s not found" : "Ozadnjega programa za souporabo za %s ni mogoče najti",
+ "Sharing failed, because the user %s is the original sharer" : "Nastavitev souporabe je spodletela, ker je uporabnik %s souporabo izvorno nastavil.",
"Sharing %s failed, because the permissions exceed permissions granted to %s" : "Nastavljanje souporabe %s je spodletelo, ker zahteve presegajo dodeljena dovoljenja za %s.",
"Sharing %s failed, because resharing is not allowed" : "Nastavljanje souporabe %s je spodletelo, ker nadaljnje omogočanje souporabe ni dovoljeno.",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Nastavljanje souporabe %s je spodletelo, ker ozadnji program %s ne upravlja z viri.",
"Sharing %s failed, because the file could not be found in the file cache" : "Nastavljanje souporabe %s je spodletelo, ker v predpomnilniku zahtevana datoteka ne obstaja.",
"Cannot increase permissions of %s" : "Ni mogoče povečati dovoljen %s",
+ "Files can't be shared with delete permissions" : "Datoteke, ki imajo nastavljene pravice za izbris, ni mogoče dati v souporabo",
+ "Files can't be shared with create permissions" : "Datoteke, ki imajo nastavljene pravice za ustvarjanje, ni mogoče dati v souporabo.",
"Expiration date is in the past" : "Datum preteka je že mimo!",
"Cannot set expiration date more than %s days in the future" : "Datuma pretaka ni mogoče nastaviti za več kot %s dni v prihodnosti.",
"Could not find category \"%s\"" : "Kategorije \"%s\" ni mogoče najti.",
"Apps" : "Programi",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "V uporabniškem imenu je dovoljeno uporabiti le znake: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"",
"A valid username must be provided" : "Navedeno mora biti veljavno uporabniško ime",
"Username contains whitespace at the beginning or at the end" : "Uporabniško ime vsebuje presledni znak na začetku ali na koncu imena.",
"A valid password must be provided" : "Navedeno mora biti veljavno geslo",
"The username is already being used" : "Vpisano uporabniško ime je že v uporabi",
+ "Login canceled by app" : "Aplikacija je prijavo prekinila.",
+ "User disabled" : "Uporabnik je onemogočen",
"Help" : "Pomoč",
"Personal" : "Osebno",
"Users" : "Uporabniki",
@@ -133,15 +143,23 @@ OC.L10N.register(
"Please ask your server administrator to install the module." : "Obvestite skrbnika strežnika, da je treba namestiti manjkajoč modul.",
"PHP module %s not installed." : "Modul PHP %s ni nameščen.",
"PHP setting \"%s\" is not set to \"%s\"." : "Nastavitev PHP \"%s\" ni nastavljena na \"%s\".",
+ "To fix this issue update your libxml2 version and restart your web server." : "Za rešitev težave posodobite libxml2 in ponovno zaženite spletni strežnik.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Napako je najverjetneje povzročil predpomnilnik ali pospeševalnik, kot sta Zend OPcache ali eAccelerator.",
"PHP modules have been installed, but they are still listed as missing?" : "Ali so bili moduli PHP nameščeni, pa so še vedno označeni kot manjkajoči?",
"Please ask your server administrator to restart the web server." : "Obvestite skrbnika strežnika, da je treba ponovno zagnati spletni strežnik.",
"PostgreSQL >= 9 required" : "Zahtevana je različica PostgreSQL >= 9.",
"Please upgrade your database version" : "Posodobite različico podatkovne zbirke.",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Spremenite dovoljenja mape na 0770 in s tem onemogočite branje vsebine drugim uporabnikom.",
"Data directory (%s) is readable by other users" : "Podatkovna mapa (%s) ima določena dovoljenja za branje skupine.",
+ "Data directory (%s) must be an absolute path" : "Podatkovna mapa (%s) mora imeti navedeno celotno pot.",
+ "Check the value of \"datadirectory\" in your configuration" : "V konfiguraciji preverite nastavitev \"datadirectory\"",
"Data directory (%s) is invalid" : "Podatkovna mapa (%s) ni veljavna.",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Preverite, ali je v korenu podatkovne mape datoteka \".ocdata\".",
"Could not obtain lock type %d on \"%s\"." : "Ni mogoče pridobiti zaklepa %d na \"%s\".",
- "Storage not available" : "Shramba ni na voljo"
+ "Storage unauthorized. %s" : "Shramba ni avtorizirana. %s",
+ "Storage incomplete configuration. %s" : "Nepopolna konfiguracija shrambe. %s",
+ "Storage connection error. %s" : "Napaka pri povezavi do shrambe. %s",
+ "Storage not available" : "Shramba ni na voljo",
+ "Storage connection timeout. %s" : "Povezava do shrambe je časovno potekla. %s"
},
"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
diff --git a/lib/l10n/sl.json b/lib/l10n/sl.json
index ea68052fa0d..6877048f079 100644
--- a/lib/l10n/sl.json
+++ b/lib/l10n/sl.json
@@ -50,6 +50,7 @@
"App can't be installed because it is not compatible with this version of ownCloud" : "Programa ni mogoče namestiti, ker ni skladen z trenutno nameščeno različico oblaka ownCloud.",
"App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Programa ni mogoče namestiti, ker vsebuje oznako <shipped>potrditve</shipped>, ki pa ni dovoljena za javne programe.",
"App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Program ni mogoče namestiti zaradi neustrezne različice datoteke info.xml. Ta ni enaka različici programa.",
+ "%s enter the database username and name." : "%s - vnos uporabniškega imena in imena podatkovne zbirke.",
"%s enter the database username." : "%s - vnos uporabniškega imena podatkovne zbirke.",
"%s enter the database name." : "%s - vnos imena podatkovne zbirke.",
"%s you may not use dots in the database name" : "%s - v imenu podatkovne zbirke ni dovoljeno uporabljati pik.",
@@ -62,6 +63,7 @@
"PostgreSQL username and/or password not valid" : "Uporabniško ime ali geslo PostgreSQL ni veljavno",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Sistem Mac OS X ni podprt, zato %s v tem okolju ne bo deloval zanesljivo. Program uporabljate na lastno odgovornost! ",
"For the best results, please consider using a GNU/Linux server instead." : "Za najbolj še rezultate je priporočljivo uporabljati strežnik GNU/Linux.",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Videti je, da je dejavna seja %s zagnana v 32-bitnem okolju PHP in, da je v datoteki php.ini nastavljen open_basedir . Tako delovanje ni priporočljivo, saj se lahko pojavijo težave z datotekami, večjimi od 4GB.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Odstraniti je treba nastavitev open_basedir v datoteki php.ini ali pa preklopiti na 64-bitno okolje PHP.",
"Set an admin username." : "Nastavi uporabniško ime skrbnika.",
"Set an admin password." : "Nastavi geslo skrbnika.",
@@ -72,9 +74,11 @@
"Sharing %s failed, because the backend does not allow shares from type %i" : "Omogočanje souporabe %s je spodletelo, ker ozadnji program ne dopušča souporabe vrste %i.",
"Sharing %s failed, because the file does not exist" : "Souporaba %s je spodletela, ker ta datoteka ne obstaja",
"You are not allowed to share %s" : "Omogočanje souporabe %s brez ustreznih dovoljenj ni mogoče.",
+ "Sharing %s failed, because you can not share with yourself" : "Nastavitev %s souporabe je spodletela, ker souporaba s samim seboj ni mogoča.",
"Sharing %s failed, because the user %s does not exist" : "Nastavljanje souporabe %s je spodletelo, ker uporabnik %s ne obstaja.",
"Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Nastavljanje souporabe %s je spodletelo, ker uporabnik %s ni član nobene skupine, v kateri je tudi uporabnik %s.",
"Sharing %s failed, because this item is already shared with %s" : "Nastavljanje souporabe %s je spodletela, ker je ima uporabnik %s predmet že v souporabi.",
+ "Sharing %s failed, because this item is already shared with user %s" : "Nastavljanje souporabe %s je spodletelo, ker je predmet že v souporabi z uporabnikom %s.",
"Sharing %s failed, because the group %s does not exist" : "Nastavljanje souporabe %s je spodletelo, ker je skupina %s ne obstaja.",
"Sharing %s failed, because %s is not a member of the group %s" : "Nastavljanje souporabe %s je spodletelo, ker uporabnik %s ni član skupine %s.",
"You need to provide a password to create a public link, only protected links are allowed" : "Navesti je treba geslo za ustvarjanje javne povezave, saj so dovoljene le zaščitene.",
@@ -90,19 +94,25 @@
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Souporaba ozadnjega programa %s mora vsebovati tudi vmesnik OCP\\Share_Backend",
"Sharing backend %s not found" : "Ozadnjega programa %s za souporabo ni mogoče najti",
"Sharing backend for %s not found" : "Ozadnjega programa za souporabo za %s ni mogoče najti",
+ "Sharing failed, because the user %s is the original sharer" : "Nastavitev souporabe je spodletela, ker je uporabnik %s souporabo izvorno nastavil.",
"Sharing %s failed, because the permissions exceed permissions granted to %s" : "Nastavljanje souporabe %s je spodletelo, ker zahteve presegajo dodeljena dovoljenja za %s.",
"Sharing %s failed, because resharing is not allowed" : "Nastavljanje souporabe %s je spodletelo, ker nadaljnje omogočanje souporabe ni dovoljeno.",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Nastavljanje souporabe %s je spodletelo, ker ozadnji program %s ne upravlja z viri.",
"Sharing %s failed, because the file could not be found in the file cache" : "Nastavljanje souporabe %s je spodletelo, ker v predpomnilniku zahtevana datoteka ne obstaja.",
"Cannot increase permissions of %s" : "Ni mogoče povečati dovoljen %s",
+ "Files can't be shared with delete permissions" : "Datoteke, ki imajo nastavljene pravice za izbris, ni mogoče dati v souporabo",
+ "Files can't be shared with create permissions" : "Datoteke, ki imajo nastavljene pravice za ustvarjanje, ni mogoče dati v souporabo.",
"Expiration date is in the past" : "Datum preteka je že mimo!",
"Cannot set expiration date more than %s days in the future" : "Datuma pretaka ni mogoče nastaviti za več kot %s dni v prihodnosti.",
"Could not find category \"%s\"" : "Kategorije \"%s\" ni mogoče najti.",
"Apps" : "Programi",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "V uporabniškem imenu je dovoljeno uporabiti le znake: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"",
"A valid username must be provided" : "Navedeno mora biti veljavno uporabniško ime",
"Username contains whitespace at the beginning or at the end" : "Uporabniško ime vsebuje presledni znak na začetku ali na koncu imena.",
"A valid password must be provided" : "Navedeno mora biti veljavno geslo",
"The username is already being used" : "Vpisano uporabniško ime je že v uporabi",
+ "Login canceled by app" : "Aplikacija je prijavo prekinila.",
+ "User disabled" : "Uporabnik je onemogočen",
"Help" : "Pomoč",
"Personal" : "Osebno",
"Users" : "Uporabniki",
@@ -131,15 +141,23 @@
"Please ask your server administrator to install the module." : "Obvestite skrbnika strežnika, da je treba namestiti manjkajoč modul.",
"PHP module %s not installed." : "Modul PHP %s ni nameščen.",
"PHP setting \"%s\" is not set to \"%s\"." : "Nastavitev PHP \"%s\" ni nastavljena na \"%s\".",
+ "To fix this issue update your libxml2 version and restart your web server." : "Za rešitev težave posodobite libxml2 in ponovno zaženite spletni strežnik.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Napako je najverjetneje povzročil predpomnilnik ali pospeševalnik, kot sta Zend OPcache ali eAccelerator.",
"PHP modules have been installed, but they are still listed as missing?" : "Ali so bili moduli PHP nameščeni, pa so še vedno označeni kot manjkajoči?",
"Please ask your server administrator to restart the web server." : "Obvestite skrbnika strežnika, da je treba ponovno zagnati spletni strežnik.",
"PostgreSQL >= 9 required" : "Zahtevana je različica PostgreSQL >= 9.",
"Please upgrade your database version" : "Posodobite različico podatkovne zbirke.",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Spremenite dovoljenja mape na 0770 in s tem onemogočite branje vsebine drugim uporabnikom.",
"Data directory (%s) is readable by other users" : "Podatkovna mapa (%s) ima določena dovoljenja za branje skupine.",
+ "Data directory (%s) must be an absolute path" : "Podatkovna mapa (%s) mora imeti navedeno celotno pot.",
+ "Check the value of \"datadirectory\" in your configuration" : "V konfiguraciji preverite nastavitev \"datadirectory\"",
"Data directory (%s) is invalid" : "Podatkovna mapa (%s) ni veljavna.",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Preverite, ali je v korenu podatkovne mape datoteka \".ocdata\".",
"Could not obtain lock type %d on \"%s\"." : "Ni mogoče pridobiti zaklepa %d na \"%s\".",
- "Storage not available" : "Shramba ni na voljo"
+ "Storage unauthorized. %s" : "Shramba ni avtorizirana. %s",
+ "Storage incomplete configuration. %s" : "Nepopolna konfiguracija shrambe. %s",
+ "Storage connection error. %s" : "Napaka pri povezavi do shrambe. %s",
+ "Storage not available" : "Shramba ni na voljo",
+ "Storage connection timeout. %s" : "Povezava do shrambe je časovno potekla. %s"
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
} \ No newline at end of file
diff --git a/lib/l10n/sq.js b/lib/l10n/sq.js
index 89b0013e219..5cbba8592bf 100644
--- a/lib/l10n/sq.js
+++ b/lib/l10n/sq.js
@@ -167,8 +167,6 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Formësim jo i plotë i depozitës. %s",
"Storage connection error. %s" : "Gabim lidhje te depozita. %s",
"Storage not available" : "Pa depozitë gati",
- "Storage connection timeout. %s" : "Mbarim kohe lidhjeje për depozitën. %s",
- "_%n file_::_%n files_" : ["%n kartelë","%n kartela"],
- "_%n window_::_%n windows_" : ["%n dritare","%n dritare"]
+ "Storage connection timeout. %s" : "Mbarim kohe lidhjeje për depozitën. %s"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/sq.json b/lib/l10n/sq.json
index e6cb94b9980..4f835a6d75c 100644
--- a/lib/l10n/sq.json
+++ b/lib/l10n/sq.json
@@ -165,8 +165,6 @@
"Storage incomplete configuration. %s" : "Formësim jo i plotë i depozitës. %s",
"Storage connection error. %s" : "Gabim lidhje te depozita. %s",
"Storage not available" : "Pa depozitë gati",
- "Storage connection timeout. %s" : "Mbarim kohe lidhjeje për depozitën. %s",
- "_%n file_::_%n files_" : ["%n kartelë","%n kartela"],
- "_%n window_::_%n windows_" : ["%n dritare","%n dritare"]
+ "Storage connection timeout. %s" : "Mbarim kohe lidhjeje për depozitën. %s"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/uk.js b/lib/l10n/uk.js
index 8aa1a9600d3..20d5d976e76 100644
--- a/lib/l10n/uk.js
+++ b/lib/l10n/uk.js
@@ -162,8 +162,6 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Неповна конфігурація сховища. %s",
"Storage connection error. %s" : "Помилка з'єднання зі сховищем. %s",
"Storage not available" : "Сховище не доступне",
- "Storage connection timeout. %s" : "Час під'єднання до сховища вичерпався. %s",
- "_%n file_::_%n files_" : ["%n файл","%n файлів","%n файлів"],
- "_%n window_::_%n windows_" : ["%n вікно","%n вікон","%n вікон"]
+ "Storage connection timeout. %s" : "Час під'єднання до сховища вичерпався. %s"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/lib/l10n/uk.json b/lib/l10n/uk.json
index 14e3ac8dbe2..05f3628e817 100644
--- a/lib/l10n/uk.json
+++ b/lib/l10n/uk.json
@@ -160,8 +160,6 @@
"Storage incomplete configuration. %s" : "Неповна конфігурація сховища. %s",
"Storage connection error. %s" : "Помилка з'єднання зі сховищем. %s",
"Storage not available" : "Сховище не доступне",
- "Storage connection timeout. %s" : "Час під'єднання до сховища вичерпався. %s",
- "_%n file_::_%n files_" : ["%n файл","%n файлів","%n файлів"],
- "_%n window_::_%n windows_" : ["%n вікно","%n вікон","%n вікон"]
+ "Storage connection timeout. %s" : "Час під'єднання до сховища вичерпався. %s"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/lib/private/AllConfig.php b/lib/private/AllConfig.php
index 6e99e1ac268..e082cea3305 100644
--- a/lib/private/AllConfig.php
+++ b/lib/private/AllConfig.php
@@ -154,7 +154,7 @@ class AllConfig implements \OCP\IConfig {
*
* @param string $appName the appName that we want to store the value under
* @param string $key the key of the value, under which will be saved
- * @param string $value the value that should be stored
+ * @param string|float|int $value the value that should be stored
*/
public function setAppValue($appName, $key, $value) {
\OC::$server->getAppConfig()->setValue($appName, $key, $value);
@@ -198,11 +198,16 @@ class AllConfig implements \OCP\IConfig {
* @param string $userId the userId of the user that we want to store the value under
* @param string $appName the appName that we want to store the value under
* @param string $key the key under which the value is being stored
- * @param string $value the value that you want to store
+ * @param string|float|int $value the value that you want to store
* @param string $preCondition only update if the config value was previously the value passed as $preCondition
* @throws \OCP\PreConditionNotMetException if a precondition is specified and is not met
+ * @throws \UnexpectedValueException when trying to store an unexpected value
*/
public function setUserValue($userId, $appName, $key, $value, $preCondition = null) {
+ if (!is_int($value) && !is_float($value) && !is_string($value)) {
+ throw new \UnexpectedValueException('Only integers, floats and strings are allowed as value');
+ }
+
// TODO - FIXME
$this->fixDIInit();
diff --git a/lib/private/AppConfig.php b/lib/private/AppConfig.php
index 24542152ffc..4e48ee149ef 100644
--- a/lib/private/AppConfig.php
+++ b/lib/private/AppConfig.php
@@ -143,7 +143,7 @@ class AppConfig implements IAppConfig {
*
* @param string $app app
* @param string $key key
- * @param string $value value
+ * @param string|float|int $value value
* @return bool True if the value was inserted or updated, false if the value was the same
*/
public function setValue($app, $key, $value) {
@@ -273,7 +273,9 @@ class AppConfig implements IAppConfig {
->from('appconfig');
$result = $sql->execute();
- while ($row = $result->fetch()) {
+ // we are going to store the result in memory anyway
+ $rows = $result->fetchAll();
+ foreach ($rows as $row) {
if (!isset($this->cache[$row['appid']])) {
$this->cache[$row['appid']] = [];
}
diff --git a/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php b/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php
index 2b9a072e59a..d84e9963436 100644
--- a/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php
+++ b/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php
@@ -26,13 +26,13 @@ namespace OC\AppFramework\Middleware\Security;
use OC\AppFramework\Middleware\Security\Exceptions\SecurityException;
use OC\AppFramework\Utility\ControllerMethodReflector;
+use OC\User\Session;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
-use OCP\IRequest;
-use OCP\IUserSession;
use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Middleware;
+use OCP\IRequest;
/**
* This middleware sets the correct CORS headers on a response if the
@@ -53,18 +53,18 @@ class CORSMiddleware extends Middleware {
private $reflector;
/**
- * @var IUserSession
+ * @var Session
*/
private $session;
/**
* @param IRequest $request
* @param ControllerMethodReflector $reflector
- * @param IUserSession $session
+ * @param Session $session
*/
public function __construct(IRequest $request,
ControllerMethodReflector $reflector,
- IUserSession $session) {
+ Session $session) {
$this->request = $request;
$this->reflector = $reflector;
$this->session = $session;
@@ -89,7 +89,7 @@ class CORSMiddleware extends Middleware {
$pass = $this->request->server['PHP_AUTH_PW'];
$this->session->logout();
- if(!$this->session->login($user, $pass)) {
+ if(!$this->session->logClientIn($user, $pass)) {
throw new SecurityException('CORS requires basic auth', Http::STATUS_UNAUTHORIZED);
}
}
diff --git a/lib/private/Authentication/Token/DefaultTokenCleanupJob.php b/lib/private/Authentication/Token/DefaultTokenCleanupJob.php
index 04b98c6c5a0..7746d6be915 100644
--- a/lib/private/Authentication/Token/DefaultTokenCleanupJob.php
+++ b/lib/private/Authentication/Token/DefaultTokenCleanupJob.php
@@ -28,6 +28,7 @@ class DefaultTokenCleanupJob extends Job {
protected function run($argument) {
/* @var $provider DefaultTokenProvider */
+ // TODO: add OC\Authentication\Token\IProvider::invalidateOldTokens and query interface
$provider = OC::$server->query('OC\Authentication\Token\DefaultTokenProvider');
$provider->invalidateOldTokens();
}
diff --git a/lib/private/DB/ConnectionFactory.php b/lib/private/DB/ConnectionFactory.php
index 0856d8d19c0..6a096e504d8 100644
--- a/lib/private/DB/ConnectionFactory.php
+++ b/lib/private/DB/ConnectionFactory.php
@@ -104,6 +104,10 @@ class ConnectionFactory {
break;
case 'oci':
$eventManager->addEventSubscriber(new OracleSessionInit);
+ // the driverOptions are unused in dbal and need to be mapped to the parameters
+ if (isset($additionalConnectionParams['driverOptions'])) {
+ $additionalConnectionParams = array_merge($additionalConnectionParams, $additionalConnectionParams['driverOptions']);
+ }
break;
case 'sqlite3':
$journalMode = $additionalConnectionParams['sqlite.journal_mode'];
diff --git a/lib/private/Encryption/DecryptAll.php b/lib/private/Encryption/DecryptAll.php
index 8676bc09575..34a3e1bff91 100644
--- a/lib/private/Encryption/DecryptAll.php
+++ b/lib/private/Encryption/DecryptAll.php
@@ -80,7 +80,7 @@ class DecryptAll {
$this->input = $input;
$this->output = $output;
- if (!empty($user) && $this->userManager->userExists($user) === false) {
+ if ($user !== '' && $this->userManager->userExists($user) === false) {
$this->output->writeln('User "' . $user . '" does not exist. Please check the username and try again');
return false;
}
@@ -141,7 +141,7 @@ class DecryptAll {
$this->output->writeln("\n");
$userList = [];
- if (empty($user)) {
+ if ($user === '') {
$fetchUsersProgress = new ProgressBar($this->output);
$fetchUsersProgress->setFormat(" %message% \n [%bar%]");
diff --git a/lib/private/Encryption/File.php b/lib/private/Encryption/File.php
index 2bd9fb02100..3573ff19c6e 100644
--- a/lib/private/Encryption/File.php
+++ b/lib/private/Encryption/File.php
@@ -22,6 +22,8 @@
namespace OC\Encryption;
+use OC\Cache\CappedMemoryCache;
+
class File implements \OCP\Encryption\IFile {
/** @var Util */
@@ -36,6 +38,7 @@ class File implements \OCP\Encryption\IFile {
public function __construct(Util $util) {
$this->util = $util;
+ $this->cache = new CappedMemoryCache();
}
diff --git a/lib/private/Files/Cache/Scanner.php b/lib/private/Files/Cache/Scanner.php
index e6bd118d5a5..c17f9bfd51b 100644
--- a/lib/private/Files/Cache/Scanner.php
+++ b/lib/private/Files/Cache/Scanner.php
@@ -38,6 +38,7 @@ use OC\Files\Filesystem;
use OC\Hooks\BasicEmitter;
use OCP\Config;
use OCP\Files\Cache\IScanner;
+use OCP\Files\ForbiddenException;
use OCP\Files\Storage\ILockingStorage;
use OCP\Lock\ILockingProvider;
@@ -140,7 +141,11 @@ class Scanner extends BasicEmitter implements IScanner {
}
}
- $data = $this->getData($file);
+ try {
+ $data = $this->getData($file);
+ } catch (ForbiddenException $e) {
+ return null;
+ }
if ($data) {
diff --git a/lib/private/Files/Cache/Updater.php b/lib/private/Files/Cache/Updater.php
index 820941abae1..4e17c4d778d 100644
--- a/lib/private/Files/Cache/Updater.php
+++ b/lib/private/Files/Cache/Updater.php
@@ -231,7 +231,10 @@ class Updater implements IUpdater {
$parentId = $this->cache->getParentId($internalPath);
$parent = dirname($internalPath);
if ($parentId != -1) {
- $this->cache->update($parentId, array('storage_mtime' => $this->storage->filemtime($parent)));
+ $mtime = $this->storage->filemtime($parent);
+ if ($mtime !== false) {
+ $this->cache->update($parentId, array('storage_mtime' => $mtime));
+ }
}
}
}
diff --git a/lib/private/Files/Filesystem.php b/lib/private/Files/Filesystem.php
index 08621d160be..3d3345a5c80 100644
--- a/lib/private/Files/Filesystem.php
+++ b/lib/private/Files/Filesystem.php
@@ -781,7 +781,7 @@ class Filesystem {
*/
$path = (string)$path;
- $cacheKey = json_encode([$path, $stripTrailingSlash, $isAbsolutePath]);
+ $cacheKey = json_encode([$path, $stripTrailingSlash, $isAbsolutePath, $keepUnicode]);
if (isset(self::$normalizedPathCache[$cacheKey])) {
return self::$normalizedPathCache[$cacheKey];
diff --git a/lib/private/Files/Mount/MountPoint.php b/lib/private/Files/Mount/MountPoint.php
index a25e8c3a57d..e11da9e5c74 100644
--- a/lib/private/Files/Mount/MountPoint.php
+++ b/lib/private/Files/Mount/MountPoint.php
@@ -188,6 +188,7 @@ class MountPoint implements IMountPoint {
* @return string
*/
public function getInternalPath($path) {
+ $path = Filesystem::normalizePath($path, true, false, true);
if ($this->mountPoint === $path or $this->mountPoint . '/' === $path) {
$internalPath = '';
} else {
diff --git a/lib/private/Files/Storage/Common.php b/lib/private/Files/Storage/Common.php
index cec6a42a2c0..0c1b69108d4 100644
--- a/lib/private/Files/Storage/Common.php
+++ b/lib/private/Files/Storage/Common.php
@@ -643,6 +643,9 @@ abstract class Common implements Storage, ILockingStorage {
$data = [];
$data['mimetype'] = $this->getMimeType($path);
$data['mtime'] = $this->filemtime($path);
+ if ($data['mtime'] === false) {
+ $data['mtime'] = time();
+ }
if ($data['mimetype'] == 'httpd/unix-directory') {
$data['size'] = -1; //unknown
} else {
diff --git a/lib/private/Files/Storage/Local.php b/lib/private/Files/Storage/Local.php
index b07e26a3358..005b5f9ab91 100644
--- a/lib/private/Files/Storage/Local.php
+++ b/lib/private/Files/Storage/Local.php
@@ -33,20 +33,31 @@
*/
namespace OC\Files\Storage;
+
+use OCP\Files\ForbiddenException;
+
/**
* for local filestore, we only have to map the paths
*/
class Local extends \OC\Files\Storage\Common {
protected $datadir;
+ protected $dataDirLength;
+
+ protected $allowSymlinks = false;
+
+ protected $realDataDir;
+
public function __construct($arguments) {
if (!isset($arguments['datadir']) || !is_string($arguments['datadir'])) {
throw new \InvalidArgumentException('No data directory set for local storage');
}
$this->datadir = $arguments['datadir'];
+ $this->realDataDir = rtrim(realpath($this->datadir), '/') . '/';
if (substr($this->datadir, -1) !== '/') {
$this->datadir .= '/';
}
+ $this->dataDirLength = strlen($this->realDataDir);
}
public function __destruct() {
@@ -157,7 +168,7 @@ class Local extends \OC\Files\Storage\Common {
public function filemtime($path) {
clearstatcache($this->getSourcePath($path));
- return filemtime($this->getSourcePath($path));
+ return $this->file_exists($path) ? filemtime($this->getSourcePath($path)) : false;
}
public function touch($path, $mtime = null) {
@@ -188,7 +199,7 @@ class Local extends \OC\Files\Storage\Common {
return '';
}
- $handle = fopen($fileName,'rb');
+ $handle = fopen($fileName, 'rb');
$content = fread($handle, $fileSize);
fclose($handle);
return $content;
@@ -337,10 +348,27 @@ class Local extends \OC\Files\Storage\Common {
*
* @param string $path
* @return string
+ * @throws ForbiddenException
*/
public function getSourcePath($path) {
$fullPath = $this->datadir . $path;
- return $fullPath;
+ if ($this->allowSymlinks || $path === '') {
+ return $fullPath;
+ }
+ $pathToResolve = $fullPath;
+ $realPath = realpath($pathToResolve);
+ while ($realPath === false) { // for non existing files check the parent directory
+ $pathToResolve = dirname($pathToResolve);
+ $realPath = realpath($pathToResolve);
+ }
+ if ($realPath) {
+ $realPath = $realPath . '/';
+ }
+ if (substr($realPath, 0, $this->dataDirLength) === $this->realDataDir) {
+ return $fullPath;
+ } else {
+ throw new ForbiddenException("Following symlinks is not allowed ('$fullPath' -> '$realPath' not inside '{$this->realDataDir}')", false);
+ }
}
/**
@@ -377,7 +405,7 @@ class Local extends \OC\Files\Storage\Common {
* @return bool
*/
public function copyFromStorage(\OCP\Files\Storage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
- if($sourceStorage->instanceOfStorage('\OC\Files\Storage\Local')){
+ if ($sourceStorage->instanceOfStorage('\OC\Files\Storage\Local')) {
/**
* @var \OC\Files\Storage\Local $sourceStorage
*/
diff --git a/lib/private/Files/Utils/Scanner.php b/lib/private/Files/Utils/Scanner.php
index be35910471a..e4e5e353f9f 100644
--- a/lib/private/Files/Utils/Scanner.php
+++ b/lib/private/Files/Utils/Scanner.php
@@ -162,7 +162,12 @@ class Scanner extends PublicEmitter {
if ($storage->instanceOfStorage('\OC\Files\Storage\Home') and
(!$storage->isCreatable('') or !$storage->isCreatable('files'))
) {
- throw new ForbiddenException();
+ if ($storage->file_exists('') or $storage->getCache()->inCache('')) {
+ throw new ForbiddenException();
+ } else {// if the root exists in neither the cache nor the storage the user isn't setup yet
+ break;
+ }
+
}
$relativePath = $mount->getInternalPath($dir);
$scanner = $storage->getScanner();
diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php
index f738542ea8c..e9daa123470 100644
--- a/lib/private/Files/View.php
+++ b/lib/private/Files/View.php
@@ -337,10 +337,17 @@ class View {
return $this->removeMount($mount, $absolutePath);
}
if ($this->is_dir($path)) {
- return $this->basicOperation('rmdir', $path, array('delete'));
+ $result = $this->basicOperation('rmdir', $path, array('delete'));
} else {
- return false;
+ $result = false;
+ }
+
+ if (!$result && !$this->file_exists($path)) { //clear ghost files from the cache on delete
+ $storage = $mount->getStorage();
+ $internalPath = $mount->getInternalPath($absolutePath);
+ $storage->getUpdater()->remove($internalPath);
}
+ return $result;
}
/**
@@ -429,7 +436,7 @@ class View {
/**
* @param string $path
- * @param int $from
+ * @param int $from
* @param int $to
* @return bool|mixed
* @throws \OCP\Files\InvalidPathException
@@ -441,18 +448,18 @@ class View {
$handle = $this->fopen($path, 'rb');
if ($handle) {
if (fseek($handle, $from) === 0) {
- $chunkSize = 8192; // 8 kB chunks
- $end = $to + 1;
- while (!feof($handle) && ftell($handle) < $end) {
- $len = $end-ftell($handle);
- if ($len > $chunkSize) {
- $len = $chunkSize;
+ $chunkSize = 8192; // 8 kB chunks
+ $end = $to + 1;
+ while (!feof($handle) && ftell($handle) < $end) {
+ $len = $end - ftell($handle);
+ if ($len > $chunkSize) {
+ $len = $chunkSize;
+ }
+ echo fread($handle, $len);
+ flush();
}
- echo fread($handle, $len);
- flush();
- }
- $size = ftell($handle) - $from;
- return $size;
+ $size = ftell($handle) - $from;
+ return $size;
}
throw new \OCP\Files\UnseekableException('fseek error');
@@ -679,7 +686,15 @@ class View {
if ($mount and $mount->getInternalPath($absolutePath) === '') {
return $this->removeMount($mount, $absolutePath);
}
- return $this->basicOperation('unlink', $path, array('delete'));
+ $result = $this->basicOperation('unlink', $path, array('delete'));
+ if (!$result && !$this->file_exists($path)) { //clear ghost files from the cache on delete
+ $storage = $mount->getStorage();
+ $internalPath = $mount->getInternalPath($absolutePath);
+ $storage->getUpdater()->remove($internalPath);
+ return true;
+ } else {
+ return $result;
+ }
}
/**
diff --git a/lib/private/Log.php b/lib/private/Log.php
index 6028064a878..49223521916 100644
--- a/lib/private/Log.php
+++ b/lib/private/Log.php
@@ -60,6 +60,32 @@ class Log implements ILogger {
/** @var Normalizer */
private $normalizer;
+ protected $methodsWithSensitiveParameters = [
+ // Session/User
+ 'login',
+ 'checkPassword',
+ 'updatePrivateKeyPassword',
+ 'validateUserPass',
+
+ // TokenProvider
+ 'getToken',
+ 'isTokenPassword',
+ 'getPassword',
+ 'decryptPassword',
+ 'logClientIn',
+ 'generateToken',
+ 'validateToken',
+
+ // TwoFactorAuth
+ 'solveChallenge',
+ 'verifyChallenge',
+
+ //ICrypto
+ 'calculateHMAC',
+ 'encrypt',
+ 'decrypt',
+ ];
+
/**
* @param string $logger The logger that should be used
* @param SystemConfig $config the system config object
@@ -286,7 +312,7 @@ class Log implements ILogger {
'File' => $exception->getFile(),
'Line' => $exception->getLine(),
);
- $exception['Trace'] = preg_replace('!(login|checkPassword|updatePrivateKeyPassword|validateUserPass)\(.*\)!', '$1(*** username and password replaced ***)', $exception['Trace']);
+ $exception['Trace'] = preg_replace('!(' . implode('|', $this->methodsWithSensitiveParameters) . ')\(.*\)!', '$1(*** sensitive parameters replaced ***)', $exception['Trace']);
$msg = isset($context['message']) ? $context['message'] : 'Exception';
$msg .= ': ' . json_encode($exception);
$this->error($msg, $context);
diff --git a/lib/private/Repair.php b/lib/private/Repair.php
index 4869db77497..bb2967d7e6e 100644
--- a/lib/private/Repair.php
+++ b/lib/private/Repair.php
@@ -29,11 +29,13 @@
namespace OC;
use OC\Repair\AssetCache;
+use OC\Repair\AvatarPermissions;
use OC\Repair\CleanTags;
use OC\Repair\Collation;
use OC\Repair\DropOldJobs;
use OC\Repair\OldGroupMembershipShares;
use OC\Repair\RemoveGetETagEntries;
+use OC\Repair\RemoveOldShares;
use OC\Repair\SharePropagation;
use OC\Repair\SqliteAutoincrement;
use OC\Repair\DropOldTables;
@@ -132,6 +134,8 @@ class Repair implements IOutput{
new UpdateOutdatedOcsIds(\OC::$server->getConfig()),
new RepairInvalidShares(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()),
new SharePropagation(\OC::$server->getConfig()),
+ new RemoveOldShares(\OC::$server->getDatabaseConnection()),
+ new AvatarPermissions(\OC::$server->getDatabaseConnection()),
];
}
diff --git a/lib/private/Repair/AvatarPermissions.php b/lib/private/Repair/AvatarPermissions.php
new file mode 100644
index 00000000000..d23479f5ba8
--- /dev/null
+++ b/lib/private/Repair/AvatarPermissions.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * @author Roeland Jago Douma <rullzer@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OC\Repair;
+
+use Doctrine\DBAL\Platforms\OraclePlatform;
+use OCP\IDBConnection;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
+
+/**
+ * Class AvatarPermissions
+ *
+ * @package OC\Repair
+ */
+class AvatarPermissions implements IRepairStep {
+ /** @var IDBConnection */
+ private $connection;
+
+ /**
+ * AvatarPermissions constructor.
+ *
+ * @param IDBConnection $connection
+ */
+ public function __construct(IDBConnection $connection) {
+ $this->connection = $connection;
+ }
+
+ /**
+ * @return string
+ */
+ public function getName() {
+ return 'Fix permissions so avatars can be stored again';
+ }
+
+ /**
+ * @param IOutput $output
+ */
+ public function run(IOutput $output) {
+ $output->startProgress(2);
+ $this->fixUserRootPermissions();
+ $output->advance();
+ $this->fixAvatarPermissions();
+ $output->finishProgress();
+ }
+
+ /**
+ * Make sure all user roots have permissions 23 (all but share)
+ */
+ protected function fixUserRootPermissions() {
+ $qb = $this->connection->getQueryBuilder();
+ $qb2 = $this->connection->getQueryBuilder();
+
+ $qb->select('numeric_id')
+ ->from('storages')
+ ->where($qb->expr()->like('id', $qb2->createParameter('like')));
+
+ if ($this->connection->getDatabasePlatform() instanceof OraclePlatform) {
+ // '' is null on oracle
+ $path = $qb2->expr()->isNull('path');
+ } else {
+ $path = $qb2->expr()->eq('path', $qb2->createNamedParameter(''));
+ }
+
+ $qb2->update('filecache')
+ ->set('permissions', $qb2->createNamedParameter(23))
+ ->where($path)
+ ->andWhere($qb2->expr()->in('storage', $qb2->createFunction($qb->getSQL())))
+ ->andWhere($qb2->expr()->neq('permissions', $qb2->createNamedParameter(23)))
+ ->setParameter('like', 'home::%');
+
+
+ $qb2->execute();
+ }
+
+ /**
+ * Make sure all avatar files in the user roots have permission 27
+ */
+ protected function fixAvatarPermissions() {
+ $qb = $this->connection->getQueryBuilder();
+ $qb2 = $this->connection->getQueryBuilder();
+
+ $qb->select('numeric_id')
+ ->from('storages')
+ ->where($qb->expr()->like('id', $qb2->createParameter('like')));
+
+ $qb2->update('filecache')
+ ->set('permissions', $qb2->createNamedParameter(27))
+ ->where($qb2->expr()->like('path', $qb2->createNamedParameter('avatar.%')))
+ ->andWhere($qb2->expr()->in('storage', $qb2->createFunction($qb->getSQL())))
+ ->andWhere($qb2->expr()->neq('permissions', $qb2->createNamedParameter(27)))
+ ->setParameter('like', 'home::%');
+
+ $qb2->execute();
+ }
+
+}
+
diff --git a/lib/private/Repair/RemoveOldShares.php b/lib/private/Repair/RemoveOldShares.php
new file mode 100644
index 00000000000..2c05d97b15c
--- /dev/null
+++ b/lib/private/Repair/RemoveOldShares.php
@@ -0,0 +1,103 @@
+<?php
+/**
+ * @author Roeland Jago Douma <rullzer@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OC\Repair;
+
+use OCP\IDBConnection;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
+
+/**
+ * Class RemoveOldShares
+ *
+ * @package OC\Repair
+ */
+class RemoveOldShares implements IRepairStep {
+
+ /** @var IDBConnection */
+ protected $connection;
+
+ /**
+ * RemoveOldCalendarShares constructor.
+ *
+ * @param IDBConnection $db
+ */
+ public function __construct(IDBConnection $connection) {
+ $this->connection = $connection;
+ }
+
+ /**
+ * @return string
+ */
+ public function getName() {
+ return 'Remove old (< 9.0) calendar/contact shares';
+ }
+
+ /**
+ * @param IOutput $output
+ */
+ public function run(IOutput $output) {
+ $output->startProgress(4);
+
+ $this->removeCalendarShares($output);
+ $this->removeContactShares($output);
+
+ $output->finishProgress();
+ }
+
+ /**
+ * @param IOutput $output
+ */
+ private function removeCalendarShares(IOutput $output) {
+ $qb = $this->connection->getQueryBuilder();
+ $qb->delete('share')
+ ->where($qb->expr()->eq('item_type', $qb->createNamedParameter('calendar')));
+ $qb->execute();
+
+ $output->advance();
+
+ $qb = $this->connection->getQueryBuilder();
+ $qb->delete('share')
+ ->where($qb->expr()->eq('item_type', $qb->createNamedParameter('event')));
+ $qb->execute();
+
+ $output->advance();
+ }
+
+ /**
+ * @param IOutput $output
+ */
+ private function removeContactShares(IOutput $output) {
+ $qb = $this->connection->getQueryBuilder();
+ $qb->delete('share')
+ ->where($qb->expr()->eq('item_type', $qb->createNamedParameter('contact')));
+ $qb->execute();
+
+ $output->advance();
+
+ $qb = $this->connection->getQueryBuilder();
+ $qb->delete('share')
+ ->where($qb->expr()->eq('item_type', $qb->createNamedParameter('addressbook')));
+ $qb->execute();
+
+ $output->advance();
+ }
+}
+
diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php
index 362468d4109..f560bb4bfc0 100644
--- a/lib/private/User/Session.php
+++ b/lib/private/User/Session.php
@@ -361,7 +361,14 @@ class Session implements IUserSession, Emitter {
// TODO: throw LoginException instead (https://github.com/owncloud/core/pull/24616)
return false;
}
- return $this->login($user, $password);
+ if (!$this->login($user, $password) ) {
+ $users = $this->manager->getByEmail($user);
+ if (count($users) === 1) {
+ return $this->login($users[0]->getUID(), $password);
+ }
+ return false;
+ }
+ return true;
}
private function isTokenAuthEnforced() {
@@ -376,7 +383,11 @@ class Session implements IUserSession, Emitter {
);
$user = $this->manager->get($username);
if (is_null($user)) {
- return true;
+ $users = $this->manager->getByEmail($username);
+ if (count($users) !== 1) {
+ return true;
+ }
+ $user = $users[0];
}
// DI not possible due to cyclic dependencies :'-/
return OC::$server->getTwoFactorAuthManager()->isTwoFactorAuthenticated($user);
@@ -385,7 +396,7 @@ class Session implements IUserSession, Emitter {
/**
* Check if the given 'password' is actually a device token
*
- * @param type $password
+ * @param string $password
* @return boolean
*/
public function isTokenPassword($password) {
@@ -470,11 +481,39 @@ class Session implements IUserSession, Emitter {
$name = isset($request->server['HTTP_USER_AGENT']) ? $request->server['HTTP_USER_AGENT'] : 'unknown browser';
try {
$sessionId = $this->session->getId();
- $this->tokenProvider->generateToken($sessionId, $uid, $loginName, $password, $name);
+ $pwd = $this->getPassword($password);
+ $this->tokenProvider->generateToken($sessionId, $uid, $loginName, $pwd, $name);
+ return true;
} catch (SessionNotAvailableException $ex) {
+ // This can happen with OCC, where a memory session is used
+ // if a memory session is used, we shouldn't create a session token anyway
+ return false;
+ }
+ }
+ /**
+ * Checks if the given password is a token.
+ * If yes, the password is extracted from the token.
+ * If no, the same password is returned.
+ *
+ * @param string $password either the login password or a device token
+ * @return string|null the password or null if none was set in the token
+ */
+ private function getPassword($password) {
+ if (is_null($password)) {
+ // This is surely no token ;-)
+ return null;
+ }
+ try {
+ $token = $this->tokenProvider->getToken($password);
+ try {
+ return $this->tokenProvider->getPassword($token, $password);
+ } catch (PasswordlessTokenException $ex) {
+ return null;
+ }
+ } catch (InvalidTokenException $ex) {
+ return $password;
}
- return true;
}
/**
diff --git a/lib/private/legacy/api.php b/lib/private/legacy/api.php
index a4745f58d02..024f3c0fb63 100644
--- a/lib/private/legacy/api.php
+++ b/lib/private/legacy/api.php
@@ -341,11 +341,15 @@ class OC_API {
// reuse existing login
$loggedIn = \OC::$server->getUserSession()->isLoggedIn();
if ($loggedIn === true) {
+ if (\OC::$server->getTwoFactorAuthManager()->needsSecondFactor()) {
+ // Do not allow access to OCS until the 2FA challenge was solved successfully
+ return false;
+ }
$ocsApiRequest = isset($_SERVER['HTTP_OCS_APIREQUEST']) ? $_SERVER['HTTP_OCS_APIREQUEST'] === 'true' : false;
if ($ocsApiRequest) {
// initialize the user's filesystem
- \OC_Util::setUpFS(\OC_User::getUser());
+ \OC_Util::setupFS(\OC_User::getUser());
self::$isLoggedIn = true;
return OC_User::getUser();
@@ -370,7 +374,7 @@ class OC_API {
self::$logoutRequired = true;
// initialize the user's filesystem
- \OC_Util::setUpFS(\OC_User::getUser());
+ \OC_Util::setupFS(\OC_User::getUser());
self::$isLoggedIn = true;
return \OC_User::getUser();
diff --git a/lib/private/legacy/helper.php b/lib/private/legacy/helper.php
index 25cfff3036b..21fb3cbc5ab 100644
--- a/lib/private/legacy/helper.php
+++ b/lib/private/legacy/helper.php
@@ -206,7 +206,9 @@ class OC_Helper {
foreach ($files as $fileInfo) {
/** @var SplFileInfo $fileInfo */
- if ($fileInfo->isDir()) {
+ if ($fileInfo->isLink()) {
+ unlink($fileInfo->getPathname());
+ } else if ($fileInfo->isDir()) {
rmdir($fileInfo->getRealPath());
} else {
unlink($fileInfo->getRealPath());
@@ -469,7 +471,7 @@ class OC_Helper {
*/
public static function freeSpace($dir) {
$freeSpace = \OC\Files\Filesystem::free_space($dir);
- if ($freeSpace !== \OCP\Files\FileInfo::SPACE_UNKNOWN) {
+ if ($freeSpace < \OCP\Files\FileInfo::SPACE_UNLIMITED) {
$freeSpace = max($freeSpace, 0);
return $freeSpace;
} else {
diff --git a/lib/private/legacy/json.php b/lib/private/legacy/json.php
index d201d69723e..1dde63602b1 100644
--- a/lib/private/legacy/json.php
+++ b/lib/private/legacy/json.php
@@ -64,7 +64,9 @@ class OC_JSON{
* @deprecated Use annotation based ACLs from the AppFramework instead
*/
public static function checkLoggedIn() {
- if( !OC_User::isLoggedIn()) {
+ $twoFactorAuthManger = \OC::$server->getTwoFactorAuthManager();
+ if( !OC_User::isLoggedIn()
+ || $twoFactorAuthManger->needsSecondFactor()) {
$l = \OC::$server->getL10N('lib');
http_response_code(\OCP\AppFramework\Http::STATUS_UNAUTHORIZED);
self::error(array( 'data' => array( 'message' => $l->t('Authentication error'), 'error' => 'authentication_error' )));
diff --git a/lib/private/legacy/util.php b/lib/private/legacy/util.php
index b744db21238..65d00c16388 100644
--- a/lib/private/legacy/util.php
+++ b/lib/private/legacy/util.php
@@ -970,6 +970,11 @@ class OC_Util {
);
exit();
}
+ // Redirect to index page if 2FA challenge was not solved yet
+ if (\OC::$server->getTwoFactorAuthManager()->needsSecondFactor()) {
+ header('Location: ' . \OCP\Util::linkToAbsolute('', 'index.php'));
+ exit();
+ }
}
/**
@@ -1128,19 +1133,8 @@ class OC_Util {
return $encoded;
}
- /**
- * Check if the .htaccess file is working
- * @param \OCP\IConfig $config
- * @return bool
- * @throws Exception
- * @throws \OC\HintException If the test file can't get written.
- */
- public function isHtaccessWorking(\OCP\IConfig $config) {
-
- if (\OC::$CLI || !$config->getSystemValue('check_for_working_htaccess', true)) {
- return true;
- }
+ public function createHtaccessTestFile(\OCP\IConfig $config) {
// php dev server does not support htaccess
if (php_sapi_name() === 'cli-server') {
return false;
@@ -1148,7 +1142,7 @@ class OC_Util {
// testdata
$fileName = '/htaccesstest.txt';
- $testContent = 'testcontent';
+ $testContent = 'This is used for testing whether htaccess is properly enabled to disallow access from the outside. This file can be safely removed.';
// creating a test file
$testFile = $config->getSystemValue('datadirectory', OC::$SERVERROOT . '/data') . '/' . $fileName;
@@ -1164,6 +1158,28 @@ class OC_Util {
}
fwrite($fp, $testContent);
fclose($fp);
+ }
+
+ /**
+ * Check if the .htaccess file is working
+ * @param \OCP\IConfig $config
+ * @return bool
+ * @throws Exception
+ * @throws \OC\HintException If the test file can't get written.
+ */
+ public function isHtaccessWorking(\OCP\IConfig $config) {
+
+ if (\OC::$CLI || !$config->getSystemValue('check_for_working_htaccess', true)) {
+ return true;
+ }
+
+ $testContent = $this->createHtaccessTestFile($config);
+ if ($testContent === false) {
+ return false;
+ }
+
+ $fileName = '/htaccesstest.txt';
+ $testFile = $config->getSystemValue('datadirectory', OC::$SERVERROOT . '/data') . '/' . $fileName;
// accessing the file via http
$url = \OC::$server->getURLGenerator()->getAbsoluteURL(OC::$WEBROOT . '/data' . $fileName);
diff --git a/lib/public/IAppConfig.php b/lib/public/IAppConfig.php
index 1406e8a56d6..22fcdbbb205 100644
--- a/lib/public/IAppConfig.php
+++ b/lib/public/IAppConfig.php
@@ -88,7 +88,7 @@ interface IAppConfig {
* sets a value in the appconfig
* @param string $app app
* @param string $key key
- * @param string $value value
+ * @param string|float|int $value value
* @deprecated 8.0.0 use method setAppValue of \OCP\IConfig
*
* Sets a value. If the key did not exist before it will be created.
diff --git a/lib/public/IConfig.php b/lib/public/IConfig.php
index 9e5024545b3..05158e9063e 100644
--- a/lib/public/IConfig.php
+++ b/lib/public/IConfig.php
@@ -104,7 +104,7 @@ interface IConfig {
* Writes a new app wide value
*
* @param string $appName the appName that we want to store the value under
- * @param string $key the key of the value, under which will be saved
+ * @param string|float|int $key the key of the value, under which will be saved
* @param string $value the value that should be stored
* @return void
* @since 6.0.0
@@ -149,6 +149,7 @@ interface IConfig {
* @param string $value the value that you want to store
* @param string $preCondition only update if the config value was previously the value passed as $preCondition
* @throws \OCP\PreConditionNotMetException if a precondition is specified and is not met
+ * @throws \UnexpectedValueException when trying to store an unexpected value
* @since 6.0.0 - parameter $precondition was added in 8.0.0
*/
public function setUserValue($userId, $appName, $key, $value, $preCondition = null);
diff --git a/lib/public/Migration/IRepairStep.php b/lib/public/Migration/IRepairStep.php
index 3394b70a6ff..84619128b4e 100644
--- a/lib/public/Migration/IRepairStep.php
+++ b/lib/public/Migration/IRepairStep.php
@@ -39,8 +39,9 @@ interface IRepairStep {
* Run repair step.
* Must throw exception on error.
*
- * @since 9.1.0
+ * @param IOutput $output
* @throws \Exception in case of failure
+ * @since 9.1.0
*/
public function run(IOutput $output);
diff --git a/settings/admin.php b/settings/admin.php
index 6fb65b013e6..3ae7455b2ea 100644
--- a/settings/admin.php
+++ b/settings/admin.php
@@ -267,3 +267,7 @@ if ($updaterAppPanel) {
$template->assign('forms', $formsAndMore);
$template->printPage();
+
+$util = new \OC_Util();
+$util->createHtaccessTestFile(\OC::$server->getConfig());
+
diff --git a/settings/js/users/users.js b/settings/js/users/users.js
index 03f471bc3b4..e0fccbd9539 100644
--- a/settings/js/users/users.js
+++ b/settings/js/users/users.js
@@ -14,7 +14,7 @@ var UserList = {
availableGroups: [],
offset: 0,
usersToLoad: 10, //So many users will be loaded when user scrolls down
- initialUsersToLoad: 250, //initial number of users to load
+ initialUsersToLoad: 50, //initial number of users to load
currentGid: '',
filter: '',
diff --git a/settings/l10n/en_GB.js b/settings/l10n/en_GB.js
index 443ca4adc38..bf3bf387fa6 100644
--- a/settings/l10n/en_GB.js
+++ b/settings/l10n/en_GB.js
@@ -137,6 +137,7 @@ OC.L10N.register(
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator.",
+ "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience.",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "The PHP module 'fileinfo' is missing. We strongly recommend enabling this module to get best results with mime-type detection.",
@@ -266,6 +267,7 @@ OC.L10N.register(
"Current password" : "Current password",
"New password" : "New password",
"Change password" : "Change password",
+ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "These are the web, desktop and mobile clients currently logged in to your ownCloud.",
"Browser" : "Browser",
"Most recent activity" : "Most recent activity",
"You've linked these devices." : "You've linked these devices.",
diff --git a/settings/l10n/en_GB.json b/settings/l10n/en_GB.json
index 838710e4073..9ab2f0e5a96 100644
--- a/settings/l10n/en_GB.json
+++ b/settings/l10n/en_GB.json
@@ -135,6 +135,7 @@
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator.",
+ "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience.",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "The PHP module 'fileinfo' is missing. We strongly recommend enabling this module to get best results with mime-type detection.",
@@ -264,6 +265,7 @@
"Current password" : "Current password",
"New password" : "New password",
"Change password" : "Change password",
+ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "These are the web, desktop and mobile clients currently logged in to your ownCloud.",
"Browser" : "Browser",
"Most recent activity" : "Most recent activity",
"You've linked these devices." : "You've linked these devices.",
diff --git a/settings/l10n/pl.js b/settings/l10n/pl.js
index 8c592ec5114..7f14e552192 100644
--- a/settings/l10n/pl.js
+++ b/settings/l10n/pl.js
@@ -6,6 +6,7 @@ OC.L10N.register(
"Authentication error" : "Błąd uwierzytelniania",
"Please provide an admin recovery password, otherwise all user data will be lost" : "Podaj hasło odzyskiwania administratora, w przeciwnym razie wszystkie dane użytkownika zostaną utracone",
"Wrong admin recovery password. Please check the password and try again." : "Błędne hasło odzyskiwania. Sprawdź hasło i spróbuj ponownie.",
+ "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Zaplecze nie obsługuje zmiany hasła, ale klucz szyfrowania użytkownika został pomyślnie zaktualizowany.",
"Unable to change password" : "Nie można zmienić hasła",
"Enabled" : "Włączone",
"Not enabled" : "Nie włączone",
diff --git a/settings/l10n/pl.json b/settings/l10n/pl.json
index ded5e82af0a..6ab582825f7 100644
--- a/settings/l10n/pl.json
+++ b/settings/l10n/pl.json
@@ -4,6 +4,7 @@
"Authentication error" : "Błąd uwierzytelniania",
"Please provide an admin recovery password, otherwise all user data will be lost" : "Podaj hasło odzyskiwania administratora, w przeciwnym razie wszystkie dane użytkownika zostaną utracone",
"Wrong admin recovery password. Please check the password and try again." : "Błędne hasło odzyskiwania. Sprawdź hasło i spróbuj ponownie.",
+ "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Zaplecze nie obsługuje zmiany hasła, ale klucz szyfrowania użytkownika został pomyślnie zaktualizowany.",
"Unable to change password" : "Nie można zmienić hasła",
"Enabled" : "Włączone",
"Not enabled" : "Nie włączone",
diff --git a/settings/l10n/pt_PT.js b/settings/l10n/pt_PT.js
index 5c90fc9cc18..c444ad5083a 100644
--- a/settings/l10n/pt_PT.js
+++ b/settings/l10n/pt_PT.js
@@ -4,7 +4,7 @@ OC.L10N.register(
"Wrong password" : "Palavra-passe errada",
"No user supplied" : "Nenhum utilizador especificado",
"Authentication error" : "Erro na autenticação",
- "Please provide an admin recovery password, otherwise all user data will be lost" : "Por favor, forneça uma palavra-passe de recuperação de administrador, caso contrário seráo perdidos todos os dados",
+ "Please provide an admin recovery password, otherwise all user data will be lost" : "Por favor, forneça uma palavra-passe de recuperação de administrador, caso contrário serão perdidos todos os dados",
"Wrong admin recovery password. Please check the password and try again." : "Palavra-passe de recuperação de administrador errada. Por favor, verifique a palavra-passe e tente novamente.",
"Backend doesn't support password change, but the user's encryption key was successfully updated." : "A interface não suporta a alteração da palavra-passe, mas a chave de encriptação foi atualizada com sucesso.",
"Unable to change password" : "Não foi possível alterar a sua palavra-passe ",
@@ -16,13 +16,13 @@ OC.L10N.register(
"A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema, por favor, verifique os ficheiros de registo (Erro: %s)",
"Migration Completed" : "Migração Concluída",
"Group already exists." : "O grupo já existe.",
- "Unable to add group." : "Impossível acrescentar o grupo.",
- "Unable to delete group." : "Impossível apagar grupo.",
+ "Unable to add group." : "Impossível adicionar o grupo.",
+ "Unable to delete group." : "Impossível eliminar grupo.",
"log-level out of allowed range" : "log-level fora do alcance permitido",
"Saved" : "Guardado",
"test email settings" : "testar as definições de e-mail",
"A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Um problema ocorreu ao enviar o email. Por favor verifique as suas definições. (Erro: %s)",
- "Email sent" : "Mensagem enviada",
+ "Email sent" : "Mensagem de correio eletrónico enviada",
"You need to set your user email before being able to send test emails." : "Você precisa de configurar o seu e-mail de usuário antes de ser capaz de enviar e-mails de teste",
"Invalid mail address" : "Endereço de correio eletrónico inválido",
"A user with that name already exists." : "Já existe um utilizador com esse nome.",
diff --git a/settings/l10n/pt_PT.json b/settings/l10n/pt_PT.json
index cd3d2e14f4e..ab0b38f7f08 100644
--- a/settings/l10n/pt_PT.json
+++ b/settings/l10n/pt_PT.json
@@ -2,7 +2,7 @@
"Wrong password" : "Palavra-passe errada",
"No user supplied" : "Nenhum utilizador especificado",
"Authentication error" : "Erro na autenticação",
- "Please provide an admin recovery password, otherwise all user data will be lost" : "Por favor, forneça uma palavra-passe de recuperação de administrador, caso contrário seráo perdidos todos os dados",
+ "Please provide an admin recovery password, otherwise all user data will be lost" : "Por favor, forneça uma palavra-passe de recuperação de administrador, caso contrário serão perdidos todos os dados",
"Wrong admin recovery password. Please check the password and try again." : "Palavra-passe de recuperação de administrador errada. Por favor, verifique a palavra-passe e tente novamente.",
"Backend doesn't support password change, but the user's encryption key was successfully updated." : "A interface não suporta a alteração da palavra-passe, mas a chave de encriptação foi atualizada com sucesso.",
"Unable to change password" : "Não foi possível alterar a sua palavra-passe ",
@@ -14,13 +14,13 @@
"A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema, por favor, verifique os ficheiros de registo (Erro: %s)",
"Migration Completed" : "Migração Concluída",
"Group already exists." : "O grupo já existe.",
- "Unable to add group." : "Impossível acrescentar o grupo.",
- "Unable to delete group." : "Impossível apagar grupo.",
+ "Unable to add group." : "Impossível adicionar o grupo.",
+ "Unable to delete group." : "Impossível eliminar grupo.",
"log-level out of allowed range" : "log-level fora do alcance permitido",
"Saved" : "Guardado",
"test email settings" : "testar as definições de e-mail",
"A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Um problema ocorreu ao enviar o email. Por favor verifique as suas definições. (Erro: %s)",
- "Email sent" : "Mensagem enviada",
+ "Email sent" : "Mensagem de correio eletrónico enviada",
"You need to set your user email before being able to send test emails." : "Você precisa de configurar o seu e-mail de usuário antes de ser capaz de enviar e-mails de teste",
"Invalid mail address" : "Endereço de correio eletrónico inválido",
"A user with that name already exists." : "Já existe um utilizador com esse nome.",
diff --git a/settings/l10n/ro.js b/settings/l10n/ro.js
index 4f965ce5b74..8afe595859a 100644
--- a/settings/l10n/ro.js
+++ b/settings/l10n/ro.js
@@ -48,8 +48,16 @@ OC.L10N.register(
"Unable to add user to group %s" : "Nu s-a putut adăuga utilizatorul în grupul %s",
"Unable to remove user from group %s" : "Nu s-a putut elimina utilizatorul din grupul %s",
"Couldn't update app." : "Aplicaţia nu s-a putut actualiza.",
+ "Add trusted domain" : "Adaugă domeniu de încredere",
+ "Migration in progress. Please wait until the migration is finished" : "Migrare în progres. Așteaptă până când migrarea este finalizată",
+ "Migration started …" : "Migrarea a început...",
"Sending..." : "Se expediază...",
+ "Official" : "Oficial",
+ "Approved" : "Aprobat",
+ "Experimental" : "Experimental",
"All" : "Toate ",
+ "No apps found for your version" : "Nu au fost găsite aplicații pentru versiunea ta",
+ "The app will be downloaded from the app store" : "Aplicația va fi descărcată din magazin",
"Please wait...." : "Aşteptaţi vă rog....",
"Error while disabling app" : "Eroare în timpul dezactivării aplicației",
"Disable" : "Dezactivați",
@@ -60,7 +68,9 @@ OC.L10N.register(
"Updated" : "Actualizat",
"Uninstalling ...." : "Dezinstalaza ....",
"Uninstall" : "Dezinstalați",
+ "Valid until {date}" : "Valabil până la {date}",
"Delete" : "Șterge",
+ "An error occurred: {message}" : "A apărut o eroare: {message}",
"Select a profile picture" : "Selectează o imagine de profil",
"Very weak password" : "Parolă foarte slabă",
"Weak password" : "Parolă slabă",
@@ -68,13 +78,21 @@ OC.L10N.register(
"Good password" : "Parolă bună",
"Strong password" : "Parolă puternică",
"Groups" : "Grupuri",
+ "Unable to delete {objName}" : "Nu s-a putut șterge {objName}",
+ "deleted {groupName}" : "{groupName} s-a șters",
"undo" : "Anulează ultima acțiune",
+ "no group" : "niciun grup",
"never" : "niciodată",
+ "deleted {userName}" : "{userName} șters",
"add group" : "adăugaţi grupul",
"A valid username must be provided" : "Trebuie să furnizaţi un nume de utilizator valid",
"A valid password must be provided" : "Trebuie să furnizaţi o parolă validă",
"__language_name__" : "_language_name_",
"Unlimited" : "Nelimitată",
+ "Personal info" : "Informații personale",
+ "Sessions" : "Sesiuni",
+ "Devices" : "Dispozitive",
+ "Sync clients" : "Sincronizează clienții",
"None" : "Niciuna",
"Login" : "Autentificare",
"SSL" : "SSL",
@@ -83,31 +101,75 @@ OC.L10N.register(
"Open documentation" : "Deschide documentația",
"Allow apps to use the Share API" : "Permite aplicațiilor să folosească API-ul de partajare",
"Allow public uploads" : "Permite încărcări publice",
+ "Enforce password protection" : "Impune protecția prin parolă",
+ "Set default expiration date" : "Setează data implicită de expirare",
"Allow users to send mail notification for shared files" : "Permite utilizatorilor sa expedieze notificări prin e-mail pentru dosarele comune",
+ "Expire after " : "Expiră după",
"days" : "zile",
+ "Enforce expiration date" : "Impune data de expirare",
"Allow resharing" : "Permite repartajarea",
+ "Allow sharing with groups" : "Permite partajarea cu grupuri",
+ "Exclude groups from sharing" : "Exclude grupuri de la partajare",
"Execute one task with each page loaded" : "Execută o sarcină la fiecare pagină încărcată",
+ "Enable server-side encryption" : "Activează criptarea pe server",
+ "Please read carefully before activating server-side encryption: " : "Citește cu atenție înainte să activezi criptarea pe server:",
+ "This is the final warning: Do you really want to enable encryption?" : "Aceasta este avertizarea finală: Chiar vrei să activezi criptarea?",
"Enable encryption" : "Activează criptarea",
+ "Select default encryption module:" : "Selectează modulul implicit de criptare:",
+ "Start migration" : "Pornește migrarea",
"Send mode" : "Modul de expediere",
"Encryption" : "Încriptare",
+ "From address" : "De la adresa",
+ "mail" : "poștă",
"Authentication method" : "Modul de autentificare",
"Authentication required" : "Autentificare necesară",
"Server address" : "Adresa server-ului",
"Port" : "Portul",
+ "Credentials" : "Detalii de autentificare",
"SMTP Username" : "Nume utilizator SMTP",
"SMTP Password" : "Parolă SMTP",
+ "Store credentials" : "Stochează datele de autentificare",
"Test email settings" : "Verifică setările de e-mail",
"Send email" : "Expediază mesajul",
+ "Download logfile" : "Descarcă fișierul cu loguri",
"More" : "Mai mult",
"Less" : "Mai puțin",
+ "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Fișierul cu loguri este mai mare de 100 MB. Descărcarea acestuia ar putea dura ceva timp!",
+ "What to log" : "Ce să loghezi",
+ "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite e folosit ca o bază de date. Pentru instalări mari recomandăm folosirea unei alte baze de date.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "În special atunci când este folosit clientul desktop pentru sincronizarea fișierelor, utilizarea SQLite este nerecomandată.",
+ "How to do backups" : "Cum să faci copii de rezervă",
+ "Advanced monitoring" : "Monitorizare avansată",
"Version" : "Versiunea",
+ "Developer documentation" : "Documentație pentru dezvoltatori",
+ "by %s" : "de %s",
+ "%s-licensed" : "%s-licențiat",
+ "Documentation:" : "Documentație:",
+ "User documentation" : "Documentație utilizator",
+ "Admin documentation" : "Documentație pentru administrare",
+ "Show description …" : "Arată descriere ...",
+ "Hide description …" : "Ascunde descriere ...",
+ "This app has an update available." : "Este disponibilă o actualizare pentru această aplicație.",
+ "Enable only for specific groups" : "Activează doar pentru grupuri specifice",
+ "Uninstall App" : "Dezinstalează aplicația",
+ "Enable experimental apps" : "Activează aplicațiile experimentale",
+ "SSL Root Certificates" : "Certificate SSL rădăcină",
+ "Common Name" : "Nume comun",
+ "Valid until" : "Valabil până la",
+ "Issued By" : "Emis de",
+ "Valid until %s" : "Valabil până la %s",
+ "Import root certificate" : "Importă certificat rădăcină",
"Cheers!" : "Noroc!",
+ "Administrator documentation" : "Documentație pentru administrare",
+ "Online documentation" : "Documentație online",
"Forum" : "Forum",
+ "Commercial support" : "Suport comercial",
"Profile picture" : "Imagine de profil",
"Upload new" : "Încarcă una nouă",
"Remove image" : "Înlătură imagine",
+ "png or jpg, max. 20 MB" : "png sau jpg, max. 20 MB",
"Cancel" : "Anulare",
+ "Full name" : "Nume complet",
"Email" : "Email",
"Your email address" : "Adresa ta de email",
"Password" : "Parolă",
@@ -115,6 +177,8 @@ OC.L10N.register(
"Current password" : "Parola curentă",
"New password" : "Noua parolă",
"Change password" : "Schimbă parola",
+ "Most recent activity" : "Cea mai recentă activitate",
+ "You've linked these devices." : "Ai legat aceste dispozitive.",
"Name" : "Nume",
"Language" : "Limba",
"Help translate" : "Ajută la traducere",
@@ -128,12 +192,16 @@ OC.L10N.register(
"Admin Recovery Password" : "Parolă de recuperare a Administratorului",
"Enter the recovery password in order to recover the users files during password change" : "Introdu parola de recuperare pentru a recupera fișierele utilizatorilor în timpul schimbării parolei",
"Group" : "Grup",
+ "Admins" : "Administratori",
"Default Quota" : "Cotă implicită",
"Other" : "Altele",
"Full Name" : "Nume complet",
+ "Group Admin for" : "Administrator de grup pentru",
"Quota" : "Cotă",
+ "Last Login" : "Ultima autentificare",
"change full name" : "schimbă numele complet",
"set new password" : "setează parolă nouă",
+ "change email address" : "schimbă adresa email",
"Default" : "Implicită"
},
"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));");
diff --git a/settings/l10n/ro.json b/settings/l10n/ro.json
index 05540e9da90..8682709a39e 100644
--- a/settings/l10n/ro.json
+++ b/settings/l10n/ro.json
@@ -46,8 +46,16 @@
"Unable to add user to group %s" : "Nu s-a putut adăuga utilizatorul în grupul %s",
"Unable to remove user from group %s" : "Nu s-a putut elimina utilizatorul din grupul %s",
"Couldn't update app." : "Aplicaţia nu s-a putut actualiza.",
+ "Add trusted domain" : "Adaugă domeniu de încredere",
+ "Migration in progress. Please wait until the migration is finished" : "Migrare în progres. Așteaptă până când migrarea este finalizată",
+ "Migration started …" : "Migrarea a început...",
"Sending..." : "Se expediază...",
+ "Official" : "Oficial",
+ "Approved" : "Aprobat",
+ "Experimental" : "Experimental",
"All" : "Toate ",
+ "No apps found for your version" : "Nu au fost găsite aplicații pentru versiunea ta",
+ "The app will be downloaded from the app store" : "Aplicația va fi descărcată din magazin",
"Please wait...." : "Aşteptaţi vă rog....",
"Error while disabling app" : "Eroare în timpul dezactivării aplicației",
"Disable" : "Dezactivați",
@@ -58,7 +66,9 @@
"Updated" : "Actualizat",
"Uninstalling ...." : "Dezinstalaza ....",
"Uninstall" : "Dezinstalați",
+ "Valid until {date}" : "Valabil până la {date}",
"Delete" : "Șterge",
+ "An error occurred: {message}" : "A apărut o eroare: {message}",
"Select a profile picture" : "Selectează o imagine de profil",
"Very weak password" : "Parolă foarte slabă",
"Weak password" : "Parolă slabă",
@@ -66,13 +76,21 @@
"Good password" : "Parolă bună",
"Strong password" : "Parolă puternică",
"Groups" : "Grupuri",
+ "Unable to delete {objName}" : "Nu s-a putut șterge {objName}",
+ "deleted {groupName}" : "{groupName} s-a șters",
"undo" : "Anulează ultima acțiune",
+ "no group" : "niciun grup",
"never" : "niciodată",
+ "deleted {userName}" : "{userName} șters",
"add group" : "adăugaţi grupul",
"A valid username must be provided" : "Trebuie să furnizaţi un nume de utilizator valid",
"A valid password must be provided" : "Trebuie să furnizaţi o parolă validă",
"__language_name__" : "_language_name_",
"Unlimited" : "Nelimitată",
+ "Personal info" : "Informații personale",
+ "Sessions" : "Sesiuni",
+ "Devices" : "Dispozitive",
+ "Sync clients" : "Sincronizează clienții",
"None" : "Niciuna",
"Login" : "Autentificare",
"SSL" : "SSL",
@@ -81,31 +99,75 @@
"Open documentation" : "Deschide documentația",
"Allow apps to use the Share API" : "Permite aplicațiilor să folosească API-ul de partajare",
"Allow public uploads" : "Permite încărcări publice",
+ "Enforce password protection" : "Impune protecția prin parolă",
+ "Set default expiration date" : "Setează data implicită de expirare",
"Allow users to send mail notification for shared files" : "Permite utilizatorilor sa expedieze notificări prin e-mail pentru dosarele comune",
+ "Expire after " : "Expiră după",
"days" : "zile",
+ "Enforce expiration date" : "Impune data de expirare",
"Allow resharing" : "Permite repartajarea",
+ "Allow sharing with groups" : "Permite partajarea cu grupuri",
+ "Exclude groups from sharing" : "Exclude grupuri de la partajare",
"Execute one task with each page loaded" : "Execută o sarcină la fiecare pagină încărcată",
+ "Enable server-side encryption" : "Activează criptarea pe server",
+ "Please read carefully before activating server-side encryption: " : "Citește cu atenție înainte să activezi criptarea pe server:",
+ "This is the final warning: Do you really want to enable encryption?" : "Aceasta este avertizarea finală: Chiar vrei să activezi criptarea?",
"Enable encryption" : "Activează criptarea",
+ "Select default encryption module:" : "Selectează modulul implicit de criptare:",
+ "Start migration" : "Pornește migrarea",
"Send mode" : "Modul de expediere",
"Encryption" : "Încriptare",
+ "From address" : "De la adresa",
+ "mail" : "poștă",
"Authentication method" : "Modul de autentificare",
"Authentication required" : "Autentificare necesară",
"Server address" : "Adresa server-ului",
"Port" : "Portul",
+ "Credentials" : "Detalii de autentificare",
"SMTP Username" : "Nume utilizator SMTP",
"SMTP Password" : "Parolă SMTP",
+ "Store credentials" : "Stochează datele de autentificare",
"Test email settings" : "Verifică setările de e-mail",
"Send email" : "Expediază mesajul",
+ "Download logfile" : "Descarcă fișierul cu loguri",
"More" : "Mai mult",
"Less" : "Mai puțin",
+ "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Fișierul cu loguri este mai mare de 100 MB. Descărcarea acestuia ar putea dura ceva timp!",
+ "What to log" : "Ce să loghezi",
+ "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite e folosit ca o bază de date. Pentru instalări mari recomandăm folosirea unei alte baze de date.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "În special atunci când este folosit clientul desktop pentru sincronizarea fișierelor, utilizarea SQLite este nerecomandată.",
+ "How to do backups" : "Cum să faci copii de rezervă",
+ "Advanced monitoring" : "Monitorizare avansată",
"Version" : "Versiunea",
+ "Developer documentation" : "Documentație pentru dezvoltatori",
+ "by %s" : "de %s",
+ "%s-licensed" : "%s-licențiat",
+ "Documentation:" : "Documentație:",
+ "User documentation" : "Documentație utilizator",
+ "Admin documentation" : "Documentație pentru administrare",
+ "Show description …" : "Arată descriere ...",
+ "Hide description …" : "Ascunde descriere ...",
+ "This app has an update available." : "Este disponibilă o actualizare pentru această aplicație.",
+ "Enable only for specific groups" : "Activează doar pentru grupuri specifice",
+ "Uninstall App" : "Dezinstalează aplicația",
+ "Enable experimental apps" : "Activează aplicațiile experimentale",
+ "SSL Root Certificates" : "Certificate SSL rădăcină",
+ "Common Name" : "Nume comun",
+ "Valid until" : "Valabil până la",
+ "Issued By" : "Emis de",
+ "Valid until %s" : "Valabil până la %s",
+ "Import root certificate" : "Importă certificat rădăcină",
"Cheers!" : "Noroc!",
+ "Administrator documentation" : "Documentație pentru administrare",
+ "Online documentation" : "Documentație online",
"Forum" : "Forum",
+ "Commercial support" : "Suport comercial",
"Profile picture" : "Imagine de profil",
"Upload new" : "Încarcă una nouă",
"Remove image" : "Înlătură imagine",
+ "png or jpg, max. 20 MB" : "png sau jpg, max. 20 MB",
"Cancel" : "Anulare",
+ "Full name" : "Nume complet",
"Email" : "Email",
"Your email address" : "Adresa ta de email",
"Password" : "Parolă",
@@ -113,6 +175,8 @@
"Current password" : "Parola curentă",
"New password" : "Noua parolă",
"Change password" : "Schimbă parola",
+ "Most recent activity" : "Cea mai recentă activitate",
+ "You've linked these devices." : "Ai legat aceste dispozitive.",
"Name" : "Nume",
"Language" : "Limba",
"Help translate" : "Ajută la traducere",
@@ -126,12 +190,16 @@
"Admin Recovery Password" : "Parolă de recuperare a Administratorului",
"Enter the recovery password in order to recover the users files during password change" : "Introdu parola de recuperare pentru a recupera fișierele utilizatorilor în timpul schimbării parolei",
"Group" : "Grup",
+ "Admins" : "Administratori",
"Default Quota" : "Cotă implicită",
"Other" : "Altele",
"Full Name" : "Nume complet",
+ "Group Admin for" : "Administrator de grup pentru",
"Quota" : "Cotă",
+ "Last Login" : "Ultima autentificare",
"change full name" : "schimbă numele complet",
"set new password" : "setează parolă nouă",
+ "change email address" : "schimbă adresa email",
"Default" : "Implicită"
},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"
} \ No newline at end of file
diff --git a/settings/l10n/sl.js b/settings/l10n/sl.js
index dcfd15f6ec9..6d93fc46441 100644
--- a/settings/l10n/sl.js
+++ b/settings/l10n/sl.js
@@ -62,6 +62,7 @@ OC.L10N.register(
"Experimental" : "Preizkusno",
"All" : "Vsi",
"No apps found for your version" : "Za to različico ni na voljo noben vstavek",
+ "The app will be downloaded from the app store" : "Program bo prejet iz zbirke programov",
"Update to %s" : "Posodobi na %s",
"_You have %n app update pending_::_You have %n app updates pending_" : ["Na čakanju je %n posodobitev","Na čakanju sta %n posodobitvi","Na čakanju so %n posodobitve","Na čakanju je %n posodobitev"],
"Please wait...." : "Počakajte ...",
@@ -80,6 +81,7 @@ OC.L10N.register(
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Vstavek je omogočen, vendar zahteva posodobitev. Samodejno bo izvedena preusmeritev na stran za posodobitev v 5 sekundah.",
"App update" : "Posodabljanje vstavkov",
"No apps found for {query}" : "Ni programov, skladnih z nizom \"{query}\".",
+ "Disconnect" : "Prekinjeni povezavo",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "Prišlo je do napake. Uvoziti je treba ustrezno ASCII kodirano potrdilo PEM.",
"Valid until {date}" : "Veljavno do {date}",
"Delete" : "Izbriši",
@@ -108,6 +110,8 @@ OC.L10N.register(
"__language_name__" : "Slovenščina",
"Unlimited" : "Neomejeno",
"Personal info" : "Osebni podatki",
+ "Sessions" : "Seje",
+ "Devices" : "Naprave",
"Sync clients" : "Uskladi odjemalce",
"Everything (fatal issues, errors, warnings, info, debug)" : "Vse (podrobnosti, opozorila, hrošče, napake in usodne dogodke)",
"Info, warnings, errors and fatal issues" : "Podrobnosti, opozorila, napake in usodne dogodke",
@@ -120,6 +124,7 @@ OC.L10N.register(
"NT LAN Manager" : "Upravljalnik NT LAN",
"SSL" : "SSL",
"TLS" : "TLS",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Napako je najverjetneje povzročil predpomnilnik ali pospeševalnik, kot sta Zend OPcache ali eAccelerator.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Strežnik ownCloud je nameščen v okolju Microsoft Windows. Toplo priporočamo okolje Linux za najboljšo uporabniško izkušnjo.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Manjka modul PHP 'fileinfo'. Priporočljivo je omogočiti ta modul za popolno zaznavanje vrst MIME.",
"System locale can not be set to a one which supports UTF-8." : "Sistemskih jezikovnih nastavitev ni mogoče nastaviti na možnost, ki podpira nabor UTF-8.",
@@ -136,6 +141,7 @@ OC.L10N.register(
"days" : "dneh",
"Enforce expiration date" : "Vsili datum preteka",
"Allow resharing" : "Dovoli nadaljnjo souporabo",
+ "Allow sharing with groups" : "Dovoli souporabo s skupinami",
"Restrict users to only share with users in their groups" : "Uporabnikom dovoli omogočanje souporabe le znotraj njihove skupine",
"Allow users to send mail notification for shared files to other users" : "Dovoli uporabnikom pošiljanje obvestil o souporabi datotek z drugimi uporabniki.",
"Exclude groups from sharing" : "Izloči skupine iz souporabe",
@@ -225,6 +231,8 @@ OC.L10N.register(
"Current password" : "Trenutno geslo",
"New password" : "Novo geslo",
"Change password" : "Spremeni geslo",
+ "Browser" : "Brskalnik",
+ "Most recent activity" : "Zadnja dejavnost",
"Name" : "Ime",
"Language" : "Jezik",
"Help translate" : "Sodelujte pri prevajanju",
diff --git a/settings/l10n/sl.json b/settings/l10n/sl.json
index efa8ddc3271..b7ac84811d7 100644
--- a/settings/l10n/sl.json
+++ b/settings/l10n/sl.json
@@ -60,6 +60,7 @@
"Experimental" : "Preizkusno",
"All" : "Vsi",
"No apps found for your version" : "Za to različico ni na voljo noben vstavek",
+ "The app will be downloaded from the app store" : "Program bo prejet iz zbirke programov",
"Update to %s" : "Posodobi na %s",
"_You have %n app update pending_::_You have %n app updates pending_" : ["Na čakanju je %n posodobitev","Na čakanju sta %n posodobitvi","Na čakanju so %n posodobitve","Na čakanju je %n posodobitev"],
"Please wait...." : "Počakajte ...",
@@ -78,6 +79,7 @@
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Vstavek je omogočen, vendar zahteva posodobitev. Samodejno bo izvedena preusmeritev na stran za posodobitev v 5 sekundah.",
"App update" : "Posodabljanje vstavkov",
"No apps found for {query}" : "Ni programov, skladnih z nizom \"{query}\".",
+ "Disconnect" : "Prekinjeni povezavo",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "Prišlo je do napake. Uvoziti je treba ustrezno ASCII kodirano potrdilo PEM.",
"Valid until {date}" : "Veljavno do {date}",
"Delete" : "Izbriši",
@@ -106,6 +108,8 @@
"__language_name__" : "Slovenščina",
"Unlimited" : "Neomejeno",
"Personal info" : "Osebni podatki",
+ "Sessions" : "Seje",
+ "Devices" : "Naprave",
"Sync clients" : "Uskladi odjemalce",
"Everything (fatal issues, errors, warnings, info, debug)" : "Vse (podrobnosti, opozorila, hrošče, napake in usodne dogodke)",
"Info, warnings, errors and fatal issues" : "Podrobnosti, opozorila, napake in usodne dogodke",
@@ -118,6 +122,7 @@
"NT LAN Manager" : "Upravljalnik NT LAN",
"SSL" : "SSL",
"TLS" : "TLS",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Napako je najverjetneje povzročil predpomnilnik ali pospeševalnik, kot sta Zend OPcache ali eAccelerator.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Strežnik ownCloud je nameščen v okolju Microsoft Windows. Toplo priporočamo okolje Linux za najboljšo uporabniško izkušnjo.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Manjka modul PHP 'fileinfo'. Priporočljivo je omogočiti ta modul za popolno zaznavanje vrst MIME.",
"System locale can not be set to a one which supports UTF-8." : "Sistemskih jezikovnih nastavitev ni mogoče nastaviti na možnost, ki podpira nabor UTF-8.",
@@ -134,6 +139,7 @@
"days" : "dneh",
"Enforce expiration date" : "Vsili datum preteka",
"Allow resharing" : "Dovoli nadaljnjo souporabo",
+ "Allow sharing with groups" : "Dovoli souporabo s skupinami",
"Restrict users to only share with users in their groups" : "Uporabnikom dovoli omogočanje souporabe le znotraj njihove skupine",
"Allow users to send mail notification for shared files to other users" : "Dovoli uporabnikom pošiljanje obvestil o souporabi datotek z drugimi uporabniki.",
"Exclude groups from sharing" : "Izloči skupine iz souporabe",
@@ -223,6 +229,8 @@
"Current password" : "Trenutno geslo",
"New password" : "Novo geslo",
"Change password" : "Spremeni geslo",
+ "Browser" : "Brskalnik",
+ "Most recent activity" : "Zadnja dejavnost",
"Name" : "Ime",
"Language" : "Jezik",
"Help translate" : "Sodelujte pri prevajanju",
diff --git a/settings/l10n/sq.js b/settings/l10n/sq.js
index c56cd65af5f..54cb92cd0d7 100644
--- a/settings/l10n/sq.js
+++ b/settings/l10n/sq.js
@@ -137,6 +137,7 @@ OC.L10N.register(
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Rregullimi Vetëm-Lexim u aktivizua. Kjo parandalon rregullimin e disa parametrave përmes ndërfaqes web. Më tej, për çdo përditësim kartela lyp të kalohet dorazi si e shkrueshme.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Duket se PHP-ja është rregulluar që të heqë blloqe të brendshme dokumentimi. Kjo do t’i bëjë të papërdrshme disa aplikacione bazë.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Kjo ka gjasa të jetë shkaktuar nga një fshehtinë/përshpejtues i tillë si Zend OPcache ose eAccelerator.",
+ "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Baza juaj e të dhënave nuk xhiron me nivelin \"READ COMMITED\" e izolimit për ndërveprimet. Kjo mund të shkaktojë probleme, kur kryhen paralelisht disa veprime njëherësh.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Shërbyesi juaj xhiron nën Microsoft Windows. Këshillojmë fort Linux-in për punim optimal nga ana e përdoruesit.",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "Ka të instaluar %1$s nën versionin %2$s, për arsye qëndrueshmërie dhe performance këshillojmë të përditësohet me një version %1$s më të ri.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Moduli PHP 'fileinfo' mungon. Ju këshillojmë me forcë ta aktivizoni këtë modul, për të patur përfundimet më të mira në zbulim llojesh MIME.",
@@ -266,6 +267,7 @@ OC.L10N.register(
"Current password" : "Fjalëkalimi i tanishëm",
"New password" : "Fjalëkalimi i ri",
"Change password" : "Ndrysho fjalëkalimin",
+ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Këta janë klientët web, desktop dhe celular të futur në këtë çast në ownCloud-in tuaj.",
"Browser" : "Shfletues",
"Most recent activity" : "Veprimtaria më e freskët",
"You've linked these devices." : "I keni të lidhura këto pajisje.",
diff --git a/settings/l10n/sq.json b/settings/l10n/sq.json
index f6411a4142b..1a2edc2ced3 100644
--- a/settings/l10n/sq.json
+++ b/settings/l10n/sq.json
@@ -135,6 +135,7 @@
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Rregullimi Vetëm-Lexim u aktivizua. Kjo parandalon rregullimin e disa parametrave përmes ndërfaqes web. Më tej, për çdo përditësim kartela lyp të kalohet dorazi si e shkrueshme.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Duket se PHP-ja është rregulluar që të heqë blloqe të brendshme dokumentimi. Kjo do t’i bëjë të papërdrshme disa aplikacione bazë.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Kjo ka gjasa të jetë shkaktuar nga një fshehtinë/përshpejtues i tillë si Zend OPcache ose eAccelerator.",
+ "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Baza juaj e të dhënave nuk xhiron me nivelin \"READ COMMITED\" e izolimit për ndërveprimet. Kjo mund të shkaktojë probleme, kur kryhen paralelisht disa veprime njëherësh.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Shërbyesi juaj xhiron nën Microsoft Windows. Këshillojmë fort Linux-in për punim optimal nga ana e përdoruesit.",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "Ka të instaluar %1$s nën versionin %2$s, për arsye qëndrueshmërie dhe performance këshillojmë të përditësohet me një version %1$s më të ri.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Moduli PHP 'fileinfo' mungon. Ju këshillojmë me forcë ta aktivizoni këtë modul, për të patur përfundimet më të mira në zbulim llojesh MIME.",
@@ -264,6 +265,7 @@
"Current password" : "Fjalëkalimi i tanishëm",
"New password" : "Fjalëkalimi i ri",
"Change password" : "Ndrysho fjalëkalimin",
+ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Këta janë klientët web, desktop dhe celular të futur në këtë çast në ownCloud-in tuaj.",
"Browser" : "Shfletues",
"Most recent activity" : "Veprimtaria më e freskët",
"You've linked these devices." : "I keni të lidhura këto pajisje.",
diff --git a/settings/l10n/sv.js b/settings/l10n/sv.js
index d056027b43e..aa5e3a8ef48 100644
--- a/settings/l10n/sv.js
+++ b/settings/l10n/sv.js
@@ -137,6 +137,7 @@ OC.L10N.register(
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Läs-bara konfigureringen har blivit aktiv. Detta förhindrar att några konfigureringar kan sättas via web-gränssnittet.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP är tydligen inställd för att rensa inline doc block. Detta kommer att göra flera kärnapplikationer otillgängliga.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Detta orsakas troligtvis av en cache/accelerator som t ex Zend OPchache eller eAccelerator.",
+ "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Din databas kör inte \"READ COMMITED\" tansaktionsisoleringsnvån. Detta kan orsaka problem när multipla aktioner körs parallellt.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Din server använder Microsoft Windows. Vi rekommenderar starkt Linux för en optimal användarerfarenhet.",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s under version %2$s är installerad, för stabilitet och prestanda rekommenderar vi uppdatering till en nyare %1$s version.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP-modulen 'fileinfo' saknas. Vi rekommenderar starkt att aktivera den här modulen för att kunna upptäcka korrekt mime-typ.",
@@ -266,6 +267,7 @@ OC.L10N.register(
"Current password" : "Nuvarande lösenord",
"New password" : "Nytt lösenord",
"Change password" : "Ändra lösenord",
+ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dessa webbläsare,pc och mobila klienter är för tillfället inloggade på din ownCloud.",
"Browser" : "Webbläsare",
"Most recent activity" : "Senaste aktivitet",
"You've linked these devices." : "Du har länkat dessa enheter.",
diff --git a/settings/l10n/sv.json b/settings/l10n/sv.json
index 61c30b1b0e3..0cf69401b31 100644
--- a/settings/l10n/sv.json
+++ b/settings/l10n/sv.json
@@ -135,6 +135,7 @@
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Läs-bara konfigureringen har blivit aktiv. Detta förhindrar att några konfigureringar kan sättas via web-gränssnittet.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP är tydligen inställd för att rensa inline doc block. Detta kommer att göra flera kärnapplikationer otillgängliga.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Detta orsakas troligtvis av en cache/accelerator som t ex Zend OPchache eller eAccelerator.",
+ "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Din databas kör inte \"READ COMMITED\" tansaktionsisoleringsnvån. Detta kan orsaka problem när multipla aktioner körs parallellt.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Din server använder Microsoft Windows. Vi rekommenderar starkt Linux för en optimal användarerfarenhet.",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s under version %2$s är installerad, för stabilitet och prestanda rekommenderar vi uppdatering till en nyare %1$s version.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP-modulen 'fileinfo' saknas. Vi rekommenderar starkt att aktivera den här modulen för att kunna upptäcka korrekt mime-typ.",
@@ -264,6 +265,7 @@
"Current password" : "Nuvarande lösenord",
"New password" : "Nytt lösenord",
"Change password" : "Ändra lösenord",
+ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dessa webbläsare,pc och mobila klienter är för tillfället inloggade på din ownCloud.",
"Browser" : "Webbläsare",
"Most recent activity" : "Senaste aktivitet",
"You've linked these devices." : "Du har länkat dessa enheter.",
diff --git a/settings/personal.php b/settings/personal.php
index 3d294acaccf..0b2781fb21b 100644
--- a/settings/personal.php
+++ b/settings/personal.php
@@ -81,8 +81,9 @@ $commonLanguages = array();
foreach($languageCodes as $lang) {
$l = \OC::$server->getL10N('settings', $lang);
// TRANSLATORS this is the language name for the language switcher in the personal settings and should be the localized version
- if(substr($l->t('__language_name__'), 0, 1) !== '_') {//first check if the language name is in the translation file
- $ln=array('code'=>$lang, 'name'=> (string)$l->t('__language_name__'));
+ $potentialName = (string) $l->t('__language_name__');
+ if($l->getLanguageCode() === $lang && substr($potentialName, 0, 1) !== '_') {//first check if the language name is in the translation file
+ $ln=array('code'=>$lang, 'name'=> $potentialName);
}elseif(isset($languageNames[$lang])) {
$ln=array('code'=>$lang, 'name'=>$languageNames[$lang]);
}else{//fallback to language code
diff --git a/settings/templates/apps.php b/settings/templates/apps.php
index ecb00fb27c3..d3c14332693 100644
--- a/settings/templates/apps.php
+++ b/settings/templates/apps.php
@@ -91,8 +91,22 @@ script(
<a id="adminDocumentation" class="appslink" href="{{documentation.admin}}" target="_blank" rel="noreferrer"><?php p($l->t('Admin documentation'));?> ↗</a>
</span>
{{/if}}
+
+ {{#if documentation.developer}}
+ <span class="developerDocumentation">
+ <a id="developerDocumentation" class="appslink" href="{{documentation.developer}}" target="_blank" rel="noreferrer"><?php p($l->t('Developer documentation'));?> ↗</a>
+ </span>
+ {{/if}}
</p>
{{/if}}
+
+ {{#if website}}
+ <a id="userDocumentation" class="appslink" href="{{website}}" target="_blank" rel="noreferrer"><?php p($l->t('Visit website'));?> ↗</a>
+ {{/if}}
+
+ {{#if bugs}}
+ <a id="adminDocumentation" class="appslink" href="{{bugs}}" target="_blank" rel="noreferrer"><?php p($l->t('Report a bug'));?> ↗</a>
+ {{/if}}
</div><!-- end app-description-container -->
<div class="app-description-toggle-show" role="link"><?php p($l->t("Show description …"));?></div>
<div class="app-description-toggle-hide hidden" role="link"><?php p($l->t("Hide description …"));?></div>
diff --git a/tests/Core/Controller/LoginControllerTest.php b/tests/Core/Controller/LoginControllerTest.php
index ea9d6a44148..d6fa772d38b 100644
--- a/tests/Core/Controller/LoginControllerTest.php
+++ b/tests/Core/Controller/LoginControllerTest.php
@@ -29,6 +29,7 @@ use OCP\IConfig;
use OCP\IRequest;
use OCP\ISession;
use OCP\IURLGenerator;
+use OCP\IUser;
use OCP\IUserManager;
use OCP\IUserSession;
use Test\TestCase;
@@ -36,19 +37,19 @@ use Test\TestCase;
class LoginControllerTest extends TestCase {
/** @var LoginController */
private $loginController;
- /** @var IRequest */
+ /** @var IRequest | \PHPUnit_Framework_MockObject_MockObject */
private $request;
- /** @var IUserManager */
+ /** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject */
private $userManager;
- /** @var IConfig */
+ /** @var IConfig | \PHPUnit_Framework_MockObject_MockObject */
private $config;
- /** @var ISession */
+ /** @var ISession | \PHPUnit_Framework_MockObject_MockObject */
private $session;
- /** @var IUserSession */
+ /** @var IUserSession | \PHPUnit_Framework_MockObject_MockObject */
private $userSession;
- /** @var IURLGenerator */
+ /** @var IURLGenerator | \PHPUnit_Framework_MockObject_MockObject */
private $urlGenerator;
- /** @var Manager */
+ /** @var Manager | \PHPUnit_Framework_MockObject_MockObject */
private $twoFactorManager;
public function setUp() {
@@ -296,6 +297,7 @@ class LoginControllerTest extends TestCase {
}
public function testLoginWithValidCredentials() {
+ /** @var IUser | \PHPUnit_Framework_MockObject_MockObject $user */
$user = $this->getMock('\OCP\IUser');
$password = 'secret';
$indexPageUrl = 'some url';
@@ -323,6 +325,7 @@ class LoginControllerTest extends TestCase {
}
public function testLoginWithValidCredentialsAndRedirectUrl() {
+ /** @var IUser | \PHPUnit_Framework_MockObject_MockObject $user */
$user = $this->getMock('\OCP\IUser');
$user->expects($this->any())
->method('getUID')
@@ -352,6 +355,7 @@ class LoginControllerTest extends TestCase {
}
public function testLoginWithTwoFactorEnforced() {
+ /** @var IUser | \PHPUnit_Framework_MockObject_MockObject $user */
$user = $this->getMock('\OCP\IUser');
$user->expects($this->any())
->method('getUID')
@@ -380,8 +384,36 @@ class LoginControllerTest extends TestCase {
->with('core.TwoFactorChallenge.selectChallenge')
->will($this->returnValue($challengeUrl));
- $expected = new \OCP\AppFramework\Http\RedirectResponse($challengeUrl);
+ $expected = new RedirectResponse($challengeUrl);
$this->assertEquals($expected, $this->loginController->tryLogin('john@doe.com', $password, null));
}
+ public function testToNotLeakLoginName() {
+ /** @var IUser | \PHPUnit_Framework_MockObject_MockObject $user */
+ $user = $this->getMock('\OCP\IUser');
+ $user->expects($this->any())
+ ->method('getUID')
+ ->will($this->returnValue('john'));
+
+ $this->userManager->expects($this->exactly(2))
+ ->method('checkPassword')
+ ->withConsecutive(
+ ['john@doe.com', 'just wrong'],
+ ['john', 'just wrong']
+ )
+ ->willReturn(false);
+
+ $this->userManager->expects($this->once())
+ ->method('getByEmail')
+ ->with('john@doe.com')
+ ->willReturn([$user]);
+
+ $this->urlGenerator->expects($this->once())
+ ->method('linkToRoute')
+ ->with('core.login.showLoginForm', ['user' => 'john@doe.com'])
+ ->will($this->returnValue(''));
+
+ $expected = new RedirectResponse('');
+ $this->assertEquals($expected, $this->loginController->tryLogin('john@doe.com', 'just wrong', null));
+ }
}
diff --git a/tests/Core/Controller/TokenControllerTest.php b/tests/Core/Controller/TokenControllerTest.php
index 386140a8a4f..b6b54b14fad 100644
--- a/tests/Core/Controller/TokenControllerTest.php
+++ b/tests/Core/Controller/TokenControllerTest.php
@@ -23,8 +23,9 @@
namespace Tests\Core\Controller;
use OC\AppFramework\Http;
+use OC\Authentication\Token\IToken;
use OC\Core\Controller\TokenController;
-use OCP\AppFramework\Http\Response;
+use OCP\AppFramework\Http\JSONResponse;
use Test\TestCase;
class TokenControllerTest extends TestCase {
@@ -34,6 +35,7 @@ class TokenControllerTest extends TestCase {
private $request;
private $userManager;
private $tokenProvider;
+ private $twoFactorAuthManager;
private $secureRandom;
protected function setUp() {
@@ -43,17 +45,17 @@ class TokenControllerTest extends TestCase {
$this->userManager = $this->getMockBuilder('\OC\User\Manager')
->disableOriginalConstructor()
->getMock();
- $this->tokenProvider = $this->getMockBuilder('\OC\Authentication\Token\DefaultTokenProvider')
+ $this->tokenProvider = $this->getMock('\OC\Authentication\Token\IProvider');
+ $this->twoFactorAuthManager = $this->getMockBuilder('\OC\Authentication\TwoFactorAuth\Manager')
->disableOriginalConstructor()
->getMock();
$this->secureRandom = $this->getMock('\OCP\Security\ISecureRandom');
- $this->tokenController = new TokenController('core', $this->request, $this->userManager, $this->tokenProvider,
- $this->secureRandom);
+ $this->tokenController = new TokenController('core', $this->request, $this->userManager, $this->tokenProvider, $this->twoFactorAuthManager, $this->secureRandom);
}
public function testWithoutCredentials() {
- $expected = new Response();
+ $expected = new JSONResponse();
$expected->setStatus(Http::STATUS_UNPROCESSABLE_ENTITY);
$actual = $this->tokenController->generateToken(null, null);
@@ -66,7 +68,7 @@ class TokenControllerTest extends TestCase {
->method('checkPassword')
->with('john', 'passme')
->will($this->returnValue(false));
- $expected = new Response();
+ $expected = new JSONResponse();
$expected->setStatus(Http::STATUS_UNAUTHORIZED);
$actual = $this->tokenController->generateToken('john', 'passme');
@@ -83,13 +85,17 @@ class TokenControllerTest extends TestCase {
$user->expects($this->once())
->method('getUID')
->will($this->returnValue('john'));
+ $this->twoFactorAuthManager->expects($this->once())
+ ->method('isTwoFactorAuthenticated')
+ ->with($user)
+ ->will($this->returnValue(false));
$this->secureRandom->expects($this->once())
->method('generate')
->with(128)
->will($this->returnValue('verysecurerandomtoken'));
$this->tokenProvider->expects($this->once())
->method('generateToken')
- ->with('verysecurerandomtoken', 'john', 'john', '123456', 'unknown client', \OC\Authentication\Token\IToken::PERMANENT_TOKEN);
+ ->with('verysecurerandomtoken', 'john', 'john', '123456', 'unknown client', IToken::PERMANENT_TOKEN);
$expected = [
'token' => 'verysecurerandomtoken'
];
@@ -99,4 +105,24 @@ class TokenControllerTest extends TestCase {
$this->assertEquals($expected, $actual);
}
+ public function testWithValidCredentialsBut2faEnabled() {
+ $user = $this->getMock('\OCP\IUser');
+ $this->userManager->expects($this->once())
+ ->method('checkPassword')
+ ->with('john', '123456')
+ ->will($this->returnValue($user));
+ $this->twoFactorAuthManager->expects($this->once())
+ ->method('isTwoFactorAuthenticated')
+ ->with($user)
+ ->will($this->returnValue(true));
+ $this->secureRandom->expects($this->never())
+ ->method('generate');
+ $expected = new JSONResponse();
+ $expected->setStatus(Http::STATUS_UNAUTHORIZED);
+
+ $actual = $this->tokenController->generateToken('john', '123456');
+
+ $this->assertEquals($expected, $actual);
+ }
+
}
diff --git a/tests/Core/Controller/TwoFactorChallengeControllerTest.php b/tests/Core/Controller/TwoFactorChallengeControllerTest.php
index 2da6dcd52ac..08d8dd1452c 100644
--- a/tests/Core/Controller/TwoFactorChallengeControllerTest.php
+++ b/tests/Core/Controller/TwoFactorChallengeControllerTest.php
@@ -33,7 +33,7 @@ class TwoFactorChallengeControllerTest extends TestCase {
private $session;
private $urlGenerator;
- /** TwoFactorChallengeController */
+ /** @var TwoFactorChallengeController|\PHPUnit_Framework_MockObject_MockObject */
private $controller;
protected function setUp() {
@@ -47,9 +47,20 @@ class TwoFactorChallengeControllerTest extends TestCase {
$this->session = $this->getMock('\OCP\ISession');
$this->urlGenerator = $this->getMock('\OCP\IURLGenerator');
- $this->controller = new TwoFactorChallengeController(
- 'core', $this->request, $this->twoFactorManager, $this->userSession, $this->session, $this->urlGenerator
- );
+ $this->controller = $this->getMockBuilder('OC\Core\Controller\TwoFactorChallengeController')
+ ->setConstructorArgs([
+ 'core',
+ $this->request,
+ $this->twoFactorManager,
+ $this->userSession,
+ $this->session,
+ $this->urlGenerator,
+ ])
+ ->setMethods(['getLogoutAttribute'])
+ ->getMock();
+ $this->controller->expects($this->any())
+ ->method('getLogoutAttribute')
+ ->willReturn('logoutAttribute');
}
public function testSelectChallenge() {
@@ -70,6 +81,7 @@ class TwoFactorChallengeControllerTest extends TestCase {
$expected = new \OCP\AppFramework\Http\TemplateResponse('core', 'twofactorselectchallenge', [
'providers' => $providers,
'redirect_url' => '/some/url',
+ 'logout_attribute' => 'logoutAttribute',
], 'guest');
$this->assertEquals($expected, $this->controller->selectChallenge('/some/url'));
@@ -110,6 +122,7 @@ class TwoFactorChallengeControllerTest extends TestCase {
$expected = new \OCP\AppFramework\Http\TemplateResponse('core', 'twofactorshowchallenge', [
'error' => true,
'provider' => $provider,
+ 'logout_attribute' => 'logoutAttribute',
'template' => '<html/>',
], 'guest');
diff --git a/tests/lib/AllConfigTest.php b/tests/lib/AllConfigTest.php
index 4f8b0658b80..3d0a9cb0827 100644
--- a/tests/lib/AllConfigTest.php
+++ b/tests/lib/AllConfigTest.php
@@ -123,6 +123,25 @@ class AllConfigTest extends \Test\TestCase {
$config->deleteUserValue('userPreCond', 'appPreCond', 'keyPreCond');
}
+ public function dataSetUserValueUnexpectedValue() {
+ return [
+ [true],
+ [false],
+ [null],
+ [new \stdClass()],
+ ];
+ }
+
+ /**
+ * @dataProvider dataSetUserValueUnexpectedValue
+ * @param mixed $value
+ * @expectedException \UnexpectedValueException
+ */
+ public function testSetUserValueUnexpectedValue($value) {
+ $config = $this->getConfig();
+ $config->setUserValue('userSetBool', 'appSetBool', 'keySetBool', $value);
+ }
+
/**
* @expectedException \OCP\PreConditionNotMetException
*/
diff --git a/tests/lib/AppFramework/Middleware/Security/CORSMiddlewareTest.php b/tests/lib/AppFramework/Middleware/Security/CORSMiddlewareTest.php
index 8e53c9202cf..a398dc2320c 100644
--- a/tests/lib/AppFramework/Middleware/Security/CORSMiddlewareTest.php
+++ b/tests/lib/AppFramework/Middleware/Security/CORSMiddlewareTest.php
@@ -16,7 +16,6 @@ use OC\AppFramework\Http\Request;
use OC\AppFramework\Middleware\Security\CORSMiddleware;
use OC\AppFramework\Utility\ControllerMethodReflector;
use OC\AppFramework\Middleware\Security\Exceptions\SecurityException;
-use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\Response;
@@ -29,7 +28,9 @@ class CORSMiddlewareTest extends \Test\TestCase {
protected function setUp() {
parent::setUp();
$this->reflector = new ControllerMethodReflector();
- $this->session = $this->getMock('\OCP\IUserSession');
+ $this->session = $this->getMockBuilder('\OC\User\Session')
+ ->disableOriginalConstructor()
+ ->getMock();
}
/**
@@ -127,7 +128,7 @@ class CORSMiddlewareTest extends \Test\TestCase {
$this->session->expects($this->never())
->method('logout');
$this->session->expects($this->never())
- ->method('login')
+ ->method('logClientIn')
->with($this->equalTo('user'), $this->equalTo('pass'))
->will($this->returnValue(true));
$this->reflector->reflect($this, __FUNCTION__);
@@ -150,7 +151,7 @@ class CORSMiddlewareTest extends \Test\TestCase {
$this->session->expects($this->once())
->method('logout');
$this->session->expects($this->once())
- ->method('login')
+ ->method('logClientIn')
->with($this->equalTo('user'), $this->equalTo('pass'))
->will($this->returnValue(true));
$this->reflector->reflect($this, __FUNCTION__);
@@ -175,7 +176,7 @@ class CORSMiddlewareTest extends \Test\TestCase {
$this->session->expects($this->once())
->method('logout');
$this->session->expects($this->once())
- ->method('login')
+ ->method('logClientIn')
->with($this->equalTo('user'), $this->equalTo('pass'))
->will($this->returnValue(false));
$this->reflector->reflect($this, __FUNCTION__);
diff --git a/tests/lib/Encryption/DecryptAllTest.php b/tests/lib/Encryption/DecryptAllTest.php
index ffcbbc74a99..d7cf2fb7baf 100644
--- a/tests/lib/Encryption/DecryptAllTest.php
+++ b/tests/lib/Encryption/DecryptAllTest.php
@@ -86,13 +86,25 @@ class DecryptAllTest extends TestCase {
$this->invokePrivate($this->instance, 'output', [$this->outputInterface]);
}
+ public function dataDecryptAll() {
+ return [
+ [true, 'user1', true],
+ [false, 'user1', true],
+ [true, '0', true],
+ [false, '0', true],
+ [true, '', false],
+ ];
+ }
+
/**
- * @dataProvider dataTrueFalse
+ * @dataProvider dataDecryptAll
* @param bool $prepareResult
+ * @param string $user
+ * @param bool $userExistsChecked
*/
- public function testDecryptAll($prepareResult, $user) {
+ public function testDecryptAll($prepareResult, $user, $userExistsChecked) {
- if (!empty($user)) {
+ if ($userExistsChecked) {
$this->userManager->expects($this->once())->method('userExists')->willReturn(true);
} else {
$this->userManager->expects($this->never())->method('userExists');
@@ -125,15 +137,6 @@ class DecryptAllTest extends TestCase {
$instance->decryptAll($this->inputInterface, $this->outputInterface, $user);
}
- public function dataTrueFalse() {
- return [
- [true, 'user1'],
- [false, 'user1'],
- [true, ''],
- [true, null]
- ];
- }
-
/**
* test decrypt all call with a user who doesn't exists
*/
@@ -147,8 +150,16 @@ class DecryptAllTest extends TestCase {
);
}
+ public function dataTrueFalse() {
+ return [
+ [true],
+ [false],
+ ];
+ }
+
/**
* @dataProvider dataTrueFalse
+ * @param bool $success
*/
public function testPrepareEncryptionModules($success) {
diff --git a/tests/lib/Files/FilesystemTest.php b/tests/lib/Files/FilesystemTest.php
index a4a4345d2f9..76e3f471633 100644
--- a/tests/lib/Files/FilesystemTest.php
+++ b/tests/lib/Files/FilesystemTest.php
@@ -92,6 +92,7 @@ class FilesystemTest extends \Test\TestCase {
}
$this->logout();
+ $this->invokePrivate('\OC\Files\Filesystem', 'normalizedPathCache', [null]);
parent::tearDown();
}
@@ -190,6 +191,32 @@ class FilesystemTest extends \Test\TestCase {
$this->assertEquals($expected, \OC\Files\Filesystem::normalizePath($path, $stripTrailingSlash));
}
+ public function normalizePathKeepUnicodeData() {
+ $nfdName = 'ümlaut';
+ $nfcName = 'ümlaut';
+ return [
+ ['/' . $nfcName, $nfcName, true],
+ ['/' . $nfcName, $nfcName, false],
+ ['/' . $nfdName, $nfdName, true],
+ ['/' . $nfcName, $nfdName, false],
+ ];
+ }
+
+ /**
+ * @dataProvider normalizePathKeepUnicodeData
+ */
+ public function testNormalizePathKeepUnicode($expected, $path, $keepUnicode = false) {
+ $this->assertEquals($expected, \OC\Files\Filesystem::normalizePath($path, true, false, $keepUnicode));
+ }
+
+ public function testNormalizePathKeepUnicodeCache() {
+ $nfdName = 'ümlaut';
+ $nfcName = 'ümlaut';
+ // call in succession due to cache
+ $this->assertEquals('/' . $nfcName, \OC\Files\Filesystem::normalizePath($nfdName, true, false, false));
+ $this->assertEquals('/' . $nfdName, \OC\Files\Filesystem::normalizePath($nfdName, true, false, true));
+ }
+
public function isValidPathData() {
return array(
array('/', true),
diff --git a/tests/lib/Files/Storage/LocalTest.php b/tests/lib/Files/Storage/LocalTest.php
index 7b8ae6a24b2..cca4d6a6676 100644
--- a/tests/lib/Files/Storage/LocalTest.php
+++ b/tests/lib/Files/Storage/LocalTest.php
@@ -84,5 +84,36 @@ class LocalTest extends Storage {
public function testInvalidArgumentsNoArray() {
new \OC\Files\Storage\Local(null);
}
+
+ /**
+ * @expectedException \OCP\Files\ForbiddenException
+ */
+ public function testDisallowSymlinksOutsideDatadir() {
+ $subDir1 = $this->tmpDir . 'sub1';
+ $subDir2 = $this->tmpDir . 'sub2';
+ $sym = $this->tmpDir . 'sub1/sym';
+ mkdir($subDir1);
+ mkdir($subDir2);
+
+ symlink($subDir2, $sym);
+
+ $storage = new \OC\Files\Storage\Local(['datadir' => $subDir1]);
+
+ $storage->file_put_contents('sym/foo', 'bar');
+ }
+
+ public function testDisallowSymlinksInsideDatadir() {
+ $subDir1 = $this->tmpDir . 'sub1';
+ $subDir2 = $this->tmpDir . 'sub1/sub2';
+ $sym = $this->tmpDir . 'sub1/sym';
+ mkdir($subDir1);
+ mkdir($subDir2);
+
+ symlink($subDir2, $sym);
+
+ $storage = new \OC\Files\Storage\Local(['datadir' => $subDir1]);
+
+ $storage->file_put_contents('sym/foo', 'bar');
+ }
}
diff --git a/tests/lib/Files/ViewTest.php b/tests/lib/Files/ViewTest.php
index 2c27bb64a70..59b17b83958 100644
--- a/tests/lib/Files/ViewTest.php
+++ b/tests/lib/Files/ViewTest.php
@@ -2417,7 +2417,7 @@ class ViewTest extends \Test\TestCase {
$content = $view->getDirectoryContent('', $filter);
- $files = array_map(function(FileInfo $info) {
+ $files = array_map(function (FileInfo $info) {
return $info->getName();
}, $content);
sort($files);
@@ -2444,4 +2444,53 @@ class ViewTest extends \Test\TestCase {
$data = $view->getFileInfo('.');
$this->assertEquals('', $data->getChecksum());
}
+
+ public function testDeleteGhostFile() {
+ $storage = new Temporary(array());
+ $scanner = $storage->getScanner();
+ $cache = $storage->getCache();
+ $storage->file_put_contents('foo.txt', 'bar');
+ \OC\Files\Filesystem::mount($storage, array(), '/test/');
+ $scanner->scan('');
+
+ $storage->unlink('foo.txt');
+
+ $this->assertTrue($cache->inCache('foo.txt'));
+
+ $view = new \OC\Files\View('/test');
+ $rootInfo = $view->getFileInfo('');
+ $this->assertEquals(3, $rootInfo->getSize());
+ $view->unlink('foo.txt');
+ $newInfo = $view->getFileInfo('');
+
+ $this->assertFalse($cache->inCache('foo.txt'));
+ $this->assertNotEquals($rootInfo->getEtag(), $newInfo->getEtag());
+ $this->assertEquals(0, $newInfo->getSize());
+ }
+
+ public function testDeleteGhostFolder() {
+ $storage = new Temporary(array());
+ $scanner = $storage->getScanner();
+ $cache = $storage->getCache();
+ $storage->mkdir('foo');
+ $storage->file_put_contents('foo/foo.txt', 'bar');
+ \OC\Files\Filesystem::mount($storage, array(), '/test/');
+ $scanner->scan('');
+
+ $storage->rmdir('foo');
+
+ $this->assertTrue($cache->inCache('foo'));
+ $this->assertTrue($cache->inCache('foo/foo.txt'));
+
+ $view = new \OC\Files\View('/test');
+ $rootInfo = $view->getFileInfo('');
+ $this->assertEquals(3, $rootInfo->getSize());
+ $view->rmdir('foo');
+ $newInfo = $view->getFileInfo('');
+
+ $this->assertFalse($cache->inCache('foo'));
+ $this->assertFalse($cache->inCache('foo/foo.txt'));
+ $this->assertNotEquals($rootInfo->getEtag(), $newInfo->getEtag());
+ $this->assertEquals(0, $newInfo->getSize());
+ }
}
diff --git a/tests/lib/LoggerTest.php b/tests/lib/LoggerTest.php
index 4eb04b00f58..4b80c01f343 100644
--- a/tests/lib/LoggerTest.php
+++ b/tests/lib/LoggerTest.php
@@ -89,7 +89,7 @@ class LoggerTest extends TestCase {
foreach($logLines as $logLine) {
$this->assertNotContains($user, $logLine);
$this->assertNotContains($password, $logLine);
- $this->assertContains('login(*** username and password replaced ***)', $logLine);
+ $this->assertContains('login(*** sensitive parameters replaced ***)', $logLine);
}
}
@@ -104,7 +104,7 @@ class LoggerTest extends TestCase {
foreach($logLines as $logLine) {
$this->assertNotContains($user, $logLine);
$this->assertNotContains($password, $logLine);
- $this->assertContains('checkPassword(*** username and password replaced ***)', $logLine);
+ $this->assertContains('checkPassword(*** sensitive parameters replaced ***)', $logLine);
}
}
@@ -119,7 +119,7 @@ class LoggerTest extends TestCase {
foreach($logLines as $logLine) {
$this->assertNotContains($user, $logLine);
$this->assertNotContains($password, $logLine);
- $this->assertContains('validateUserPass(*** username and password replaced ***)', $logLine);
+ $this->assertContains('validateUserPass(*** sensitive parameters replaced ***)', $logLine);
}
}
}
diff --git a/tests/lib/Repair/AvatarPermissionsTest.php b/tests/lib/Repair/AvatarPermissionsTest.php
new file mode 100644
index 00000000000..e3f582dc512
--- /dev/null
+++ b/tests/lib/Repair/AvatarPermissionsTest.php
@@ -0,0 +1,189 @@
+<?php
+/**
+ * @author Roeland Jago Douma <rullzer@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace Test\Repair;
+
+/**
+ * Test for fixing the userRoot and avatar permissions
+ *
+ * @group DB
+ *
+ * @see \OC\Repair\AvatarPermissionsTest
+ */
+class AvatarPermissionsTest extends \Test\TestCase {
+
+ /** @var \OC\Repair\AvatarPermissions */
+ protected $repair;
+
+ /** @var \OCP\IDBConnection */
+ protected $connection;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->connection = \OC::$server->getDatabaseConnection();
+ $this->repair = new \OC\Repair\AvatarPermissions($this->connection);
+ $this->cleanUpTables();
+ }
+
+ protected function tearDown() {
+ $this->cleanUpTables();
+
+ parent::tearDown();
+ }
+
+ protected function cleanUpTables() {
+ $qb = $this->connection->getQueryBuilder();
+ $qb->delete('filecache')->execute();
+ $qb->delete('storages')->execute();
+ }
+
+ public function dataFixUserRootPermissions() {
+ return [
+ ['home::user', '', 0, 23],
+ ['home::user', 'foo', 0, 0],
+ ['home::user', 'avatar.jpg', 0, 0],
+ ['ABC::user', '', 0, 0],
+ ['ABC::user', 'foo', 0, 0],
+ ];
+ }
+
+ /**
+ * @dataProvider dataFixUserRootPermissions
+ *
+ * @param string $storageId
+ * @param string $path
+ * @param int $permissionsBefore
+ * @param int $permissionsAfter
+ */
+ public function testFixUserRootPermissions($storageId, $path, $permissionsBefore, $permissionsAfter) {
+ $userStorage = $this->addStorage($storageId);
+ $userHome = $this->addFileCacheEntry($userStorage, $path, $permissionsBefore);
+
+ $this->invokePrivate($this->repair, 'fixUserRootPermissions', []);
+
+ $this->verifyPermissions($userHome, $permissionsAfter);
+ }
+
+ public function dataFixAvatarPermissions() {
+ return [
+ ['home::user', '', 0, 0],
+ ['home::user', 'avatar.jpg', 0, 27],
+ ['home::user', 'avatar.png', 0, 27],
+ ['home::user', 'avatar.32.png', 0, 27],
+ ['home::user', 'mine.txt', 0, 0],
+ ['ABC::user', '', 0, 0],
+ ['ABC::user', 'avatar.jpg', 0, 0],
+ ['ABC::user', 'avatar.png', 0, 0],
+ ['ABC::user', 'avatar.32.png', 0, 0],
+ ['ABC::user', 'mine.txt', 0, 0],
+ ];
+ }
+
+ /**
+ * @dataProvider dataFixAvatarPermissions
+ *
+ * @param string $storageId
+ * @param string $path
+ * @param int $permissionsBefore
+ * @param int $permissionsAfter
+ */
+ public function testFixAvatarPermissions($storageId, $path, $permissionsBefore, $permissionsAfter) {
+ $userStorage = $this->addStorage($storageId);
+ $userHome = $this->addFileCacheEntry($userStorage, $path, $permissionsBefore);
+
+ $this->invokePrivate($this->repair, 'fixAvatarPermissions', []);
+
+ $this->verifyPermissions($userHome, $permissionsAfter);
+ }
+
+ /**
+ * Add a new storage
+ *
+ * @param string $id
+ * @return int The numeric id
+ */
+ protected function addStorage($id) {
+ $qb = $this->connection->getQueryBuilder();
+
+ $qb->insert('storages')
+ ->values([
+ 'id' => $qb->createNamedParameter($id)
+ ]);
+
+ $qb->execute();
+
+ return $qb->getLastInsertId();
+ }
+
+ /**
+ * Add a filecache entry
+ *
+ * @param int $storage
+ * @param string $path
+ * @param int $permissions
+ *
+ * @return int The fileid
+ */
+ protected function addFileCacheEntry($storage, $path, $permissions) {
+ $qb = $this->connection->getQueryBuilder();
+
+ $qb->insert('filecache')
+ ->values([
+ 'path' => $qb->createNamedParameter($path),
+ 'path_hash' => $qb->createNamedParameter(md5($path)),
+ 'parent' => $qb->createNamedParameter(42),
+ 'mimetype' => $qb->createNamedParameter(23),
+ 'mimepart' => $qb->createNamedParameter(32),
+ 'size' => $qb->createNamedParameter(16),
+ 'mtime' => $qb->createNamedParameter(1),
+ 'storage_mtime' => $qb->createNamedParameter(2),
+ 'encrypted' => $qb->createNamedParameter(0),
+ 'unencrypted_size' => $qb->createNamedParameter(0),
+ 'storage' => $qb->createNamedParameter($storage),
+ 'permissions' => $qb->createNamedParameter($permissions),
+ ]);
+
+ $qb->execute();
+
+ return $qb->getLastInsertId();
+ }
+
+ /**
+ * @param int $fileId
+ * @param int $permissions
+ */
+ protected function verifyPermissions($fileId, $permissions) {
+ $qb = $this->connection->getQueryBuilder();
+
+ $qb->select('permissions')
+ ->from('filecache')
+ ->where($qb->expr()->eq('fileid', $qb->createNamedParameter($fileId)));
+
+ $cursor = $qb->execute();
+
+ $data = $cursor->fetch();
+ $cursor->closeCursor();
+
+ $this->assertSame($permissions, (int)$data['permissions']);
+ }
+
+
+}
diff --git a/tests/lib/Repair/RemoveOldSharesTest.php b/tests/lib/Repair/RemoveOldSharesTest.php
new file mode 100644
index 00000000000..ac30585bdc5
--- /dev/null
+++ b/tests/lib/Repair/RemoveOldSharesTest.php
@@ -0,0 +1,160 @@
+<?php
+/**
+ * @author Roeland Jago Douma <rullzer@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace Test\Repair;
+
+use OC\Repair\RemoveOldShares;
+use OCP\IDBConnection;
+use OCP\Migration\IOutput;
+
+/**
+ * Class RemoveOldSharesTest
+ *
+ * @package Test\Repair
+ * @group DB
+ */
+class RemoveOldSharesTest extends \Test\TestCase {
+
+ /** @var RemoveOldShares */
+ protected $repair;
+
+ /** @var IDBConnection */
+ protected $connection;
+
+ /** @var IOutput */
+ private $outputMock;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->connection = \OC::$server->getDatabaseConnection();
+ $this->repair = new RemoveOldShares($this->connection);
+ }
+
+ protected function tearDown() {
+ $qb = $this->connection->getQueryBuilder();
+ $qb->delete('share');
+ $qb->execute();
+
+ return parent::tearDown();
+ }
+
+ public function testRun() {
+ $qb = $this->connection->getQueryBuilder();
+ $qb->insert('share')
+ ->values([
+ 'share_type' => $qb->createNamedParameter(0),
+ 'share_with' => $qb->createNamedParameter('foo'),
+ 'uid_owner' => $qb->createNamedParameter('owner'),
+ 'item_type' => $qb->createNamedParameter('file'),
+ 'item_source' => $qb->createNamedParameter(42),
+ 'item_target' => $qb->createNamedParameter('/target'),
+ 'file_source' => $qb->createNamedParameter(42),
+ 'file_target' => $qb->createNamedParameter('/target'),
+ 'permissions' => $qb->createNamedParameter(1),
+ ]);
+ $qb->execute();
+
+ $qb = $this->connection->getQueryBuilder();
+ $qb->insert('share')
+ ->values([
+ 'share_type' => $qb->createNamedParameter(0),
+ 'share_with' => $qb->createNamedParameter('foo'),
+ 'uid_owner' => $qb->createNamedParameter('owner'),
+ 'item_type' => $qb->createNamedParameter('calendar'),
+ 'item_source' => $qb->createNamedParameter(42),
+ 'item_target' => $qb->createNamedParameter('/target'),
+ 'file_source' => $qb->createNamedParameter(42),
+ 'file_target' => $qb->createNamedParameter('/target'),
+ 'permissions' => $qb->createNamedParameter(1),
+ ]);
+ $qb->execute();
+
+ $qb = $this->connection->getQueryBuilder();
+ $qb->insert('share')
+ ->values([
+ 'share_type' => $qb->createNamedParameter(0),
+ 'share_with' => $qb->createNamedParameter('foo'),
+ 'uid_owner' => $qb->createNamedParameter('owner'),
+ 'item_type' => $qb->createNamedParameter('event'),
+ 'item_source' => $qb->createNamedParameter(42),
+ 'item_target' => $qb->createNamedParameter('/target'),
+ 'file_source' => $qb->createNamedParameter(42),
+ 'file_target' => $qb->createNamedParameter('/target'),
+ 'permissions' => $qb->createNamedParameter(1),
+ ]);
+ $qb->execute();
+
+ $qb = $this->connection->getQueryBuilder();
+ $qb->insert('share')
+ ->values([
+ 'share_type' => $qb->createNamedParameter(0),
+ 'share_with' => $qb->createNamedParameter('foo'),
+ 'uid_owner' => $qb->createNamedParameter('owner'),
+ 'item_type' => $qb->createNamedParameter('contact'),
+ 'item_source' => $qb->createNamedParameter(42),
+ 'item_target' => $qb->createNamedParameter('/target'),
+ 'file_source' => $qb->createNamedParameter(42),
+ 'file_target' => $qb->createNamedParameter('/target'),
+ 'permissions' => $qb->createNamedParameter(1),
+ ]);
+ $qb->execute();
+
+ $qb = $this->connection->getQueryBuilder();
+ $qb->insert('share')
+ ->values([
+ 'share_type' => $qb->createNamedParameter(0),
+ 'share_with' => $qb->createNamedParameter('foo'),
+ 'uid_owner' => $qb->createNamedParameter('owner'),
+ 'item_type' => $qb->createNamedParameter('addressbook'),
+ 'item_source' => $qb->createNamedParameter(42),
+ 'item_target' => $qb->createNamedParameter('/target'),
+ 'file_source' => $qb->createNamedParameter(42),
+ 'file_target' => $qb->createNamedParameter('/target'),
+ 'permissions' => $qb->createNamedParameter(1),
+ ]);
+ $qb->execute();
+
+ $qb = $this->connection->getQueryBuilder();
+ $qb->selectAlias($qb->createFunction('COUNT(*)'), 'count')
+ ->from('share');
+
+ $cursor = $qb->execute();
+ $data = $cursor->fetchAll();
+ $cursor->closeCursor();
+ $this->assertEquals(5, $data[0]['count']);
+
+ $this->repair->run($this->outputMock);
+
+ $qb = $this->connection->getQueryBuilder();
+ $qb->select('*')
+ ->from('share');
+
+ $cursor = $qb->execute();
+ $data = $cursor->fetchAll();
+ $cursor->closeCursor();
+ $this->assertCount(1, $data);
+ $this->assertEquals('file', $data[0]['item_type']);
+ }
+}
diff --git a/tests/lib/TestCase.php b/tests/lib/TestCase.php
index 7ed121d3556..a1f65f8ac82 100644
--- a/tests/lib/TestCase.php
+++ b/tests/lib/TestCase.php
@@ -166,7 +166,12 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase {
* @return mixed
*/
protected static function invokePrivate($object, $methodName, array $parameters = array()) {
- $reflection = new \ReflectionClass(get_class($object));
+ if (is_string($object)) {
+ $className = $object;
+ } else {
+ $className = get_class($object);
+ }
+ $reflection = new \ReflectionClass($className);
if ($reflection->hasMethod($methodName)) {
$method = $reflection->getMethod($methodName);
diff --git a/tests/lib/User/SessionTest.php b/tests/lib/User/SessionTest.php
index 36f14e85492..eac38ebba16 100644
--- a/tests/lib/User/SessionTest.php
+++ b/tests/lib/User/SessionTest.php
@@ -22,7 +22,7 @@ class SessionTest extends \Test\TestCase {
private $timeFactory;
/** @var \OC\Authentication\Token\DefaultTokenProvider */
- protected $defaultProvider;
+ protected $tokenProvider;
/** @var \OCP\IConfig */
private $config;
@@ -34,9 +34,7 @@ class SessionTest extends \Test\TestCase {
$this->timeFactory->expects($this->any())
->method('getTime')
->will($this->returnValue(10000));
- $this->defaultProvider = $this->getMockBuilder('\OC\Authentication\Token\DefaultTokenProvider')
- ->disableOriginalConstructor()
- ->getMock();
+ $this->tokenProvider = $this->getMock('\OC\Authentication\Token\IProvider');
$this->config = $this->getMock('\OCP\IConfig');
}
@@ -61,14 +59,14 @@ class SessionTest extends \Test\TestCase {
$session->expects($this->once())
->method('getId')
->will($this->returnValue($sessionId));
- $this->defaultProvider->expects($this->once())
+ $this->tokenProvider->expects($this->once())
->method('getToken')
->will($this->returnValue($token));
$session->expects($this->at(2))
->method('get')
->with('last_login_check')
->will($this->returnValue(null)); // No check has been run yet
- $this->defaultProvider->expects($this->once())
+ $this->tokenProvider->expects($this->once())
->method('getPassword')
->with($token, $sessionId)
->will($this->returnValue('password123'));
@@ -87,7 +85,7 @@ class SessionTest extends \Test\TestCase {
->method('get')
->with('last_token_update')
->will($this->returnValue(null)); // No check run so far
- $this->defaultProvider->expects($this->once())
+ $this->tokenProvider->expects($this->once())
->method('updateToken')
->with($token);
$session->expects($this->at(5))
@@ -99,7 +97,7 @@ class SessionTest extends \Test\TestCase {
->with($expectedUser->getUID())
->will($this->returnValue($expectedUser));
- $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->defaultProvider, $this->config);
+ $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config);
$user = $userSession->getUser();
$this->assertSame($expectedUser, $user);
}
@@ -122,7 +120,7 @@ class SessionTest extends \Test\TestCase {
->getMock();
$userSession = $this->getMockBuilder('\OC\User\Session')
- ->setConstructorArgs([$manager, $session, $this->timeFactory, $this->defaultProvider, $this->config])
+ ->setConstructorArgs([$manager, $session, $this->timeFactory, $this->tokenProvider, $this->config])
->setMethods([
'getUser'
])
@@ -149,7 +147,7 @@ class SessionTest extends \Test\TestCase {
->method('getUID')
->will($this->returnValue('foo'));
- $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->defaultProvider, $this->config);
+ $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config);
$userSession->setUser($user);
}
@@ -201,7 +199,7 @@ class SessionTest extends \Test\TestCase {
->will($this->returnValue($user));
$userSession = $this->getMockBuilder('\OC\User\Session')
- ->setConstructorArgs([$manager, $session, $this->timeFactory, $this->defaultProvider, $this->config])
+ ->setConstructorArgs([$manager, $session, $this->timeFactory, $this->tokenProvider, $this->config])
->setMethods([
'prepareUserLogin'
])
@@ -248,7 +246,7 @@ class SessionTest extends \Test\TestCase {
->with('foo', 'bar')
->will($this->returnValue($user));
- $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->defaultProvider, $this->config);
+ $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config);
$userSession->login('foo', 'bar');
}
@@ -284,7 +282,7 @@ class SessionTest extends \Test\TestCase {
->with('foo', 'bar')
->will($this->returnValue(false));
- $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->defaultProvider, $this->config);
+ $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config);
$userSession->login('foo', 'bar');
}
@@ -304,7 +302,7 @@ class SessionTest extends \Test\TestCase {
->with('foo', 'bar')
->will($this->returnValue(false));
- $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->defaultProvider, $this->config);
+ $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config);
$userSession->login('foo', 'bar');
}
@@ -316,11 +314,11 @@ class SessionTest extends \Test\TestCase {
/** @var \OC\User\Session $userSession */
$userSession = $this->getMockBuilder('\OC\User\Session')
- ->setConstructorArgs([$manager, $session, $this->timeFactory, $this->defaultProvider, $this->config])
+ ->setConstructorArgs([$manager, $session, $this->timeFactory, $this->tokenProvider, $this->config])
->setMethods(['login'])
->getMock();
- $this->defaultProvider->expects($this->once())
+ $this->tokenProvider->expects($this->once())
->method('getToken')
->with('doe')
->will($this->throwException(new \OC\Authentication\Exceptions\InvalidTokenException()));
@@ -341,11 +339,11 @@ class SessionTest extends \Test\TestCase {
/** @var \OC\User\Session $userSession */
$userSession = $this->getMockBuilder('\OC\User\Session')
- ->setConstructorArgs([$manager, $session, $this->timeFactory, $this->defaultProvider, $this->config])
+ ->setConstructorArgs([$manager, $session, $this->timeFactory, $this->tokenProvider, $this->config])
->setMethods(['login', 'isTwoFactorEnforced'])
->getMock();
- $this->defaultProvider->expects($this->once())
+ $this->tokenProvider->expects($this->once())
->method('getToken')
->with('doe')
->will($this->throwException(new \OC\Authentication\Exceptions\InvalidTokenException()));
@@ -413,7 +411,7 @@ class SessionTest extends \Test\TestCase {
//override, otherwise tests will fail because of setcookie()
array('setMagicInCookie'),
//there are passed as parameters to the constructor
- array($manager, $session, $this->timeFactory, $this->defaultProvider, $this->config));
+ array($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config));
$granted = $userSession->loginWithCookie('foo', $token);
@@ -458,7 +456,7 @@ class SessionTest extends \Test\TestCase {
$token = 'goodToken';
\OC::$server->getConfig()->setUserValue('foo', 'login_token', $token, time());
- $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->defaultProvider, $this->config);
+ $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config);
$granted = $userSession->loginWithCookie('foo', 'badToken');
$this->assertSame($granted, false);
@@ -501,7 +499,7 @@ class SessionTest extends \Test\TestCase {
$token = 'goodToken';
\OC::$server->getConfig()->setUserValue('foo', 'login_token', $token, time());
- $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->defaultProvider, $this->config);
+ $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config);
$granted = $userSession->loginWithCookie('foo', $token);
$this->assertSame($granted, false);
@@ -526,7 +524,7 @@ class SessionTest extends \Test\TestCase {
$session = new Memory('');
$session->set('user_id', 'foo');
$userSession = $this->getMockBuilder('\OC\User\Session')
- ->setConstructorArgs([$manager, $session, $this->timeFactory, $this->defaultProvider, $this->config])
+ ->setConstructorArgs([$manager, $session, $this->timeFactory, $this->tokenProvider, $this->config])
->setMethods([
'validateSession'
])
@@ -542,6 +540,119 @@ class SessionTest extends \Test\TestCase {
$this->assertEquals($users['bar'], $userSession->getUser());
}
+ public function testCreateSessionToken() {
+ $manager = $this->getMockBuilder('\OC\User\Manager')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $session = $this->getMock('\OCP\ISession');
+ $token = $this->getMock('\OC\Authentication\Token\IToken');
+ $user = $this->getMock('\OCP\IUser');
+ $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config);
+
+ $random = $this->getMock('\OCP\Security\ISecureRandom');
+ $config = $this->getMock('\OCP\IConfig');
+ $csrf = $this->getMockBuilder('\OC\Security\CSRF\CsrfTokenManager')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $request = new \OC\AppFramework\Http\Request([
+ 'server' => [
+ 'HTTP_USER_AGENT' => 'Firefox',
+ ]
+ ], $random, $config, $csrf);
+
+ $uid = 'user123';
+ $loginName = 'User123';
+ $password = 'passme';
+ $sessionId = 'abcxyz';
+
+ $manager->expects($this->once())
+ ->method('get')
+ ->with($uid)
+ ->will($this->returnValue($user));
+ $session->expects($this->once())
+ ->method('getId')
+ ->will($this->returnValue($sessionId));
+ $this->tokenProvider->expects($this->once())
+ ->method('getToken')
+ ->with($password)
+ ->will($this->throwException(new \OC\Authentication\Exceptions\InvalidTokenException()));
+
+ $this->tokenProvider->expects($this->once())
+ ->method('generateToken')
+ ->with($sessionId, $uid, $loginName, $password, 'Firefox');
+
+ $this->assertTrue($userSession->createSessionToken($request, $uid, $loginName, $password));
+ }
+
+ public function testCreateSessionTokenWithTokenPassword() {
+ $manager = $this->getMockBuilder('\OC\User\Manager')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $session = $this->getMock('\OCP\ISession');
+ $token = $this->getMock('\OC\Authentication\Token\IToken');
+ $user = $this->getMock('\OCP\IUser');
+ $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config);
+
+ $random = $this->getMock('\OCP\Security\ISecureRandom');
+ $config = $this->getMock('\OCP\IConfig');
+ $csrf = $this->getMockBuilder('\OC\Security\CSRF\CsrfTokenManager')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $request = new \OC\AppFramework\Http\Request([
+ 'server' => [
+ 'HTTP_USER_AGENT' => 'Firefox',
+ ]
+ ], $random, $config, $csrf);
+
+ $uid = 'user123';
+ $loginName = 'User123';
+ $password = 'iamatoken';
+ $realPassword = 'passme';
+ $sessionId = 'abcxyz';
+
+ $manager->expects($this->once())
+ ->method('get')
+ ->with($uid)
+ ->will($this->returnValue($user));
+ $session->expects($this->once())
+ ->method('getId')
+ ->will($this->returnValue($sessionId));
+ $this->tokenProvider->expects($this->once())
+ ->method('getToken')
+ ->with($password)
+ ->will($this->returnValue($token));
+ $this->tokenProvider->expects($this->once())
+ ->method('getPassword')
+ ->with($token, $password)
+ ->will($this->returnValue($realPassword));
+
+ $this->tokenProvider->expects($this->once())
+ ->method('generateToken')
+ ->with($sessionId, $uid, $loginName, $realPassword, 'Firefox');
+
+ $this->assertTrue($userSession->createSessionToken($request, $uid, $loginName, $password));
+ }
+
+ public function testCreateSessionTokenWithNonExistentUser() {
+ $manager = $this->getMockBuilder('\OC\User\Manager')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $session = $this->getMock('\OCP\ISession');
+ $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config);
+ $request = $this->getMock('\OCP\IRequest');
+
+ $uid = 'user123';
+ $loginName = 'User123';
+ $password = 'passme';
+
+ $manager->expects($this->once())
+ ->method('get')
+ ->with($uid)
+ ->will($this->returnValue(null));
+
+ $this->assertFalse($userSession->createSessionToken($request, $uid, $loginName, $password));
+ }
+
public function testTryTokenLoginWithDisabledUser() {
$manager = $this->getMockBuilder('\OC\User\Manager')
->disableOriginalConstructor()
@@ -549,14 +660,14 @@ class SessionTest extends \Test\TestCase {
$session = new Memory('');
$token = $this->getMock('\OC\Authentication\Token\IToken');
$user = $this->getMock('\OCP\IUser');
- $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->defaultProvider, $this->config);
+ $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config);
$request = $this->getMock('\OCP\IRequest');
$request->expects($this->once())
->method('getHeader')
->with('Authorization')
->will($this->returnValue('token xxxxx'));
- $this->defaultProvider->expects($this->once())
+ $this->tokenProvider->expects($this->once())
->method('validateToken')
->with('xxxxx')
->will($this->returnValue($token));
diff --git a/version.php b/version.php
index 967f2690276..698636a2196 100644
--- a/version.php
+++ b/version.php
@@ -25,10 +25,10 @@
// We only can count up. The 4. digit is only for the internal patchlevel to trigger DB upgrades
// between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel
// when updating major/minor version number.
-$OC_Version = array(9, 1, 0, 7);
+$OC_Version = array(9, 1, 0, 8);
// The human readable string
-$OC_VersionString = '9.1.0 beta 1';
+$OC_VersionString = '9.1.0 beta 2';
$OC_VersionCanBeUpgradedFrom = array(9, 0);