summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.drone.yml12
m---------3rdparty0
-rw-r--r--apps/admin_audit/appinfo/info.xml16
-rw-r--r--apps/comments/appinfo/info.xml17
-rw-r--r--apps/comments/lib/EventHandler.php1
-rw-r--r--apps/dav/appinfo/info.xml37
-rw-r--r--apps/dav/l10n/hu.js1
-rw-r--r--apps/dav/l10n/hu.json1
-rw-r--r--apps/dav/l10n/ru.js1
-rw-r--r--apps/dav/l10n/ru.json1
-rw-r--r--apps/dav/l10n/sv.js4
-rw-r--r--apps/dav/l10n/sv.json4
-rw-r--r--apps/dav/lib/CalDAV/CalDavBackend.php2
-rw-r--r--apps/dav/lib/CalDAV/Plugin.php2
-rw-r--r--apps/dav/lib/CalDAV/Principal/Collection.php1
-rw-r--r--apps/dav/lib/CalDAV/Schedule/IMipPlugin.php1
-rw-r--r--apps/dav/lib/CardDAV/CardDavBackend.php1
-rw-r--r--apps/dav/lib/CardDAV/ImageExportPlugin.php1
-rw-r--r--apps/dav/lib/CardDAV/Plugin.php1
-rw-r--r--apps/dav/lib/Connector/LegacyDAVACL.php1
-rw-r--r--apps/dav/lib/Connector/Sabre/ObjectTree.php1
-rw-r--r--apps/dav/lib/Connector/Sabre/Principal.php1
-rw-r--r--apps/dav/lib/Connector/Sabre/QuotaPlugin.php3
-rw-r--r--apps/dav/lib/Connector/Sabre/ServerFactory.php1
-rw-r--r--apps/dav/lib/DAV/SystemPrincipalBackend.php1
-rw-r--r--apps/dav/lib/Files/FilesHome.php1
-rw-r--r--apps/dav/lib/Files/RootCollection.php1
-rw-r--r--apps/dav/lib/Server.php2
-rw-r--r--apps/dav/lib/Upload/ChunkingPlugin.php2
-rw-r--r--apps/dav/tests/unit/ServerTest.php2
-rw-r--r--apps/encryption/appinfo/info.xml40
-rw-r--r--apps/encryption/l10n/es.js8
-rw-r--r--apps/encryption/l10n/es.json8
-rw-r--r--apps/encryption/l10n/pt_PT.js7
-rw-r--r--apps/encryption/l10n/pt_PT.json7
-rw-r--r--apps/encryption/lib/AppInfo/Application.php1
-rw-r--r--apps/encryption/lib/Hooks/UserHooks.php1
-rw-r--r--apps/federatedfilesharing/appinfo/info.xml14
-rw-r--r--apps/federatedfilesharing/l10n/hu.js1
-rw-r--r--apps/federatedfilesharing/l10n/hu.json1
-rw-r--r--apps/federatedfilesharing/l10n/ja.js1
-rw-r--r--apps/federatedfilesharing/l10n/ja.json1
-rw-r--r--apps/federatedfilesharing/l10n/lv.js2
-rw-r--r--apps/federatedfilesharing/l10n/lv.json2
-rw-r--r--apps/federatedfilesharing/l10n/nl.js1
-rw-r--r--apps/federatedfilesharing/l10n/nl.json1
-rw-r--r--apps/federatedfilesharing/l10n/pt_PT.js41
-rw-r--r--apps/federatedfilesharing/l10n/pt_PT.json41
-rw-r--r--apps/federatedfilesharing/l10n/ru.js1
-rw-r--r--apps/federatedfilesharing/l10n/ru.json1
-rw-r--r--apps/federatedfilesharing/l10n/sk.js1
-rw-r--r--apps/federatedfilesharing/l10n/sk.json1
-rw-r--r--apps/federatedfilesharing/l10n/sv.js1
-rw-r--r--apps/federatedfilesharing/l10n/sv.json1
-rw-r--r--apps/federation/appinfo/info.xml27
-rw-r--r--apps/federation/l10n/hu.js1
-rw-r--r--apps/federation/l10n/hu.json1
-rw-r--r--apps/federation/l10n/nl.js1
-rw-r--r--apps/federation/l10n/nl.json1
-rw-r--r--apps/federation/l10n/ru.js1
-rw-r--r--apps/federation/l10n/ru.json1
-rw-r--r--apps/federation/l10n/sk.js1
-rw-r--r--apps/federation/l10n/sk.json1
-rw-r--r--apps/federation/l10n/sv.js1
-rw-r--r--apps/federation/l10n/sv.json1
-rw-r--r--apps/federation/lib/BackgroundJob/GetSharedSecret.php1
-rw-r--r--apps/federation/lib/BackgroundJob/RequestSharedSecret.php1
-rw-r--r--apps/federation/lib/SyncJob.php1
-rw-r--r--apps/files/appinfo/info.xml50
-rw-r--r--apps/files/download.php4
-rw-r--r--apps/files/img/change.pngbin594 -> 560 bytes
-rw-r--r--apps/files/img/change.svg2
-rw-r--r--apps/files/js/fileactions.js17
-rw-r--r--apps/files/js/filelist.js34
-rw-r--r--apps/files/l10n/es.js4
-rw-r--r--apps/files/l10n/es.json4
-rw-r--r--apps/files/l10n/ja.js14
-rw-r--r--apps/files/l10n/ja.json14
-rw-r--r--apps/files/l10n/lt_LT.js1
-rw-r--r--apps/files/l10n/lt_LT.json1
-rw-r--r--apps/files/l10n/lv.js2
-rw-r--r--apps/files/l10n/lv.json2
-rw-r--r--apps/files/l10n/nl.js5
-rw-r--r--apps/files/l10n/nl.json5
-rw-r--r--apps/files/l10n/pt_PT.js2
-rw-r--r--apps/files/l10n/pt_PT.json2
-rw-r--r--apps/files/l10n/ru.js2
-rw-r--r--apps/files/l10n/ru.json2
-rw-r--r--apps/files/l10n/sk.js8
-rw-r--r--apps/files/l10n/sk.json8
-rw-r--r--apps/files/l10n/sv.js3
-rw-r--r--apps/files/l10n/sv.json3
-rw-r--r--apps/files/l10n/zh_CN.js7
-rw-r--r--apps/files/l10n/zh_CN.json7
-rw-r--r--apps/files/templates/list.php2
-rw-r--r--apps/files/tests/js/fileactionsmenuSpec.js3
-rw-r--r--apps/files/tests/js/filelistSpec.js9
-rw-r--r--apps/files_external/appinfo/info.xml35
-rw-r--r--apps/files_external/js/settings.js1
-rw-r--r--apps/files_external/l10n/ast.js1
-rw-r--r--apps/files_external/l10n/ast.json1
-rw-r--r--apps/files_external/l10n/hu.js1
-rw-r--r--apps/files_external/l10n/hu.json1
-rw-r--r--apps/files_external/l10n/ja.js12
-rw-r--r--apps/files_external/l10n/ja.json12
-rw-r--r--apps/files_external/l10n/nl.js7
-rw-r--r--apps/files_external/l10n/nl.json7
-rw-r--r--apps/files_external/l10n/pt_PT.js27
-rw-r--r--apps/files_external/l10n/pt_PT.json27
-rw-r--r--apps/files_external/l10n/ru.js8
-rw-r--r--apps/files_external/l10n/ru.json8
-rw-r--r--apps/files_external/lib/AppInfo/Application.php1
-rw-r--r--apps/files_external/lib/Controller/AjaxController.php2
-rw-r--r--apps/files_external/lib/Lib/Auth/Password/GlobalAuth.php1
-rw-r--r--apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php3
-rw-r--r--apps/files_external/lib/Lib/Auth/Password/UserProvided.php1
-rw-r--r--apps/files_external/lib/Lib/Backend/AmazonS3.php4
-rw-r--r--apps/files_external/lib/Lib/Backend/DAV.php3
-rw-r--r--apps/files_external/lib/Lib/Backend/FTP.php3
-rw-r--r--apps/files_external/lib/Lib/Backend/LegacyBackend.php1
-rw-r--r--apps/files_external/lib/Lib/Backend/Local.php1
-rw-r--r--apps/files_external/lib/Lib/Backend/OwnCloud.php3
-rw-r--r--apps/files_external/lib/Lib/Backend/SFTP_Key.php3
-rw-r--r--apps/files_external/lib/Lib/Backend/SMB.php2
-rw-r--r--apps/files_external/lib/Lib/Backend/SMB_OC.php2
-rw-r--r--apps/files_external/lib/Lib/Backend/Swift.php2
-rw-r--r--apps/files_external/lib/Lib/DependencyTrait.php2
-rw-r--r--apps/files_external/lib/Lib/FrontendDefinitionTrait.php2
-rw-r--r--apps/files_external/lib/Lib/LegacyDependencyCheckPolyfill.php1
-rw-r--r--apps/files_external/lib/Lib/SessionStorageWrapper.php1
-rw-r--r--apps/files_external/lib/Lib/Storage/AmazonS3.php11
-rw-r--r--apps/files_external/lib/Lib/Storage/Swift.php248
-rw-r--r--apps/files_external/lib/Lib/StorageModifierTrait.php2
-rw-r--r--apps/files_external/lib/Migration/StorageMigrator.php1
-rw-r--r--apps/files_external/lib/Service/UserStoragesService.php2
-rw-r--r--apps/files_external/lib/Settings/Personal.php1
-rw-r--r--apps/files_external/templates/list.php3
-rw-r--r--apps/files_external/templates/settings.php5
-rw-r--r--apps/files_external/tests/Storage/SwiftTest.php16
-rw-r--r--apps/files_sharing/appinfo/info.xml52
-rw-r--r--apps/files_sharing/js/share.js4
-rw-r--r--apps/files_sharing/l10n/hu.js1
-rw-r--r--apps/files_sharing/l10n/hu.json1
-rw-r--r--apps/files_sharing/l10n/ja.js4
-rw-r--r--apps/files_sharing/l10n/ja.json4
-rw-r--r--apps/files_sharing/l10n/lv.js8
-rw-r--r--apps/files_sharing/l10n/lv.json8
-rw-r--r--apps/files_sharing/l10n/nl.js4
-rw-r--r--apps/files_sharing/l10n/nl.json4
-rw-r--r--apps/files_sharing/l10n/pt_PT.js4
-rw-r--r--apps/files_sharing/l10n/pt_PT.json4
-rw-r--r--apps/files_sharing/l10n/ru.js18
-rw-r--r--apps/files_sharing/l10n/ru.json18
-rw-r--r--apps/files_sharing/l10n/zh_CN.js6
-rw-r--r--apps/files_sharing/l10n/zh_CN.json6
-rw-r--r--apps/files_sharing/lib/Controller/ShareController.php1
-rw-r--r--apps/files_sharing/lib/Controller/ShareInfoController.php1
-rw-r--r--apps/files_sharing/lib/Middleware/ShareInfoMiddleware.php1
-rw-r--r--apps/files_trashbin/appinfo/info.xml18
-rw-r--r--apps/files_versions/appinfo/info.xml26
-rw-r--r--apps/files_versions/download.php4
-rw-r--r--apps/files_versions/l10n/fa.js5
-rw-r--r--apps/files_versions/l10n/fa.json5
-rw-r--r--apps/lookup_server_connector/appinfo/info.xml18
-rw-r--r--apps/oauth2/appinfo/info.xml9
-rw-r--r--apps/oauth2/l10n/ast.js1
-rw-r--r--apps/oauth2/l10n/ast.json1
-rw-r--r--apps/oauth2/l10n/hu.js1
-rw-r--r--apps/oauth2/l10n/hu.json1
-rw-r--r--apps/oauth2/l10n/pt_PT.js14
-rw-r--r--apps/oauth2/l10n/pt_PT.json12
-rw-r--r--apps/oauth2/l10n/ru.js1
-rw-r--r--apps/oauth2/l10n/ru.json1
-rw-r--r--apps/oauth2/l10n/sv.js1
-rw-r--r--apps/oauth2/l10n/sv.json1
-rw-r--r--apps/provisioning_api/appinfo/info.xml20
-rw-r--r--apps/provisioning_api/lib/Controller/UsersController.php12
-rw-r--r--apps/sharebymail/appinfo/info.xml51
-rw-r--r--apps/sharebymail/l10n/fr.js16
-rw-r--r--apps/sharebymail/l10n/fr.json16
-rw-r--r--apps/sharebymail/lib/ShareByMailProvider.php4
-rw-r--r--apps/sharebymail/templates/settings-admin.php1
-rw-r--r--apps/systemtags/appinfo/info.xml19
-rw-r--r--apps/systemtags/l10n/lv.js8
-rw-r--r--apps/systemtags/l10n/lv.json8
-rw-r--r--apps/systemtags/l10n/nl.js14
-rw-r--r--apps/systemtags/l10n/nl.json14
-rw-r--r--apps/systemtags/l10n/sk.js58
-rw-r--r--apps/systemtags/l10n/sk.json56
-rw-r--r--apps/systemtags/lib/Activity/Listener.php3
-rw-r--r--apps/testing/appinfo/info.xml18
-rw-r--r--apps/theming/appinfo/info.xml20
-rw-r--r--apps/theming/l10n/ar.js3
-rw-r--r--apps/theming/l10n/ar.json3
-rw-r--r--apps/theming/l10n/ast.js2
-rw-r--r--apps/theming/l10n/ast.json2
-rw-r--r--apps/theming/l10n/lv.js2
-rw-r--r--apps/theming/l10n/lv.json2
-rw-r--r--apps/theming/l10n/nl.js2
-rw-r--r--apps/theming/l10n/nl.json2
-rw-r--r--apps/theming/l10n/pt_PT.js39
-rw-r--r--apps/theming/l10n/pt_PT.json37
-rw-r--r--apps/theming/lib/Controller/ThemingController.php2
-rw-r--r--apps/theming/lib/Util.php1
-rw-r--r--apps/twofactor_backupcodes/appinfo/info.xml23
-rw-r--r--apps/twofactor_backupcodes/l10n/es.js2
-rw-r--r--apps/twofactor_backupcodes/l10n/es.json2
-rw-r--r--apps/twofactor_backupcodes/l10n/hu.js1
-rw-r--r--apps/twofactor_backupcodes/l10n/hu.json1
-rw-r--r--apps/twofactor_backupcodes/l10n/nb.js1
-rw-r--r--apps/twofactor_backupcodes/l10n/nb.json1
-rw-r--r--apps/twofactor_backupcodes/l10n/nl.js1
-rw-r--r--apps/twofactor_backupcodes/l10n/nl.json1
-rw-r--r--apps/updatenotification/appinfo/info.xml10
-rw-r--r--apps/updatenotification/l10n/es.js6
-rw-r--r--apps/updatenotification/l10n/es.json6
-rw-r--r--apps/updatenotification/l10n/hu.js1
-rw-r--r--apps/updatenotification/l10n/hu.json1
-rw-r--r--apps/updatenotification/l10n/nl.js1
-rw-r--r--apps/updatenotification/l10n/nl.json1
-rw-r--r--apps/updatenotification/l10n/ru.js7
-rw-r--r--apps/updatenotification/l10n/ru.json7
-rw-r--r--apps/updatenotification/l10n/sk.js3
-rw-r--r--apps/updatenotification/l10n/sk.json3
-rw-r--r--apps/updatenotification/l10n/sv.js1
-rw-r--r--apps/updatenotification/l10n/sv.json1
-rw-r--r--apps/user_ldap/appinfo/info.xml23
-rw-r--r--apps/user_ldap/l10n/es.js4
-rw-r--r--apps/user_ldap/l10n/es.json4
-rw-r--r--apps/user_ldap/l10n/lt_LT.js9
-rw-r--r--apps/user_ldap/l10n/lt_LT.json9
-rw-r--r--apps/user_ldap/lib/Connection.php31
-rw-r--r--apps/user_ldap/lib/Controller/RenewPasswordController.php1
-rw-r--r--apps/user_ldap/lib/Group_LDAP.php13
-rw-r--r--apps/user_ldap/lib/Jobs/Sync.php2
-rw-r--r--apps/user_ldap/lib/Notification/Notifier.php2
-rw-r--r--apps/user_ldap/templates/part.wizard-groupfilter.php4
-rw-r--r--apps/user_ldap/templates/part.wizard-loginfilter.php2
-rw-r--r--apps/user_ldap/templates/part.wizard-userfilter.php2
-rw-r--r--apps/user_ldap/templates/settings.php2
-rw-r--r--apps/user_ldap/tests/ConnectionTest.php2
-rw-r--r--apps/user_ldap/tests/Group_LDAPTest.php87
-rw-r--r--apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php2
-rw-r--r--apps/workflowengine/appinfo/info.xml20
-rw-r--r--apps/workflowengine/l10n/es.js2
-rw-r--r--apps/workflowengine/l10n/es.json2
-rw-r--r--apps/workflowengine/l10n/hu.js1
-rw-r--r--apps/workflowengine/l10n/hu.json1
-rw-r--r--apps/workflowengine/l10n/ja.js1
-rw-r--r--apps/workflowengine/l10n/ja.json1
-rw-r--r--apps/workflowengine/l10n/lv.js6
-rw-r--r--apps/workflowengine/l10n/lv.json6
-rw-r--r--apps/workflowengine/l10n/nl.js3
-rw-r--r--apps/workflowengine/l10n/nl.json3
-rw-r--r--apps/workflowengine/l10n/ru.js3
-rw-r--r--apps/workflowengine/l10n/ru.json3
-rw-r--r--apps/workflowengine/l10n/sk.js1
-rw-r--r--apps/workflowengine/l10n/sk.json1
-rwxr-xr-xautotest.sh14
-rw-r--r--build/integration/composer.json2
-rw-r--r--build/integration/features/bootstrap/Auth.php40
-rw-r--r--build/integration/features/bootstrap/BasicStructure.php96
-rw-r--r--build/integration/features/bootstrap/CalDavContext.php11
-rw-r--r--build/integration/features/bootstrap/CapabilitiesContext.php2
-rw-r--r--build/integration/features/bootstrap/CardDavContext.php19
-rw-r--r--build/integration/features/bootstrap/ChecksumsContext.php14
-rw-r--r--build/integration/features/bootstrap/CommandLine.php3
-rw-r--r--build/integration/features/bootstrap/CommentsContext.php53
-rw-r--r--build/integration/features/bootstrap/FederationContext.php2
-rw-r--r--build/integration/features/bootstrap/FilesDropContext.php11
-rw-r--r--build/integration/features/bootstrap/LDAPContext.php6
-rw-r--r--build/integration/features/bootstrap/Provisioning.php92
-rw-r--r--build/integration/features/bootstrap/ShareesContext.php4
-rw-r--r--build/integration/features/bootstrap/Sharing.php44
-rw-r--r--build/integration/features/bootstrap/TagsContext.php102
-rw-r--r--build/integration/features/bootstrap/WebDav.php169
-rw-r--r--core/Command/App/CheckCode.php53
-rw-r--r--core/Command/Db/ConvertFilecacheBigInt.php2
-rw-r--r--core/Command/Group/AddUser.php2
-rw-r--r--core/Command/Group/ListCommand.php3
-rw-r--r--core/Command/Group/RemoveUser.php2
-rw-r--r--core/Command/Maintenance/UpdateHtaccess.php4
-rw-r--r--core/Command/Security/ImportCertificate.php3
-rw-r--r--core/Command/Security/ListCertificates.php2
-rw-r--r--core/Command/Security/RemoveCertificate.php3
-rw-r--r--core/Command/TwoFactorAuth/Base.php1
-rw-r--r--core/Command/Upgrade.php1
-rw-r--r--core/Command/User/Disable.php1
-rw-r--r--core/Command/User/Enable.php1
-rw-r--r--core/Command/User/Info.php2
-rw-r--r--core/Command/User/ListCommand.php1
-rw-r--r--core/Controller/AutoCompleteController.php7
-rw-r--r--core/Controller/AvatarController.php1
-rw-r--r--core/Controller/LoginController.php8
-rw-r--r--core/Controller/LostController.php4
-rw-r--r--core/Controller/NavigationController.php92
-rw-r--r--core/css/icons.scss14
-rw-r--r--core/css/systemtags.scss1
-rw-r--r--core/fonts/OpenSans-Light.ttfbin0 -> 222412 bytes
-rw-r--r--core/fonts/OpenSans-Semibold.ttfbin0 -> 221328 bytes
-rw-r--r--core/img/clients/desktop.svg1
-rw-r--r--core/img/clients/phone.svg1
-rw-r--r--core/img/clients/tablet.svg1
-rw-r--r--core/js/js.js1
-rw-r--r--core/js/sharedialogshareelistview.js26
-rw-r--r--core/js/shareitemmodel.js26
-rw-r--r--core/js/tests/specs/sharedialogshareelistview.js50
-rw-r--r--core/l10n/ar.js202
-rw-r--r--core/l10n/ar.json200
-rw-r--r--core/l10n/es.js2
-rw-r--r--core/l10n/es.json2
-rw-r--r--core/l10n/lt_LT.js7
-rw-r--r--core/l10n/lt_LT.json7
-rw-r--r--core/l10n/lv.js6
-rw-r--r--core/l10n/lv.json6
-rw-r--r--core/l10n/nb.js2
-rw-r--r--core/l10n/nb.json2
-rw-r--r--core/l10n/nl.js26
-rw-r--r--core/l10n/nl.json26
-rw-r--r--core/l10n/pt_PT.js70
-rw-r--r--core/l10n/pt_PT.json70
-rw-r--r--core/l10n/ru.js33
-rw-r--r--core/l10n/ru.json33
-rw-r--r--core/l10n/sv.js1
-rw-r--r--core/l10n/sv.json1
-rw-r--r--core/register_command.php3
-rw-r--r--core/routes.php2
-rw-r--r--core/templates/exception.php14
-rw-r--r--core/templates/installation.php2
-rw-r--r--lib/autoloader.php15
-rw-r--r--lib/base.php1
-rw-r--r--lib/composer/composer/autoload_classmap.php2
-rw-r--r--lib/composer/composer/autoload_static.php2
-rw-r--r--lib/l10n/ar.js74
-rw-r--r--lib/l10n/ar.json74
-rw-r--r--lib/l10n/ast.js1
-rw-r--r--lib/l10n/ast.json1
-rw-r--r--lib/l10n/es.js8
-rw-r--r--lib/l10n/es.json8
-rw-r--r--lib/l10n/lt_LT.js8
-rw-r--r--lib/l10n/lt_LT.json8
-rw-r--r--lib/l10n/lv.js2
-rw-r--r--lib/l10n/lv.json2
-rw-r--r--lib/l10n/nl.js6
-rw-r--r--lib/l10n/nl.json6
-rw-r--r--lib/l10n/pt_PT.js121
-rw-r--r--lib/l10n/pt_PT.json121
-rw-r--r--lib/l10n/ru.js12
-rw-r--r--lib/l10n/ru.json12
-rw-r--r--lib/private/App/AppManager.php11
-rw-r--r--lib/private/App/AppStore/Fetcher/Fetcher.php1
-rw-r--r--lib/private/App/CodeChecker/DeprecationCheck.php2
-rw-r--r--lib/private/App/CodeChecker/InfoChecker.php149
-rw-r--r--lib/private/App/DependencyAnalyzer.php10
-rw-r--r--lib/private/AppFramework/DependencyInjection/DIContainer.php4
-rw-r--r--lib/private/AppFramework/Http/Dispatcher.php25
-rw-r--r--lib/private/AppFramework/Http/Request.php124
-rw-r--r--lib/private/AppFramework/Middleware/MiddlewareDispatcher.php21
-rw-r--r--lib/private/AppFramework/Middleware/Security/BruteForceMiddleware.php1
-rw-r--r--lib/private/AppFramework/Middleware/Security/RateLimitingMiddleware.php1
-rw-r--r--lib/private/AppFramework/Utility/ControllerMethodReflector.php54
-rw-r--r--lib/private/Avatar.php4
-rw-r--r--lib/private/Collaboration/Collaborators/MailPlugin.php2
-rw-r--r--lib/private/Collaboration/Collaborators/RemotePlugin.php2
-rw-r--r--lib/private/Contacts/ContactsMenu/ContactsStore.php2
-rw-r--r--lib/private/DB/MigrationService.php2
-rw-r--r--lib/private/DB/SchemaWrapper.php1
-rw-r--r--lib/private/Files/Config/UserMountCache.php1
-rw-r--r--lib/private/Files/ObjectStore/S3ObjectTrait.php3
-rw-r--r--lib/private/Files/ObjectStore/Swift.php243
-rw-r--r--lib/private/Files/ObjectStore/SwiftFactory.php174
-rw-r--r--lib/private/Files/Storage/DAV.php4
-rw-r--r--lib/private/Http/Client/Client.php63
-rw-r--r--lib/private/Http/Client/ClientService.php3
-rw-r--r--lib/private/Http/Client/Response.php10
-rw-r--r--lib/private/Installer.php9
-rw-r--r--lib/private/IntegrityCheck/Checker.php47
-rw-r--r--lib/private/IntegrityCheck/Helpers/AppLocator.php5
-rw-r--r--lib/private/IntegrityCheck/Helpers/EnvironmentHelper.php5
-rw-r--r--lib/private/IntegrityCheck/Helpers/FileAccessHelper.php13
-rw-r--r--lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php3
-rw-r--r--lib/private/IntegrityCheck/Iterator/ExcludeFoldersByPathFilterIterator.php5
-rw-r--r--lib/private/L10N/L10N.php47
-rw-r--r--lib/private/Mail/EMailTemplate.php28
-rw-r--r--lib/private/NavigationManager.php51
-rw-r--r--lib/private/Repair.php2
-rw-r--r--lib/private/Repair/Collation.php5
-rw-r--r--lib/private/Server.php2
-rw-r--r--lib/private/Share/Share.php5
-rw-r--r--lib/private/Share20/DefaultShareProvider.php1
-rw-r--r--lib/private/Share20/Manager.php2
-rw-r--r--lib/private/SystemTag/ManagerFactory.php5
-rw-r--r--lib/private/SystemTag/SystemTag.php11
-rw-r--r--lib/private/SystemTag/SystemTagManager.php63
-rw-r--r--lib/private/SystemTag/SystemTagObjectMapper.php31
-rw-r--r--lib/private/TemplateLayout.php4
-rw-r--r--lib/private/Updater.php6
-rw-r--r--lib/private/User/Session.php1
-rw-r--r--lib/private/legacy/app.php205
-rw-r--r--lib/private/legacy/files.php4
-rw-r--r--lib/private/legacy/response.php10
-rw-r--r--lib/public/App/IAppManager.php4
-rw-r--r--lib/public/AppFramework/Http/Response.php4
-rw-r--r--lib/public/AppFramework/Utility/IControllerMethodReflector.php9
-rw-r--r--lib/public/IL10N.php11
-rw-r--r--lib/public/INavigationManager.php9
-rw-r--r--lib/public/IRequest.php41
-rw-r--r--lib/public/Mail/IEMailTemplate.php12
-rw-r--r--lib/public/Response.php5
-rw-r--r--lib/public/SystemTag/ISystemTag.php9
-rw-r--r--lib/public/SystemTag/ISystemTagManager.php39
-rw-r--r--lib/public/SystemTag/ISystemTagManagerFactory.php5
-rw-r--r--lib/public/SystemTag/ISystemTagObjectMapper.php19
-rw-r--r--lib/public/SystemTag/ManagerEvent.php10
-rw-r--r--lib/public/SystemTag/MapperEvent.php11
-rw-r--r--lib/public/SystemTag/SystemTagsEntityEvent.php7
-rw-r--r--lib/public/SystemTag/TagAlreadyExistsException.php1
-rw-r--r--lib/public/SystemTag/TagNotFoundException.php5
-rw-r--r--lib/public/Util.php1
-rw-r--r--resources/app-info-shipped.xsd671
-rw-r--r--resources/app-info.xsd652
-rw-r--r--settings/Controller/CheckSetupController.php3
-rw-r--r--settings/Controller/LogSettingsController.php5
-rw-r--r--settings/Controller/MailSettingsController.php7
-rw-r--r--settings/Controller/UsersController.php12
-rw-r--r--settings/ajax/enableapp.php2
-rw-r--r--settings/ajax/navigationdetect.php2
-rw-r--r--settings/css/settings.scss16
-rw-r--r--settings/img/change.svg2
-rw-r--r--settings/js/authtoken_view.js24
-rw-r--r--settings/js/users/users.js10
-rw-r--r--settings/l10n/ar.js149
-rw-r--r--settings/l10n/ar.json149
-rw-r--r--settings/l10n/ast.js1
-rw-r--r--settings/l10n/ast.json1
-rw-r--r--settings/l10n/de.js2
-rw-r--r--settings/l10n/de.json2
-rw-r--r--settings/l10n/de_DE.js2
-rw-r--r--settings/l10n/de_DE.json2
-rw-r--r--settings/l10n/es.js12
-rw-r--r--settings/l10n/es.json12
-rw-r--r--settings/l10n/es_MX.js2
-rw-r--r--settings/l10n/es_MX.json2
-rw-r--r--settings/l10n/fi.js17
-rw-r--r--settings/l10n/fi.json17
-rw-r--r--settings/l10n/lt_LT.js23
-rw-r--r--settings/l10n/lt_LT.json23
-rw-r--r--settings/l10n/nb.js6
-rw-r--r--settings/l10n/nb.json6
-rw-r--r--settings/l10n/nl.js12
-rw-r--r--settings/l10n/nl.json12
-rw-r--r--settings/l10n/pt_PT.js65
-rw-r--r--settings/l10n/pt_PT.json65
-rw-r--r--settings/l10n/ru.js6
-rw-r--r--settings/l10n/ru.json6
-rw-r--r--settings/l10n/sk.js23
-rw-r--r--settings/l10n/sk.json23
-rw-r--r--settings/l10n/sv.js3
-rw-r--r--settings/l10n/sv.json3
-rw-r--r--settings/l10n/zh_CN.js2
-rw-r--r--settings/l10n/zh_CN.json2
-rw-r--r--settings/templates/settings/personal/security.php1
-rw-r--r--settings/templates/users/part.createuser.php2
-rw-r--r--settings/templates/users/part.userlist.php2
-rw-r--r--tests/Core/Controller/AutoCompleteControllerTest.php8
-rw-r--r--tests/Core/Controller/NavigationControllerTest.php129
-rw-r--r--tests/Settings/Controller/CheckSetupControllerTest.php5
-rw-r--r--tests/Settings/Controller/UsersControllerTest.php14
-rw-r--r--tests/acceptance/features/app-comments.feature2
-rw-r--r--tests/acceptance/features/bootstrap/CommentsAppContext.php64
-rw-r--r--tests/apps/testapp-dependency-missing/appinfo/info.xml9
-rw-r--r--tests/apps/testapp-infoxml/appinfo/info.xml12
-rw-r--r--tests/apps/testapp-name-missing/appinfo/info.xml11
-rw-r--r--tests/apps/testapp-version/appinfo/info.xml11
-rw-r--r--tests/apps/testapp-version/appinfo/version1
-rw-r--r--tests/apps/testapp_dependency_missing/appinfo/info.xml13
-rw-r--r--tests/apps/testapp_infoxml/appinfo/info.xml16
-rw-r--r--tests/apps/testapp_name_missing/appinfo/info.xml15
-rw-r--r--tests/apps/testapp_version/appinfo/info.xml15
-rwxr-xr-xtests/drone-wait-objectstore.sh57
-rw-r--r--tests/lib/App/CodeChecker/InfoCheckerTest.php19
-rw-r--r--tests/lib/AppFramework/Http/DispatcherTest.php28
-rw-r--r--tests/lib/AppFramework/Http/RequestTest.php2
-rw-r--r--tests/lib/AppFramework/Middleware/MiddlewareDispatcherTest.php2
-rw-r--r--tests/lib/AppTest.php13
-rw-r--r--tests/lib/Collaboration/Collaborators/MailPluginTest.php4
-rw-r--r--tests/lib/Collaboration/Collaborators/RemotePluginTest.php2
-rw-r--r--tests/lib/Http/Client/ClientServiceTest.php3
-rw-r--r--tests/lib/Http/Client/ClientTest.php49
-rw-r--r--tests/lib/Http/Client/ResponseTest.php28
-rw-r--r--tests/lib/IntegrityCheck/CheckerTest.php3
-rw-r--r--tests/lib/NavigationManagerTest.php14
492 files changed, 6239 insertions, 2332 deletions
diff --git a/.drone.yml b/.drone.yml
index 614c0dc40c2..9a0e7b25484 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -549,6 +549,13 @@ pipeline:
when:
matrix:
TESTS-ACCEPTANCE: access-levels
+ acceptance-app-comments:
+ image: nextcloudci/integration-php7.0:integration-php7.0-6
+ commands:
+ - tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-app-comments --selenium-server selenium:4444 allow-git-repository-modifications features/app-comments.feature
+ when:
+ matrix:
+ TESTS-ACCEPTANCE: app-comments
acceptance-app-files:
image: nextcloudci/integration-php7.0:integration-php7.0-6
commands:
@@ -727,6 +734,8 @@ matrix:
- TESTS: acceptance
TESTS-ACCEPTANCE: access-levels
- TESTS: acceptance
+ TESTS-ACCEPTANCE: app-comments
+ - TESTS: acceptance
TESTS-ACCEPTANCE: app-files
- TESTS: acceptance
TESTS-ACCEPTANCE: app-theming
@@ -842,9 +851,8 @@ services:
matrix:
OBJECT_STORE: s3
dockswift:
- image: icewind1991/dockswift
+ image: icewind1991/dockswift:nextcloud-ci
environment:
- - INITIALIZE=yes
- IPADDRESS=dockswift
when:
matrix:
diff --git a/3rdparty b/3rdparty
-Subproject e42a129bf8c10cf9e519cc9e4a0e6978bbcd7e5
+Subproject 8168fc1d0f33445ec4158867421dfaa9a0e241d
diff --git a/apps/admin_audit/appinfo/info.xml b/apps/admin_audit/appinfo/info.xml
index 44abc85f105..054ed9580f2 100644
--- a/apps/admin_audit/appinfo/info.xml
+++ b/apps/admin_audit/appinfo/info.xml
@@ -1,16 +1,20 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>admin_audit</id>
<name>Auditing / Logging</name>
+ <summary>Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions.</summary>
<description>Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions.</description>
- <licence>AGPL</licence>
- <author>Nextcloud</author>
<version>1.4.0</version>
+ <licence>agpl</licence>
+ <author>Nextcloud</author>
<namespace>AdminAudit</namespace>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<types>
<logging/>
</types>
+ <category>monitoring</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
</info>
diff --git a/apps/comments/appinfo/info.xml b/apps/comments/appinfo/info.xml
index 61a23cf65f8..bc2cfe03054 100644
--- a/apps/comments/appinfo/info.xml
+++ b/apps/comments/appinfo/info.xml
@@ -1,19 +1,24 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>comments</id>
<name>Comments</name>
+ <summary>Files app plugin to add comments to files</summary>
<description>Files app plugin to add comments to files</description>
- <licence>AGPL</licence>
+ <version>1.4.0</version>
+ <licence>agpl</licence>
<author>Arthur Schiwon</author>
<author>Vincent Petry</author>
<default_enable/>
- <version>1.4.0</version>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<types>
<logging/>
</types>
+ <category>office</category>
+ <category>social</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
<activity>
<settings>
diff --git a/apps/comments/lib/EventHandler.php b/apps/comments/lib/EventHandler.php
index 0fc6de7bf49..d2b31e809c1 100644
--- a/apps/comments/lib/EventHandler.php
+++ b/apps/comments/lib/EventHandler.php
@@ -24,7 +24,6 @@
namespace OCA\Comments;
use OCA\Comments\Activity\Listener as ActivityListener;
-use OCA\Comments\AppInfo\Application;
use OCA\Comments\Notification\Listener as NotificationListener;
use OCP\Comments\CommentsEvent;
use OCP\Comments\ICommentsEventHandler;
diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml
index 7115cacfef2..3afef530e7a 100644
--- a/apps/dav/appinfo/info.xml
+++ b/apps/dav/appinfo/info.xml
@@ -1,22 +1,24 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>dav</id>
<name>WebDAV</name>
+ <summary>WebDAV endpoint</summary>
<description>WebDAV endpoint</description>
- <licence>AGPL</licence>
- <author>owncloud.org</author>
<version>1.5.0</version>
+ <licence>agpl</licence>
+ <author>owncloud.org</author>
+ <namespace>DAV</namespace>
<default_enable/>
<types>
<filesystem/>
</types>
- <namespace>DAV</namespace>
- <public>
- <webdav>appinfo/v1/publicwebdav.php</webdav>
- </public>
+ <category>integration</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
+
<repair-steps>
<post-migration>
<step>OCA\DAV\Migration\FixBirthdayCalendarComponent</step>
@@ -24,6 +26,7 @@
<step>OCA\DAV\Migration\BuildCalendarSearchIndex</step>
</post-migration>
</repair-steps>
+
<commands>
<command>OCA\DAV\Command\CreateAddressBook</command>
<command>OCA\DAV\Command\CreateCalendar</command>
@@ -31,18 +34,22 @@
<command>OCA\DAV\Command\SyncSystemAddressBook</command>
</commands>
- <activity>
- <filters>
- <filter>OCA\DAV\CalDAV\Activity\Filter\Calendar</filter>
- <filter>OCA\DAV\CalDAV\Activity\Filter\Todo</filter>
- </filters>
+ <settings>
+ <admin>OCA\DAV\Settings\CalDAVSettings</admin>
+ </settings>
+ <activity>
<settings>
<setting>OCA\DAV\CalDAV\Activity\Setting\Calendar</setting>
<setting>OCA\DAV\CalDAV\Activity\Setting\Event</setting>
<setting>OCA\DAV\CalDAV\Activity\Setting\Todo</setting>
</settings>
+ <filters>
+ <filter>OCA\DAV\CalDAV\Activity\Filter\Calendar</filter>
+ <filter>OCA\DAV\CalDAV\Activity\Filter\Todo</filter>
+ </filters>
+
<providers>
<provider>OCA\DAV\CalDAV\Activity\Provider\Calendar</provider>
<provider>OCA\DAV\CalDAV\Activity\Provider\Event</provider>
@@ -50,7 +57,7 @@
</providers>
</activity>
- <settings>
- <admin>OCA\DAV\Settings\CalDAVSettings</admin>
- </settings>
+ <public>
+ <webdav>appinfo/v1/publicwebdav.php</webdav>
+ </public>
</info>
diff --git a/apps/dav/l10n/hu.js b/apps/dav/l10n/hu.js
index e028e61e787..88c86a874a3 100644
--- a/apps/dav/l10n/hu.js
+++ b/apps/dav/l10n/hu.js
@@ -55,6 +55,7 @@ OC.L10N.register(
"Description:" : "Leírás:",
"Link:" : "Link:",
"Contacts" : "Névjegyek",
+ "WebDAV" : "WebDAV",
"Technical details" : "Technikai adatok",
"Remote Address: %s" : "Távoli cím: %s",
"Request ID: %s" : "Kérelem azonosító: %s",
diff --git a/apps/dav/l10n/hu.json b/apps/dav/l10n/hu.json
index 2f507d46aa9..cd9af191756 100644
--- a/apps/dav/l10n/hu.json
+++ b/apps/dav/l10n/hu.json
@@ -53,6 +53,7 @@
"Description:" : "Leírás:",
"Link:" : "Link:",
"Contacts" : "Névjegyek",
+ "WebDAV" : "WebDAV",
"Technical details" : "Technikai adatok",
"Remote Address: %s" : "Távoli cím: %s",
"Request ID: %s" : "Kérelem azonosító: %s",
diff --git a/apps/dav/l10n/ru.js b/apps/dav/l10n/ru.js
index 86082e3f8c6..70cfd8050a6 100644
--- a/apps/dav/l10n/ru.js
+++ b/apps/dav/l10n/ru.js
@@ -55,6 +55,7 @@ OC.L10N.register(
"Description:" : "Описание:",
"Link:" : "Ссылка:",
"Contacts" : "Контакты",
+ "WebDAV" : "WebDAV",
"Technical details" : "Технические подробности",
"Remote Address: %s" : "Удаленный адрес: %s",
"Request ID: %s" : "ID запроса: %s",
diff --git a/apps/dav/l10n/ru.json b/apps/dav/l10n/ru.json
index 8c53fede2aa..934bcaa719e 100644
--- a/apps/dav/l10n/ru.json
+++ b/apps/dav/l10n/ru.json
@@ -53,6 +53,7 @@
"Description:" : "Описание:",
"Link:" : "Ссылка:",
"Contacts" : "Контакты",
+ "WebDAV" : "WebDAV",
"Technical details" : "Технические подробности",
"Remote Address: %s" : "Удаленный адрес: %s",
"Request ID: %s" : "ID запроса: %s",
diff --git a/apps/dav/l10n/sv.js b/apps/dav/l10n/sv.js
index cc93613e2b0..f6af2bf93f3 100644
--- a/apps/dav/l10n/sv.js
+++ b/apps/dav/l10n/sv.js
@@ -55,6 +55,7 @@ OC.L10N.register(
"Description:" : "Beskrivning:",
"Link:" : "Länk:",
"Contacts" : "Kontakter",
+ "WebDAV" : "WebDAV",
"Technical details" : "Tekniska detaljer",
"Remote Address: %s" : "Extern adress: %s",
"Request ID: %s" : "Begär ID: %s",
@@ -62,6 +63,7 @@ OC.L10N.register(
"Send invitations to attendees" : "Skicka inbjudan till deltagare",
"Please make sure to properly set up the email settings above." : "Vänligen säkerställ att epost-inställningarna ovan är korrekt angivna",
"Automatically generate a birthday calendar" : "Generera en födelsedagskalender automatiskt",
- "Birthday calendars will be generated by a background job." : "Födelsedagskalender kommer skapas som ett bakgrundsjobb."
+ "Birthday calendars will be generated by a background job." : "Födelsedagskalender kommer skapas som ett bakgrundsjobb.",
+ "Hence they will not be available immediately after enabling but will show up after some time." : "Därför kommer de inte vara tillgängliga direkt efter aktivering men kommer dyka upp efter en tid."
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/dav/l10n/sv.json b/apps/dav/l10n/sv.json
index df7d8faa22a..4c256ddb1aa 100644
--- a/apps/dav/l10n/sv.json
+++ b/apps/dav/l10n/sv.json
@@ -53,6 +53,7 @@
"Description:" : "Beskrivning:",
"Link:" : "Länk:",
"Contacts" : "Kontakter",
+ "WebDAV" : "WebDAV",
"Technical details" : "Tekniska detaljer",
"Remote Address: %s" : "Extern adress: %s",
"Request ID: %s" : "Begär ID: %s",
@@ -60,6 +61,7 @@
"Send invitations to attendees" : "Skicka inbjudan till deltagare",
"Please make sure to properly set up the email settings above." : "Vänligen säkerställ att epost-inställningarna ovan är korrekt angivna",
"Automatically generate a birthday calendar" : "Generera en födelsedagskalender automatiskt",
- "Birthday calendars will be generated by a background job." : "Födelsedagskalender kommer skapas som ett bakgrundsjobb."
+ "Birthday calendars will be generated by a background job." : "Födelsedagskalender kommer skapas som ett bakgrundsjobb.",
+ "Hence they will not be available immediately after enabling but will show up after some time." : "Därför kommer de inte vara tillgängliga direkt efter aktivering men kommer dyka upp efter en tid."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php
index a936cb6aeba..290d6027006 100644
--- a/apps/dav/lib/CalDAV/CalDavBackend.php
+++ b/apps/dav/lib/CalDAV/CalDavBackend.php
@@ -51,10 +51,8 @@ use Sabre\DAV;
use Sabre\DAV\Exception\Forbidden;
use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\PropPatch;
-use Sabre\HTTP\URLUtil;
use Sabre\VObject\Component;
use Sabre\VObject\Component\VCalendar;
-use Sabre\VObject\Component\VEvent;
use Sabre\VObject\Component\VTimeZone;
use Sabre\VObject\DateTimeParser;
use Sabre\VObject\InvalidDataException;
diff --git a/apps/dav/lib/CalDAV/Plugin.php b/apps/dav/lib/CalDAV/Plugin.php
index 0d793f929b3..4aa9762899f 100644
--- a/apps/dav/lib/CalDAV/Plugin.php
+++ b/apps/dav/lib/CalDAV/Plugin.php
@@ -23,8 +23,6 @@
namespace OCA\DAV\CalDAV;
-use Sabre\HTTP\URLUtil;
-
class Plugin extends \Sabre\CalDAV\Plugin {
/**
diff --git a/apps/dav/lib/CalDAV/Principal/Collection.php b/apps/dav/lib/CalDAV/Principal/Collection.php
index cadfc66c26b..e4389a1c726 100644
--- a/apps/dav/lib/CalDAV/Principal/Collection.php
+++ b/apps/dav/lib/CalDAV/Principal/Collection.php
@@ -23,7 +23,6 @@
namespace OCA\DAV\CalDAV\Principal;
-use OCA\DAV\CalDAV\Principal\User;
/**
* Class Collection
diff --git a/apps/dav/lib/CalDAV/Schedule/IMipPlugin.php b/apps/dav/lib/CalDAV/Schedule/IMipPlugin.php
index 781baa2032d..85973a8be12 100644
--- a/apps/dav/lib/CalDAV/Schedule/IMipPlugin.php
+++ b/apps/dav/lib/CalDAV/Schedule/IMipPlugin.php
@@ -35,7 +35,6 @@ use OCP\L10N\IFactory as L10NFactory;
use OCP\Mail\IEMailTemplate;
use OCP\Mail\IMailer;
use Sabre\CalDAV\Schedule\IMipPlugin as SabreIMipPlugin;
-use Sabre\DAV\Xml\Element\Prop;
use Sabre\VObject\Component\VCalendar;
use Sabre\VObject\Component\VEvent;
use Sabre\VObject\DateTimeParser;
diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php
index be92f16f772..a2d3b03147b 100644
--- a/apps/dav/lib/CardDAV/CardDavBackend.php
+++ b/apps/dav/lib/CardDAV/CardDavBackend.php
@@ -46,7 +46,6 @@ use Sabre\CardDAV\Backend\BackendInterface;
use Sabre\CardDAV\Backend\SyncSupport;
use Sabre\CardDAV\Plugin;
use Sabre\DAV\Exception\BadRequest;
-use Sabre\HTTP\URLUtil;
use Sabre\VObject\Component\VCard;
use Sabre\VObject\Reader;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
diff --git a/apps/dav/lib/CardDAV/ImageExportPlugin.php b/apps/dav/lib/CardDAV/ImageExportPlugin.php
index 069239326ba..cac8e795747 100644
--- a/apps/dav/lib/CardDAV/ImageExportPlugin.php
+++ b/apps/dav/lib/CardDAV/ImageExportPlugin.php
@@ -24,7 +24,6 @@
namespace OCA\DAV\CardDAV;
use OCP\Files\NotFoundException;
-use OCP\ILogger;
use Sabre\CardDAV\Card;
use Sabre\DAV\Server;
use Sabre\DAV\ServerPlugin;
diff --git a/apps/dav/lib/CardDAV/Plugin.php b/apps/dav/lib/CardDAV/Plugin.php
index 2dca3585f35..cd303a394ed 100644
--- a/apps/dav/lib/CardDAV/Plugin.php
+++ b/apps/dav/lib/CardDAV/Plugin.php
@@ -27,7 +27,6 @@ use OCA\DAV\CardDAV\Xml\Groups;
use Sabre\DAV\INode;
use Sabre\DAV\PropFind;
use Sabre\DAV\Server;
-use Sabre\HTTP\URLUtil;
class Plugin extends \Sabre\CardDAV\Plugin {
diff --git a/apps/dav/lib/Connector/LegacyDAVACL.php b/apps/dav/lib/Connector/LegacyDAVACL.php
index f96d75a2486..6c55eb0765f 100644
--- a/apps/dav/lib/Connector/LegacyDAVACL.php
+++ b/apps/dav/lib/Connector/LegacyDAVACL.php
@@ -28,7 +28,6 @@ namespace OCA\DAV\Connector;
use OCA\DAV\Connector\Sabre\DavAclPlugin;
use Sabre\DAV\INode;
use Sabre\DAV\PropFind;
-use Sabre\HTTP\URLUtil;
use Sabre\DAVACL\Xml\Property\Principal;
class LegacyDAVACL extends DavAclPlugin {
diff --git a/apps/dav/lib/Connector/Sabre/ObjectTree.php b/apps/dav/lib/Connector/Sabre/ObjectTree.php
index 25db1d5028c..15988cdadb4 100644
--- a/apps/dav/lib/Connector/Sabre/ObjectTree.php
+++ b/apps/dav/lib/Connector/Sabre/ObjectTree.php
@@ -34,7 +34,6 @@ use OCA\DAV\Connector\Sabre\Exception\Forbidden;
use OCA\DAV\Connector\Sabre\Exception\InvalidPath;
use OCA\DAV\Connector\Sabre\Exception\FileLocked;
use OC\Files\FileInfo;
-use OC\Files\Mount\MoveableMount;
use OCP\Files\ForbiddenException;
use OCP\Files\StorageInvalidException;
use OCP\Files\StorageNotAvailableException;
diff --git a/apps/dav/lib/Connector/Sabre/Principal.php b/apps/dav/lib/Connector/Sabre/Principal.php
index 06fb10f7e2c..b2f57cf715c 100644
--- a/apps/dav/lib/Connector/Sabre/Principal.php
+++ b/apps/dav/lib/Connector/Sabre/Principal.php
@@ -39,7 +39,6 @@ use OCP\Share\IManager as IShareManager;
use Sabre\DAV\Exception;
use \Sabre\DAV\PropPatch;
use Sabre\DAVACL\PrincipalBackend\BackendInterface;
-use Sabre\HTTP\URLUtil;
class Principal implements BackendInterface {
diff --git a/apps/dav/lib/Connector/Sabre/QuotaPlugin.php b/apps/dav/lib/Connector/Sabre/QuotaPlugin.php
index af45f526831..5222986cb5c 100644
--- a/apps/dav/lib/Connector/Sabre/QuotaPlugin.php
+++ b/apps/dav/lib/Connector/Sabre/QuotaPlugin.php
@@ -26,15 +26,12 @@
*
*/
namespace OCA\DAV\Connector\Sabre;
-use OCA\DAV\Files\FilesHome;
use OCA\DAV\Upload\FutureFile;
-use OCA\DAV\Upload\UploadFolder;
use OCP\Files\FileInfo;
use OCP\Files\StorageNotAvailableException;
use Sabre\DAV\Exception\InsufficientStorage;
use Sabre\DAV\Exception\ServiceUnavailable;
use Sabre\DAV\INode;
-use Sabre\HTTP\URLUtil;
/**
* This plugin check user quota and deny creating files when they exceeds the quota.
diff --git a/apps/dav/lib/Connector/Sabre/ServerFactory.php b/apps/dav/lib/Connector/Sabre/ServerFactory.php
index c120b0be2e2..73969865a86 100644
--- a/apps/dav/lib/Connector/Sabre/ServerFactory.php
+++ b/apps/dav/lib/Connector/Sabre/ServerFactory.php
@@ -39,7 +39,6 @@ use OCP\IPreview;
use OCP\IRequest;
use OCP\ITagManager;
use OCP\IUserSession;
-use Sabre\DAV\Auth\Backend\BackendInterface;
use Sabre\DAV\Auth\Plugin;
class ServerFactory {
diff --git a/apps/dav/lib/DAV/SystemPrincipalBackend.php b/apps/dav/lib/DAV/SystemPrincipalBackend.php
index e3b9302886e..77dd5c77caf 100644
--- a/apps/dav/lib/DAV/SystemPrincipalBackend.php
+++ b/apps/dav/lib/DAV/SystemPrincipalBackend.php
@@ -24,7 +24,6 @@
namespace OCA\DAV\DAV;
use Sabre\DAVACL\PrincipalBackend\AbstractBackend;
-use Sabre\HTTP\URLUtil;
class SystemPrincipalBackend extends AbstractBackend {
diff --git a/apps/dav/lib/Files/FilesHome.php b/apps/dav/lib/Files/FilesHome.php
index 8820ef6ffb7..63e7916edcf 100644
--- a/apps/dav/lib/Files/FilesHome.php
+++ b/apps/dav/lib/Files/FilesHome.php
@@ -27,7 +27,6 @@ namespace OCA\DAV\Files;
use OCA\DAV\Connector\Sabre\Directory;
use OCP\Files\FileInfo;
use Sabre\DAV\Exception\Forbidden;
-use Sabre\HTTP\URLUtil;
class FilesHome extends Directory {
diff --git a/apps/dav/lib/Files/RootCollection.php b/apps/dav/lib/Files/RootCollection.php
index 28f98483c4c..59b6690a026 100644
--- a/apps/dav/lib/Files/RootCollection.php
+++ b/apps/dav/lib/Files/RootCollection.php
@@ -25,7 +25,6 @@ namespace OCA\DAV\Files;
use Sabre\DAV\INode;
use Sabre\DAVACL\AbstractPrincipalCollection;
-use Sabre\HTTP\URLUtil;
use Sabre\DAV\SimpleCollection;
class RootCollection extends AbstractPrincipalCollection {
diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php
index dfa19467e5e..84426db04cb 100644
--- a/apps/dav/lib/Server.php
+++ b/apps/dav/lib/Server.php
@@ -32,9 +32,7 @@
*/
namespace OCA\DAV;
-use OC\AppFramework\Utility\TimeFactory;
use OCA\DAV\CalDAV\BirthdayService;
-use OCA\DAV\CalDAV\Schedule\IMipPlugin;
use OCA\DAV\CardDAV\ImageExportPlugin;
use OCA\DAV\CardDAV\PhotoCache;
use OCA\DAV\Comments\CommentsPlugin;
diff --git a/apps/dav/lib/Upload/ChunkingPlugin.php b/apps/dav/lib/Upload/ChunkingPlugin.php
index 5768f53c2b4..a3f6e528c6b 100644
--- a/apps/dav/lib/Upload/ChunkingPlugin.php
+++ b/apps/dav/lib/Upload/ChunkingPlugin.php
@@ -22,8 +22,6 @@
namespace OCA\DAV\Upload;
-
-use OCA\DAV\Connector\Sabre\File;
use Sabre\DAV\Exception\BadRequest;
use Sabre\DAV\Server;
use Sabre\DAV\ServerPlugin;
diff --git a/apps/dav/tests/unit/ServerTest.php b/apps/dav/tests/unit/ServerTest.php
index d502b24adcf..58c77c1b0ec 100644
--- a/apps/dav/tests/unit/ServerTest.php
+++ b/apps/dav/tests/unit/ServerTest.php
@@ -41,6 +41,8 @@ class ServerTest extends \Test\TestCase {
public function test() {
/** @var IRequest $r */
$r = $this->createMock(IRequest::class);
+ $r->method('getRequestUri')
+ ->willReturn('/');
$s = new Server($r, '/');
$this->assertInstanceOf('OCA\DAV\Server', $s);
}
diff --git a/apps/encryption/appinfo/info.xml b/apps/encryption/appinfo/info.xml
index 5744e5d2d66..2859043e72b 100644
--- a/apps/encryption/appinfo/info.xml
+++ b/apps/encryption/appinfo/info.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>encryption</id>
+ <name>Default encryption module</name>
+ <summary>Default encryption module for server-side encryption</summary>
<description>
In order to use this encryption module you need to enable server-side
encryption in the admin settings. Once enabled this module will encrypt
@@ -11,35 +14,40 @@
Please read the documentation to know all implications before you decide
to enable server-side encryption.
</description>
- <name>Default encryption module</name>
- <licence>AGPL</licence>
+ <version>2.1.0</version>
+ <licence>agpl</licence>
<author>Bjoern Schiessle</author>
<author>Clark Tomlinson</author>
+ <types>
+ <filesystem/>
+ </types>
<documentation>
<user>user-encryption</user>
<admin>admin-encryption</admin>
</documentation>
- <version>2.1.0</version>
- <types>
- <filesystem/>
- </types>
+ <category>files</category>
+ <category>security</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+
<dependencies>
<lib>openssl</lib>
<nextcloud min-version="14" max-version="14" />
</dependencies>
- <settings>
- <admin>OCA\Encryption\Settings\Admin</admin>
- <personal>OCA\Encryption\Settings\Personal</personal>
- </settings>
- <commands>
- <command>OCA\Encryption\Command\EnableMasterKey</command>
- <command>OCA\Encryption\Command\DisableMasterKey</command>
- <command>OCA\Encryption\Command\MigrateKeys</command>
- </commands>
<repair-steps>
<post-migration>
<step>OCA\Encryption\Migration\SetMasterKeyStatus</step>
</post-migration>
</repair-steps>
+
+ <commands>
+ <command>OCA\Encryption\Command\EnableMasterKey</command>
+ <command>OCA\Encryption\Command\DisableMasterKey</command>
+ <command>OCA\Encryption\Command\MigrateKeys</command>
+ </commands>
+
+ <settings>
+ <admin>OCA\Encryption\Settings\Admin</admin>
+ <personal>OCA\Encryption\Settings\Personal</personal>
+ </settings>
</info>
diff --git a/apps/encryption/l10n/es.js b/apps/encryption/l10n/es.js
index 35ef819d2d1..d7d0f4af1e7 100644
--- a/apps/encryption/l10n/es.js
+++ b/apps/encryption/l10n/es.js
@@ -1,22 +1,22 @@
OC.L10N.register(
"encryption",
{
- "Missing recovery key password" : "Falta contraseña de recuperación",
+ "Missing recovery key password" : "Falta la contraseña de recuperación",
"Please repeat the recovery key password" : "Por favor, repita la contraseña de recuperación",
"Repeated recovery key password does not match the provided recovery key password" : "La contraseña de recuperación reintroducida no coincide con la contraseña de recuperación proporcionada",
"Recovery key successfully enabled" : "Se ha habilitado la recuperación de archivos",
- "Could not enable recovery key. Please check your recovery key password!" : "No se pudo habilitar la contraseña de recuperación. Por favor, ¡compruebe su contraseña de recuperación!",
+ "Could not enable recovery key. Please check your recovery key password!" : "No se ha podido habilitar la contraseña de recuperación. Por favor, ¡compruebe su contraseña de recuperación!",
"Recovery key successfully disabled" : "Clave de recuperación deshabilitada",
"Could not disable recovery key. Please check your recovery key password!" : "No se pudo deshabilitar la clave de recuperación. Por favor, ¡compruebe su contraseña!",
"Missing parameters" : "Faltan parámetros",
- "Please provide the old recovery password" : "Por favor, ingrese su antigua contraseña de recuperación",
+ "Please provide the old recovery password" : "Por favor, introduzca su antigua contraseña de recuperación",
"Please provide a new recovery password" : "Por favor, provea una nueva contraseña de recuperación",
"Please repeat the new recovery password" : "Por favor, repita su nueva contraseña de recuperación",
"Password successfully changed." : "Su contraseña ha sido cambiada",
"Could not change the password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Compruebe que la contraseña actual sea correcta.",
"Recovery Key disabled" : "Desactivada la clave de recuperación",
"Recovery Key enabled" : "Recuperación de clave habilitada",
- "Could not enable the recovery key, please try again or contact your administrator" : "No se pudo habilitar la clave de recuperación, por favor vuelva a intentarlo o póngase en contacto con su administrador",
+ "Could not enable the recovery key, please try again or contact your administrator" : "No se ha podido habilitar la clave de recuperación, por favor vuelva a intentarlo o póngase en contacto con su administrador",
"Could not update the private key password." : "No se pudo actualizar la contraseña de la clave privada.",
"The old password was not correct, please try again." : "La antigua contraseña no es correcta, por favor inténtelo de nuevo.",
"The current log-in password was not correct, please try again." : "La contraseña de inicio de sesión actual no es correcta, por favor inténtelo de nuevo.",
diff --git a/apps/encryption/l10n/es.json b/apps/encryption/l10n/es.json
index 0ab95ab9247..17ba43a1bf0 100644
--- a/apps/encryption/l10n/es.json
+++ b/apps/encryption/l10n/es.json
@@ -1,20 +1,20 @@
{ "translations": {
- "Missing recovery key password" : "Falta contraseña de recuperación",
+ "Missing recovery key password" : "Falta la contraseña de recuperación",
"Please repeat the recovery key password" : "Por favor, repita la contraseña de recuperación",
"Repeated recovery key password does not match the provided recovery key password" : "La contraseña de recuperación reintroducida no coincide con la contraseña de recuperación proporcionada",
"Recovery key successfully enabled" : "Se ha habilitado la recuperación de archivos",
- "Could not enable recovery key. Please check your recovery key password!" : "No se pudo habilitar la contraseña de recuperación. Por favor, ¡compruebe su contraseña de recuperación!",
+ "Could not enable recovery key. Please check your recovery key password!" : "No se ha podido habilitar la contraseña de recuperación. Por favor, ¡compruebe su contraseña de recuperación!",
"Recovery key successfully disabled" : "Clave de recuperación deshabilitada",
"Could not disable recovery key. Please check your recovery key password!" : "No se pudo deshabilitar la clave de recuperación. Por favor, ¡compruebe su contraseña!",
"Missing parameters" : "Faltan parámetros",
- "Please provide the old recovery password" : "Por favor, ingrese su antigua contraseña de recuperación",
+ "Please provide the old recovery password" : "Por favor, introduzca su antigua contraseña de recuperación",
"Please provide a new recovery password" : "Por favor, provea una nueva contraseña de recuperación",
"Please repeat the new recovery password" : "Por favor, repita su nueva contraseña de recuperación",
"Password successfully changed." : "Su contraseña ha sido cambiada",
"Could not change the password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Compruebe que la contraseña actual sea correcta.",
"Recovery Key disabled" : "Desactivada la clave de recuperación",
"Recovery Key enabled" : "Recuperación de clave habilitada",
- "Could not enable the recovery key, please try again or contact your administrator" : "No se pudo habilitar la clave de recuperación, por favor vuelva a intentarlo o póngase en contacto con su administrador",
+ "Could not enable the recovery key, please try again or contact your administrator" : "No se ha podido habilitar la clave de recuperación, por favor vuelva a intentarlo o póngase en contacto con su administrador",
"Could not update the private key password." : "No se pudo actualizar la contraseña de la clave privada.",
"The old password was not correct, please try again." : "La antigua contraseña no es correcta, por favor inténtelo de nuevo.",
"The current log-in password was not correct, please try again." : "La contraseña de inicio de sesión actual no es correcta, por favor inténtelo de nuevo.",
diff --git a/apps/encryption/l10n/pt_PT.js b/apps/encryption/l10n/pt_PT.js
index b5b26cefd07..99d3ab28b9a 100644
--- a/apps/encryption/l10n/pt_PT.js
+++ b/apps/encryption/l10n/pt_PT.js
@@ -22,15 +22,21 @@ OC.L10N.register(
"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 para a aplicação de cifra. Por favor actualize a sua chave privada nas definições pessoais para recuperar acesso aos seus ficheiros cifrados.",
+ "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Aplicação de cifra está activa, mas as suas chaves não estão inicializaras. Por favor, faça logout e autentique-se novamente.",
+ "Please enable server side encryption in the admin settings in order to use the encryption module." : "Por favor active cifragem no servidor nas definições de administrador para usar o módulo de cifra.",
+ "Encryption app is enabled and ready" : "Aplicação de cifra activa e pronta a usar",
"Bad Signature" : "Má Assinatura",
"Missing Signature" : "Assinatura em Falta",
"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.",
+ "Default encryption module" : "Módulo de cifra padrão",
"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 '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' 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",
"The share will expire on %s." : "Esta partilha irá expirar em %s.",
"Cheers!" : "Parabéns!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Olá,<br><br>o administrador ativou a encriptação do lado do servidor. Os teus ficheiros foram encriptados usando a palavra-passe <strong>%s</strong>.<br><br>Por favor, faz login via browser, vai à secção 'Módulo de encriptação básica' 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.<br><br>",
+ "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Aplicação de cifra está activa, mas as suas chaves não estão inicializaras. Por favor, faça logout e autentique-se novamente.",
"Encrypt the home storage" : "Encriptar o armazenamento do início",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ativando esta opção todos os ficheiros armazenados no armazenamento principal serão encriptados, senão serão encriptados todos os ficheiros no armazenamento externo",
"Enable recovery key" : "Ativar a chave de recuperação",
@@ -43,6 +49,7 @@ OC.L10N.register(
"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",
+ "Basic encryption module" : "Módulo de cifra básica",
"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. ",
diff --git a/apps/encryption/l10n/pt_PT.json b/apps/encryption/l10n/pt_PT.json
index 2dbaaaf1dbf..050c8b1710c 100644
--- a/apps/encryption/l10n/pt_PT.json
+++ b/apps/encryption/l10n/pt_PT.json
@@ -20,15 +20,21 @@
"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 para a aplicação de cifra. Por favor actualize a sua chave privada nas definições pessoais para recuperar acesso aos seus ficheiros cifrados.",
+ "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Aplicação de cifra está activa, mas as suas chaves não estão inicializaras. Por favor, faça logout e autentique-se novamente.",
+ "Please enable server side encryption in the admin settings in order to use the encryption module." : "Por favor active cifragem no servidor nas definições de administrador para usar o módulo de cifra.",
+ "Encryption app is enabled and ready" : "Aplicação de cifra activa e pronta a usar",
"Bad Signature" : "Má Assinatura",
"Missing Signature" : "Assinatura em Falta",
"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.",
+ "Default encryption module" : "Módulo de cifra padrão",
"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 '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' 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",
"The share will expire on %s." : "Esta partilha irá expirar em %s.",
"Cheers!" : "Parabéns!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Olá,<br><br>o administrador ativou a encriptação do lado do servidor. Os teus ficheiros foram encriptados usando a palavra-passe <strong>%s</strong>.<br><br>Por favor, faz login via browser, vai à secção 'Módulo de encriptação básica' 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.<br><br>",
+ "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Aplicação de cifra está activa, mas as suas chaves não estão inicializaras. Por favor, faça logout e autentique-se novamente.",
"Encrypt the home storage" : "Encriptar o armazenamento do início",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ativando esta opção todos os ficheiros armazenados no armazenamento principal serão encriptados, senão serão encriptados todos os ficheiros no armazenamento externo",
"Enable recovery key" : "Ativar a chave de recuperação",
@@ -41,6 +47,7 @@
"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",
+ "Basic encryption module" : "Módulo de cifra básica",
"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. ",
diff --git a/apps/encryption/lib/AppInfo/Application.php b/apps/encryption/lib/AppInfo/Application.php
index 2130044d1f4..da59169694b 100644
--- a/apps/encryption/lib/AppInfo/Application.php
+++ b/apps/encryption/lib/AppInfo/Application.php
@@ -40,7 +40,6 @@ use OCA\Encryption\Recovery;
use OCA\Encryption\Session;
use OCA\Encryption\Users\Setup;
use OCA\Encryption\Util;
-use OCP\App;
use OCP\AppFramework\IAppContainer;
use OCP\Encryption\IManager;
use OCP\IConfig;
diff --git a/apps/encryption/lib/Hooks/UserHooks.php b/apps/encryption/lib/Hooks/UserHooks.php
index 1dade9f782f..dc3a4d3c428 100644
--- a/apps/encryption/lib/Hooks/UserHooks.php
+++ b/apps/encryption/lib/Hooks/UserHooks.php
@@ -34,7 +34,6 @@ use OCA\Encryption\Hooks\Contracts\IHook;
use OCA\Encryption\KeyManager;
use OCA\Encryption\Crypto\Crypt;
use OCA\Encryption\Users\Setup;
-use OCP\App;
use OCP\ILogger;
use OCP\IUserSession;
use OCA\Encryption\Util;
diff --git a/apps/federatedfilesharing/appinfo/info.xml b/apps/federatedfilesharing/appinfo/info.xml
index ac5e3f45e95..027e62ed183 100644
--- a/apps/federatedfilesharing/appinfo/info.xml
+++ b/apps/federatedfilesharing/appinfo/info.xml
@@ -1,17 +1,23 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>federatedfilesharing</id>
<name>Federated file sharing</name>
+ <summary>Provide federated file sharing across servers</summary>
<description>Provide federated file sharing across servers</description>
- <licence>AGPL</licence>
+ <version>1.4.0</version>
+ <licence>agpl</licence>
<author>Bjoern Schiessle</author>
<author>Roeland Jago Douma</author>
- <version>1.4.0</version>
<namespace>FederatedFileSharing</namespace>
- <category>other</category>
+ <category>files</category>
+ <category>social</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
+
<settings>
<admin>OCA\FederatedFileSharing\Settings\Admin</admin>
<personal>OCA\FederatedFileSharing\Settings\Personal</personal>
diff --git a/apps/federatedfilesharing/l10n/hu.js b/apps/federatedfilesharing/l10n/hu.js
index ec462c190c1..0f57f27e5fa 100644
--- a/apps/federatedfilesharing/l10n/hu.js
+++ b/apps/federatedfilesharing/l10n/hu.js
@@ -38,6 +38,7 @@ OC.L10N.register(
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Ossza meg velem az #Nextcloud Egyesített Felhő Azonosító segítségével, lásd %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Ossza meg velem az #Nextcloud Egyesített Felhő Azonosító segítségével ",
"Sharing" : "Megosztás",
+ "Federated file sharing" : "Egyesített fájlmegosztás",
"Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
"Open documentation" : "Dokumentáció megnyitása",
"Adjust how people can share between servers." : "A szerverek közti megosztási lehetőségek beállítása",
diff --git a/apps/federatedfilesharing/l10n/hu.json b/apps/federatedfilesharing/l10n/hu.json
index e4c4094be26..5315c6593b5 100644
--- a/apps/federatedfilesharing/l10n/hu.json
+++ b/apps/federatedfilesharing/l10n/hu.json
@@ -36,6 +36,7 @@
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Ossza meg velem az #Nextcloud Egyesített Felhő Azonosító segítségével, lásd %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Ossza meg velem az #Nextcloud Egyesített Felhő Azonosító segítségével ",
"Sharing" : "Megosztás",
+ "Federated file sharing" : "Egyesített fájlmegosztás",
"Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
"Open documentation" : "Dokumentáció megnyitása",
"Adjust how people can share between servers." : "A szerverek közti megosztási lehetőségek beállítása",
diff --git a/apps/federatedfilesharing/l10n/ja.js b/apps/federatedfilesharing/l10n/ja.js
index c25ab82bc3c..a310958d709 100644
--- a/apps/federatedfilesharing/l10n/ja.js
+++ b/apps/federatedfilesharing/l10n/ja.js
@@ -38,6 +38,7 @@ OC.L10N.register(
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "#Nextcloud の「クラウド共有ID」で私と共有できます。こちらを見てください。%s",
"Share with me through my #Nextcloud Federated Cloud ID" : "#Nextcloud の「クラウド共有ID」で私と共有できます。",
"Sharing" : "共有中",
+ "Federated file sharing" : "連携共有",
"Federated Cloud Sharing" : "統合されたクラウド共有",
"Open documentation" : "ドキュメントを開く",
"Adjust how people can share between servers." : "サーバー間でどうやって共有するかを調整する",
diff --git a/apps/federatedfilesharing/l10n/ja.json b/apps/federatedfilesharing/l10n/ja.json
index 67870054631..89c5c06bf1b 100644
--- a/apps/federatedfilesharing/l10n/ja.json
+++ b/apps/federatedfilesharing/l10n/ja.json
@@ -36,6 +36,7 @@
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "#Nextcloud の「クラウド共有ID」で私と共有できます。こちらを見てください。%s",
"Share with me through my #Nextcloud Federated Cloud ID" : "#Nextcloud の「クラウド共有ID」で私と共有できます。",
"Sharing" : "共有中",
+ "Federated file sharing" : "連携共有",
"Federated Cloud Sharing" : "統合されたクラウド共有",
"Open documentation" : "ドキュメントを開く",
"Adjust how people can share between servers." : "サーバー間でどうやって共有するかを調整する",
diff --git a/apps/federatedfilesharing/l10n/lv.js b/apps/federatedfilesharing/l10n/lv.js
index b432c74285f..29e26c409db 100644
--- a/apps/federatedfilesharing/l10n/lv.js
+++ b/apps/federatedfilesharing/l10n/lv.js
@@ -19,7 +19,7 @@ OC.L10N.register(
"Invalid or untrusted SSL certificate" : "Nederīgs vai neuzticams SSL sertifikāts",
"Storage not valid" : "Nederīga krātuve",
"Couldn't add remote share" : "Nevarēja pievienot attālināto koplietotni",
- "File is already shared with %s" : "Fails ir jau koplietots ar %s",
+ "File is already shared with %s" : "Datne ir jau koplietota ar %s",
"Could not find share" : "Nevarēja atrast koplietojumu",
"Accept" : "Akceptēt",
"Decline" : "Noraidīt",
diff --git a/apps/federatedfilesharing/l10n/lv.json b/apps/federatedfilesharing/l10n/lv.json
index d036b879573..472df869385 100644
--- a/apps/federatedfilesharing/l10n/lv.json
+++ b/apps/federatedfilesharing/l10n/lv.json
@@ -17,7 +17,7 @@
"Invalid or untrusted SSL certificate" : "Nederīgs vai neuzticams SSL sertifikāts",
"Storage not valid" : "Nederīga krātuve",
"Couldn't add remote share" : "Nevarēja pievienot attālināto koplietotni",
- "File is already shared with %s" : "Fails ir jau koplietots ar %s",
+ "File is already shared with %s" : "Datne ir jau koplietota ar %s",
"Could not find share" : "Nevarēja atrast koplietojumu",
"Accept" : "Akceptēt",
"Decline" : "Noraidīt",
diff --git a/apps/federatedfilesharing/l10n/nl.js b/apps/federatedfilesharing/l10n/nl.js
index 985df3fb9eb..5538dea0d41 100644
--- a/apps/federatedfilesharing/l10n/nl.js
+++ b/apps/federatedfilesharing/l10n/nl.js
@@ -38,6 +38,7 @@ OC.L10N.register(
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Deel met mij via mijn #Nextcloud gefedereerde Cloud ID, zie %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Deel met mij via mijn #Nextcloud gefedereerde Cloud ID",
"Sharing" : "Delen",
+ "Federated file sharing" : "Gefedereerd delen",
"Federated Cloud Sharing" : "Federated Cloud Sharing",
"Open documentation" : "Open documentatie",
"Adjust how people can share between servers." : "Aanpassen hoe mensen tussen servers kunnen delen.",
diff --git a/apps/federatedfilesharing/l10n/nl.json b/apps/federatedfilesharing/l10n/nl.json
index d3c1e3bc1cd..5006ccb35c9 100644
--- a/apps/federatedfilesharing/l10n/nl.json
+++ b/apps/federatedfilesharing/l10n/nl.json
@@ -36,6 +36,7 @@
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Deel met mij via mijn #Nextcloud gefedereerde Cloud ID, zie %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Deel met mij via mijn #Nextcloud gefedereerde Cloud ID",
"Sharing" : "Delen",
+ "Federated file sharing" : "Gefedereerd delen",
"Federated Cloud Sharing" : "Federated Cloud Sharing",
"Open documentation" : "Open documentatie",
"Adjust how people can share between servers." : "Aanpassen hoe mensen tussen servers kunnen delen.",
diff --git a/apps/federatedfilesharing/l10n/pt_PT.js b/apps/federatedfilesharing/l10n/pt_PT.js
index 974e4988006..b88c8dbb9c8 100644
--- a/apps/federatedfilesharing/l10n/pt_PT.js
+++ b/apps/federatedfilesharing/l10n/pt_PT.js
@@ -2,26 +2,57 @@ OC.L10N.register(
"federatedfilesharing",
{
"Federated sharing" : "Partilha Federada",
+ "Do you want to add the remote share {name} from {owner}@{remote}?" : "Pretende adicionar a partilha remota {nome} de {proprietório}@{remoto}?",
+ "Remote share" : "Partilha remota",
+ "Remote share password" : "Palavra-passe da partilha remota",
+ "Cancel" : "Cancelar",
+ "Add remote share" : "Adicionar partilha remota",
+ "Copy" : "Copiar",
+ "Copied!" : "Copiado!",
+ "Not supported!" : "Não suportado!",
+ "Press ⌘-C to copy." : "Pressione ⌘-C para copiar.",
+ "Press Ctrl-C to copy." : "Pressione Ctrl-C para copiar.",
"Invalid Federated Cloud ID" : "Id. de Nuvem Federada Inválida",
+ "Server to server sharing is not enabled on this server" : "Partilha servidor-para-servidor não está activa neste servidor",
+ "Couldn't establish a federated share." : "Não foi possível estabelecer uma partilha federada.",
+ "Couldn't establish a federated share, maybe the password was wrong." : "Não foi possível estabelecer a partilha federada, a palavra-passe talvez esteja incorrecta.",
+ "Federated Share request sent, you will receive an invitation. Check your notifications." : "Pedido de Partilha Federada enviado, irá receber o convite. Confira as suas notificações.",
+ "The mountpoint name contains invalid characters." : "O ponto de montagem (mountpoint) contem caracteres inválidos.",
+ "Not allowed to create a federated share with the owner." : "Não é permitido criar partilha federada com o proprietário. ",
+ "Invalid or untrusted SSL certificate" : "Certificado SSL inválido ou não confiável",
+ "Could not authenticate to remote share, password might be wrong" : "Não foi possível a autenticação na partilha remota, a palavra passe talvez esteja incorrecta",
+ "Storage not valid" : "Armazenamento inválido",
+ "Federated share added" : "Partilha federada adicionada",
+ "Couldn't add remote share" : "Não foi possível adicionar partilha remota",
"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",
"File is already shared with %s" : "O ficheiro já foi partilhado com %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "A partilha de %s falhou, não foi possível encontrar %s. É possível que o servidor esteja inacessível.",
- "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Recebeu \"/%3$s\" como uma partilha remota de %1$s (por conta de %2$s)",
- "You received \"/%3$s\" as a remote share from %1$s" : "Recebeu \"/%3$s\" como uma partilha remota de %1$s",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Partilha %s falhou, não foi possível encontrar %s, o servidor pode estar actualmente inatingível ou usa um certificado auto-assinado. ",
+ "Could not find share" : "Não foi possível encontrar partilha",
+ "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Recebeu \"%3$s\" como uma partilha remota de %1$s (em nome de %2$s)",
+ "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Recebeu {partilha} como uma partilha remota de {utilizador} (em nome de {behalf})",
+ "You received \"%3$s\" as a remote share from %1$s" : "Recebeu \"%3$s\" como uma partilha remota de %1$s",
+ "You received {share} as a remote share from {user}" : "Recebeu {partilha} como uma partilha remota de {utilizador}",
"Accept" : "Aceitar",
"Decline" : "Recusar",
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Partilhe comigo através da minha Id. da Nuvem Federada #Nextcloud, veja %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Partilhe comigo através da minha Id. da Nuvem Federada #Nextcloud",
+ "Sharing" : "Partilha",
+ "Federated file sharing" : "Partilha federada de ficheiros",
"Federated Cloud Sharing" : "Partilha de Nuvem Federada",
"Open documentation" : "Abrir documentação",
+ "Adjust how people can share between servers." : "Ajustar como as pessoas podem partilhar entre servidores.",
"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",
+ "Search global and public address book for users" : "Pesquisar lista global e pública de contactos de utilizadores ",
+ "Allow users to publish their data to a global and public address book" : "Permitir que os utilizadores publiquem os seus dados para uma lista de contactos global e pública",
"Federated Cloud" : "Nuvem Federada",
+ "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Pode partilhar com qualquer pessoa que use Nextcloud, ownCloud ou Pydio! Basta inserir Cloud ID federado no diálogo de partilha. Deve ser idêntico a pessoa@cloud.exemplo.com",
"Your Federated Cloud ID:" : "A sua id. da Nuvem Federada:",
- "Share it:" : "Partilhe-a:",
+ "Share it so your friends can share files with you:" : "Partilhe para que os seus amigos possam partilhar ficheiros consigo:",
"Add to your website" : "Adicione ao seu site da Web",
"Share with me via Nextcloud" : "Partilhe comigo via Nextcloud",
- "HTML Code:" : "Código HTML:"
+ "HTML Code:" : "Código HTML:",
+ "Search global and public address book for users and let local users publish their data" : "Pesquisar por utilizadores na lista de endereços global e pública e permita que utilizadores locais publiquem os seus dados"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/pt_PT.json b/apps/federatedfilesharing/l10n/pt_PT.json
index 9cdd87376f4..75d8104e635 100644
--- a/apps/federatedfilesharing/l10n/pt_PT.json
+++ b/apps/federatedfilesharing/l10n/pt_PT.json
@@ -1,25 +1,56 @@
{ "translations": {
"Federated sharing" : "Partilha Federada",
+ "Do you want to add the remote share {name} from {owner}@{remote}?" : "Pretende adicionar a partilha remota {nome} de {proprietório}@{remoto}?",
+ "Remote share" : "Partilha remota",
+ "Remote share password" : "Palavra-passe da partilha remota",
+ "Cancel" : "Cancelar",
+ "Add remote share" : "Adicionar partilha remota",
+ "Copy" : "Copiar",
+ "Copied!" : "Copiado!",
+ "Not supported!" : "Não suportado!",
+ "Press ⌘-C to copy." : "Pressione ⌘-C para copiar.",
+ "Press Ctrl-C to copy." : "Pressione Ctrl-C para copiar.",
"Invalid Federated Cloud ID" : "Id. de Nuvem Federada Inválida",
+ "Server to server sharing is not enabled on this server" : "Partilha servidor-para-servidor não está activa neste servidor",
+ "Couldn't establish a federated share." : "Não foi possível estabelecer uma partilha federada.",
+ "Couldn't establish a federated share, maybe the password was wrong." : "Não foi possível estabelecer a partilha federada, a palavra-passe talvez esteja incorrecta.",
+ "Federated Share request sent, you will receive an invitation. Check your notifications." : "Pedido de Partilha Federada enviado, irá receber o convite. Confira as suas notificações.",
+ "The mountpoint name contains invalid characters." : "O ponto de montagem (mountpoint) contem caracteres inválidos.",
+ "Not allowed to create a federated share with the owner." : "Não é permitido criar partilha federada com o proprietário. ",
+ "Invalid or untrusted SSL certificate" : "Certificado SSL inválido ou não confiável",
+ "Could not authenticate to remote share, password might be wrong" : "Não foi possível a autenticação na partilha remota, a palavra passe talvez esteja incorrecta",
+ "Storage not valid" : "Armazenamento inválido",
+ "Federated share added" : "Partilha federada adicionada",
+ "Couldn't add remote share" : "Não foi possível adicionar partilha remota",
"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",
"File is already shared with %s" : "O ficheiro já foi partilhado com %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "A partilha de %s falhou, não foi possível encontrar %s. É possível que o servidor esteja inacessível.",
- "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Recebeu \"/%3$s\" como uma partilha remota de %1$s (por conta de %2$s)",
- "You received \"/%3$s\" as a remote share from %1$s" : "Recebeu \"/%3$s\" como uma partilha remota de %1$s",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Partilha %s falhou, não foi possível encontrar %s, o servidor pode estar actualmente inatingível ou usa um certificado auto-assinado. ",
+ "Could not find share" : "Não foi possível encontrar partilha",
+ "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Recebeu \"%3$s\" como uma partilha remota de %1$s (em nome de %2$s)",
+ "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Recebeu {partilha} como uma partilha remota de {utilizador} (em nome de {behalf})",
+ "You received \"%3$s\" as a remote share from %1$s" : "Recebeu \"%3$s\" como uma partilha remota de %1$s",
+ "You received {share} as a remote share from {user}" : "Recebeu {partilha} como uma partilha remota de {utilizador}",
"Accept" : "Aceitar",
"Decline" : "Recusar",
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Partilhe comigo através da minha Id. da Nuvem Federada #Nextcloud, veja %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Partilhe comigo através da minha Id. da Nuvem Federada #Nextcloud",
+ "Sharing" : "Partilha",
+ "Federated file sharing" : "Partilha federada de ficheiros",
"Federated Cloud Sharing" : "Partilha de Nuvem Federada",
"Open documentation" : "Abrir documentação",
+ "Adjust how people can share between servers." : "Ajustar como as pessoas podem partilhar entre servidores.",
"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",
+ "Search global and public address book for users" : "Pesquisar lista global e pública de contactos de utilizadores ",
+ "Allow users to publish their data to a global and public address book" : "Permitir que os utilizadores publiquem os seus dados para uma lista de contactos global e pública",
"Federated Cloud" : "Nuvem Federada",
+ "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Pode partilhar com qualquer pessoa que use Nextcloud, ownCloud ou Pydio! Basta inserir Cloud ID federado no diálogo de partilha. Deve ser idêntico a pessoa@cloud.exemplo.com",
"Your Federated Cloud ID:" : "A sua id. da Nuvem Federada:",
- "Share it:" : "Partilhe-a:",
+ "Share it so your friends can share files with you:" : "Partilhe para que os seus amigos possam partilhar ficheiros consigo:",
"Add to your website" : "Adicione ao seu site da Web",
"Share with me via Nextcloud" : "Partilhe comigo via Nextcloud",
- "HTML Code:" : "Código HTML:"
+ "HTML Code:" : "Código HTML:",
+ "Search global and public address book for users and let local users publish their data" : "Pesquisar por utilizadores na lista de endereços global e pública e permita que utilizadores locais publiquem os seus dados"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/ru.js b/apps/federatedfilesharing/l10n/ru.js
index 9d0d769ff80..4c3e6fcf251 100644
--- a/apps/federatedfilesharing/l10n/ru.js
+++ b/apps/federatedfilesharing/l10n/ru.js
@@ -38,6 +38,7 @@ OC.L10N.register(
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Поделитесь со мной через мой #Nextcloud ID в федерации облачных хранилищ, смотрите %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Поделитесь со мной через мой #Nextcloud ID в федерации облачных хранилищ",
"Sharing" : "Общий доступ",
+ "Federated file sharing" : "Федеративный обмен файлами",
"Federated Cloud Sharing" : "Федерация облачных хранилищ",
"Open documentation" : "Открыть документацию",
"Adjust how people can share between servers." : "Настройте общий доступ между серверами.",
diff --git a/apps/federatedfilesharing/l10n/ru.json b/apps/federatedfilesharing/l10n/ru.json
index 2b676154840..5d42815329d 100644
--- a/apps/federatedfilesharing/l10n/ru.json
+++ b/apps/federatedfilesharing/l10n/ru.json
@@ -36,6 +36,7 @@
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Поделитесь со мной через мой #Nextcloud ID в федерации облачных хранилищ, смотрите %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Поделитесь со мной через мой #Nextcloud ID в федерации облачных хранилищ",
"Sharing" : "Общий доступ",
+ "Federated file sharing" : "Федеративный обмен файлами",
"Federated Cloud Sharing" : "Федерация облачных хранилищ",
"Open documentation" : "Открыть документацию",
"Adjust how people can share between servers." : "Настройте общий доступ между серверами.",
diff --git a/apps/federatedfilesharing/l10n/sk.js b/apps/federatedfilesharing/l10n/sk.js
index e0844f3e57f..ae3c60a3135 100644
--- a/apps/federatedfilesharing/l10n/sk.js
+++ b/apps/federatedfilesharing/l10n/sk.js
@@ -38,6 +38,7 @@ OC.L10N.register(
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Sprístupnite mi obsah prostredníctvom môjho #Nextcloud Federated Cloud ID, viac na %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Sprístupnite mi obsah prostredníctvom môjho #Nextcloud Federated Cloud ID",
"Sharing" : "Sprístupnenie",
+ "Federated file sharing" : "Združené sprístupňovanie súborov",
"Federated Cloud Sharing" : "Sprístupnenie prostredníctvom Federated Cloud",
"Open documentation" : "Otvoriť dokumentáciu",
"Adjust how people can share between servers." : "Nastavte ako môžu ľudia medzi sebou zdieľať servery.",
diff --git a/apps/federatedfilesharing/l10n/sk.json b/apps/federatedfilesharing/l10n/sk.json
index 0bc24068a60..2263551d316 100644
--- a/apps/federatedfilesharing/l10n/sk.json
+++ b/apps/federatedfilesharing/l10n/sk.json
@@ -36,6 +36,7 @@
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Sprístupnite mi obsah prostredníctvom môjho #Nextcloud Federated Cloud ID, viac na %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Sprístupnite mi obsah prostredníctvom môjho #Nextcloud Federated Cloud ID",
"Sharing" : "Sprístupnenie",
+ "Federated file sharing" : "Združené sprístupňovanie súborov",
"Federated Cloud Sharing" : "Sprístupnenie prostredníctvom Federated Cloud",
"Open documentation" : "Otvoriť dokumentáciu",
"Adjust how people can share between servers." : "Nastavte ako môžu ľudia medzi sebou zdieľať servery.",
diff --git a/apps/federatedfilesharing/l10n/sv.js b/apps/federatedfilesharing/l10n/sv.js
index 95117b897d2..d2cee743295 100644
--- a/apps/federatedfilesharing/l10n/sv.js
+++ b/apps/federatedfilesharing/l10n/sv.js
@@ -38,6 +38,7 @@ OC.L10N.register(
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Dela med mig genom mitt #Nextcloud Federerade Moln-ID, se %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Dela med mig genom mitt #Nextcloud Federerade Moln-ID",
"Sharing" : "Delar",
+ "Federated file sharing" : "Federerad fildelning",
"Federated Cloud Sharing" : "Federerad Moln-delning",
"Open documentation" : "Öppna dokumentation",
"Adjust how people can share between servers." : "Justera hur användare kan dela genom servrar.",
diff --git a/apps/federatedfilesharing/l10n/sv.json b/apps/federatedfilesharing/l10n/sv.json
index 2e64e36b1dc..61679494e33 100644
--- a/apps/federatedfilesharing/l10n/sv.json
+++ b/apps/federatedfilesharing/l10n/sv.json
@@ -36,6 +36,7 @@
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Dela med mig genom mitt #Nextcloud Federerade Moln-ID, se %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Dela med mig genom mitt #Nextcloud Federerade Moln-ID",
"Sharing" : "Delar",
+ "Federated file sharing" : "Federerad fildelning",
"Federated Cloud Sharing" : "Federerad Moln-delning",
"Open documentation" : "Öppna dokumentation",
"Adjust how people can share between servers." : "Justera hur användare kan dela genom servrar.",
diff --git a/apps/federation/appinfo/info.xml b/apps/federation/appinfo/info.xml
index c7fc2f2431a..e96c50479ae 100644
--- a/apps/federation/appinfo/info.xml
+++ b/apps/federation/appinfo/info.xml
@@ -1,30 +1,35 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>federation</id>
<name>Federation</name>
+ <summary>Federation allows you to connect with other trusted servers to exchange the user directory.</summary>
<description>Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing.</description>
- <licence>AGPL</licence>
- <author>Bjoern Schiessle</author>
<version>1.4.0</version>
+ <licence>agpl</licence>
+ <author>Bjoern Schiessle</author>
<namespace>Federation</namespace>
- <category>other</category>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<default_enable/>
+
<types>
<authentication/>
</types>
+ <category>social</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
<background-jobs>
<job>OCA\Federation\SyncJob</job>
</background-jobs>
- <settings>
- <admin>OCA\Federation\Settings\Admin</admin>
- </settings>
-
<commands>
<command>OCA\Federation\Command\SyncFederationAddressBooks</command>
</commands>
+
+ <settings>
+ <admin>OCA\Federation\Settings\Admin</admin>
+ </settings>
</info>
diff --git a/apps/federation/l10n/hu.js b/apps/federation/l10n/hu.js
index 3050ffe0e69..70a86b87b27 100644
--- a/apps/federation/l10n/hu.js
+++ b/apps/federation/l10n/hu.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Server is already in the list of trusted servers." : "A szerver már a megbízható szerverek közt van.",
"No server to federate with found" : "Nem található egyesíthető szerver",
"Could not add server" : "Nem lehet hozzáadni a szervert",
+ "Federation" : "Egyesítés",
"Trusted servers" : "Megbízható szerverek",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Az egyesítés lehetővé teszi a kapcsolódást más megbízható szerverekhez a felhasználói könyvtárak kicseréléséhez. Például ennek segítségével lesznek automatikusan kiegészítve a külső felhasználók az egyesített megosztáshoz.",
"Add server automatically once a federated share was created successfully" : "Szerver automatikus hozzáadása, ha az egyesített megosztás létrehozása sikeres",
diff --git a/apps/federation/l10n/hu.json b/apps/federation/l10n/hu.json
index 08db887b348..49c8d704a7f 100644
--- a/apps/federation/l10n/hu.json
+++ b/apps/federation/l10n/hu.json
@@ -3,6 +3,7 @@
"Server is already in the list of trusted servers." : "A szerver már a megbízható szerverek közt van.",
"No server to federate with found" : "Nem található egyesíthető szerver",
"Could not add server" : "Nem lehet hozzáadni a szervert",
+ "Federation" : "Egyesítés",
"Trusted servers" : "Megbízható szerverek",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Az egyesítés lehetővé teszi a kapcsolódást más megbízható szerverekhez a felhasználói könyvtárak kicseréléséhez. Például ennek segítségével lesznek automatikusan kiegészítve a külső felhasználók az egyesített megosztáshoz.",
"Add server automatically once a federated share was created successfully" : "Szerver automatikus hozzáadása, ha az egyesített megosztás létrehozása sikeres",
diff --git a/apps/federation/l10n/nl.js b/apps/federation/l10n/nl.js
index fa714a8c718..b85a8f00876 100644
--- a/apps/federation/l10n/nl.js
+++ b/apps/federation/l10n/nl.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Server is already in the list of trusted servers." : "Server bestaat reeds in de lijst van vertrouwde servers.",
"No server to federate with found" : "Geen server gevonden om mee te federeren",
"Could not add server" : "Kon server niet toevoegen",
+ "Federation" : "Federatie",
"Trusted servers" : "Vertrouwde servers",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federatie maakt het mogelijk om te verbinden met vertrouwde servers en de gebuikersadministratie te delen. Zo kun je automatisch externe gebruikers toevoegen voor federatief delen.",
"Add server automatically once a federated share was created successfully" : "Voeg server automatisch toe zodra een gefedereerde share succesvol gecreëerd is",
diff --git a/apps/federation/l10n/nl.json b/apps/federation/l10n/nl.json
index 9d22b153f72..31ab6dcee21 100644
--- a/apps/federation/l10n/nl.json
+++ b/apps/federation/l10n/nl.json
@@ -3,6 +3,7 @@
"Server is already in the list of trusted servers." : "Server bestaat reeds in de lijst van vertrouwde servers.",
"No server to federate with found" : "Geen server gevonden om mee te federeren",
"Could not add server" : "Kon server niet toevoegen",
+ "Federation" : "Federatie",
"Trusted servers" : "Vertrouwde servers",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federatie maakt het mogelijk om te verbinden met vertrouwde servers en de gebuikersadministratie te delen. Zo kun je automatisch externe gebruikers toevoegen voor federatief delen.",
"Add server automatically once a federated share was created successfully" : "Voeg server automatisch toe zodra een gefedereerde share succesvol gecreëerd is",
diff --git a/apps/federation/l10n/ru.js b/apps/federation/l10n/ru.js
index 52ffdc0af95..d465c97ddfa 100644
--- a/apps/federation/l10n/ru.js
+++ b/apps/federation/l10n/ru.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Server is already in the list of trusted servers." : "Сервер уже есть в списке доверенных серверов.",
"No server to federate with found" : "Сервер для объединения не найден",
"Could not add server" : "Не удалось добавить сервер",
+ "Federation" : "Федерация",
"Trusted servers" : "Доверенные серверы",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Федерация серверов позволит Вам подключиться к другим доверенным серверам для обмена каталогами пользователей. Это будет использовано, например, для автодополнения имён пользователей при открытии федеративного общего доступа.",
"Add server automatically once a federated share was created successfully" : "Добавить сервер автоматически после успешного создания федеративного ресурса общего доступа",
diff --git a/apps/federation/l10n/ru.json b/apps/federation/l10n/ru.json
index 2470668f1f9..fbb14ff083f 100644
--- a/apps/federation/l10n/ru.json
+++ b/apps/federation/l10n/ru.json
@@ -3,6 +3,7 @@
"Server is already in the list of trusted servers." : "Сервер уже есть в списке доверенных серверов.",
"No server to federate with found" : "Сервер для объединения не найден",
"Could not add server" : "Не удалось добавить сервер",
+ "Federation" : "Федерация",
"Trusted servers" : "Доверенные серверы",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Федерация серверов позволит Вам подключиться к другим доверенным серверам для обмена каталогами пользователей. Это будет использовано, например, для автодополнения имён пользователей при открытии федеративного общего доступа.",
"Add server automatically once a federated share was created successfully" : "Добавить сервер автоматически после успешного создания федеративного ресурса общего доступа",
diff --git a/apps/federation/l10n/sk.js b/apps/federation/l10n/sk.js
index 4b82f2c9b60..7a842a3961a 100644
--- a/apps/federation/l10n/sk.js
+++ b/apps/federation/l10n/sk.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Server is already in the list of trusted servers." : "Server sa už nachádza v zozname dôveryhodných serverov",
"No server to federate with found" : "Server pre združenie sa nenašiel",
"Could not add server" : "Nebolo možné pridať server",
+ "Federation" : "Združovanie",
"Trusted servers" : "Dôveryhodné servery",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Združovanie vám umožňuje sa pripojiť k iným dôveryhodným serverom za účelom výmeny adresára používateľov. Používa sa to napr. pre automatické doplňovanie používateľov pri združenom zdieľaní.",
"Add server automatically once a federated share was created successfully" : "Pridať server automaticky akonáhle je úspešne vytvorené združené zdieľanie",
diff --git a/apps/federation/l10n/sk.json b/apps/federation/l10n/sk.json
index 48e06ce374f..16da9ab4022 100644
--- a/apps/federation/l10n/sk.json
+++ b/apps/federation/l10n/sk.json
@@ -3,6 +3,7 @@
"Server is already in the list of trusted servers." : "Server sa už nachádza v zozname dôveryhodných serverov",
"No server to federate with found" : "Server pre združenie sa nenašiel",
"Could not add server" : "Nebolo možné pridať server",
+ "Federation" : "Združovanie",
"Trusted servers" : "Dôveryhodné servery",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Združovanie vám umožňuje sa pripojiť k iným dôveryhodným serverom za účelom výmeny adresára používateľov. Používa sa to napr. pre automatické doplňovanie používateľov pri združenom zdieľaní.",
"Add server automatically once a federated share was created successfully" : "Pridať server automaticky akonáhle je úspešne vytvorené združené zdieľanie",
diff --git a/apps/federation/l10n/sv.js b/apps/federation/l10n/sv.js
index 676df6798da..eba25bbd93f 100644
--- a/apps/federation/l10n/sv.js
+++ b/apps/federation/l10n/sv.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Server is already in the list of trusted servers." : "Servern finns redan i listan",
"No server to federate with found" : "Ingen server att federera med hittades",
"Could not add server" : "Kunde inte lägga till server",
+ "Federation" : "Federation",
"Trusted servers" : "Betrodda servrar",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federation låter dig ansluta till andra betrodda servrar för att utbyta användarinformation. Till exempel kommer detta användas för att auto-komplettera externa användare för federerad delning.",
"Add server automatically once a federated share was created successfully" : "Lägg till servern automatiskt så fort en lyckad federerad delning skapats",
diff --git a/apps/federation/l10n/sv.json b/apps/federation/l10n/sv.json
index 5e7379d9317..1f27bbe7303 100644
--- a/apps/federation/l10n/sv.json
+++ b/apps/federation/l10n/sv.json
@@ -3,6 +3,7 @@
"Server is already in the list of trusted servers." : "Servern finns redan i listan",
"No server to federate with found" : "Ingen server att federera med hittades",
"Could not add server" : "Kunde inte lägga till server",
+ "Federation" : "Federation",
"Trusted servers" : "Betrodda servrar",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federation låter dig ansluta till andra betrodda servrar för att utbyta användarinformation. Till exempel kommer detta användas för att auto-komplettera externa användare för federerad delning.",
"Add server automatically once a federated share was created successfully" : "Lägg till servern automatiskt så fort en lyckad federerad delning skapats",
diff --git a/apps/federation/lib/BackgroundJob/GetSharedSecret.php b/apps/federation/lib/BackgroundJob/GetSharedSecret.php
index 829e04ddb28..e5e30406f0d 100644
--- a/apps/federation/lib/BackgroundJob/GetSharedSecret.php
+++ b/apps/federation/lib/BackgroundJob/GetSharedSecret.php
@@ -31,7 +31,6 @@
namespace OCA\Federation\BackgroundJob;
use GuzzleHttp\Exception\ClientException;
-use GuzzleHttp\Exception\ConnectException;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Ring\Exception\RingException;
use OC\BackgroundJob\JobList;
diff --git a/apps/federation/lib/BackgroundJob/RequestSharedSecret.php b/apps/federation/lib/BackgroundJob/RequestSharedSecret.php
index ad7504da7ad..e165c24bdf2 100644
--- a/apps/federation/lib/BackgroundJob/RequestSharedSecret.php
+++ b/apps/federation/lib/BackgroundJob/RequestSharedSecret.php
@@ -32,7 +32,6 @@ namespace OCA\Federation\BackgroundJob;
use GuzzleHttp\Exception\ClientException;
-use GuzzleHttp\Exception\ConnectException;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Ring\Exception\RingException;
use OC\BackgroundJob\JobList;
diff --git a/apps/federation/lib/SyncJob.php b/apps/federation/lib/SyncJob.php
index 23255f2a441..258d0f2fc9c 100644
--- a/apps/federation/lib/SyncJob.php
+++ b/apps/federation/lib/SyncJob.php
@@ -24,7 +24,6 @@
namespace OCA\Federation;
use OC\BackgroundJob\TimedJob;
-use OCA\Federation\AppInfo\Application;
use OCP\ILogger;
class SyncJob extends TimedJob {
diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml
index 1faf2c80adc..f5b43070cee 100644
--- a/apps/files/appinfo/info.xml
+++ b/apps/files/appinfo/info.xml
@@ -1,22 +1,43 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>files</id>
<name>Files</name>
+ <summary>File Management</summary>
<description>File Management</description>
- <licence>AGPL</licence>
+ <version>1.9.0</version>
+ <licence>agpl</licence>
<author>Robin Appelman</author>
<author>Vincent Petry</author>
<default_enable/>
- <version>1.9.0</version>
<types>
<filesystem/>
</types>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<documentation>
<user>user-files</user>
</documentation>
+ <category>files</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
+
+ <background-jobs>
+ <job>OCA\Files\BackgroundJob\ScanFiles</job>
+ <job>OCA\Files\BackgroundJob\DeleteOrphanedItems</job>
+ <job>OCA\Files\BackgroundJob\CleanupFileLocks</job>
+ </background-jobs>
+
+ <commands>
+ <command>OCA\Files\Command\Scan</command>
+ <command>OCA\Files\Command\DeleteOrphanedFiles</command>
+ <command>OCA\Files\Command\TransferOwnership</command>
+ <command>OCA\Files\Command\ScanAppData</command>
+ </commands>
+
+ <settings>
+ <admin>OCA\Files\Settings\Admin</admin>
+ </settings>
<activity>
<settings>
@@ -39,23 +60,6 @@
</providers>
</activity>
- <background-jobs>
- <job>OCA\Files\BackgroundJob\ScanFiles</job>
- <job>OCA\Files\BackgroundJob\DeleteOrphanedItems</job>
- <job>OCA\Files\BackgroundJob\CleanupFileLocks</job>
- </background-jobs>
-
- <settings>
- <admin>OCA\Files\Settings\Admin</admin>
- </settings>
-
- <commands>
- <command>OCA\Files\Command\Scan</command>
- <command>OCA\Files\Command\DeleteOrphanedFiles</command>
- <command>OCA\Files\Command\TransferOwnership</command>
- <command>OCA\Files\Command\ScanAppData</command>
- </commands>
-
<navigations>
<navigation>
<name>Files</name>
diff --git a/apps/files/download.php b/apps/files/download.php
index 60f386f50f0..2389c9b535e 100644
--- a/apps/files/download.php
+++ b/apps/files/download.php
@@ -41,7 +41,9 @@ $ftype=\OC::$server->getMimeTypeDetector()->getSecureMimeType(\OC\Files\Filesyst
header('Content-Type:'.$ftype);
OCP\Response::setContentDispositionHeader(basename($filename), 'attachment');
-OCP\Response::disableCaching();
+header('Pragma: public');// enable caching in IE
+header('Expires: 0');
+header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
OCP\Response::setContentLengthHeader(\OC\Files\Filesystem::filesize($filename));
OC_Util::obEnd();
diff --git a/apps/files/img/change.png b/apps/files/img/change.png
index 9f64e60d565..ca77a8844f6 100644
--- a/apps/files/img/change.png
+++ b/apps/files/img/change.png
Binary files differ
diff --git a/apps/files/img/change.svg b/apps/files/img/change.svg
index b3404d2ef84..12071422b7f 100644
--- a/apps/files/img/change.svg
+++ b/apps/files/img/change.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1"><path d="m8 0c-2.8557-3.771e-8 -5.4999 1.5269-6.9277 4l2.5976 1.5c0.8944-1.5491 2.5413-2.5 4.3301-2.5 1.5874 0 3.0628 0.74877 4 2l-2 2h6v-6l-1.875 1.875c-1.505-1.797-3.736-2.875-6.125-2.875z"/><path d="m0 9v6l1.877-1.877c1.4882 1.778 3.7559 2.857 6.123 2.877 2.8797 0.02436 5.4878-1.506 6.9277-4l-2.598-1.5c-0.902 1.562-2.5261 2.515-4.33 2.5-1.5737-0.013-3.0729-0.762-4-2l2-2z"/></svg>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" version="1.1" height="16"><path d="m8 2c-2.142 0-4.125 1.145-5.196 3l1.948 1.125c0.671-1.162 1.906-1.875 3.2476-1.875 1.1906 0 2.297 0.56157 3 1.5l-1.5 1.5h4.5v-4.5l-1.406 1.406c-1.129-1.348-2.802-2.1563-4.594-2.1563z"/><path d="m2 8.75v4.5l1.408-1.41c1.116 1.334 2.817 2.145 4.592 2.16 2.16 0.01827 4.116-1.132 5.196-3.002l-1.948-1.125c-0.677 1.171-1.9005 1.886-3.248 1.875-1.18-0.01-2.3047-0.572-3-1.5l1.5-1.5z"/></svg>
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
index 2fb7dfba29f..a6d376aa2a9 100644
--- a/apps/files/js/fileactions.js
+++ b/apps/files/js/fileactions.js
@@ -625,12 +625,23 @@
this.registerAction({
name: 'MoveCopy',
- displayName: t('files', 'Move or copy'),
+ displayName: function(context) {
+ var permissions = context.fileInfoModel.attributes.permissions;
+ if (permissions & OC.PERMISSION_UPDATE) {
+ return t('files', 'Move or copy');
+ }
+ return t('files', 'Copy');
+ },
mime: 'all',
order: -25,
- permissions: OC.PERMISSION_UPDATE,
+ permissions: $('#isPublic').val() ? OC.PERMISSION_UPDATE : OC.PERMISSION_READ,
iconClass: 'icon-external',
actionHandler: function (filename, context) {
+ var permissions = context.fileInfoModel.attributes.permissions;
+ var actions = OC.dialogs.FILEPICKER_TYPE_COPY;
+ if (permissions & OC.PERMISSION_UPDATE) {
+ actions = OC.dialogs.FILEPICKER_TYPE_COPY_MOVE;
+ }
OC.dialogs.filepicker(t('files', 'Target folder'), function(targetPath, type) {
if (type === OC.dialogs.FILEPICKER_TYPE_COPY) {
context.fileList.copy(filename, targetPath);
@@ -638,7 +649,7 @@
if (type === OC.dialogs.FILEPICKER_TYPE_MOVE) {
context.fileList.move(filename, targetPath);
}
- }, false, "httpd/unix-directory", true, OC.dialogs.FILEPICKER_TYPE_COPY_MOVE);
+ }, false, "httpd/unix-directory", true, actions);
}
});
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index b46db792678..4dc8a58e175 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -798,6 +798,7 @@
OCA.Files.FileActions.updateFileActionSpinner(moveFileAction, false);
};
+ var actions = this.isSelectedMovable() ? OC.dialogs.FILEPICKER_TYPE_COPY_MOVE : OC.dialogs.FILEPICKER_TYPE_COPY;
OC.dialogs.filepicker(t('files', 'Target folder'), function(targetPath, type) {
if (type === OC.dialogs.FILEPICKER_TYPE_COPY) {
self.copy(files, targetPath, disableLoadingState);
@@ -805,7 +806,7 @@
if (type === OC.dialogs.FILEPICKER_TYPE_MOVE) {
self.move(files, targetPath, disableLoadingState);
}
- }, false, "httpd/unix-directory", true, OC.dialogs.FILEPICKER_TYPE_COPY_MOVE);
+ }, false, "httpd/unix-directory", true, actions);
return false;
},
@@ -2871,18 +2872,39 @@
this.$el.find('#headerName a.name>span:first').text(selection);
this.$el.find('#modified a>span:first').text('');
this.$el.find('table').addClass('multiselect');
- this.$el.find('.selectedActions .copy-move').toggleClass('hidden', !this.isSelectedCopiableOrMovable());
this.$el.find('.selectedActions .download').toggleClass('hidden', !this.isSelectedDownloadable());
this.$el.find('.delete-selected').toggleClass('hidden', !this.isSelectedDeletable());
+
+ var $copyMove = this.$el.find('.selectedActions .copy-move');
+ if (this.isSelectedCopiable()) {
+ $copyMove.toggleClass('hidden', false);
+ if (this.isSelectedMovable()) {
+ $copyMove.find('.label').text(t('files', 'Move or copy'));
+ } else {
+ $copyMove.find('.label').text(t('files', 'Copy'));
+ }
+ } else {
+ $copyMove.toggleClass('hidden', true);
+ }
}
},
/**
- * Check whether all selected files are copiable or movable
+ * Check whether all selected files are copiable
+ */
+ isSelectedCopiable: function() {
+ return _.reduce(this.getSelectedFiles(), function(copiable, file) {
+ var requiredPermission = $('#isPublic').val() ? OC.PERMISSION_UPDATE : OC.PERMISSION_READ;
+ return copiable && (file.permissions & requiredPermission);
+ }, true);
+ },
+
+ /**
+ * Check whether all selected files are movable
*/
- isSelectedCopiableOrMovable: function() {
- return _.reduce(this.getSelectedFiles(), function(copiableOrMovable, file) {
- return copiableOrMovable && (file.permissions & OC.PERMISSION_UPDATE);
+ isSelectedMovable: function() {
+ return _.reduce(this.getSelectedFiles(), function(movable, file) {
+ return movable && (file.permissions & OC.PERMISSION_UPDATE);
}, true);
},
diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js
index d83d2ee3c95..ec3708417d8 100644
--- a/apps/files/l10n/es.js
+++ b/apps/files/l10n/es.js
@@ -1,8 +1,8 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente",
- "Storage invalid" : "Almacenamiento inválido",
+ "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente",
+ "Storage invalid" : "Almacenamiento no válido",
"Unknown error" : "Error desconocido",
"All files" : "Todos los archivos",
"Recent" : "Reciente",
diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json
index 212da33a515..f7982515bab 100644
--- a/apps/files/l10n/es.json
+++ b/apps/files/l10n/es.json
@@ -1,6 +1,6 @@
{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente",
- "Storage invalid" : "Almacenamiento inválido",
+ "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente",
+ "Storage invalid" : "Almacenamiento no válido",
"Unknown error" : "Error desconocido",
"All files" : "Todos los archivos",
"Recent" : "Reciente",
diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js
index 7629e273784..e7e754f5ead 100644
--- a/apps/files/l10n/ja.js
+++ b/apps/files/l10n/ja.js
@@ -16,7 +16,10 @@ OC.L10N.register(
"Not enough free space, you are uploading {size1} but only {size2} is left" : "空き容量が十分でなく、 {size1} をアップロードしていますが、 {size2} しか残っていません。",
"Target folder \"{dir}\" does not exist any more" : "対象フォルダー \"{dir}\" がもう存在しません",
"Not enough free space" : "十分な空き容量がありません",
+ "Uploading …" : "アップロード中...",
+ "…" : "…",
"{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中 {loadedSize} ({bitrate})",
+ "Target folder does not exist any more" : "対象フォルダーがもう存在しません",
"Actions" : "アクション",
"Download" : "ダウンロード",
"Rename" : "名前の変更",
@@ -56,8 +59,11 @@ OC.L10N.register(
"You don’t have permission to upload or create files here" : "ここにファイルをアップロードもしくは作成する権限がありません",
"_Uploading %n file_::_Uploading %n files_" : ["%n 個のファイルをアップロード中"],
"New" : "新規作成",
+ "{used} of {quota} used" : "{used} / {quota} 使用中",
+ "{used} used" : "{used} 使用中",
"\"{name}\" is an invalid file name." : "\"{name}\" は無効なファイル名です。",
"File name cannot be empty." : "ファイル名を空にすることはできません。",
+ "\"/\" is not allowed inside a file name." : "\"/\" はファイル名に利用できません。",
"\"{name}\" is not an allowed filetype" : "\"{name}\" は無効なファイル形式です",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} のストレージは一杯です。ファイルの更新と同期はもうできません!",
"Your storage is full, files can not be updated or synced anymore!" : "あなたのストレージは一杯です。ファイルの更新と同期はもうできません!",
@@ -73,6 +79,9 @@ OC.L10N.register(
"Favorite" : "お気に入り",
"New folder" : "新しいフォルダー",
"Upload file" : "ファイルをアップロード",
+ "Not favorited" : "お気に入りではありません",
+ "Remove from favorites" : "お気に入りから削除",
+ "Add to favorites" : "お気に入りに追加",
"An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました",
"Added to favorites" : "お気に入りに追加",
"Removed from favorites" : "お気に入りから削除",
@@ -118,6 +127,8 @@ OC.L10N.register(
"Settings" : "設定",
"Show hidden files" : "隠しファイルを表示",
"WebDAV" : "WebDAV",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">WebDAV 経由でファイルにアクセス</a>するにはこのアドレスを利用してください",
+ "Cancel upload" : "アップロードをキャンセル",
"No files in here" : "ファイルがありません",
"Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。",
"No entries found in this folder" : "このフォルダーにはエントリーがありません",
@@ -132,6 +143,7 @@ OC.L10N.register(
"Tags" : "タグ",
"Deleted files" : "ゴミ箱",
"Text file" : "テキストファイル",
- "New text file.txt" : "新規のテキストファイル作成"
+ "New text file.txt" : "新規のテキストファイル作成",
+ "Move" : "移動"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json
index 1af3dbeb40b..a643d750f1c 100644
--- a/apps/files/l10n/ja.json
+++ b/apps/files/l10n/ja.json
@@ -14,7 +14,10 @@
"Not enough free space, you are uploading {size1} but only {size2} is left" : "空き容量が十分でなく、 {size1} をアップロードしていますが、 {size2} しか残っていません。",
"Target folder \"{dir}\" does not exist any more" : "対象フォルダー \"{dir}\" がもう存在しません",
"Not enough free space" : "十分な空き容量がありません",
+ "Uploading …" : "アップロード中...",
+ "…" : "…",
"{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中 {loadedSize} ({bitrate})",
+ "Target folder does not exist any more" : "対象フォルダーがもう存在しません",
"Actions" : "アクション",
"Download" : "ダウンロード",
"Rename" : "名前の変更",
@@ -54,8 +57,11 @@
"You don’t have permission to upload or create files here" : "ここにファイルをアップロードもしくは作成する権限がありません",
"_Uploading %n file_::_Uploading %n files_" : ["%n 個のファイルをアップロード中"],
"New" : "新規作成",
+ "{used} of {quota} used" : "{used} / {quota} 使用中",
+ "{used} used" : "{used} 使用中",
"\"{name}\" is an invalid file name." : "\"{name}\" は無効なファイル名です。",
"File name cannot be empty." : "ファイル名を空にすることはできません。",
+ "\"/\" is not allowed inside a file name." : "\"/\" はファイル名に利用できません。",
"\"{name}\" is not an allowed filetype" : "\"{name}\" は無効なファイル形式です",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} のストレージは一杯です。ファイルの更新と同期はもうできません!",
"Your storage is full, files can not be updated or synced anymore!" : "あなたのストレージは一杯です。ファイルの更新と同期はもうできません!",
@@ -71,6 +77,9 @@
"Favorite" : "お気に入り",
"New folder" : "新しいフォルダー",
"Upload file" : "ファイルをアップロード",
+ "Not favorited" : "お気に入りではありません",
+ "Remove from favorites" : "お気に入りから削除",
+ "Add to favorites" : "お気に入りに追加",
"An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました",
"Added to favorites" : "お気に入りに追加",
"Removed from favorites" : "お気に入りから削除",
@@ -116,6 +125,8 @@
"Settings" : "設定",
"Show hidden files" : "隠しファイルを表示",
"WebDAV" : "WebDAV",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">WebDAV 経由でファイルにアクセス</a>するにはこのアドレスを利用してください",
+ "Cancel upload" : "アップロードをキャンセル",
"No files in here" : "ファイルがありません",
"Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。",
"No entries found in this folder" : "このフォルダーにはエントリーがありません",
@@ -130,6 +141,7 @@
"Tags" : "タグ",
"Deleted files" : "ゴミ箱",
"Text file" : "テキストファイル",
- "New text file.txt" : "新規のテキストファイル作成"
+ "New text file.txt" : "新規のテキストファイル作成",
+ "Move" : "移動"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js
index e3e69bb3a84..a30e7272c5d 100644
--- a/apps/files/l10n/lt_LT.js
+++ b/apps/files/l10n/lt_LT.js
@@ -54,6 +54,7 @@ OC.L10N.register(
"You don’t have permission to upload or create files here" : "Jūs neturite leidimo čia įkelti arba kurti failus",
"_Uploading %n file_::_Uploading %n files_" : ["Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų"],
"New" : "Naujas",
+ "{used} of {quota} used" : "panaudota {used} iš {quota}",
"\"{name}\" is an invalid file name." : "„{name}“ yra netinkamas bylos pavadinimas.",
"File name cannot be empty." : "Failo pavadinimas negali būti tuščias.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" nėra leidžiamas failo tipas",
diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json
index 6bb6ff51681..78aec5fd463 100644
--- a/apps/files/l10n/lt_LT.json
+++ b/apps/files/l10n/lt_LT.json
@@ -52,6 +52,7 @@
"You don’t have permission to upload or create files here" : "Jūs neturite leidimo čia įkelti arba kurti failus",
"_Uploading %n file_::_Uploading %n files_" : ["Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų"],
"New" : "Naujas",
+ "{used} of {quota} used" : "panaudota {used} iš {quota}",
"\"{name}\" is an invalid file name." : "„{name}“ yra netinkamas bylos pavadinimas.",
"File name cannot be empty." : "Failo pavadinimas negali būti tuščias.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" nėra leidžiamas failo tipas",
diff --git a/apps/files/l10n/lv.js b/apps/files/l10n/lv.js
index 7c15a6bf95d..616c39fff8b 100644
--- a/apps/files/l10n/lv.js
+++ b/apps/files/l10n/lv.js
@@ -24,7 +24,7 @@ OC.L10N.register(
"Delete" : "Dzēst",
"Disconnect storage" : "Atvienot glabātuvi",
"Unshare" : "Pārtraukt koplietošanu",
- "Could not load info for file \"{file}\"" : "Nevar ielādēt informāciju par failu \"{file}\"",
+ "Could not load info for file \"{file}\"" : "Nevar ielādēt informāciju par datni \"{file}\"",
"Files" : "Datnes",
"Details" : "Detaļas",
"Select" : "Norādīt",
diff --git a/apps/files/l10n/lv.json b/apps/files/l10n/lv.json
index ed2b04ac59d..cc8ecb6bb0d 100644
--- a/apps/files/l10n/lv.json
+++ b/apps/files/l10n/lv.json
@@ -22,7 +22,7 @@
"Delete" : "Dzēst",
"Disconnect storage" : "Atvienot glabātuvi",
"Unshare" : "Pārtraukt koplietošanu",
- "Could not load info for file \"{file}\"" : "Nevar ielādēt informāciju par failu \"{file}\"",
+ "Could not load info for file \"{file}\"" : "Nevar ielādēt informāciju par datni \"{file}\"",
"Files" : "Datnes",
"Details" : "Detaļas",
"Select" : "Norādīt",
diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js
index aacae19af41..6adfb86aee1 100644
--- a/apps/files/l10n/nl.js
+++ b/apps/files/l10n/nl.js
@@ -147,6 +147,9 @@ OC.L10N.register(
"Deleted files" : "Verwijderde bestanden",
"Text file" : "Tekstbestand",
"New text file.txt" : "Nieuw tekstbestand.txt",
- "Move" : "Verplaatsen"
+ "Move" : "Verplaatsen",
+ "A new file or folder has been <strong>deleted</strong>" : "Een nieuw bestand of nieuwe map is <strong>verwijderd</strong>",
+ "A new file or folder has been <strong>restored</strong>" : "Een nieuw bestand of een nieuwe map is <strong>hersteld</strong>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Gebruik deze link om je <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">bestanden via WebDAV te benaderen</a>"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json
index de059f16f08..ca422e8d07b 100644
--- a/apps/files/l10n/nl.json
+++ b/apps/files/l10n/nl.json
@@ -145,6 +145,9 @@
"Deleted files" : "Verwijderde bestanden",
"Text file" : "Tekstbestand",
"New text file.txt" : "Nieuw tekstbestand.txt",
- "Move" : "Verplaatsen"
+ "Move" : "Verplaatsen",
+ "A new file or folder has been <strong>deleted</strong>" : "Een nieuw bestand of nieuwe map is <strong>verwijderd</strong>",
+ "A new file or folder has been <strong>restored</strong>" : "Een nieuw bestand of een nieuwe map is <strong>hersteld</strong>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Gebruik deze link om je <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">bestanden via WebDAV te benaderen</a>"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/pt_PT.js b/apps/files/l10n/pt_PT.js
index feb43aced76..ffa95f4b93c 100644
--- a/apps/files/l10n/pt_PT.js
+++ b/apps/files/l10n/pt_PT.js
@@ -17,8 +17,10 @@ OC.L10N.register(
"Target folder \"{dir}\" does not exist any more" : "A pasta de destino \"{dir}\" já não existe",
"Not enough free space" : "Espaço insuficiente",
"Uploading …" : "A carregar ...",
+ "…" : "...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"Target folder does not exist any more" : "A pasta de destino já não existe",
+ "Error when assembling chunks, status code {status}" : "Erro ao agregar partições, código de estado: {estado}",
"Actions" : "Ações",
"Download" : "Transferir",
"Rename" : "Renomear",
diff --git a/apps/files/l10n/pt_PT.json b/apps/files/l10n/pt_PT.json
index 97d4308cab4..31ecc0ef67d 100644
--- a/apps/files/l10n/pt_PT.json
+++ b/apps/files/l10n/pt_PT.json
@@ -15,8 +15,10 @@
"Target folder \"{dir}\" does not exist any more" : "A pasta de destino \"{dir}\" já não existe",
"Not enough free space" : "Espaço insuficiente",
"Uploading …" : "A carregar ...",
+ "…" : "...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"Target folder does not exist any more" : "A pasta de destino já não existe",
+ "Error when assembling chunks, status code {status}" : "Erro ao agregar partições, código de estado: {estado}",
"Actions" : "Ações",
"Download" : "Transferir",
"Rename" : "Renomear",
diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js
index d4bce72110e..5f4912587b7 100644
--- a/apps/files/l10n/ru.js
+++ b/apps/files/l10n/ru.js
@@ -81,7 +81,7 @@ OC.L10N.register(
"Favorited" : "Избранное",
"Favorite" : "Добавить в избранное",
"New folder" : "Новый каталог",
- "Upload file" : "Зарузить файл",
+ "Upload file" : "Загрузить файл",
"Not favorited" : "Не избранное",
"Remove from favorites" : "Удалить из избранных",
"Add to favorites" : "Добавить в избранное",
diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json
index 705a2a75c7c..65cc92c052e 100644
--- a/apps/files/l10n/ru.json
+++ b/apps/files/l10n/ru.json
@@ -79,7 +79,7 @@
"Favorited" : "Избранное",
"Favorite" : "Добавить в избранное",
"New folder" : "Новый каталог",
- "Upload file" : "Зарузить файл",
+ "Upload file" : "Загрузить файл",
"Not favorited" : "Не избранное",
"Remove from favorites" : "Удалить из избранных",
"Add to favorites" : "Добавить в избранное",
diff --git a/apps/files/l10n/sk.js b/apps/files/l10n/sk.js
index 89da1860307..c609ee92197 100644
--- a/apps/files/l10n/sk.js
+++ b/apps/files/l10n/sk.js
@@ -20,6 +20,7 @@ OC.L10N.register(
"…" : "...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
"Target folder does not exist any more" : "Cieľový priečinok už neexistuje",
+ "Error when assembling chunks, status code {status}" : "Chyba pri zostavovaní kusov, kód chyby {status}",
"Actions" : "Akcie",
"Download" : "Sťahovanie",
"Rename" : "Premenovať",
@@ -65,6 +66,7 @@ OC.L10N.register(
"{used} used" : "{used} použitých",
"\"{name}\" is an invalid file name." : "\"{name}\" je neplatné meno súboru.",
"File name cannot be empty." : "Meno súboru nemôže byť prázdne",
+ "\"/\" is not allowed inside a file name." : "Znak \"/\" nie je povolený v názve súboru.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" nie je povolený typ súboru",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "Úložisko používateľa {owner} je plné, súbory sa viac nedajú aktualizovať ani synchronizovať.",
"Your storage is full, files can not be updated or synced anymore!" : "Vaše úložisko je plné. Súbory nemožno aktualizovať ani synchronizovať!",
@@ -144,6 +146,10 @@ OC.L10N.register(
"Tags" : "Štítky",
"Deleted files" : "Zmazané súbory",
"Text file" : "Textový súbor",
- "New text file.txt" : "Nový text file.txt"
+ "New text file.txt" : "Nový text file.txt",
+ "Move" : "Presunúť",
+ "A new file or folder has been <strong>deleted</strong>" : "Nový súbor alebo priečinok bol <strong>zmazaný</strong>",
+ "A new file or folder has been <strong>restored</strong>" : "Nový súbor alebo priečinok bol<strong>obnovený</strong>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Použi túto adresu pre <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">prístup ku svojím súborom cez WebDAV</a>"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/files/l10n/sk.json b/apps/files/l10n/sk.json
index 7e764476c8b..59d387b91b1 100644
--- a/apps/files/l10n/sk.json
+++ b/apps/files/l10n/sk.json
@@ -18,6 +18,7 @@
"…" : "...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
"Target folder does not exist any more" : "Cieľový priečinok už neexistuje",
+ "Error when assembling chunks, status code {status}" : "Chyba pri zostavovaní kusov, kód chyby {status}",
"Actions" : "Akcie",
"Download" : "Sťahovanie",
"Rename" : "Premenovať",
@@ -63,6 +64,7 @@
"{used} used" : "{used} použitých",
"\"{name}\" is an invalid file name." : "\"{name}\" je neplatné meno súboru.",
"File name cannot be empty." : "Meno súboru nemôže byť prázdne",
+ "\"/\" is not allowed inside a file name." : "Znak \"/\" nie je povolený v názve súboru.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" nie je povolený typ súboru",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "Úložisko používateľa {owner} je plné, súbory sa viac nedajú aktualizovať ani synchronizovať.",
"Your storage is full, files can not be updated or synced anymore!" : "Vaše úložisko je plné. Súbory nemožno aktualizovať ani synchronizovať!",
@@ -142,6 +144,10 @@
"Tags" : "Štítky",
"Deleted files" : "Zmazané súbory",
"Text file" : "Textový súbor",
- "New text file.txt" : "Nový text file.txt"
+ "New text file.txt" : "Nový text file.txt",
+ "Move" : "Presunúť",
+ "A new file or folder has been <strong>deleted</strong>" : "Nový súbor alebo priečinok bol <strong>zmazaný</strong>",
+ "A new file or folder has been <strong>restored</strong>" : "Nový súbor alebo priečinok bol<strong>obnovený</strong>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Použi túto adresu pre <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">prístup ku svojím súborom cez WebDAV</a>"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js
index 8bfc3c23027..c893216a3bf 100644
--- a/apps/files/l10n/sv.js
+++ b/apps/files/l10n/sv.js
@@ -62,8 +62,11 @@ OC.L10N.register(
"You don’t have permission to upload or create files here" : "Du har ej tillåtelse att ladda upp eller skapa filer här",
"_Uploading %n file_::_Uploading %n files_" : ["Laddar upp %n fil","Laddar upp %n filer"],
"New" : "Ny",
+ "{used} of {quota} used" : "{used} av {quota} använt",
+ "{used} used" : "{used} använt",
"\"{name}\" is an invalid file name." : "\"{name}\" är ett ogiltigt filnamn.",
"File name cannot be empty." : "Filnamn kan inte vara tomt.",
+ "\"/\" is not allowed inside a file name." : "\"/\" är inte tillåtet i ett filnamn.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" är inte en tillåten filtyp",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "Lagring av {owner} är full, filer kan inte uppdateras eller synkroniseras längre!",
"Your storage is full, files can not be updated or synced anymore!" : "Ditt lagringsutrymme är fullt, filer kan inte längre uppdateras eller synkroniseras!",
diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json
index a33455084d9..24586c07bbf 100644
--- a/apps/files/l10n/sv.json
+++ b/apps/files/l10n/sv.json
@@ -60,8 +60,11 @@
"You don’t have permission to upload or create files here" : "Du har ej tillåtelse att ladda upp eller skapa filer här",
"_Uploading %n file_::_Uploading %n files_" : ["Laddar upp %n fil","Laddar upp %n filer"],
"New" : "Ny",
+ "{used} of {quota} used" : "{used} av {quota} använt",
+ "{used} used" : "{used} använt",
"\"{name}\" is an invalid file name." : "\"{name}\" är ett ogiltigt filnamn.",
"File name cannot be empty." : "Filnamn kan inte vara tomt.",
+ "\"/\" is not allowed inside a file name." : "\"/\" är inte tillåtet i ett filnamn.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" är inte en tillåten filtyp",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "Lagring av {owner} är full, filer kan inte uppdateras eller synkroniseras längre!",
"Your storage is full, files can not be updated or synced anymore!" : "Ditt lagringsutrymme är fullt, filer kan inte längre uppdateras eller synkroniseras!",
diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js
index 66766641618..f1e0d376991 100644
--- a/apps/files/l10n/zh_CN.js
+++ b/apps/files/l10n/zh_CN.js
@@ -17,7 +17,7 @@ OC.L10N.register(
"Target folder \"{dir}\" does not exist any more" : "目标目录 \"{dir}\" 不存在",
"Not enough free space" : "可用空间不足",
"Uploading …" : "上传中…",
- "…" : "undefined",
+ "…" : "…",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
"Target folder does not exist any more" : "目标文件夹不存在",
"Actions" : "操作",
@@ -124,7 +124,7 @@ OC.L10N.register(
"Save" : "保存",
"With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效.",
"Missing permissions to edit from here." : "没有权限编辑",
- "%s of %s used" : " %s 的%s 已使用",
+ "%s of %s used" : "%s 已使用 (共 %s)",
"%s used" : "%s 已使用",
"Settings" : "设置",
"Show hidden files" : "显示隐藏文件",
@@ -144,6 +144,7 @@ OC.L10N.register(
"Tags" : "标签",
"Deleted files" : "已删除的文件",
"Text file" : "文本文件",
- "New text file.txt" : "创建文本文件 .txt"
+ "New text file.txt" : "新建文本文件.txt",
+ "Move" : "移动"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json
index 17f074d5faf..f2396a979ec 100644
--- a/apps/files/l10n/zh_CN.json
+++ b/apps/files/l10n/zh_CN.json
@@ -15,7 +15,7 @@
"Target folder \"{dir}\" does not exist any more" : "目标目录 \"{dir}\" 不存在",
"Not enough free space" : "可用空间不足",
"Uploading …" : "上传中…",
- "…" : "undefined",
+ "…" : "…",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
"Target folder does not exist any more" : "目标文件夹不存在",
"Actions" : "操作",
@@ -122,7 +122,7 @@
"Save" : "保存",
"With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效.",
"Missing permissions to edit from here." : "没有权限编辑",
- "%s of %s used" : " %s 的%s 已使用",
+ "%s of %s used" : "%s 已使用 (共 %s)",
"%s used" : "%s 已使用",
"Settings" : "设置",
"Show hidden files" : "显示隐藏文件",
@@ -142,6 +142,7 @@
"Tags" : "标签",
"Deleted files" : "已删除的文件",
"Text file" : "文本文件",
- "New text file.txt" : "创建文本文件 .txt"
+ "New text file.txt" : "新建文本文件.txt",
+ "Move" : "移动"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/templates/list.php b/apps/files/templates/list.php
index fd5423c334f..e6b1e54d389 100644
--- a/apps/files/templates/list.php
+++ b/apps/files/templates/list.php
@@ -53,7 +53,7 @@
<span id="selectedActionsList" class="selectedActions">
<a href="" class="copy-move">
<span class="icon icon-external"></span>
- <span><?php p($l->t('Move or copy'))?></span>
+ <span class="label"><?php p($l->t('Move or copy'))?></span>
</a>
<a href="" class="download">
<span class="icon icon-download"></span>
diff --git a/apps/files/tests/js/fileactionsmenuSpec.js b/apps/files/tests/js/fileactionsmenuSpec.js
index 926516b3043..c678d166153 100644
--- a/apps/files/tests/js/fileactionsmenuSpec.js
+++ b/apps/files/tests/js/fileactionsmenuSpec.js
@@ -271,6 +271,7 @@ describe('OCA.Files.FileActionsMenu tests', function() {
$file: $tr,
fileList: fileList,
fileActions: fileActions,
+ fileInfoModel: new OCA.Files.FileInfoModel(fileData),
dir: fileList.getCurrentDirectory()
};
menu = new OCA.Files.FileActionsMenu();
@@ -304,6 +305,7 @@ describe('OCA.Files.FileActionsMenu tests', function() {
$file: $tr,
fileList: fileList,
fileActions: fileActions,
+ fileInfoModel: new OCA.Files.FileInfoModel(fileData),
dir: '/anotherpath/there'
};
menu = new OCA.Files.FileActionsMenu();
@@ -336,6 +338,7 @@ describe('OCA.Files.FileActionsMenu tests', function() {
$file: $tr,
fileList: fileList,
fileActions: fileActions,
+ fileInfoModel: new OCA.Files.FileInfoModel(fileData),
dir: '/somepath/dir'
};
menu = new OCA.Files.FileActionsMenu();
diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js
index 08da15b8a88..1b26a468172 100644
--- a/apps/files/tests/js/filelistSpec.js
+++ b/apps/files/tests/js/filelistSpec.js
@@ -94,7 +94,7 @@ describe('OCA.Files.FileList tests', function() {
'<input type="checkbox" id="select_all_files" class="select-all checkbox">' +
'<a class="name columntitle" data-sort="name"><span>Name</span><span class="sort-indicator"></span></a>' +
'<span id="selectedActionsList" class="selectedActions hidden">' +
- '<a href class="copy-move">Move or copy</a>' +
+ '<a href class="copy-move"><span class="label">Move or copy</span></a>' +
'<a href class="download"><img src="actions/download.svg">Download</a>' +
'<a href class="delete-selected">Delete</a></span>' +
'</th>' +
@@ -2101,10 +2101,17 @@ describe('OCA.Files.FileList tests', function() {
$('#permissions').val(OC.PERMISSION_READ | OC.PERMISSION_UPDATE);
$('.select-all').click();
expect(fileList.$el.find('.selectedActions .copy-move').hasClass('hidden')).toEqual(false);
+ expect(fileList.$el.find('.selectedActions .copy-move .label').text()).toEqual('Move or copy');
testFiles[0].permissions = OC.PERMISSION_READ;
$('.select-all').click();
fileList.setFiles(testFiles);
$('.select-all').click();
+ expect(fileList.$el.find('.selectedActions .copy-move').hasClass('hidden')).toEqual(false);
+ expect(fileList.$el.find('.selectedActions .copy-move .label').text()).toEqual('Copy');
+ testFiles[0].permissions = OC.PERMISSION_NONE;
+ $('.select-all').click();
+ fileList.setFiles(testFiles);
+ $('.select-all').click();
expect(fileList.$el.find('.selectedActions .copy-move').hasClass('hidden')).toEqual(true);
});
it('show doesnt show the download action if one or more files are not downloadable', function () {
diff --git a/apps/files_external/appinfo/info.xml b/apps/files_external/appinfo/info.xml
index a924c32ba25..795c63a60f0 100644
--- a/apps/files_external/appinfo/info.xml
+++ b/apps/files_external/appinfo/info.xml
@@ -1,38 +1,36 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>files_external</id>
<name>External storage support</name>
+ <summary>Adds basic external storage support</summary>
<description>
This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, other Nextcloud servers, WebDAV servers, and more. Administrators can choose which types of storage to enable and can mount these storage locations for a user, a group, or the entire system. Users will see a new folder appear in their root Nextcloud directory, which they can access and use like any other Nextcloud folder. External storage also allows users to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.
External storage can be configured using the GUI or at the command line. This second option provides the advanced user with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation.
</description>
- <licence>AGPL</licence>
+ <version>1.5.0</version>
+ <licence>agpl</licence>
<author>Robin Appelman</author>
<author>Michael Gapczynski</author>
<author>Vincent Petry</author>
- <documentation>
- <admin>admin-external-storage</admin>
- </documentation>
- <version>1.5.0</version>
+ <namespace>Files_External</namespace>
+
<types>
<filesystem/>
</types>
- <ocsid>166048</ocsid>
- <namespace>Files_External</namespace>
+ <documentation>
+ <admin>admin-external-storage</admin>
+ </documentation>
+ <category>files</category>
+ <category>integration</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
- <settings>
- <admin>OCA\Files_External\Settings\Admin</admin>
- <admin-section>OCA\Files_External\Settings\Section</admin-section>
- <personal>OCA\Files_External\Settings\Personal</personal>
- <personal-section>OCA\Files_External\Settings\PersonalSection</personal-section>
- </settings>
-
<commands>
<command>OCA\Files_External\Command\ListCommand</command>
<command>OCA\Files_External\Command\Config</command>
@@ -46,4 +44,11 @@ External storage can be configured using the GUI or at the command line. This se
<command>OCA\Files_External\Command\Verify</command>
<command>OCA\Files_External\Command\Notify</command>
</commands>
+
+ <settings>
+ <admin>OCA\Files_External\Settings\Admin</admin>
+ <admin-section>OCA\Files_External\Settings\Section</admin-section>
+ <personal>OCA\Files_External\Settings\Personal</personal>
+ <personal-section>OCA\Files_External\Settings\PersonalSection</personal-section>
+ </settings>
</info>
diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js
index cb9b7ad6822..12ad285c52b 100644
--- a/apps/files_external/js/settings.js
+++ b/apps/files_external/js/settings.js
@@ -960,6 +960,7 @@ MountConfigListView.prototype = _.extend({
if (result.length === 0 && mainForm.attr('data-can-create') === 'false') {
mainForm.hide();
$('a[href="#external-storage"]').parent().hide();
+ $('#emptycontent').show();
}
onCompletion.resolve();
}
diff --git a/apps/files_external/l10n/ast.js b/apps/files_external/l10n/ast.js
index 294c3f38b53..28d44e12b6d 100644
--- a/apps/files_external/l10n/ast.js
+++ b/apps/files_external/l10n/ast.js
@@ -11,6 +11,7 @@ OC.L10N.register(
"Error generating key pair" : "Fallu xenerando'l par de claves",
"All users. Type to select user or group." : "Tolos usuarios. Escribe pa seleccionar usuariu o grupu.",
"(group)" : "(grupu)",
+ "Delete storage?" : "¿Desaniciar almacenamientu?",
"Saved" : "Guardáu",
"Saving..." : "Guardando...",
"Save" : "Guardar",
diff --git a/apps/files_external/l10n/ast.json b/apps/files_external/l10n/ast.json
index 1f30910b745..7898a38e01d 100644
--- a/apps/files_external/l10n/ast.json
+++ b/apps/files_external/l10n/ast.json
@@ -9,6 +9,7 @@
"Error generating key pair" : "Fallu xenerando'l par de claves",
"All users. Type to select user or group." : "Tolos usuarios. Escribe pa seleccionar usuariu o grupu.",
"(group)" : "(grupu)",
+ "Delete storage?" : "¿Desaniciar almacenamientu?",
"Saved" : "Guardáu",
"Saving..." : "Guardando...",
"Save" : "Guardar",
diff --git a/apps/files_external/l10n/hu.js b/apps/files_external/l10n/hu.js
index ce9b36cc0f4..c9f112fd8f5 100644
--- a/apps/files_external/l10n/hu.js
+++ b/apps/files_external/l10n/hu.js
@@ -100,6 +100,7 @@ OC.L10N.register(
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "A cURL támogatás, a PHP-ban nincs engedélyezve vagy telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Az FTP támogatás, a PHP-ban nincs engedélyezve vagy telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "%s nincs telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.",
+ "External storage support" : "Külső tároló támogatás",
"No external storage configured" : "Nincs külső tároló beállítva.",
"You can add external storages in the personal settings" : "Hozzáadhatsz külső tárolókat a személyes beállítások közt.",
"Name" : "Név",
diff --git a/apps/files_external/l10n/hu.json b/apps/files_external/l10n/hu.json
index 67ce98c0fc6..c4de7b558af 100644
--- a/apps/files_external/l10n/hu.json
+++ b/apps/files_external/l10n/hu.json
@@ -98,6 +98,7 @@
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "A cURL támogatás, a PHP-ban nincs engedélyezve vagy telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Az FTP támogatás, a PHP-ban nincs engedélyezve vagy telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "%s nincs telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.",
+ "External storage support" : "Külső tároló támogatás",
"No external storage configured" : "Nincs külső tároló beállítva.",
"You can add external storages in the personal settings" : "Hozzáadhatsz külső tárolókat a személyes beállítások közt.",
"Name" : "Név",
diff --git a/apps/files_external/l10n/ja.js b/apps/files_external/l10n/ja.js
index 4cb446d6305..fc9ceed9ca5 100644
--- a/apps/files_external/l10n/ja.js
+++ b/apps/files_external/l10n/ja.js
@@ -75,6 +75,7 @@ OC.L10N.register(
"Region" : "リージョン",
"Enable SSL" : "SSLを有効",
"Enable Path Style" : "パス形式を有効",
+ "Legacy (v2) authentication" : "レガシー認証(v2)",
"WebDAV" : "WebDAV",
"URL" : "URL",
"Remote subfolder" : "リモートサブフォルダー",
@@ -99,6 +100,7 @@ OC.L10N.register(
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHPでのcURLのサポートが有効になっていないか、インストールされていません。 %s のマウントは不可能です。システム管理者にインストールを依頼してください。",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHPのFTPサポートが有効になっていないか、インストールされていません。%s のマウントは不可能です。システム管理者にインストールを依頼してください。",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\"はインストールされていません。 %s のマウントは不可能です。システム管理者にインストールを依頼してください。",
+ "External storage support" : "外部ストレージのサポート",
"No external storage configured" : "外部ストレージは設定されていません",
"You can add external storages in the personal settings" : "個人設定で外部ストレージを設定することができます。",
"Name" : "名前",
@@ -119,6 +121,14 @@ OC.L10N.register(
"Advanced settings" : "詳細設定",
"Delete" : "削除",
"Allow users to mount external storage" : "ユーザーに外部ストレージの接続を許可する",
- "Allow users to mount the following external storage" : "ユーザーに以下の外部ストレージのマウントを許可する"
+ "Allow users to mount the following external storage" : "ユーザーに以下の外部ストレージのマウントを許可する",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "リクエストトークンの取得に失敗しました。アプリのキーとパスワードが正しいことを確認してください。",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "アクセストークンの取得に失敗しました。アプリのキーとパスワードが正しいことを確認してください。",
+ "Step 1 failed. Exception: %s" : "ステップ 1 の実行に失敗しました。例外: %s",
+ "Step 2 failed. Exception: %s" : "ステップ 2 の実行に失敗しました。例外: %s",
+ "Dropbox App Configuration" : "Dropbox アプリ設定",
+ "Google Drive App Configuration" : "Google アプリ設定",
+ "Dropbox" : "Dropbox",
+ "Google Drive" : "Google Drive"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_external/l10n/ja.json b/apps/files_external/l10n/ja.json
index cb5e680a8b4..ed1d339368d 100644
--- a/apps/files_external/l10n/ja.json
+++ b/apps/files_external/l10n/ja.json
@@ -73,6 +73,7 @@
"Region" : "リージョン",
"Enable SSL" : "SSLを有効",
"Enable Path Style" : "パス形式を有効",
+ "Legacy (v2) authentication" : "レガシー認証(v2)",
"WebDAV" : "WebDAV",
"URL" : "URL",
"Remote subfolder" : "リモートサブフォルダー",
@@ -97,6 +98,7 @@
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHPでのcURLのサポートが有効になっていないか、インストールされていません。 %s のマウントは不可能です。システム管理者にインストールを依頼してください。",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHPのFTPサポートが有効になっていないか、インストールされていません。%s のマウントは不可能です。システム管理者にインストールを依頼してください。",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\"はインストールされていません。 %s のマウントは不可能です。システム管理者にインストールを依頼してください。",
+ "External storage support" : "外部ストレージのサポート",
"No external storage configured" : "外部ストレージは設定されていません",
"You can add external storages in the personal settings" : "個人設定で外部ストレージを設定することができます。",
"Name" : "名前",
@@ -117,6 +119,14 @@
"Advanced settings" : "詳細設定",
"Delete" : "削除",
"Allow users to mount external storage" : "ユーザーに外部ストレージの接続を許可する",
- "Allow users to mount the following external storage" : "ユーザーに以下の外部ストレージのマウントを許可する"
+ "Allow users to mount the following external storage" : "ユーザーに以下の外部ストレージのマウントを許可する",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "リクエストトークンの取得に失敗しました。アプリのキーとパスワードが正しいことを確認してください。",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "アクセストークンの取得に失敗しました。アプリのキーとパスワードが正しいことを確認してください。",
+ "Step 1 failed. Exception: %s" : "ステップ 1 の実行に失敗しました。例外: %s",
+ "Step 2 failed. Exception: %s" : "ステップ 2 の実行に失敗しました。例外: %s",
+ "Dropbox App Configuration" : "Dropbox アプリ設定",
+ "Google Drive App Configuration" : "Google アプリ設定",
+ "Dropbox" : "Dropbox",
+ "Google Drive" : "Google Drive"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js
index 9d91f42aa6b..8095903e1e3 100644
--- a/apps/files_external/l10n/nl.js
+++ b/apps/files_external/l10n/nl.js
@@ -100,6 +100,7 @@ OC.L10N.register(
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Curl ondersteuning in PHP is niet ingeschakeld of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je systeembeheerder dit te installeren.",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP ondersteuning in PHP is niet ingeschakeld of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je beheerder dit te installeren.",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" is niet geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je beheerder om dit te installeren.",
+ "External storage support" : "Externe opslag ondersteuning",
"No external storage configured" : "Geen externe opslag geconfigureerd",
"You can add external storages in the personal settings" : "Je kunt externe opslag toevoegen in persoonlijke instellingen",
"Name" : "Naam",
@@ -121,6 +122,12 @@ OC.L10N.register(
"Delete" : "Verwijder",
"Allow users to mount external storage" : "Sta gebruikers toe om een externe opslag aan te koppelen",
"Allow users to mount the following external storage" : "Sta gebruikers toe de volgende externe opslag aan te koppelen",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Binnenhalen van de aanvraag token is mislukt. Controleer dat je app sleutel en geheim correct zijn.",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "Binnenhalen van de toegangstoken is mislukt. Controleer dat je app sleutel en geheim correct zijn.",
+ "Step 1 failed. Exception: %s" : "Stap 1 mislukt. Uitzondering: %s",
+ "Step 2 failed. Exception: %s" : "Stap 2 mislukt. Uitzondering: %s",
+ "Dropbox App Configuration" : "Dropbox App Configuratie",
+ "Google Drive App Configuration" : "Google Drive App Configuratie",
"Dropbox" : "Dropbox",
"Google Drive" : "Google Drive"
},
diff --git a/apps/files_external/l10n/nl.json b/apps/files_external/l10n/nl.json
index d66ad379696..0582c01052c 100644
--- a/apps/files_external/l10n/nl.json
+++ b/apps/files_external/l10n/nl.json
@@ -98,6 +98,7 @@
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Curl ondersteuning in PHP is niet ingeschakeld of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je systeembeheerder dit te installeren.",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP ondersteuning in PHP is niet ingeschakeld of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je beheerder dit te installeren.",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" is niet geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je beheerder om dit te installeren.",
+ "External storage support" : "Externe opslag ondersteuning",
"No external storage configured" : "Geen externe opslag geconfigureerd",
"You can add external storages in the personal settings" : "Je kunt externe opslag toevoegen in persoonlijke instellingen",
"Name" : "Naam",
@@ -119,6 +120,12 @@
"Delete" : "Verwijder",
"Allow users to mount external storage" : "Sta gebruikers toe om een externe opslag aan te koppelen",
"Allow users to mount the following external storage" : "Sta gebruikers toe de volgende externe opslag aan te koppelen",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Binnenhalen van de aanvraag token is mislukt. Controleer dat je app sleutel en geheim correct zijn.",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "Binnenhalen van de toegangstoken is mislukt. Controleer dat je app sleutel en geheim correct zijn.",
+ "Step 1 failed. Exception: %s" : "Stap 1 mislukt. Uitzondering: %s",
+ "Step 2 failed. Exception: %s" : "Stap 2 mislukt. Uitzondering: %s",
+ "Dropbox App Configuration" : "Dropbox App Configuratie",
+ "Google Drive App Configuration" : "Google Drive App Configuratie",
"Dropbox" : "Dropbox",
"Google Drive" : "Google Drive"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/files_external/l10n/pt_PT.js b/apps/files_external/l10n/pt_PT.js
index 5f119553b57..a81b857eba5 100644
--- a/apps/files_external/l10n/pt_PT.js
+++ b/apps/files_external/l10n/pt_PT.js
@@ -14,13 +14,19 @@ OC.L10N.register(
"(group)" : "(grupo)",
"Compatibility with Mac NFD encoding (slow)" : "Compatibilidade com a codificação NFD Mac (lenta)",
"Admin defined" : "Administrador definido",
+ "Are you sure you want to delete this external storage" : "De certeza que quer apagar este armazenamento externo",
+ "Delete storage?" : "Apagar armazenamento?",
"Saved" : "Guardado",
+ "Saving..." : "A guardar...",
"Save" : "Guardar",
"Empty response from the server" : "Resposta vazia a partir do servidor",
+ "Couldn't access. Please log out and in again to activate this mount point" : "Não foi possível aceder. Por favor faça logout e volte-se a autenticar para activar este ponto de montagem.",
+ "Couldn't get the information from the remote server: {code} {type}" : "Não foi possível obter informação do servidor remoto: {código}{tipo}",
"Couldn't get the list of external mount points: {type}" : "Não foi possível conseguir a lista de pontos de montagem externos: {type}",
"There was an error with message: " : "Houve um erro com a mensagem:",
"External mount error" : "Erro de montagem externa",
"external-storage" : "armazenamento externo",
+ "Couldn't fetch list of Windows network drive mount points: Empty response from server" : "Não fo possível obter lista de pontos de montagem de rede Windows: 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",
@@ -28,6 +34,7 @@ OC.L10N.register(
"Credentials saved" : "Credenciais guardadas",
"Credentials saving failed" : "Falha ao guardar as credenciais",
"Credentials required" : "Credenciais necessárias",
+ "Storage with ID \"%d\" not found" : "Armazenamento com ID \"%d\" não encontrado",
"Invalid backend or authentication mechanism class" : "Parâmetros do mecanismo de autenticação inválidos",
"Invalid mount point" : "Ponto de montagem inválido",
"Objectstore forbidden" : "Objectstore proibido",
@@ -38,6 +45,7 @@ OC.L10N.register(
"Unsatisfied authentication mechanism parameters" : "Parâmetros do mecanismo de autenticação inválidos",
"Insufficient data: %s" : "Dados insuficientes: %s",
"%s" : "%s",
+ "Storage with ID \"%d\" is not user editable" : "Armazenamento com ID \"%d\" não é evitável por utilizadores",
"Access key" : "Chave de acesso",
"Secret key" : "Código secreto",
"Builtin" : "Integrado",
@@ -53,8 +61,11 @@ OC.L10N.register(
"Identity endpoint URL" : "Identidade URL endpoint",
"Rackspace" : "Rackspace",
"API key" : "Chave API",
+ "Global credentials" : "Credenciais globais",
+ "Log-in credentials, save in database" : "Credenciais de Log-in, guardar na base de dados",
"Username and password" : "Nome de utilizador e palavra-passe",
"Log-in credentials, save in session" : "Credenciais de login, guardar na sessão",
+ "User entered, store in database" : "Inseridos pelo utilizador, armazenar na base de dados",
"RSA public key" : "Chave pública RSA",
"Public key" : "Chave pública",
"Amazon S3" : "Amazon S3",
@@ -64,6 +75,7 @@ OC.L10N.register(
"Region" : "Região",
"Enable SSL" : "Ativar SSL",
"Enable Path Style" : "Ativar Estilo do Caminho",
+ "Legacy (v2) authentication" : "Autenticação obsoleta (v2)",
"WebDAV" : "WebDAV",
"URL" : "URL",
"Remote subfolder" : "Subpasta remota ",
@@ -73,6 +85,7 @@ OC.L10N.register(
"Secure ftps://" : "ftps:// Seguro",
"Local" : "Local",
"Location" : "Localização:",
+ "Nextcloud" : "Nextcloud",
"SFTP" : "SFTP",
"Root" : "Root",
"SFTP with secret key login" : "SFTP com login por chave secreta",
@@ -84,6 +97,10 @@ OC.L10N.register(
"OpenStack Object Storage" : "Armazenamento de Objetos OpenStack",
"Service name" : "Nome do serviço",
"Request timeout (seconds)" : "Pedido expira (segundos)",
+ "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte cURL em PHP não está activo ou instalado. Não é possível montar %s. Por favor peça ao seu administrador de sistema que o instale.",
+ "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporteF TP em PHP não está activo ou instalado. Não é possível montar %s. Por favor peça ao seu administrador de sistema que o instale.",
+ "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. Não é possível montar %s. Por favor peça ao seu administrador que o instale.",
+ "External storage support" : "Suporte para armazenamento externo",
"No external storage configured" : "Sem armazenamentos externos configurados",
"You can add external storages in the personal settings" : "Pode adicionar armazenamentos externos nas definições pessoais",
"Name" : "Nome",
@@ -104,6 +121,14 @@ OC.L10N.register(
"Advanced settings" : "Definições avançadas",
"Delete" : "Apagar",
"Allow users to mount external storage" : "Permitir que os utilizadores montem armazenamento externo",
- "Allow users to mount the following external storage" : "Permitir que os utilizadores montem o seguinte armazenamento externo"
+ "Allow users to mount the following external storage" : "Permitir que os utilizadores montem o seguinte armazenamento externo",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Falhou a obter tokens de pedido. Verifique se a sua chave de aplicação e segredo estão correctos.",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "Falhou a obter tokens de acesso. Verifique se a sua chave de aplicação e segredo estão correctos.",
+ "Step 1 failed. Exception: %s" : "Passo 1 falhou. Excepção: %s",
+ "Step 2 failed. Exception: %s" : "Passo 2 falhou. Excepção: %s",
+ "Dropbox App Configuration" : "configuração da aplicação Dropbox",
+ "Google Drive App Configuration" : "Configuração da aplicação Google Drive",
+ "Dropbox" : "Dropbox",
+ "Google Drive" : "Google Drive"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/pt_PT.json b/apps/files_external/l10n/pt_PT.json
index 88600ac5eaf..4efae622222 100644
--- a/apps/files_external/l10n/pt_PT.json
+++ b/apps/files_external/l10n/pt_PT.json
@@ -12,13 +12,19 @@
"(group)" : "(grupo)",
"Compatibility with Mac NFD encoding (slow)" : "Compatibilidade com a codificação NFD Mac (lenta)",
"Admin defined" : "Administrador definido",
+ "Are you sure you want to delete this external storage" : "De certeza que quer apagar este armazenamento externo",
+ "Delete storage?" : "Apagar armazenamento?",
"Saved" : "Guardado",
+ "Saving..." : "A guardar...",
"Save" : "Guardar",
"Empty response from the server" : "Resposta vazia a partir do servidor",
+ "Couldn't access. Please log out and in again to activate this mount point" : "Não foi possível aceder. Por favor faça logout e volte-se a autenticar para activar este ponto de montagem.",
+ "Couldn't get the information from the remote server: {code} {type}" : "Não foi possível obter informação do servidor remoto: {código}{tipo}",
"Couldn't get the list of external mount points: {type}" : "Não foi possível conseguir a lista de pontos de montagem externos: {type}",
"There was an error with message: " : "Houve um erro com a mensagem:",
"External mount error" : "Erro de montagem externa",
"external-storage" : "armazenamento externo",
+ "Couldn't fetch list of Windows network drive mount points: Empty response from server" : "Não fo possível obter lista de pontos de montagem de rede Windows: 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",
@@ -26,6 +32,7 @@
"Credentials saved" : "Credenciais guardadas",
"Credentials saving failed" : "Falha ao guardar as credenciais",
"Credentials required" : "Credenciais necessárias",
+ "Storage with ID \"%d\" not found" : "Armazenamento com ID \"%d\" não encontrado",
"Invalid backend or authentication mechanism class" : "Parâmetros do mecanismo de autenticação inválidos",
"Invalid mount point" : "Ponto de montagem inválido",
"Objectstore forbidden" : "Objectstore proibido",
@@ -36,6 +43,7 @@
"Unsatisfied authentication mechanism parameters" : "Parâmetros do mecanismo de autenticação inválidos",
"Insufficient data: %s" : "Dados insuficientes: %s",
"%s" : "%s",
+ "Storage with ID \"%d\" is not user editable" : "Armazenamento com ID \"%d\" não é evitável por utilizadores",
"Access key" : "Chave de acesso",
"Secret key" : "Código secreto",
"Builtin" : "Integrado",
@@ -51,8 +59,11 @@
"Identity endpoint URL" : "Identidade URL endpoint",
"Rackspace" : "Rackspace",
"API key" : "Chave API",
+ "Global credentials" : "Credenciais globais",
+ "Log-in credentials, save in database" : "Credenciais de Log-in, guardar na base de dados",
"Username and password" : "Nome de utilizador e palavra-passe",
"Log-in credentials, save in session" : "Credenciais de login, guardar na sessão",
+ "User entered, store in database" : "Inseridos pelo utilizador, armazenar na base de dados",
"RSA public key" : "Chave pública RSA",
"Public key" : "Chave pública",
"Amazon S3" : "Amazon S3",
@@ -62,6 +73,7 @@
"Region" : "Região",
"Enable SSL" : "Ativar SSL",
"Enable Path Style" : "Ativar Estilo do Caminho",
+ "Legacy (v2) authentication" : "Autenticação obsoleta (v2)",
"WebDAV" : "WebDAV",
"URL" : "URL",
"Remote subfolder" : "Subpasta remota ",
@@ -71,6 +83,7 @@
"Secure ftps://" : "ftps:// Seguro",
"Local" : "Local",
"Location" : "Localização:",
+ "Nextcloud" : "Nextcloud",
"SFTP" : "SFTP",
"Root" : "Root",
"SFTP with secret key login" : "SFTP com login por chave secreta",
@@ -82,6 +95,10 @@
"OpenStack Object Storage" : "Armazenamento de Objetos OpenStack",
"Service name" : "Nome do serviço",
"Request timeout (seconds)" : "Pedido expira (segundos)",
+ "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte cURL em PHP não está activo ou instalado. Não é possível montar %s. Por favor peça ao seu administrador de sistema que o instale.",
+ "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporteF TP em PHP não está activo ou instalado. Não é possível montar %s. Por favor peça ao seu administrador de sistema que o instale.",
+ "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. Não é possível montar %s. Por favor peça ao seu administrador que o instale.",
+ "External storage support" : "Suporte para armazenamento externo",
"No external storage configured" : "Sem armazenamentos externos configurados",
"You can add external storages in the personal settings" : "Pode adicionar armazenamentos externos nas definições pessoais",
"Name" : "Nome",
@@ -102,6 +119,14 @@
"Advanced settings" : "Definições avançadas",
"Delete" : "Apagar",
"Allow users to mount external storage" : "Permitir que os utilizadores montem armazenamento externo",
- "Allow users to mount the following external storage" : "Permitir que os utilizadores montem o seguinte armazenamento externo"
+ "Allow users to mount the following external storage" : "Permitir que os utilizadores montem o seguinte armazenamento externo",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Falhou a obter tokens de pedido. Verifique se a sua chave de aplicação e segredo estão correctos.",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "Falhou a obter tokens de acesso. Verifique se a sua chave de aplicação e segredo estão correctos.",
+ "Step 1 failed. Exception: %s" : "Passo 1 falhou. Excepção: %s",
+ "Step 2 failed. Exception: %s" : "Passo 2 falhou. Excepção: %s",
+ "Dropbox App Configuration" : "configuração da aplicação Dropbox",
+ "Google Drive App Configuration" : "Configuração da aplicação Google Drive",
+ "Dropbox" : "Dropbox",
+ "Google Drive" : "Google Drive"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/ru.js b/apps/files_external/l10n/ru.js
index 90ad73d8e31..db9bfd567a8 100644
--- a/apps/files_external/l10n/ru.js
+++ b/apps/files_external/l10n/ru.js
@@ -100,6 +100,7 @@ OC.L10N.register(
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Поддержка cURL в PHP не включена и/или не установлена, монтирование %s невозможно. Обратитесь к вашему системному администратору.",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Поддержка FTP в PHP не включена и/или не установлена, монтирование %s невозможно. Обратитесь к вашему системному администратору.",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "«%s» не установлен, монтирование %s невозможно. Обратитесь к вашему системному администратору.",
+ "External storage support" : "Поддержка внешних хранилищ",
"No external storage configured" : "Внешние хранилища не настроены",
"You can add external storages in the personal settings" : "Вы можете добавить внешние хранилища в личных настройках",
"Name" : "Имя",
@@ -120,6 +121,11 @@ OC.L10N.register(
"Advanced settings" : "Расширенные настройки",
"Delete" : "Удалить",
"Allow users to mount external storage" : "Разрешить пользователями монтировать внешние накопители",
- "Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных"
+ "Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Ошибка получения токенов запроса. Проверьте корректность ключа и секрета приложения.",
+ "Dropbox App Configuration" : "Настройка приложения Dropbox",
+ "Google Drive App Configuration" : "Настройка приложения Google Drive",
+ "Dropbox" : "Dropbox",
+ "Google Drive" : "Google Drive"
},
"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/files_external/l10n/ru.json b/apps/files_external/l10n/ru.json
index f0eb6d1e231..5ffee5598ed 100644
--- a/apps/files_external/l10n/ru.json
+++ b/apps/files_external/l10n/ru.json
@@ -98,6 +98,7 @@
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Поддержка cURL в PHP не включена и/или не установлена, монтирование %s невозможно. Обратитесь к вашему системному администратору.",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Поддержка FTP в PHP не включена и/или не установлена, монтирование %s невозможно. Обратитесь к вашему системному администратору.",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "«%s» не установлен, монтирование %s невозможно. Обратитесь к вашему системному администратору.",
+ "External storage support" : "Поддержка внешних хранилищ",
"No external storage configured" : "Внешние хранилища не настроены",
"You can add external storages in the personal settings" : "Вы можете добавить внешние хранилища в личных настройках",
"Name" : "Имя",
@@ -118,6 +119,11 @@
"Advanced settings" : "Расширенные настройки",
"Delete" : "Удалить",
"Allow users to mount external storage" : "Разрешить пользователями монтировать внешние накопители",
- "Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных"
+ "Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Ошибка получения токенов запроса. Проверьте корректность ключа и секрета приложения.",
+ "Dropbox App Configuration" : "Настройка приложения Dropbox",
+ "Google Drive App Configuration" : "Настройка приложения Google Drive",
+ "Dropbox" : "Dropbox",
+ "Google Drive" : "Google Drive"
},"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/apps/files_external/lib/AppInfo/Application.php b/apps/files_external/lib/AppInfo/Application.php
index e32828fbf4e..e037b9b34e5 100644
--- a/apps/files_external/lib/AppInfo/Application.php
+++ b/apps/files_external/lib/AppInfo/Application.php
@@ -31,7 +31,6 @@ namespace OCA\Files_External\AppInfo;
use \OCP\AppFramework\App;
use OCP\AppFramework\IAppContainer;
-use \OCP\IContainer;
use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\Config\IBackendProvider;
use \OCA\Files_External\Lib\Config\IAuthMechanismProvider;
diff --git a/apps/files_external/lib/Controller/AjaxController.php b/apps/files_external/lib/Controller/AjaxController.php
index 66cbcae3e8f..6404fb9de51 100644
--- a/apps/files_external/lib/Controller/AjaxController.php
+++ b/apps/files_external/lib/Controller/AjaxController.php
@@ -30,8 +30,6 @@ namespace OCA\Files_External\Controller;
use OCA\Files_External\Lib\Auth\Password\GlobalAuth;
use OCP\AppFramework\Controller;
-use OCP\AppFramework\Http;
-use OCP\AppFramework\Http\Response;
use OCP\IGroupManager;
use OCP\IRequest;
use OCP\AppFramework\Http\JSONResponse;
diff --git a/apps/files_external/lib/Lib/Auth/Password/GlobalAuth.php b/apps/files_external/lib/Lib/Auth/Password/GlobalAuth.php
index 3c5798ccee7..c1397ae8f8c 100644
--- a/apps/files_external/lib/Lib/Auth/Password/GlobalAuth.php
+++ b/apps/files_external/lib/Lib/Auth/Password/GlobalAuth.php
@@ -29,7 +29,6 @@ use OCP\IUser;
use OCA\Files_External\Lib\Auth\AuthMechanism;
use OCA\Files_External\Lib\StorageConfig;
use OCP\Security\ICredentialsManager;
-use OCP\Files\Storage;
use OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException;
/**
diff --git a/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php b/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php
index 80703b52a9a..dfdfd072980 100644
--- a/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php
+++ b/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php
@@ -24,13 +24,10 @@ namespace OCA\Files_External\Lib\Auth\Password;
use \OCP\IL10N;
use \OCP\IUser;
-use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
use \OCA\Files_External\Lib\StorageConfig;
use \OCP\ISession;
use \OCP\Security\ICredentialsManager;
-use \OCP\Files\Storage;
-use \OCA\Files_External\Lib\SessionStorageWrapper;
use \OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException;
/**
diff --git a/apps/files_external/lib/Lib/Auth/Password/UserProvided.php b/apps/files_external/lib/Lib/Auth/Password/UserProvided.php
index 7eb2f63e7d3..6bac2bd9c18 100644
--- a/apps/files_external/lib/Lib/Auth/Password/UserProvided.php
+++ b/apps/files_external/lib/Lib/Auth/Password/UserProvided.php
@@ -30,7 +30,6 @@ use OCP\IUser;
use OCA\Files_External\Lib\Auth\AuthMechanism;
use OCA\Files_External\Lib\StorageConfig;
use OCP\Security\ICredentialsManager;
-use OCP\Files\Storage;
use OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException;
/**
diff --git a/apps/files_external/lib/Lib/Backend/AmazonS3.php b/apps/files_external/lib/Lib/Backend/AmazonS3.php
index d21794a6847..509c6453dc9 100644
--- a/apps/files_external/lib/Lib/Backend/AmazonS3.php
+++ b/apps/files_external/lib/Lib/Backend/AmazonS3.php
@@ -23,12 +23,8 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
-use \OCA\Files_External\Lib\Auth\AuthMechanism;
-use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
-
use \OCA\Files_External\Lib\Auth\AmazonS3\AccessKey;
class AmazonS3 extends Backend {
diff --git a/apps/files_external/lib/Lib/Backend/DAV.php b/apps/files_external/lib/Lib/Backend/DAV.php
index 95d804ba943..2863a33c2c0 100644
--- a/apps/files_external/lib/Lib/Backend/DAV.php
+++ b/apps/files_external/lib/Lib/Backend/DAV.php
@@ -23,12 +23,9 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
-use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
-
use \OCA\Files_External\Lib\Auth\Password\Password;
class DAV extends Backend {
diff --git a/apps/files_external/lib/Lib/Backend/FTP.php b/apps/files_external/lib/Lib/Backend/FTP.php
index 12aee8114f3..d224d231281 100644
--- a/apps/files_external/lib/Lib/Backend/FTP.php
+++ b/apps/files_external/lib/Lib/Backend/FTP.php
@@ -23,12 +23,9 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
-use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
-
use \OCA\Files_External\Lib\Auth\Password\Password;
class FTP extends Backend {
diff --git a/apps/files_external/lib/Lib/Backend/LegacyBackend.php b/apps/files_external/lib/Lib/Backend/LegacyBackend.php
index 4d3aa3e7e93..3fc073b842d 100644
--- a/apps/files_external/lib/Lib/Backend/LegacyBackend.php
+++ b/apps/files_external/lib/Lib/Backend/LegacyBackend.php
@@ -23,7 +23,6 @@
namespace OCA\Files_External\Lib\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\Auth\Builtin;
use \OCA\Files_External\Lib\MissingDependency;
use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
diff --git a/apps/files_external/lib/Lib/Backend/Local.php b/apps/files_external/lib/Lib/Backend/Local.php
index 528528f2923..e0a2734d7ba 100644
--- a/apps/files_external/lib/Lib/Backend/Local.php
+++ b/apps/files_external/lib/Lib/Backend/Local.php
@@ -23,7 +23,6 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
use \OCA\Files_External\Service\BackendService;
diff --git a/apps/files_external/lib/Lib/Backend/OwnCloud.php b/apps/files_external/lib/Lib/Backend/OwnCloud.php
index 7dcd1f27212..cbf28be2bf2 100644
--- a/apps/files_external/lib/Lib/Backend/OwnCloud.php
+++ b/apps/files_external/lib/Lib/Backend/OwnCloud.php
@@ -24,11 +24,8 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
-use \OCA\Files_External\Service\BackendService;
-
use \OCA\Files_External\Lib\Auth\Password\Password;
class OwnCloud extends Backend {
diff --git a/apps/files_external/lib/Lib/Backend/SFTP_Key.php b/apps/files_external/lib/Lib/Backend/SFTP_Key.php
index 62f108cd9dd..73d3acd3565 100644
--- a/apps/files_external/lib/Lib/Backend/SFTP_Key.php
+++ b/apps/files_external/lib/Lib/Backend/SFTP_Key.php
@@ -23,12 +23,9 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
-use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\Auth\PublicKey\RSA;
-use \OCA\Files_External\Lib\Backend\SFTP;
class SFTP_Key extends Backend {
diff --git a/apps/files_external/lib/Lib/Backend/SMB.php b/apps/files_external/lib/Lib/Backend/SMB.php
index 38e386005ad..f5335f4940c 100644
--- a/apps/files_external/lib/Lib/Backend/SMB.php
+++ b/apps/files_external/lib/Lib/Backend/SMB.php
@@ -23,10 +23,8 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
-use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\StorageConfig;
use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
diff --git a/apps/files_external/lib/Lib/Backend/SMB_OC.php b/apps/files_external/lib/Lib/Backend/SMB_OC.php
index 54d941ff1db..074c729b429 100644
--- a/apps/files_external/lib/Lib/Backend/SMB_OC.php
+++ b/apps/files_external/lib/Lib/Backend/SMB_OC.php
@@ -23,14 +23,12 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\Auth\Password\SessionCredentials;
use \OCA\Files_External\Lib\StorageConfig;
use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
-use \OCA\Files_External\Lib\Backend\SMB;
use OCP\IUser;
/**
diff --git a/apps/files_external/lib/Lib/Backend/Swift.php b/apps/files_external/lib/Lib/Backend/Swift.php
index b0a69ae51e0..f2b694362f4 100644
--- a/apps/files_external/lib/Lib/Backend/Swift.php
+++ b/apps/files_external/lib/Lib/Backend/Swift.php
@@ -23,10 +23,8 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
-use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\Auth\OpenStack\OpenStack;
use \OCA\Files_External\Lib\Auth\OpenStack\Rackspace;
use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
diff --git a/apps/files_external/lib/Lib/DependencyTrait.php b/apps/files_external/lib/Lib/DependencyTrait.php
index bae2d277a59..1d99fa9c162 100644
--- a/apps/files_external/lib/Lib/DependencyTrait.php
+++ b/apps/files_external/lib/Lib/DependencyTrait.php
@@ -22,8 +22,6 @@
namespace OCA\Files_External\Lib;
-use \OCA\Files_External\Lib\MissingDependency;
-
/**
* Trait for objects that have dependencies for use
*/
diff --git a/apps/files_external/lib/Lib/FrontendDefinitionTrait.php b/apps/files_external/lib/Lib/FrontendDefinitionTrait.php
index 25b3cb4fc29..89fb62932ad 100644
--- a/apps/files_external/lib/Lib/FrontendDefinitionTrait.php
+++ b/apps/files_external/lib/Lib/FrontendDefinitionTrait.php
@@ -24,8 +24,6 @@
namespace OCA\Files_External\Lib;
-use \OCA\Files_External\Lib\DefinitionParameter;
-use \OCA\Files_External\Lib\StorageConfig;
/**
* Trait for objects that have a frontend representation
diff --git a/apps/files_external/lib/Lib/LegacyDependencyCheckPolyfill.php b/apps/files_external/lib/Lib/LegacyDependencyCheckPolyfill.php
index 4db4e6d74de..07fe99f9406 100644
--- a/apps/files_external/lib/Lib/LegacyDependencyCheckPolyfill.php
+++ b/apps/files_external/lib/Lib/LegacyDependencyCheckPolyfill.php
@@ -22,7 +22,6 @@
namespace OCA\Files_External\Lib;
-use \OCA\Files_External\Lib\MissingDependency;
/**
* Polyfill for checking dependencies using legacy Storage::checkDependencies()
diff --git a/apps/files_external/lib/Lib/SessionStorageWrapper.php b/apps/files_external/lib/Lib/SessionStorageWrapper.php
index ba0f68b4e11..37cd0eae9ea 100644
--- a/apps/files_external/lib/Lib/SessionStorageWrapper.php
+++ b/apps/files_external/lib/Lib/SessionStorageWrapper.php
@@ -22,7 +22,6 @@
namespace OCA\Files_External\Lib;
-use \OCP\Files\Storage;
use \OC\Files\Storage\Wrapper\PermissionsMask;
use \OCP\Constants;
diff --git a/apps/files_external/lib/Lib/Storage/AmazonS3.php b/apps/files_external/lib/Lib/Storage/AmazonS3.php
index f06247c3690..459f9b80e12 100644
--- a/apps/files_external/lib/Lib/Storage/AmazonS3.php
+++ b/apps/files_external/lib/Lib/Storage/AmazonS3.php
@@ -571,13 +571,10 @@ class AmazonS3 extends \OC\Files\Storage\Common {
}
public function test() {
- $test = $this->getConnection()->getBucketAcl(array(
- 'Bucket' => $this->bucket,
- ));
- if (isset($test) && !is_null($test->getPath('Owner/ID'))) {
- return true;
- }
- return false;
+ $this->getConnection()->headBucket([
+ 'Bucket' => $this->bucket
+ ]);
+ return true;
}
public function getId() {
diff --git a/apps/files_external/lib/Lib/Storage/Swift.php b/apps/files_external/lib/Lib/Storage/Swift.php
index aaa7e95bbdf..051c65350d5 100644
--- a/apps/files_external/lib/Lib/Storage/Swift.php
+++ b/apps/files_external/lib/Lib/Storage/Swift.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -39,33 +40,22 @@
namespace OCA\Files_External\Lib\Storage;
-use Guzzle\Http\Url;
-use Guzzle\Http\Exception\ClientErrorResponseException;
+use GuzzleHttp\Psr7\Uri;
use Icewind\Streams\CallbackWrapper;
use Icewind\Streams\IteratorDirectory;
-use Icewind\Streams\RetryWrapper;
-use OpenCloud;
-use OpenCloud\Common\Exceptions;
-use OpenCloud\OpenStack;
-use OpenCloud\Rackspace;
-use OpenCloud\ObjectStore\Resource\DataObject;
-use OpenCloud\ObjectStore\Exception;
+use OC\Files\ObjectStore\SwiftFactory;
+use OCP\Files\StorageBadConfigException;
+use OpenStack\Common\Error\BadResponseError;
+use OpenStack\ObjectStore\v1\Models\StorageObject;
class Swift extends \OC\Files\Storage\Common {
-
- /**
- * @var \OpenCloud\ObjectStore\Service
- */
- private $connection;
+ /** @var SwiftFactory */
+ private $connectionFactory;
/**
- * @var \OpenCloud\ObjectStore\Resource\Container
+ * @var \OpenStack\ObjectStore\v1\Models\Container
*/
private $container;
/**
- * @var \OpenCloud\OpenStack
- */
- private $anchor;
- /**
* @var string
*/
private $bucket;
@@ -76,21 +66,26 @@ class Swift extends \OC\Files\Storage\Common {
*/
private $params;
- /** @var string */
+ /** @var string */
private $id;
+ /** @var \OC\Files\ObjectStore\Swift */
+ private $objectStore;
+
/**
* Key value cache mapping path to data object. Maps path to
* \OpenCloud\OpenStack\ObjectStorage\Resource\DataObject for existing
* paths and path to false for not existing paths.
+ *
* @var \OCP\ICache
*/
private $objectCache;
/**
* @param string $path
+ * @return mixed|string
*/
- private function normalizePath($path) {
+ private function normalizePath(string $path) {
$path = trim($path, '/');
if (!$path) {
@@ -118,24 +113,22 @@ class Swift extends \OC\Files\Storage\Common {
* that one will be returned.
*
* @param string $path
- * @return \OpenCloud\ObjectStore\Resource\DataObject|bool object
+ * @return StorageObject|bool object
* or false if the object did not exist
+ * @throws \OCP\Files\StorageAuthException
+ * @throws \OCP\Files\StorageNotAvailableException
*/
- private function fetchObject($path) {
+ private function fetchObject(string $path) {
if ($this->objectCache->hasKey($path)) {
// might be "false" if object did not exist from last check
return $this->objectCache->get($path);
}
try {
- $object = $this->getContainer()->getPartialObject($path);
+ $object = $this->getContainer()->getObject($path);
+ $object->retrieve();
$this->objectCache->set($path, $object);
return $object;
- } catch (ClientErrorResponseException $e) {
- // this exception happens when the object does not exist, which
- // is expected in most cases
- $this->objectCache->set($path, false);
- return false;
- } catch (ClientErrorResponseException $e) {
+ } catch (BadResponseError $e) {
// Expected response is "404 Not Found", so only log if it isn't
if ($e->getResponse()->getStatusCode() !== 404) {
\OC::$server->getLogger()->logException($e, [
@@ -143,6 +136,7 @@ class Swift extends \OC\Files\Storage\Common {
'app' => 'files_external',
]);
}
+ $this->objectCache->set($path, false);
return false;
}
}
@@ -153,6 +147,8 @@ class Swift extends \OC\Files\Storage\Common {
* @param string $path
*
* @return bool true if the object exist, false otherwise
+ * @throws \OCP\Files\StorageAuthException
+ * @throws \OCP\Files\StorageNotAvailableException
*/
private function doesObjectExist($path) {
return $this->fetchObject($path) !== false;
@@ -163,17 +159,15 @@ class Swift extends \OC\Files\Storage\Common {
or empty($params['user']) or empty($params['bucket'])
or empty($params['region'])
) {
- throw new \Exception("API Key or password, Username, Bucket and Region have to be configured.");
+ throw new StorageBadConfigException("API Key or password, Username, Bucket and Region have to be configured.");
}
$this->id = 'swift::' . $params['user'] . md5($params['bucket']);
- $bucketUrl = Url::factory($params['bucket']);
- if ($bucketUrl->isAbsolute()) {
- $this->bucket = end($bucketUrl->getPathSegments());
- $params['endpoint_url'] = $bucketUrl->addPath('..')->normalizePath();
- } else {
- $this->bucket = $params['bucket'];
+ $bucketUrl = new Uri($params['bucket']);
+ if ($bucketUrl->getHost()) {
+ $params['bucket'] = basename($bucketUrl->getPath());
+ $params['endpoint_url'] = (string)$bucketUrl->withPath(dirname($bucketUrl->getPath()));
}
if (empty($params['url'])) {
@@ -184,9 +178,14 @@ class Swift extends \OC\Files\Storage\Common {
$params['service_name'] = 'cloudFiles';
}
+ $params['autocreate'] = true;
+
$this->params = $params;
// FIXME: private class...
$this->objectCache = new \OC\Cache\CappedMemoryCache();
+ $this->connectionFactory = new SwiftFactory(\OC::$server->getMemCacheFactory()->createDistributed('swift/'), $this->params);
+ $this->objectStore = new \OC\Files\ObjectStore\Swift($this->params, $this->connectionFactory);
+ $this->bucket = $params['bucket'];
}
public function mkdir($path) {
@@ -201,14 +200,15 @@ class Swift extends \OC\Files\Storage\Common {
}
try {
- $customHeaders = array('content-type' => 'httpd/unix-directory');
- $metadataHeaders = DataObject::stockHeaders(array());
- $allHeaders = $customHeaders + $metadataHeaders;
- $this->getContainer()->uploadObject($path, '', $allHeaders);
+ $this->getContainer()->createObject([
+ 'name' => $path,
+ 'content' => '',
+ 'headers' => ['content-type' => 'httpd/unix-directory']
+ ]);
// invalidate so that the next access gets the real object
// with all properties
$this->objectCache->remove($path);
- } catch (Exceptions\CreateUpdateError $e) {
+ } catch (BadResponseError $e) {
\OC::$server->getLogger()->logException($e, [
'level' => \OCP\Util::ERROR,
'app' => 'files_external',
@@ -250,9 +250,9 @@ class Swift extends \OC\Files\Storage\Common {
}
try {
- $this->getContainer()->dataObject()->setName($path . '/')->delete();
+ $this->objectStore->deleteObject($path . '/');
$this->objectCache->remove($path . '/');
- } catch (Exceptions\DeleteError $e) {
+ } catch (BadResponseError $e) {
\OC::$server->getLogger()->logException($e, [
'level' => \OCP\Util::ERROR,
'app' => 'files_external',
@@ -272,19 +272,18 @@ class Swift extends \OC\Files\Storage\Common {
$path .= '/';
}
- $path = str_replace('%23', '#', $path); // the prefix is sent as a query param, so revert the encoding of #
+// $path = str_replace('%23', '#', $path); // the prefix is sent as a query param, so revert the encoding of #
try {
- $files = array();
- /** @var OpenCloud\Common\Collection $objects */
- $objects = $this->getContainer()->objectList(array(
+ $files = [];
+ $objects = $this->getContainer()->listObjects([
'prefix' => $path,
'delimiter' => '/'
- ));
+ ]);
- /** @var OpenCloud\ObjectStore\Resource\DataObject $object */
+ /** @var StorageObject $object */
foreach ($objects as $object) {
- $file = basename($object->getName());
+ $file = basename($object->name);
if ($file !== basename($path) && $file !== '.') {
$files[] = $file;
}
@@ -311,12 +310,11 @@ class Swift extends \OC\Files\Storage\Common {
}
try {
- /** @var DataObject $object */
$object = $this->fetchObject($path);
if (!$object) {
return false;
}
- } catch (ClientErrorResponseException $e) {
+ } catch (BadResponseError $e) {
\OC::$server->getLogger()->logException($e, [
'level' => \OCP\Util::ERROR,
'app' => 'files_external',
@@ -324,16 +322,11 @@ class Swift extends \OC\Files\Storage\Common {
return false;
}
- $dateTime = \DateTime::createFromFormat(\DateTime::RFC1123, $object->getLastModified());
- if ($dateTime !== false) {
- $mtime = $dateTime->getTimestamp();
- } else {
- $mtime = null;
- }
+ $dateTime = $object->lastModified ? \DateTime::createFromFormat(\DateTime::RFC1123, $object->lastModified) : false;
+ $mtime = $dateTime ? $dateTime->getTimestamp() : null;
$objectMetadata = $object->getMetadata();
- $metaTimestamp = $objectMetadata->getProperty('timestamp');
- if (isset($metaTimestamp)) {
- $mtime = $metaTimestamp;
+ if (isset($objectMetadata['timestamp'])) {
+ $mtime = $objectMetadata['timestamp'];
}
if (!empty($mtime)) {
@@ -341,7 +334,7 @@ class Swift extends \OC\Files\Storage\Common {
}
$stat = array();
- $stat['size'] = (int)$object->getContentLength();
+ $stat['size'] = (int)$object->contentLength;
$stat['mtime'] = $mtime;
$stat['atime'] = time();
return $stat;
@@ -371,17 +364,17 @@ class Swift extends \OC\Files\Storage\Common {
}
try {
- $this->getContainer()->dataObject()->setName($path)->delete();
+ $this->objectStore->deleteObject($path);
$this->objectCache->remove($path);
$this->objectCache->remove($path . '/');
- } catch (ClientErrorResponseException $e) {
+ } catch (BadResponseError $e) {
if ($e->getResponse()->getStatusCode() !== 404) {
\OC::$server->getLogger()->logException($e, [
'level' => \OCP\Util::ERROR,
'app' => 'files_external',
]);
+ throw $e;
}
- return false;
}
return true;
@@ -398,20 +391,8 @@ class Swift extends \OC\Files\Storage\Common {
case 'r':
case 'rb':
try {
- $c = $this->getContainer();
- $streamFactory = new \Guzzle\Stream\PhpStreamRequestFactory();
- /** @var \OpenCloud\Common\Http\Client $client */
- $client = $c->getClient();
- $streamInterface = $streamFactory->fromRequest($client->get($c->getUrl($path)));
- $streamInterface->rewind();
- $stream = $streamInterface->getStream();
- stream_context_set_option($stream, 'swift','content', $streamInterface);
- if(!strrpos($streamInterface
- ->getMetaData('wrapper_data')[0], '404 Not Found')) {
- return RetryWrapper::wrap($stream);
- }
- return false;
- } catch (\Guzzle\Http\Exception\BadResponseException $e) {
+ return $this->objectStore->readObject($path);
+ } catch (BadResponseError $e) {
\OC::$server->getLogger()->logException($e, [
'level' => \OCP\Util::ERROR,
'app' => 'files_external',
@@ -454,24 +435,25 @@ class Swift extends \OC\Files\Storage\Common {
if (is_null($mtime)) {
$mtime = time();
}
- $metadata = array('timestamp' => $mtime);
+ $metadata = ['timestamp' => $mtime];
if ($this->file_exists($path)) {
if ($this->is_dir($path) && $path !== '.') {
$path .= '/';
}
$object = $this->fetchObject($path);
- if ($object->saveMetadata($metadata)) {
+ if ($object->mergeMetadata($metadata)) {
// invalidate target object to force repopulation on fetch
$this->objectCache->remove($path);
}
return true;
} else {
$mimeType = \OC::$server->getMimeTypeDetector()->detectPath($path);
- $customHeaders = array('content-type' => $mimeType);
- $metadataHeaders = DataObject::stockHeaders($metadata);
- $allHeaders = $customHeaders + $metadataHeaders;
- $this->getContainer()->uploadObject($path, '', $allHeaders);
+ $this->getContainer()->createObject([
+ 'name' => $path,
+ 'content' => '',
+ 'headers' => ['content-type' => 'httpd/unix-directory']
+ ]);
// invalidate target object to force repopulation on fetch
$this->objectCache->remove($path);
return true;
@@ -483,18 +465,21 @@ class Swift extends \OC\Files\Storage\Common {
$path2 = $this->normalizePath($path2);
$fileType = $this->filetype($path1);
- if ($fileType === 'file') {
-
+ if ($fileType) {
// make way
$this->unlink($path2);
+ }
+ if ($fileType === 'file') {
try {
$source = $this->fetchObject($path1);
- $source->copy($this->bucket . '/' . $path2);
+ $source->copy([
+ 'destination' => $this->bucket . '/' . $path2
+ ]);
// invalidate target object to force repopulation on fetch
$this->objectCache->remove($path2);
$this->objectCache->remove($path2 . '/');
- } catch (ClientErrorResponseException $e) {
+ } catch (BadResponseError $e) {
\OC::$server->getLogger()->logException($e, [
'level' => \OCP\Util::ERROR,
'app' => 'files_external',
@@ -503,17 +488,15 @@ class Swift extends \OC\Files\Storage\Common {
}
} else if ($fileType === 'dir') {
-
- // make way
- $this->unlink($path2);
-
try {
$source = $this->fetchObject($path1 . '/');
- $source->copy($this->bucket . '/' . $path2 . '/');
+ $source->copy([
+ 'destination' => $this->bucket . '/' . $path2 . '/'
+ ]);
// invalidate target object to force repopulation on fetch
$this->objectCache->remove($path2);
$this->objectCache->remove($path2 . '/');
- } catch (ClientErrorResponseException $e) {
+ } catch (BadResponseError $e) {
\OC::$server->getLogger()->logException($e, [
'level' => \OCP\Util::ERROR,
'app' => 'files_external',
@@ -554,6 +537,7 @@ class Swift extends \OC\Files\Storage\Common {
// cleanup
if ($this->unlink($path1) === false) {
+ throw new \Exception('failed to remove original');
$this->unlink($path2);
return false;
}
@@ -569,80 +553,26 @@ class Swift extends \OC\Files\Storage\Common {
}
/**
- * Returns the connection
- *
- * @return OpenCloud\ObjectStore\Service connected client
- * @throws \Exception if connection could not be made
- */
- public function getConnection() {
- if (!is_null($this->connection)) {
- return $this->connection;
- }
-
- $settings = array(
- 'username' => $this->params['user'],
- );
-
- if (!empty($this->params['password'])) {
- $settings['password'] = $this->params['password'];
- } else if (!empty($this->params['key'])) {
- $settings['apiKey'] = $this->params['key'];
- }
-
- if (!empty($this->params['tenant'])) {
- $settings['tenantName'] = $this->params['tenant'];
- }
-
- if (!empty($this->params['timeout'])) {
- $settings['timeout'] = $this->params['timeout'];
- }
-
- if (isset($settings['apiKey'])) {
- $this->anchor = new Rackspace($this->params['url'], $settings);
- } else {
- $this->anchor = new OpenStack($this->params['url'], $settings);
- }
-
- $connection = $this->anchor->objectStoreService($this->params['service_name'], $this->params['region']);
-
- if (!empty($this->params['endpoint_url'])) {
- $endpoint = $connection->getEndpoint();
- $endpoint->setPublicUrl($this->params['endpoint_url']);
- $endpoint->setPrivateUrl($this->params['endpoint_url']);
- $connection->setEndpoint($endpoint);
- }
-
- $this->connection = $connection;
-
- return $this->connection;
- }
-
- /**
* Returns the initialized object store container.
*
- * @return OpenCloud\ObjectStore\Resource\Container
+ * @return \OpenStack\ObjectStore\v1\Models\Container
+ * @throws \OCP\Files\StorageAuthException
+ * @throws \OCP\Files\StorageNotAvailableException
*/
public function getContainer() {
- if (!is_null($this->container)) {
- return $this->container;
- }
+ if (is_null($this->container)) {
+ $this->container = $this->connectionFactory->getContainer();
- try {
- $this->container = $this->getConnection()->getContainer($this->bucket);
- } catch (ClientErrorResponseException $e) {
- $this->container = $this->getConnection()->createContainer($this->bucket);
- }
-
- if (!$this->file_exists('.')) {
- $this->mkdir('.');
+ if (!$this->file_exists('.')) {
+ $this->mkdir('.');
+ }
}
-
return $this->container;
}
public function writeBack($tmpFile, $path) {
$fileData = fopen($tmpFile, 'r');
- $this->getContainer()->uploadObject($path, $fileData);
+ $this->objectStore->writeObject($path, $fileData);
// invalidate target object to force repopulation on fetch
$this->objectCache->remove($path);
unlink($tmpFile);
diff --git a/apps/files_external/lib/Lib/StorageModifierTrait.php b/apps/files_external/lib/Lib/StorageModifierTrait.php
index 3327869e1a3..a0f5c53382e 100644
--- a/apps/files_external/lib/Lib/StorageModifierTrait.php
+++ b/apps/files_external/lib/Lib/StorageModifierTrait.php
@@ -24,8 +24,6 @@ namespace OCA\Files_External\Lib;
use \OCP\IUser;
use \OCP\Files\Storage;
-use \OCA\Files_External\Lib\StorageConfig;
-use \OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException;
use \OCP\Files\StorageNotAvailableException;
/**
diff --git a/apps/files_external/lib/Migration/StorageMigrator.php b/apps/files_external/lib/Migration/StorageMigrator.php
index 2ecc5d6cd66..ceb5f4a2bda 100644
--- a/apps/files_external/lib/Migration/StorageMigrator.php
+++ b/apps/files_external/lib/Migration/StorageMigrator.php
@@ -27,7 +27,6 @@ namespace OCA\Files_External\Migration;
use OCA\Files_External\Service\BackendService;
use OCA\Files_External\Service\DBConfigService;
use OCA\Files_External\Service\GlobalLegacyStoragesService;
-use OCA\Files_External\Service\GlobalStoragesService;
use OCA\Files_External\Service\LegacyStoragesService;
use OCA\Files_External\Service\StoragesService;
use OCA\Files_External\Service\UserLegacyStoragesService;
diff --git a/apps/files_external/lib/Service/UserStoragesService.php b/apps/files_external/lib/Service/UserStoragesService.php
index db03befa852..0c422b2b85e 100644
--- a/apps/files_external/lib/Service/UserStoragesService.php
+++ b/apps/files_external/lib/Service/UserStoragesService.php
@@ -32,8 +32,6 @@ use \OC\Files\Filesystem;
use OCA\Files_External\Lib\StorageConfig;
use OCA\Files_External\NotFoundException;
-use \OCA\Files_External\Service\BackendService;
-use \OCA\Files_External\Service\UserTrait;
/**
* Service class to manage user external storages
diff --git a/apps/files_external/lib/Settings/Personal.php b/apps/files_external/lib/Settings/Personal.php
index 7aec459bfb7..1bd140f0b35 100644
--- a/apps/files_external/lib/Settings/Personal.php
+++ b/apps/files_external/lib/Settings/Personal.php
@@ -25,7 +25,6 @@ namespace OCA\Files_External\Settings;
use OCA\Files_External\Lib\Auth\Password\GlobalAuth;
use OCA\Files_External\Service\BackendService;
-use OCA\Files_External\Service\GlobalStoragesService;
use OCA\Files_External\Service\UserGlobalStoragesService;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\Encryption\IManager;
diff --git a/apps/files_external/templates/list.php b/apps/files_external/templates/list.php
index d006514bcde..ed13ed83701 100644
--- a/apps/files_external/templates/list.php
+++ b/apps/files_external/templates/list.php
@@ -6,8 +6,7 @@
<div id="emptycontent" class="hidden">
<div class="icon-external"></div>
- <h2><?php p($l->t('No external storage configured')); ?></h2>
- <p><a href="<?php p(link_to('', 'index.php/settings/personal#files_external' )); ?>"><?php p($l->t('You can add external storages in the personal settings')); ?></a></p>
+ <h2><?php p($l->t('No external storage configured or you don\'t have the permission to configure them')); ?></h2>
</div>
<input type="hidden" name="dir" value="" id="dir">
diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php
index 237985bfd0f..11b3451c32e 100644
--- a/apps/files_external/templates/settings.php
+++ b/apps/files_external/templates/settings.php
@@ -87,6 +87,11 @@
}
?>
+<div id="emptycontent" class="hidden">
+ <div class="icon-external"></div>
+ <h2><?php p($l->t('No external storage configured or you don\'t have the permission to configure them')); ?></h2>
+</div>
+
<form data-can-create="<?php echo $canCreateMounts?'true':'false' ?>" id="files_external" class="section" data-encryption-enabled="<?php echo $_['encryptionEnabled']?'true': 'false'; ?>">
<h2 data-anchor-name="external-storage"><?php p($l->t('External storages')); ?></h2>
<?php if (isset($_['dependencies']) and ($_['dependencies'] !== '') and $canCreateMounts) print_unescaped(''.$_['dependencies'].''); ?>
diff --git a/apps/files_external/tests/Storage/SwiftTest.php b/apps/files_external/tests/Storage/SwiftTest.php
index 19f185ed033..fdda8baace8 100644
--- a/apps/files_external/tests/Storage/SwiftTest.php
+++ b/apps/files_external/tests/Storage/SwiftTest.php
@@ -27,6 +27,7 @@
namespace OCA\Files_External\Tests\Storage;
+use GuzzleHttp\Exception\ClientException;
use \OCA\Files_External\Lib\Storage\Swift;
/**
@@ -40,6 +41,11 @@ class SwiftTest extends \Test\Files\Storage\Storage {
private $config;
+ /**
+ * @var Swift instance
+ */
+ protected $instance;
+
protected function setUp() {
parent::setUp();
@@ -53,17 +59,15 @@ class SwiftTest extends \Test\Files\Storage\Storage {
protected function tearDown() {
if ($this->instance) {
try {
- $connection = $this->instance->getConnection();
- $container = $connection->getContainer($this->config['bucket']);
+ $container = $this->instance->getContainer();
- $objects = $container->objectList();
- while($object = $objects->next()) {
- $object->setName(str_replace('#','%23',$object->getName()));
+ $objects = $container->listObjects();
+ foreach ($objects as $object) {
$object->delete();
}
$container->delete();
- } catch (\Guzzle\Http\Exception\ClientErrorResponseException $e) {
+ } catch (ClientException $e) {
// container didn't exist, so we don't need to delete it
}
}
diff --git a/apps/files_sharing/appinfo/info.xml b/apps/files_sharing/appinfo/info.xml
index 326bd49e9bc..b4c54247267 100644
--- a/apps/files_sharing/appinfo/info.xml
+++ b/apps/files_sharing/appinfo/info.xml
@@ -1,28 +1,46 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>files_sharing</id>
<name>File sharing</name>
+ <summary>File sharing</summary>
<description>
This application enables users to share files within Nextcloud. If enabled, the admin can choose which groups can share files. The applicable users can then share files and folders with other users and groups within Nextcloud. In addition, if the admin enables the share link feature, an external link can be used to share files with other users outside of Nextcloud. Admins can also enforce passwords, expirations dates, and enable server to server sharing via share links, as well as sharing from mobile devices.
Turning the feature off removes shared files and folders on the server for all share recipients, and also on the sync clients and mobile apps. More information is available in the Nextcloud Documentation.
</description>
- <licence>AGPL</licence>
+ <version>1.6.0</version>
+ <licence>agpl</licence>
<author>Michael Gapczynski</author>
<author>Bjoern Schiessle</author>
+ <namespace>Files_Sharing</namespace>
<default_enable/>
- <version>1.6.0</version>
<types>
<filesystem/>
</types>
+
+ <category>files</category>
+ <category>social</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
- <public>
- <files>public.php</files>
- </public>
- <namespace>Files_Sharing</namespace>
+ <background-jobs>
+ <job>OCA\Files_Sharing\DeleteOrphanedSharesJob</job>
+ <job>OCA\Files_Sharing\ExpireSharesJob</job>
+ </background-jobs>
+
+ <repair-steps>
+ <post-migration>
+ <step>OCA\Files_Sharing\Migration\OwncloudGuestShareType</step>
+ <step>OCA\Files_Sharing\Migration\SetPasswordColumn</step>
+ </post-migration>
+ </repair-steps>
+
+ <commands>
+ <command>OCA\Files_Sharing\Command\CleanupRemoteStorages</command>
+ </commands>
<activity>
<settings>
@@ -44,25 +62,13 @@ Turning the feature off removes shared files and folders on the server for all s
</providers>
</activity>
- <background-jobs>
- <job>OCA\Files_Sharing\DeleteOrphanedSharesJob</job>
- <job>OCA\Files_Sharing\ExpireSharesJob</job>
- </background-jobs>
-
- <commands>
- <command>OCA\Files_Sharing\Command\CleanupRemoteStorages</command>
- </commands>
-
- <repair-steps>
- <post-migration>
- <step>OCA\Files_Sharing\Migration\OwncloudGuestShareType</step>
- <step>OCA\Files_Sharing\Migration\SetPasswordColumn</step>
- </post-migration>
- </repair-steps>
-
<collaboration>
<plugins>
<plugin type="autocomplete-sort">OCA\Files_Sharing\Collaboration\ShareRecipientSorter</plugin>
</plugins>
</collaboration>
+
+ <public>
+ <files>public.php</files>
+ </public>
</info>
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index aa0803c491b..b2715912d3b 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -12,6 +12,7 @@
_.extend(OC.Files.Client, {
PROPERTY_SHARE_TYPES: '{' + OC.Files.Client.NS_OWNCLOUD + '}share-types',
+ PROPERTY_OWNER_ID: '{' + OC.Files.Client.NS_OWNCLOUD + '}owner-id',
PROPERTY_OWNER_DISPLAY_NAME: '{' + OC.Files.Client.NS_OWNCLOUD + '}owner-display-name'
});
@@ -66,6 +67,7 @@
var fileInfo = oldElementToFile.apply(this, arguments);
fileInfo.sharePermissions = $el.attr('data-share-permissions') || undefined;
fileInfo.shareOwner = $el.attr('data-share-owner') || undefined;
+ fileInfo.shareOwnerId = $el.attr('data-share-owner-id') || undefined;
if( $el.attr('data-share-types')){
fileInfo.shareTypes = $el.attr('data-share-types').split(',');
@@ -83,6 +85,7 @@
var oldGetWebdavProperties = fileList._getWebdavProperties;
fileList._getWebdavProperties = function() {
var props = oldGetWebdavProperties.apply(this, arguments);
+ props.push(OC.Files.Client.PROPERTY_OWNER_ID);
props.push(OC.Files.Client.PROPERTY_OWNER_DISPLAY_NAME);
props.push(OC.Files.Client.PROPERTY_SHARE_TYPES);
return props;
@@ -95,6 +98,7 @@
if (permissionsProp && permissionsProp.indexOf('S') >= 0) {
data.shareOwner = props[OC.Files.Client.PROPERTY_OWNER_DISPLAY_NAME];
+ data.shareOwnerId = props[OC.Files.Client.PROPERTY_OWNER_ID];
}
var shareTypesProp = props[OC.Files.Client.PROPERTY_SHARE_TYPES];
diff --git a/apps/files_sharing/l10n/hu.js b/apps/files_sharing/l10n/hu.js
index 9705d709fa6..df038f6f38f 100644
--- a/apps/files_sharing/l10n/hu.js
+++ b/apps/files_sharing/l10n/hu.js
@@ -88,6 +88,7 @@ OC.L10N.register(
"Can't change permissions for public share links" : "Nem lehet módosítani a nyilvános megosztási hivatkozások jogosultságait",
"Cannot increase permissions" : "Nem lehet növelni az engedélyeket",
"Share API is disabled" : "Megosztás API letiltva",
+ "File sharing" : "Fájlmegosztás",
"This share is password-protected" : "Ez egy jelszóval védett megosztás",
"The password is wrong. Try again." : "A megadott jelszó nem megfelelő. Próbálja újra!",
"Password" : "Jelszó",
diff --git a/apps/files_sharing/l10n/hu.json b/apps/files_sharing/l10n/hu.json
index 628741239dd..1b65474cda2 100644
--- a/apps/files_sharing/l10n/hu.json
+++ b/apps/files_sharing/l10n/hu.json
@@ -86,6 +86,7 @@
"Can't change permissions for public share links" : "Nem lehet módosítani a nyilvános megosztási hivatkozások jogosultságait",
"Cannot increase permissions" : "Nem lehet növelni az engedélyeket",
"Share API is disabled" : "Megosztás API letiltva",
+ "File sharing" : "Fájlmegosztás",
"This share is password-protected" : "Ez egy jelszóval védett megosztás",
"The password is wrong. Try again." : "A megadott jelszó nem megfelelő. Próbálja újra!",
"Password" : "Jelszó",
diff --git a/apps/files_sharing/l10n/ja.js b/apps/files_sharing/l10n/ja.js
index a9df4eb22da..e0ea814ebd7 100644
--- a/apps/files_sharing/l10n/ja.js
+++ b/apps/files_sharing/l10n/ja.js
@@ -88,6 +88,7 @@ OC.L10N.register(
"Can't change permissions for public share links" : "URLリンク共有のパーミッションを変更できません",
"Cannot increase permissions" : "パーミッションを追加できません",
"Share API is disabled" : "共有APIが無効です。",
+ "File sharing" : "ファイル共有",
"This share is password-protected" : "この共有はパスワードで保護されています",
"The password is wrong. Try again." : "パスワードが間違っています。再試行してください。",
"Password" : "パスワード",
@@ -109,6 +110,7 @@ OC.L10N.register(
"Upload files to %s" : "%s にファイルをアップロード",
"Select or drop files" : "ファイルを選択するか、ドラッグ&ドロップしてください",
"Uploading files…" : "ファイルをアップロード中...",
- "Uploaded files:" : "アップロード済ファイル:"
+ "Uploaded files:" : "アップロード済ファイル:",
+ "%s is publicly shared" : "%s が公開共有されました"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_sharing/l10n/ja.json b/apps/files_sharing/l10n/ja.json
index dbb7604ee6a..0ed2739e522 100644
--- a/apps/files_sharing/l10n/ja.json
+++ b/apps/files_sharing/l10n/ja.json
@@ -86,6 +86,7 @@
"Can't change permissions for public share links" : "URLリンク共有のパーミッションを変更できません",
"Cannot increase permissions" : "パーミッションを追加できません",
"Share API is disabled" : "共有APIが無効です。",
+ "File sharing" : "ファイル共有",
"This share is password-protected" : "この共有はパスワードで保護されています",
"The password is wrong. Try again." : "パスワードが間違っています。再試行してください。",
"Password" : "パスワード",
@@ -107,6 +108,7 @@
"Upload files to %s" : "%s にファイルをアップロード",
"Select or drop files" : "ファイルを選択するか、ドラッグ&ドロップしてください",
"Uploading files…" : "ファイルをアップロード中...",
- "Uploaded files:" : "アップロード済ファイル:"
+ "Uploaded files:" : "アップロード済ファイル:",
+ "%s is publicly shared" : "%s が公開共有されました"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/lv.js b/apps/files_sharing/l10n/lv.js
index 2c6d990ed76..cfed9516baf 100644
--- a/apps/files_sharing/l10n/lv.js
+++ b/apps/files_sharing/l10n/lv.js
@@ -5,11 +5,11 @@ OC.L10N.register(
"Shared with others" : "Koplietots ar citiem",
"Shared by link" : "Koplietots ar saiti",
"Nothing shared with you yet" : "Nekas vēl nav koplietots",
- "Files and folders others share with you will show up here" : "Faili un mapes, ko citi koplietos ar tevi, tiks rādīti šeit",
+ "Files and folders others share with you will show up here" : "Datnes un mapes, ko citi koplietos ar tevi, tiks rādīti šeit",
"Nothing shared yet" : "Nekas vēl nav koplietots",
- "Files and folders you share will show up here" : "Faili un mapes, ko koplietosi ar citiem, tiks rādīti šeit",
+ "Files and folders you share will show up here" : "Datnes un mapes, ko koplietosi ar citiem, tiks rādīti šeit",
"No shared links" : "Nav koplietotu saišu",
- "Files and folders you share by link will show up here" : "Faili un mapes, ko koplietosi ar saitēm, tiks rādīti šeit",
+ "Files and folders you share by link will show up here" : "Datnes un mapes, ko koplietosi ar saitēm, tiks rādīti šeit",
"You can upload into this folder" : "Jūs variet augšuplādēt šajā mapē",
"No compatible server found at {remote}" : "Nav atrasts neviens saderīgs serveris {remote}",
"Invalid server URL" : "Nederīgs servera url",
@@ -18,7 +18,7 @@ OC.L10N.register(
"No expiration date set" : "Nav noteikts derīguma termiņa beigu datums",
"Shared by" : "Koplietoja",
"Sharing" : "Koplietošana",
- "File shares" : "Failu koplietojumi",
+ "File shares" : "Datņu koplietojumi",
"Downloaded via public link" : "Lejupielādēt izmantojot publisku saiti",
"Downloaded by {email}" : "Lejupielādēts {email}",
"{file} downloaded via public link" : "{file} lejupielādēts izmantojot publisku saiti",
diff --git a/apps/files_sharing/l10n/lv.json b/apps/files_sharing/l10n/lv.json
index 831a042dd7f..7ea92586707 100644
--- a/apps/files_sharing/l10n/lv.json
+++ b/apps/files_sharing/l10n/lv.json
@@ -3,11 +3,11 @@
"Shared with others" : "Koplietots ar citiem",
"Shared by link" : "Koplietots ar saiti",
"Nothing shared with you yet" : "Nekas vēl nav koplietots",
- "Files and folders others share with you will show up here" : "Faili un mapes, ko citi koplietos ar tevi, tiks rādīti šeit",
+ "Files and folders others share with you will show up here" : "Datnes un mapes, ko citi koplietos ar tevi, tiks rādīti šeit",
"Nothing shared yet" : "Nekas vēl nav koplietots",
- "Files and folders you share will show up here" : "Faili un mapes, ko koplietosi ar citiem, tiks rādīti šeit",
+ "Files and folders you share will show up here" : "Datnes un mapes, ko koplietosi ar citiem, tiks rādīti šeit",
"No shared links" : "Nav koplietotu saišu",
- "Files and folders you share by link will show up here" : "Faili un mapes, ko koplietosi ar saitēm, tiks rādīti šeit",
+ "Files and folders you share by link will show up here" : "Datnes un mapes, ko koplietosi ar saitēm, tiks rādīti šeit",
"You can upload into this folder" : "Jūs variet augšuplādēt šajā mapē",
"No compatible server found at {remote}" : "Nav atrasts neviens saderīgs serveris {remote}",
"Invalid server URL" : "Nederīgs servera url",
@@ -16,7 +16,7 @@
"No expiration date set" : "Nav noteikts derīguma termiņa beigu datums",
"Shared by" : "Koplietoja",
"Sharing" : "Koplietošana",
- "File shares" : "Failu koplietojumi",
+ "File shares" : "Datņu koplietojumi",
"Downloaded via public link" : "Lejupielādēt izmantojot publisku saiti",
"Downloaded by {email}" : "Lejupielādēts {email}",
"{file} downloaded via public link" : "{file} lejupielādēts izmantojot publisku saiti",
diff --git a/apps/files_sharing/l10n/nl.js b/apps/files_sharing/l10n/nl.js
index a54c1d46224..0a35c91d20a 100644
--- a/apps/files_sharing/l10n/nl.js
+++ b/apps/files_sharing/l10n/nl.js
@@ -88,6 +88,7 @@ OC.L10N.register(
"Can't change permissions for public share links" : "Kan rechten voor openbaar gedeelde links niet wijzigen",
"Cannot increase permissions" : "Kan de rechten niet verruimen",
"Share API is disabled" : "Delen API is uitgeschakeld",
+ "File sharing" : "Bestand delen",
"This share is password-protected" : "Deze gedeelde folder is met een wachtwoord beveiligd",
"The password is wrong. Try again." : "Wachtwoord ongeldig. Probeer het nogmaals.",
"Password" : "Wachtwoord",
@@ -109,6 +110,7 @@ OC.L10N.register(
"Upload files to %s" : "Upload bestanden naar %s",
"Select or drop files" : "Selecteer bestanden of sleep ze naar dit venster",
"Uploading files…" : "Uploaden bestanden...",
- "Uploaded files:" : "Geüploade bestanden"
+ "Uploaded files:" : "Geüploade bestanden",
+ "%s is publicly shared" : "%s is openbaar gedeeld"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/nl.json b/apps/files_sharing/l10n/nl.json
index 237257a9dbe..859c6652e47 100644
--- a/apps/files_sharing/l10n/nl.json
+++ b/apps/files_sharing/l10n/nl.json
@@ -86,6 +86,7 @@
"Can't change permissions for public share links" : "Kan rechten voor openbaar gedeelde links niet wijzigen",
"Cannot increase permissions" : "Kan de rechten niet verruimen",
"Share API is disabled" : "Delen API is uitgeschakeld",
+ "File sharing" : "Bestand delen",
"This share is password-protected" : "Deze gedeelde folder is met een wachtwoord beveiligd",
"The password is wrong. Try again." : "Wachtwoord ongeldig. Probeer het nogmaals.",
"Password" : "Wachtwoord",
@@ -107,6 +108,7 @@
"Upload files to %s" : "Upload bestanden naar %s",
"Select or drop files" : "Selecteer bestanden of sleep ze naar dit venster",
"Uploading files…" : "Uploaden bestanden...",
- "Uploaded files:" : "Geüploade bestanden"
+ "Uploaded files:" : "Geüploade bestanden",
+ "%s is publicly shared" : "%s is openbaar gedeeld"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/pt_PT.js b/apps/files_sharing/l10n/pt_PT.js
index f2c387e7591..a1af9e5d1c8 100644
--- a/apps/files_sharing/l10n/pt_PT.js
+++ b/apps/files_sharing/l10n/pt_PT.js
@@ -79,6 +79,8 @@ OC.L10N.register(
"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",
"Sharing %s failed because the back end does not allow shares from type %s" : "A partilha de %s falhou porque \"back end\" não permite partilhas do tipo %s",
+ "You cannot share to a Circle if the app is not enabled" : "Não pode partilhar um Círculo se a aplicação não estiver activa",
+ "Please specify a valid circle" : "Por favor especifique um círculo válido",
"Unknown share type" : "Tipo de partilha desconhecido",
"Not a directory" : "Não é uma diretoria",
"Could not lock path" : "Não foi possível bloquear o caminho",
@@ -86,6 +88,7 @@ OC.L10N.register(
"Can't change permissions for public share links" : "Não é possível alterar as permissões para as hiperligações de partilha pública",
"Cannot increase permissions" : "Não é possível incrementar as permissões",
"Share API is disabled" : "A partilha de API está desativada",
+ "File sharing" : "Partilha de ficheiro",
"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",
@@ -102,6 +105,7 @@ OC.L10N.register(
"shared by %s" : "partilhado por %s",
"Download" : "Transferir",
"Direct link" : "Hiperligação direta",
+ "Add to your Nextcloud" : "Adicionar à sua Nextcloud",
"Download %s" : "Transferir %s",
"Upload files to %s" : "Enviar ficheiros para %s",
"Select or drop files" : "Seleccione ou solte ficheiros",
diff --git a/apps/files_sharing/l10n/pt_PT.json b/apps/files_sharing/l10n/pt_PT.json
index c6ce44a9f88..40d57e3ffe8 100644
--- a/apps/files_sharing/l10n/pt_PT.json
+++ b/apps/files_sharing/l10n/pt_PT.json
@@ -77,6 +77,8 @@
"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",
"Sharing %s failed because the back end does not allow shares from type %s" : "A partilha de %s falhou porque \"back end\" não permite partilhas do tipo %s",
+ "You cannot share to a Circle if the app is not enabled" : "Não pode partilhar um Círculo se a aplicação não estiver activa",
+ "Please specify a valid circle" : "Por favor especifique um círculo válido",
"Unknown share type" : "Tipo de partilha desconhecido",
"Not a directory" : "Não é uma diretoria",
"Could not lock path" : "Não foi possível bloquear o caminho",
@@ -84,6 +86,7 @@
"Can't change permissions for public share links" : "Não é possível alterar as permissões para as hiperligações de partilha pública",
"Cannot increase permissions" : "Não é possível incrementar as permissões",
"Share API is disabled" : "A partilha de API está desativada",
+ "File sharing" : "Partilha de ficheiro",
"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",
@@ -100,6 +103,7 @@
"shared by %s" : "partilhado por %s",
"Download" : "Transferir",
"Direct link" : "Hiperligação direta",
+ "Add to your Nextcloud" : "Adicionar à sua Nextcloud",
"Download %s" : "Transferir %s",
"Upload files to %s" : "Enviar ficheiros para %s",
"Select or drop files" : "Seleccione ou solte ficheiros",
diff --git a/apps/files_sharing/l10n/ru.js b/apps/files_sharing/l10n/ru.js
index 72cefe4c4b8..1e59cc3779e 100644
--- a/apps/files_sharing/l10n/ru.js
+++ b/apps/files_sharing/l10n/ru.js
@@ -34,13 +34,13 @@ OC.L10N.register(
"Shared as public link" : "Предоставлен доступ общедоступной ссылкой",
"Removed public link" : "Общедоступная ссылка удалена",
"Public link expired" : "Истёк срок действия общедоступной ссылки",
- "{actor} shared as public link" : "{actor} поделился(ась) общедоступной ссылкой",
+ "{actor} shared as public link" : "{actor} открыл(а) общий доступ созданием общедоступной ссылки",
"{actor} removed public link" : "{actor} удалил(а) общедоступную ссылку",
"Public link of {actor} expired" : "Истёк срок действия общедоступной ссылки пользователя {actor}",
"You shared {file} as public link" : "Вы предоставили общий доступ к «{file}» созданием общедоступной ссылки",
"You removed public link for {file}" : "Вы удалили общедоступную ссылку на «{file}»",
"Public link expired for {file}" : "Истёк срок действия общедоступной ссылки на «{file}»",
- "{actor} shared {file} as public link" : "{actor} открыл(а) общий доступ к «{file}» в виде общедоступной ссылки",
+ "{actor} shared {file} as public link" : "{actor} предоставил(а) общий доступ к «{file}» созданием общедоступной ссылки",
"{actor} removed public link for {file}" : "{actor} удалил(а) общедоступную ссылку на «{file}»",
"Public link of {actor} for {file} expired" : "Истёк срок действия общедоступной ссылки на «{file}», созданной {actor}.",
"{user} accepted the remote share" : "{user} принял(а) общий ресурс другого сервера",
@@ -55,11 +55,11 @@ OC.L10N.register(
"{actor} removed share for {user}" : "{actor} закрыл(а) общий доступ пользователю {user}",
"Shared by {actor}" : "Общий доступ был открыт пользователем {actor}",
"{actor} removed share" : "{actor} закрыл(а) общий доступ",
- "You shared {file} with {user}" : "Вы поделились «{file}» с пользователем {user}",
+ "You shared {file} with {user}" : "Вы предоставили пользователю {user} общий доступ к «{file}»",
"You removed {user} from {file}" : "Вы закрыли пользователю {user} общий доступ к «{file}»",
- "{actor} shared {file} with {user}" : "{actor} поделился(ась) «{file}» с пользователем {user}",
- "{actor} removed {user} from {file}" : "{actor} закрыл(а) пользователю общий доступ к «{file}»",
- "{actor} shared {file} with you" : "{actor} открыл(а) вам общий доступ к «{file}»",
+ "{actor} shared {file} with {user}" : "{actor} предоставил(а) пользователю {user} общий доступ к «{file}»",
+ "{actor} removed {user} from {file}" : "{actor} закрыл(а) пользователю {user} общий доступ к «{file}»",
+ "{actor} shared {file} with you" : "{actor} предоставил(а) вам общий доступ к «{file}»",
"{actor} removed you from {file}" : "{actor} закрыл(а) вам общий доступ к «{file}»",
"A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Файл или папка, которыми поделились по электронной почте или общедоступной ссылке, были <strong>скачаны</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Общий доступ к файлу или каталогу был открыт <strong>с другого сервера</strong>",
@@ -79,7 +79,7 @@ OC.L10N.register(
"Public upload is only possible for publicly shared folders" : "Общедоступная загрузка возможна только в общедоступные папки",
"Invalid date, date format must be YYYY-MM-DD" : "Неверная дата, формат даты должен быть ГГГГ-ММ-ДД",
"Sharing %s failed because the back end does not allow shares from type %s" : "Не удалось предоставить общий доступ к «%s», поскольку механизм удалённого обмена не разрешает публикации типа %s",
- "You cannot share to a Circle if the app is not enabled" : "Вы не можете поделиться с кругом, если приложение «Круг» не включено",
+ "You cannot share to a Circle if the app is not enabled" : "Вы не можете поделиться с кругом, если приложение «Круг» не включено",
"Please specify a valid circle" : "Укажите верный круг",
"Unknown share type" : "Общий доступ неизвестного типа",
"Not a directory" : "Это не каталог",
@@ -88,6 +88,7 @@ OC.L10N.register(
"Can't change permissions for public share links" : "Для общедоступных ссылок изменение прав невозможно",
"Cannot increase permissions" : "Нельзя увеличить права",
"Share API is disabled" : "API общего доступа отключён",
+ "File sharing" : "Обмен файлами",
"This share is password-protected" : "Общий ресурс защищён паролем",
"The password is wrong. Try again." : "Неверный пароль. Попробуйте ещё раз.",
"Password" : "Пароль",
@@ -109,6 +110,7 @@ OC.L10N.register(
"Upload files to %s" : "Загрузка файлов пользователю %s",
"Select or drop files" : "Выберите или перетащите файлы",
"Uploading files…" : "Файлы передаются на сервер...",
- "Uploaded files:" : "Отправленные файлы:"
+ "Uploaded files:" : "Отправленные файлы:",
+ "%s is publicly shared" : "«%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/apps/files_sharing/l10n/ru.json b/apps/files_sharing/l10n/ru.json
index 268b97ab7b1..171f690d8da 100644
--- a/apps/files_sharing/l10n/ru.json
+++ b/apps/files_sharing/l10n/ru.json
@@ -32,13 +32,13 @@
"Shared as public link" : "Предоставлен доступ общедоступной ссылкой",
"Removed public link" : "Общедоступная ссылка удалена",
"Public link expired" : "Истёк срок действия общедоступной ссылки",
- "{actor} shared as public link" : "{actor} поделился(ась) общедоступной ссылкой",
+ "{actor} shared as public link" : "{actor} открыл(а) общий доступ созданием общедоступной ссылки",
"{actor} removed public link" : "{actor} удалил(а) общедоступную ссылку",
"Public link of {actor} expired" : "Истёк срок действия общедоступной ссылки пользователя {actor}",
"You shared {file} as public link" : "Вы предоставили общий доступ к «{file}» созданием общедоступной ссылки",
"You removed public link for {file}" : "Вы удалили общедоступную ссылку на «{file}»",
"Public link expired for {file}" : "Истёк срок действия общедоступной ссылки на «{file}»",
- "{actor} shared {file} as public link" : "{actor} открыл(а) общий доступ к «{file}» в виде общедоступной ссылки",
+ "{actor} shared {file} as public link" : "{actor} предоставил(а) общий доступ к «{file}» созданием общедоступной ссылки",
"{actor} removed public link for {file}" : "{actor} удалил(а) общедоступную ссылку на «{file}»",
"Public link of {actor} for {file} expired" : "Истёк срок действия общедоступной ссылки на «{file}», созданной {actor}.",
"{user} accepted the remote share" : "{user} принял(а) общий ресурс другого сервера",
@@ -53,11 +53,11 @@
"{actor} removed share for {user}" : "{actor} закрыл(а) общий доступ пользователю {user}",
"Shared by {actor}" : "Общий доступ был открыт пользователем {actor}",
"{actor} removed share" : "{actor} закрыл(а) общий доступ",
- "You shared {file} with {user}" : "Вы поделились «{file}» с пользователем {user}",
+ "You shared {file} with {user}" : "Вы предоставили пользователю {user} общий доступ к «{file}»",
"You removed {user} from {file}" : "Вы закрыли пользователю {user} общий доступ к «{file}»",
- "{actor} shared {file} with {user}" : "{actor} поделился(ась) «{file}» с пользователем {user}",
- "{actor} removed {user} from {file}" : "{actor} закрыл(а) пользователю общий доступ к «{file}»",
- "{actor} shared {file} with you" : "{actor} открыл(а) вам общий доступ к «{file}»",
+ "{actor} shared {file} with {user}" : "{actor} предоставил(а) пользователю {user} общий доступ к «{file}»",
+ "{actor} removed {user} from {file}" : "{actor} закрыл(а) пользователю {user} общий доступ к «{file}»",
+ "{actor} shared {file} with you" : "{actor} предоставил(а) вам общий доступ к «{file}»",
"{actor} removed you from {file}" : "{actor} закрыл(а) вам общий доступ к «{file}»",
"A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Файл или папка, которыми поделились по электронной почте или общедоступной ссылке, были <strong>скачаны</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Общий доступ к файлу или каталогу был открыт <strong>с другого сервера</strong>",
@@ -77,7 +77,7 @@
"Public upload is only possible for publicly shared folders" : "Общедоступная загрузка возможна только в общедоступные папки",
"Invalid date, date format must be YYYY-MM-DD" : "Неверная дата, формат даты должен быть ГГГГ-ММ-ДД",
"Sharing %s failed because the back end does not allow shares from type %s" : "Не удалось предоставить общий доступ к «%s», поскольку механизм удалённого обмена не разрешает публикации типа %s",
- "You cannot share to a Circle if the app is not enabled" : "Вы не можете поделиться с кругом, если приложение «Круг» не включено",
+ "You cannot share to a Circle if the app is not enabled" : "Вы не можете поделиться с кругом, если приложение «Круг» не включено",
"Please specify a valid circle" : "Укажите верный круг",
"Unknown share type" : "Общий доступ неизвестного типа",
"Not a directory" : "Это не каталог",
@@ -86,6 +86,7 @@
"Can't change permissions for public share links" : "Для общедоступных ссылок изменение прав невозможно",
"Cannot increase permissions" : "Нельзя увеличить права",
"Share API is disabled" : "API общего доступа отключён",
+ "File sharing" : "Обмен файлами",
"This share is password-protected" : "Общий ресурс защищён паролем",
"The password is wrong. Try again." : "Неверный пароль. Попробуйте ещё раз.",
"Password" : "Пароль",
@@ -107,6 +108,7 @@
"Upload files to %s" : "Загрузка файлов пользователю %s",
"Select or drop files" : "Выберите или перетащите файлы",
"Uploading files…" : "Файлы передаются на сервер...",
- "Uploaded files:" : "Отправленные файлы:"
+ "Uploaded files:" : "Отправленные файлы:",
+ "%s is publicly shared" : "«%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/apps/files_sharing/l10n/zh_CN.js b/apps/files_sharing/l10n/zh_CN.js
index de33a357fbb..1b7a35ccf4c 100644
--- a/apps/files_sharing/l10n/zh_CN.js
+++ b/apps/files_sharing/l10n/zh_CN.js
@@ -88,6 +88,7 @@ OC.L10N.register(
"Can't change permissions for public share links" : "不能改变公共分享链接权限",
"Cannot increase permissions" : "不能增加权限",
"Share API is disabled" : "共享 API 已被禁用",
+ "File sharing" : "文件共享",
"This share is password-protected" : "这是一个密码保护的共享",
"The password is wrong. Try again." : "用户名或密码错误!请重试",
"Password" : "密码",
@@ -99,7 +100,7 @@ OC.L10N.register(
"Reasons might be:" : "可能原因是:",
"the item was removed" : "此项已移除",
"the link expired" : "链接过期",
- "sharing is disabled" : "分享已禁用",
+ "sharing is disabled" : "已禁用共享",
"For more info, please ask the person who sent this link." : "欲知详情,请联系发给你链接的人。",
"shared by %s" : "共享者 %s",
"Download" : "下载",
@@ -109,6 +110,7 @@ OC.L10N.register(
"Upload files to %s" : "上传文件到 %s",
"Select or drop files" : "选择或删除文件",
"Uploading files…" : "上传文件 … ",
- "Uploaded files:" : "上传的文件: "
+ "Uploaded files:" : "上传的文件: ",
+ "%s is publicly shared" : "%s 是公开共享"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_sharing/l10n/zh_CN.json b/apps/files_sharing/l10n/zh_CN.json
index 982d0bd238a..c76961670a3 100644
--- a/apps/files_sharing/l10n/zh_CN.json
+++ b/apps/files_sharing/l10n/zh_CN.json
@@ -86,6 +86,7 @@
"Can't change permissions for public share links" : "不能改变公共分享链接权限",
"Cannot increase permissions" : "不能增加权限",
"Share API is disabled" : "共享 API 已被禁用",
+ "File sharing" : "文件共享",
"This share is password-protected" : "这是一个密码保护的共享",
"The password is wrong. Try again." : "用户名或密码错误!请重试",
"Password" : "密码",
@@ -97,7 +98,7 @@
"Reasons might be:" : "可能原因是:",
"the item was removed" : "此项已移除",
"the link expired" : "链接过期",
- "sharing is disabled" : "分享已禁用",
+ "sharing is disabled" : "已禁用共享",
"For more info, please ask the person who sent this link." : "欲知详情,请联系发给你链接的人。",
"shared by %s" : "共享者 %s",
"Download" : "下载",
@@ -107,6 +108,7 @@
"Upload files to %s" : "上传文件到 %s",
"Select or drop files" : "选择或删除文件",
"Uploading files…" : "上传文件 … ",
- "Uploaded files:" : "上传的文件: "
+ "Uploaded files:" : "上传的文件: ",
+ "%s is publicly shared" : "%s 是公开共享"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_sharing/lib/Controller/ShareController.php b/apps/files_sharing/lib/Controller/ShareController.php
index b5b2979ec6b..795d069c1b8 100644
--- a/apps/files_sharing/lib/Controller/ShareController.php
+++ b/apps/files_sharing/lib/Controller/ShareController.php
@@ -35,7 +35,6 @@
namespace OCA\Files_Sharing\Controller;
-use OC\Files\Node\Folder;
use OC_Files;
use OC_Util;
use OCA\FederatedFileSharing\FederatedShareProvider;
diff --git a/apps/files_sharing/lib/Controller/ShareInfoController.php b/apps/files_sharing/lib/Controller/ShareInfoController.php
index 28bfcd12c24..14b56d28954 100644
--- a/apps/files_sharing/lib/Controller/ShareInfoController.php
+++ b/apps/files_sharing/lib/Controller/ShareInfoController.php
@@ -31,7 +31,6 @@ use OCP\Constants;
use OCP\Files\File;
use OCP\Files\Folder;
use OCP\Files\Node;
-use OCP\ILogger;
use OCP\IRequest;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager;
diff --git a/apps/files_sharing/lib/Middleware/ShareInfoMiddleware.php b/apps/files_sharing/lib/Middleware/ShareInfoMiddleware.php
index 74a5db4f308..7a6ecc483e8 100644
--- a/apps/files_sharing/lib/Middleware/ShareInfoMiddleware.php
+++ b/apps/files_sharing/lib/Middleware/ShareInfoMiddleware.php
@@ -23,7 +23,6 @@
*/
namespace OCA\Files_Sharing\Middleware;
-use OCA\FederatedFileSharing\FederatedShareProvider;
use OCA\Files_Sharing\Controller\ShareInfoController;
use OCA\Files_Sharing\Exceptions\S2SException;
use OCP\AppFramework\Controller;
diff --git a/apps/files_trashbin/appinfo/info.xml b/apps/files_trashbin/appinfo/info.xml
index 305906a5446..585e61fe1e8 100644
--- a/apps/files_trashbin/appinfo/info.xml
+++ b/apps/files_trashbin/appinfo/info.xml
@@ -1,26 +1,30 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>files_trashbin</id>
<name>Deleted files</name>
+ <summary>This application enables users to restore files that were deleted from the system.</summary>
<description>
This application enables users to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the users file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.
To prevent a user from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation.
</description>
- <licence>AGPL</licence>
+ <version>1.4.0</version>
+ <licence>agpl</licence>
<author>Bjoern Schiessle</author>
+ <namespace>Files_Trashbin</namespace>
<default_enable/>
- <version>1.4.0</version>
<types>
<filesystem/>
</types>
- <namespace>Files_Trashbin</namespace>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<documentation>
<user>user-trashbin</user>
</documentation>
+ <category>files</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
<background-jobs>
<job>OCA\Files_Trashbin\BackgroundJob\ExpireTrash</job>
diff --git a/apps/files_versions/appinfo/info.xml b/apps/files_versions/appinfo/info.xml
index 511b1713cb1..8f7e4d7b716 100644
--- a/apps/files_versions/appinfo/info.xml
+++ b/apps/files_versions/appinfo/info.xml
@@ -1,26 +1,30 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>files_versions</id>
<name>Versions</name>
- <licence>AGPL</licence>
- <author>Frank Karlitschek</author>
- <author>Bjoern Schiessle</author>
+ <summary>This application automatically maintains older versions of files that are changed.</summary>
<description>
- This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.
-In addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation.
+ This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.
+ In addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation.
</description>
<version>1.7.0</version>
+ <licence>agpl</licence>
+ <author>Frank Karlitschek</author>
+ <author>Bjoern Schiessle</author>
+ <namespace>Files_Versions</namespace>
+ <default_enable/>
<types>
<filesystem/>
</types>
- <namespace>Files_Versions</namespace>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<documentation>
<user>user-versions</user>
</documentation>
- <default_enable/>
+ <category>files</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
<background-jobs>
<job>OCA\Files_Versions\BackgroundJob\ExpireVersions</job>
diff --git a/apps/files_versions/download.php b/apps/files_versions/download.php
index e5c70dd2bc5..833077fbcce 100644
--- a/apps/files_versions/download.php
+++ b/apps/files_versions/download.php
@@ -49,7 +49,9 @@ $ftype = \OC::$server->getMimeTypeDetector()->getSecureMimeType($view->getMimeTy
header('Content-Type:'.$ftype);
OCP\Response::setContentDispositionHeader(basename($filename), 'attachment');
-OCP\Response::disableCaching();
+header('Pragma: public');// enable caching in IE
+header('Expires: 0');
+header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
OCP\Response::setContentLengthHeader($view->filesize($versionName));
OC_Util::obEnd();
diff --git a/apps/files_versions/l10n/fa.js b/apps/files_versions/l10n/fa.js
index 08ad3dd3254..35332939df1 100644
--- a/apps/files_versions/l10n/fa.js
+++ b/apps/files_versions/l10n/fa.js
@@ -4,6 +4,9 @@ OC.L10N.register(
"Could not revert: %s" : "بازگردانی امکان ناپذیر است: %s",
"Versions" : "نسخه ها",
"Failed to revert {file} to revision {timestamp}." : "برگرداندن {file} به نسخه {timestamp} با شکست روبرو شد",
- "Restore" : "بازیابی"
+ "_%n byte_::_%n bytes_" : ["%n بایت"],
+ "Restore" : "بازیابی",
+ "No earlier versions available" : "هیچ نسخه قدیمی تری در دسترس نیست",
+ "More versions …" : "نسخه های بیشتر ..."
},
"nplurals=1; plural=0;");
diff --git a/apps/files_versions/l10n/fa.json b/apps/files_versions/l10n/fa.json
index f25ecb00445..2618427c674 100644
--- a/apps/files_versions/l10n/fa.json
+++ b/apps/files_versions/l10n/fa.json
@@ -2,6 +2,9 @@
"Could not revert: %s" : "بازگردانی امکان ناپذیر است: %s",
"Versions" : "نسخه ها",
"Failed to revert {file} to revision {timestamp}." : "برگرداندن {file} به نسخه {timestamp} با شکست روبرو شد",
- "Restore" : "بازیابی"
+ "_%n byte_::_%n bytes_" : ["%n بایت"],
+ "Restore" : "بازیابی",
+ "No earlier versions available" : "هیچ نسخه قدیمی تری در دسترس نیست",
+ "More versions …" : "نسخه های بیشتر ..."
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/lookup_server_connector/appinfo/info.xml b/apps/lookup_server_connector/appinfo/info.xml
index 31fc4fe8e5f..19ffeb4de1c 100644
--- a/apps/lookup_server_connector/appinfo/info.xml
+++ b/apps/lookup_server_connector/appinfo/info.xml
@@ -1,18 +1,22 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>lookup_server_connector</id>
<name>Lookup Server Connector</name>
+ <summary>Sync public user information with the lookup server</summary>
<description>Sync public user information with the lookup server</description>
- <licence>AGPL</licence>
+ <version>1.2.0</version>
+ <licence>agpl</licence>
<author>Bjoern Schiessle</author>
<namespace>LookupServerConnector</namespace>
- <version>1.2.0</version>
- <category>other</category>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<default_enable/>
<types>
<authentication/>
</types>
+ <category>integration</category>
+ <category>social</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
</info>
diff --git a/apps/oauth2/appinfo/info.xml b/apps/oauth2/appinfo/info.xml
index 0bbad31dab3..ac18b5cdb94 100644
--- a/apps/oauth2/appinfo/info.xml
+++ b/apps/oauth2/appinfo/info.xml
@@ -1,16 +1,21 @@
<?xml version="1.0"?>
-<info xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>oauth2</id>
<name>OAuth 2.0</name>
+ <summary>Allows OAuth2 compatible authentication from other web applications.</summary>
<description>The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications.</description>
+ <version>1.2.0</version>
<licence>agpl</licence>
<author>Lukas Reschke</author>
<namespace>OAuth2</namespace>
- <version>1.2.0</version>
<default_enable/>
<types>
<authentication/>
</types>
+
+ <category>integration</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
diff --git a/apps/oauth2/l10n/ast.js b/apps/oauth2/l10n/ast.js
index ddb11d0b9ed..07a7510eda6 100644
--- a/apps/oauth2/l10n/ast.js
+++ b/apps/oauth2/l10n/ast.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"oauth2",
{
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Veceros d'OAuth 2.0",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 permite a los servicios esternos solicitar accesu a %s.",
"Name" : "Nome",
diff --git a/apps/oauth2/l10n/ast.json b/apps/oauth2/l10n/ast.json
index 5e2db794420..53ac163ef17 100644
--- a/apps/oauth2/l10n/ast.json
+++ b/apps/oauth2/l10n/ast.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Veceros d'OAuth 2.0",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 permite a los servicios esternos solicitar accesu a %s.",
"Name" : "Nome",
diff --git a/apps/oauth2/l10n/hu.js b/apps/oauth2/l10n/hu.js
index 48747669a31..64124c7a5d4 100644
--- a/apps/oauth2/l10n/hu.js
+++ b/apps/oauth2/l10n/hu.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"oauth2",
{
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "OAuth 2.0 kliensek",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 megengedi külső szolgáltatásoknak, hogy hozzáférést kérjenek ehhez: %s.",
"Name" : "Név",
diff --git a/apps/oauth2/l10n/hu.json b/apps/oauth2/l10n/hu.json
index c69fbb0fcd8..8c07c53e66f 100644
--- a/apps/oauth2/l10n/hu.json
+++ b/apps/oauth2/l10n/hu.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "OAuth 2.0 kliensek",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 megengedi külső szolgáltatásoknak, hogy hozzáférést kérjenek ehhez: %s.",
"Name" : "Név",
diff --git a/apps/oauth2/l10n/pt_PT.js b/apps/oauth2/l10n/pt_PT.js
new file mode 100644
index 00000000000..f89a56c39d1
--- /dev/null
+++ b/apps/oauth2/l10n/pt_PT.js
@@ -0,0 +1,14 @@
+OC.L10N.register(
+ "oauth2",
+ {
+ "OAuth 2.0" : "OAuth 2.0",
+ "OAuth 2.0 clients" : "Clientes OAuth 2.0",
+ "OAuth 2.0 allows external services to request access to %s." : "OAuth2.0 permite que dispositivos externos peçam acesso a %s.",
+ "Name" : "Nome",
+ "Redirection URI" : "URI de redireccionamento",
+ "Client Identifier" : "Identificador de Cliente",
+ "Secret" : "Segredo",
+ "Add client" : "Adicionar cliente",
+ "Add" : "Adicionar"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/pt_PT.json b/apps/oauth2/l10n/pt_PT.json
new file mode 100644
index 00000000000..15f16743e78
--- /dev/null
+++ b/apps/oauth2/l10n/pt_PT.json
@@ -0,0 +1,12 @@
+{ "translations": {
+ "OAuth 2.0" : "OAuth 2.0",
+ "OAuth 2.0 clients" : "Clientes OAuth 2.0",
+ "OAuth 2.0 allows external services to request access to %s." : "OAuth2.0 permite que dispositivos externos peçam acesso a %s.",
+ "Name" : "Nome",
+ "Redirection URI" : "URI de redireccionamento",
+ "Client Identifier" : "Identificador de Cliente",
+ "Secret" : "Segredo",
+ "Add client" : "Adicionar cliente",
+ "Add" : "Adicionar"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/oauth2/l10n/ru.js b/apps/oauth2/l10n/ru.js
index 7edd72964cd..4adf2f65ceb 100644
--- a/apps/oauth2/l10n/ru.js
+++ b/apps/oauth2/l10n/ru.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"oauth2",
{
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Клиенты OAuth 2.0",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 позволяет внешним службам запрашивать доступ к %s.",
"Name" : "Имя",
diff --git a/apps/oauth2/l10n/ru.json b/apps/oauth2/l10n/ru.json
index f83068d6097..793dd149678 100644
--- a/apps/oauth2/l10n/ru.json
+++ b/apps/oauth2/l10n/ru.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Клиенты OAuth 2.0",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 позволяет внешним службам запрашивать доступ к %s.",
"Name" : "Имя",
diff --git a/apps/oauth2/l10n/sv.js b/apps/oauth2/l10n/sv.js
index 6008633294f..5d2946a1d22 100644
--- a/apps/oauth2/l10n/sv.js
+++ b/apps/oauth2/l10n/sv.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"oauth2",
{
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "OAuth 2.0 klienter",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 tillåter externa tjänster att efterfråga tillgång till %s.",
"Name" : "Namn",
diff --git a/apps/oauth2/l10n/sv.json b/apps/oauth2/l10n/sv.json
index 6fa51297312..464282a4491 100644
--- a/apps/oauth2/l10n/sv.json
+++ b/apps/oauth2/l10n/sv.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "OAuth 2.0 klienter",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 tillåter externa tjänster att efterfråga tillgång till %s.",
"Name" : "Namn",
diff --git a/apps/provisioning_api/appinfo/info.xml b/apps/provisioning_api/appinfo/info.xml
index 849e74432f0..05e805c1170 100644
--- a/apps/provisioning_api/appinfo/info.xml
+++ b/apps/provisioning_api/appinfo/info.xml
@@ -1,7 +1,9 @@
-<?xml version="1.0"?>
-<info>
+<?xml version="1.0"?>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>provisioning_api</id>
<name>Provisioning API</name>
+ <summary>This application enables a set of APIs that external systems can use to manage users, groups and apps.</summary>
<description>
This application enables a set of APIs that external systems can use to create, edit, delete and query user
attributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin users
@@ -11,17 +13,19 @@
listed above. More information is available in the Provisioning API documentation, including example calls
and server responses.
</description>
- <licence>AGPL</licence>
- <author>Tom Needham</author>
- <default_enable/>
- <documentation>
- <admin>admin-provisioning-api</admin>
- </documentation>
<version>1.4.0</version>
+ <licence>agpl</licence>
+ <author>Tom Needham</author>
<namespace>Provisioning_API</namespace>
+ <default_enable/>
<types>
<prevent_group_restriction/>
</types>
+ <documentation>
+ <admin>admin-provisioning-api</admin>
+ </documentation>
+ <category>integration</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
diff --git a/apps/provisioning_api/lib/Controller/UsersController.php b/apps/provisioning_api/lib/Controller/UsersController.php
index 99f1a0ddd57..402381ab58a 100644
--- a/apps/provisioning_api/lib/Controller/UsersController.php
+++ b/apps/provisioning_api/lib/Controller/UsersController.php
@@ -31,6 +31,7 @@
namespace OCA\Provisioning_API\Controller;
use OC\Accounts\AccountManager;
+use OC\HintException;
use OC\Settings\Mailer\NewUserMailHelper;
use OC_Helper;
use OCA\Provisioning_API\FederatedFileSharingFactory;
@@ -193,15 +194,22 @@ class UsersController extends OCSController {
try {
$newUser = $this->userManager->createUser($userid, $password);
- $this->logger->info('Successful addUser call with userid: '.$userid, ['app' => 'ocs_api']);
+ $this->logger->info('Successful addUser call with userid: ' . $userid, ['app' => 'ocs_api']);
if (is_array($groups)) {
foreach ($groups as $group) {
$this->groupManager->get($group)->addUser($newUser);
- $this->logger->info('Added userid '.$userid.' to group '.$group, ['app' => 'ocs_api']);
+ $this->logger->info('Added userid ' . $userid . ' to group ' . $group, ['app' => 'ocs_api']);
}
}
return new DataResponse();
+ } catch (HintException $e ) {
+ $this->logger->logException($e, [
+ 'message' => 'Failed addUser attempt with hint exception.',
+ 'level' => \OCP\Util::WARN,
+ 'app' => 'ocs_api',
+ ]);
+ throw new OCSException($e->getHint(), 107);
} catch (\Exception $e) {
$this->logger->logException($e, [
'message' => 'Failed addUser attempt with exception.',
diff --git a/apps/sharebymail/appinfo/info.xml b/apps/sharebymail/appinfo/info.xml
index f1cd70a66b3..6bec13e819b 100644
--- a/apps/sharebymail/appinfo/info.xml
+++ b/apps/sharebymail/appinfo/info.xml
@@ -1,29 +1,32 @@
<?xml version="1.0"?>
-<info>
- <id>sharebymail</id>
- <name>Share by mail</name>
- <description>Share provider which allows you to share files by mail</description>
- <licence>AGPL</licence>
- <author>Bjoern Schiessle</author>
- <version>1.4.0</version>
- <namespace>ShareByMail</namespace>
- <category>other</category>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
- <default_enable/>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
+ <id>sharebymail</id>
+ <name>Share by mail</name>
+ <summary>Share provider which allows you to share files by mail</summary>
+ <description>Share provider which allows you to share files by mail</description>
+ <version>1.4.0</version>
+ <licence>agpl</licence>
+ <author>Bjoern Schiessle</author>
+ <namespace>ShareByMail</namespace>
+ <default_enable/>
- <types>
- <filesystem/>
- </types>
+ <types>
+ <filesystem/>
+ </types>
+ <category>social</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
- <settings>
- <admin>OCA\ShareByMail\Settings\Admin</admin>
- </settings>
+ <settings>
+ <admin>OCA\ShareByMail\Settings\Admin</admin>
+ </settings>
- <activity>
- <providers>
- <provider>OCA\ShareByMail\Activity</provider>
- </providers>
- </activity>
+ <activity>
+ <providers>
+ <provider>OCA\ShareByMail\Activity</provider>
+ </providers>
+ </activity>
</info>
diff --git a/apps/sharebymail/l10n/fr.js b/apps/sharebymail/l10n/fr.js
index 25aef7b560a..0a66fce6b54 100644
--- a/apps/sharebymail/l10n/fr.js
+++ b/apps/sharebymail/l10n/fr.js
@@ -18,26 +18,26 @@ OC.L10N.register(
"Password to access {file} was sent to you" : "Le mot de passe pour accèder à {file} vous a été envoyé",
"Sharing %s failed, this item is already shared with %s" : "Le partage de %s a échoué, cet élément est déjà partagé avec %s",
"We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Nous ne pouvons pas vous envoyer le mot de passe généré automatiquement. Veuillez renseigner une adresse e-mail valide dans vos paramètres personnels puis réessayer.",
- "Failed to send share by email" : "Erreur lors de l'envoi du partage par e-mail",
+ "Failed to send share by email" : "Échec lors de l'envoi du partage par e-mail",
"%s shared »%s« with you" : "%s a partagé «%s» avec vous",
"%s shared »%s« with you." : "%s a partagé «%s» avec vous.",
"Click the button below to open it." : "Cliquez sur le bouton ci-dessous pour l'ouvrir.",
"Open »%s«" : "Ouvrir «%s»",
"%s via %s" : "%s via %s",
- "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s a partagé «%s» avec vous.\nVous avez normalement déjà reçu un autre email avec un lien pour y accéder.\n",
- "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s a partagé «%s» avec vous. Vous avez normalement déjà reçu un autre email avec un lien pour y accéder.",
- "Password to access »%s« shared to you by %s" : "Mot de passe pour accèder à «%s» partagé par %s",
- "Password to access »%s«" : "Mot de passe pour accèder à «%s»",
+ "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s a partagé «%s» avec vous.\nVous avez normalement déjà reçu un autre e-mail avec un lien pour y accéder.\n",
+ "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s a partagé «%s» avec vous. Vous avez normalement déjà reçu un autre e-mail avec un lien pour y accéder.",
+ "Password to access »%s« shared to you by %s" : "Mot de passe pour accéder à «%s» partagé avec vous par %s",
+ "Password to access »%s«" : "Mot de passe pour accéder à «%s»",
"It is protected with the following password: %s" : "Il est protégé avec le mot de passe suivant : %s",
"You just shared »%s« with %s. The share was already send to the recipient. Due to the security policies defined by the administrator of %s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "Vous venez de partager «%s» avec %s. Le partage a déjà été envoyé au destinataire. En raison de la politique de sécurité définie par l'administrateur de %s, chaque partage a besoin d'être protégé par mot de passe et il n'est pas autorisé d'envoyer le mot de passe directement au destinataire. C'est pourquoi vous devez transmettre le mot de passe manuellement au destinataire.",
"Password to access »%s« shared with %s" : "Mot de passe pour accèder à «%s» partagé avec %s",
"This is the password: %s" : "Voici le mot de passe : %s",
"You can choose a different password at any time in the share dialog." : "Vous pouvez choisir un mot de passe différent à n'importe quel moment dans la boîte de dialogue de partage.",
"Could not find share" : "Impossible de trouver le partage",
- "Share by mail" : "Partage par email",
+ "Share by mail" : "Partage par e-mail",
"Allows users to share a personalized link to a file or folder by putting in an email address." : "Autoriser les utilisateurs de partager un lien personnalisé vers un fichier ou un dossier en renseignant une adresse e-mail.",
- "Send password by mail" : "Envoyer le mot de passe par email",
+ "Send password by mail" : "Envoyer le mot de passe par e-mail",
"Enforce password protection" : "Imposer la protection par mot de passe",
- "Failed to send share by E-mail" : "Erreur lors de l'envoi du partage par email"
+ "Failed to send share by E-mail" : "Échec lors de l'envoi du partage par e-mail"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/sharebymail/l10n/fr.json b/apps/sharebymail/l10n/fr.json
index e1d44b155f9..23cd35032a3 100644
--- a/apps/sharebymail/l10n/fr.json
+++ b/apps/sharebymail/l10n/fr.json
@@ -16,26 +16,26 @@
"Password to access {file} was sent to you" : "Le mot de passe pour accèder à {file} vous a été envoyé",
"Sharing %s failed, this item is already shared with %s" : "Le partage de %s a échoué, cet élément est déjà partagé avec %s",
"We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Nous ne pouvons pas vous envoyer le mot de passe généré automatiquement. Veuillez renseigner une adresse e-mail valide dans vos paramètres personnels puis réessayer.",
- "Failed to send share by email" : "Erreur lors de l'envoi du partage par e-mail",
+ "Failed to send share by email" : "Échec lors de l'envoi du partage par e-mail",
"%s shared »%s« with you" : "%s a partagé «%s» avec vous",
"%s shared »%s« with you." : "%s a partagé «%s» avec vous.",
"Click the button below to open it." : "Cliquez sur le bouton ci-dessous pour l'ouvrir.",
"Open »%s«" : "Ouvrir «%s»",
"%s via %s" : "%s via %s",
- "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s a partagé «%s» avec vous.\nVous avez normalement déjà reçu un autre email avec un lien pour y accéder.\n",
- "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s a partagé «%s» avec vous. Vous avez normalement déjà reçu un autre email avec un lien pour y accéder.",
- "Password to access »%s« shared to you by %s" : "Mot de passe pour accèder à «%s» partagé par %s",
- "Password to access »%s«" : "Mot de passe pour accèder à «%s»",
+ "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s a partagé «%s» avec vous.\nVous avez normalement déjà reçu un autre e-mail avec un lien pour y accéder.\n",
+ "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s a partagé «%s» avec vous. Vous avez normalement déjà reçu un autre e-mail avec un lien pour y accéder.",
+ "Password to access »%s« shared to you by %s" : "Mot de passe pour accéder à «%s» partagé avec vous par %s",
+ "Password to access »%s«" : "Mot de passe pour accéder à «%s»",
"It is protected with the following password: %s" : "Il est protégé avec le mot de passe suivant : %s",
"You just shared »%s« with %s. The share was already send to the recipient. Due to the security policies defined by the administrator of %s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "Vous venez de partager «%s» avec %s. Le partage a déjà été envoyé au destinataire. En raison de la politique de sécurité définie par l'administrateur de %s, chaque partage a besoin d'être protégé par mot de passe et il n'est pas autorisé d'envoyer le mot de passe directement au destinataire. C'est pourquoi vous devez transmettre le mot de passe manuellement au destinataire.",
"Password to access »%s« shared with %s" : "Mot de passe pour accèder à «%s» partagé avec %s",
"This is the password: %s" : "Voici le mot de passe : %s",
"You can choose a different password at any time in the share dialog." : "Vous pouvez choisir un mot de passe différent à n'importe quel moment dans la boîte de dialogue de partage.",
"Could not find share" : "Impossible de trouver le partage",
- "Share by mail" : "Partage par email",
+ "Share by mail" : "Partage par e-mail",
"Allows users to share a personalized link to a file or folder by putting in an email address." : "Autoriser les utilisateurs de partager un lien personnalisé vers un fichier ou un dossier en renseignant une adresse e-mail.",
- "Send password by mail" : "Envoyer le mot de passe par email",
+ "Send password by mail" : "Envoyer le mot de passe par e-mail",
"Enforce password protection" : "Imposer la protection par mot de passe",
- "Failed to send share by E-mail" : "Erreur lors de l'envoi du partage par email"
+ "Failed to send share by E-mail" : "Échec lors de l'envoi du partage par e-mail"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/sharebymail/lib/ShareByMailProvider.php b/apps/sharebymail/lib/ShareByMailProvider.php
index 31df8a18951..61c9c01e9ab 100644
--- a/apps/sharebymail/lib/ShareByMailProvider.php
+++ b/apps/sharebymail/lib/ShareByMailProvider.php
@@ -404,7 +404,7 @@ class ShareByMailProvider implements IShareProvider {
$text = $this->l->t('%s shared »%s« with you.', [$initiatorDisplayName, $filename]);
$emailTemplate->addBodyText(
- $text . ' ' . $this->l->t('Click the button below to open it.'),
+ htmlspecialchars($text . ' ' . $this->l->t('Click the button below to open it.')),
$text
);
$emailTemplate->addBodyButton(
@@ -476,7 +476,7 @@ class ShareByMailProvider implements IShareProvider {
$emailTemplate->setSubject($this->l->t('Password to access »%s« shared to you by %s', [$filename, $initiatorDisplayName]));
$emailTemplate->addHeader();
$emailTemplate->addHeading($this->l->t('Password to access »%s«', [$filename]), false);
- $emailTemplate->addBodyText($htmlBodyPart, $plainBodyPart);
+ $emailTemplate->addBodyText(htmlspecialchars($htmlBodyPart), $plainBodyPart);
$emailTemplate->addBodyText($this->l->t('It is protected with the following password: %s', [$password]));
// The "From" contains the sharers name
diff --git a/apps/sharebymail/templates/settings-admin.php b/apps/sharebymail/templates/settings-admin.php
index 50fede86685..5b16f551a56 100644
--- a/apps/sharebymail/templates/settings-admin.php
+++ b/apps/sharebymail/templates/settings-admin.php
@@ -1,6 +1,5 @@
<?php
/** @var array $_ */
-use OCA\Federation\TrustedServers;
/** @var \OCP\IL10N $l */
script('sharebymail', 'settings-admin');
diff --git a/apps/systemtags/appinfo/info.xml b/apps/systemtags/appinfo/info.xml
index e46daf4b042..6484cd450ca 100644
--- a/apps/systemtags/appinfo/info.xml
+++ b/apps/systemtags/appinfo/info.xml
@@ -1,21 +1,26 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>systemtags</id>
<name>Collaborative tags</name>
+ <summary>Collaborative tagging functionality which shares tags among users.</summary>
<description>Collaborative tagging functionality which shares tags among users. Great for teams.
(If you are a provider with a multi-tenancy installation, it is advised to deactivate this app as tags are shared.)</description>
- <licence>AGPL</licence>
+ <version>1.4.0</version>
+ <licence>agpl</licence>
<author>Vincent Petry</author>
<author>Joas Schilling</author>
- <default_enable/>
- <version>1.4.0</version>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<namespace>SystemTags</namespace>
+ <default_enable/>
<types>
<logging/>
</types>
+ <category>files</category>
+ <category>organization</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
<settings>
<admin>OCA\SystemTags\Settings\Admin</admin>
</settings>
diff --git a/apps/systemtags/l10n/lv.js b/apps/systemtags/l10n/lv.js
index 116f7a366ec..cc3f8f49898 100644
--- a/apps/systemtags/l10n/lv.js
+++ b/apps/systemtags/l10n/lv.js
@@ -9,7 +9,7 @@ OC.L10N.register(
"Select tags to filter by" : "Izvēlies atzīmes pēc kā filtrēt",
"No tags found" : "Netika atrasta neviena atzīme",
"Please select tags to filter by" : "Lūdzu izvēlies atzīmes pēc kā filtrēt",
- "No files found for the selected tags" : "Faili netika atrasti ar atlasītām atzīmēm",
+ "No files found for the selected tags" : "Datnes ar atlasītām atzīmēm netika atrastas",
"Added system tag %1$s" : "Pievienota sistēmas atzīme %1$s",
"Added system tag {systemtag}" : "Pievienota sistēmas atzīme {systemtag}",
"%1$s added system tag %2$s" : "%1$s pievienota sistēmas atzīme %2$s",
@@ -31,11 +31,11 @@ OC.L10N.register(
"%1$s updated system tag %3$s to %2$s" : "%1$spārmainija sistēmas atzīmi %3$s uz %2$s",
"{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} atjaunināja sistēmas atzīmi {oldsystemtag} uz {newsystemtag}",
"You added system tag %2$s to %1$s" : "Tu pievienoji sistēmas atzīmi %2$s uz %1$s",
- "You added system tag {systemtag} to {file}" : "Tu pievienoji sistēmas atzīmi {systemtag} failam {file}",
+ "You added system tag {systemtag} to {file}" : "Tu pievienoji sistēmas atzīmi {systemtag} datnei {file}",
"%1$s added system tag %3$s to %2$s" : "%1$spievienoja sistēmas atzīmi %3$s uz %2$s",
- "{actor} added system tag {systemtag} to {file}" : "{actor} added system tag {systemtag} to {file}",
+ "{actor} added system tag {systemtag} to {file}" : "{actor} pievienoja sistēmas atzīmi {systemtag} {file}",
"You removed system tag %2$s from %1$s" : "Tu noņēmi sistēmas atzīmi %2$s no %1$s",
- "You removed system tag {systemtag} from {file}" : "TU noņēmi sistēmas atzīmi {systemtag} no {file}",
+ "You removed system tag {systemtag} from {file}" : "Tu noņēmi sistēmas atzīmi {systemtag} no {file}",
"%1$s removed system tag %3$s from %2$s" : "%1$s noņēma sistēmas atzīmi %3$s no %2$s",
"{actor} removed system tag {systemtag} from {file}" : "{actor} noņēma sistēmas atzīmi {systemtag} no {file}",
"%s (restricted)" : "%s (ierobežots)",
diff --git a/apps/systemtags/l10n/lv.json b/apps/systemtags/l10n/lv.json
index 7359422ea9e..9dd5a05233b 100644
--- a/apps/systemtags/l10n/lv.json
+++ b/apps/systemtags/l10n/lv.json
@@ -7,7 +7,7 @@
"Select tags to filter by" : "Izvēlies atzīmes pēc kā filtrēt",
"No tags found" : "Netika atrasta neviena atzīme",
"Please select tags to filter by" : "Lūdzu izvēlies atzīmes pēc kā filtrēt",
- "No files found for the selected tags" : "Faili netika atrasti ar atlasītām atzīmēm",
+ "No files found for the selected tags" : "Datnes ar atlasītām atzīmēm netika atrastas",
"Added system tag %1$s" : "Pievienota sistēmas atzīme %1$s",
"Added system tag {systemtag}" : "Pievienota sistēmas atzīme {systemtag}",
"%1$s added system tag %2$s" : "%1$s pievienota sistēmas atzīme %2$s",
@@ -29,11 +29,11 @@
"%1$s updated system tag %3$s to %2$s" : "%1$spārmainija sistēmas atzīmi %3$s uz %2$s",
"{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} atjaunināja sistēmas atzīmi {oldsystemtag} uz {newsystemtag}",
"You added system tag %2$s to %1$s" : "Tu pievienoji sistēmas atzīmi %2$s uz %1$s",
- "You added system tag {systemtag} to {file}" : "Tu pievienoji sistēmas atzīmi {systemtag} failam {file}",
+ "You added system tag {systemtag} to {file}" : "Tu pievienoji sistēmas atzīmi {systemtag} datnei {file}",
"%1$s added system tag %3$s to %2$s" : "%1$spievienoja sistēmas atzīmi %3$s uz %2$s",
- "{actor} added system tag {systemtag} to {file}" : "{actor} added system tag {systemtag} to {file}",
+ "{actor} added system tag {systemtag} to {file}" : "{actor} pievienoja sistēmas atzīmi {systemtag} {file}",
"You removed system tag %2$s from %1$s" : "Tu noņēmi sistēmas atzīmi %2$s no %1$s",
- "You removed system tag {systemtag} from {file}" : "TU noņēmi sistēmas atzīmi {systemtag} no {file}",
+ "You removed system tag {systemtag} from {file}" : "Tu noņēmi sistēmas atzīmi {systemtag} no {file}",
"%1$s removed system tag %3$s from %2$s" : "%1$s noņēma sistēmas atzīmi %3$s no %2$s",
"{actor} removed system tag {systemtag} from {file}" : "{actor} noņēma sistēmas atzīmi {systemtag} no {file}",
"%s (restricted)" : "%s (ierobežots)",
diff --git a/apps/systemtags/l10n/nl.js b/apps/systemtags/l10n/nl.js
index a778fc7ce7d..0f7aed6ffc5 100644
--- a/apps/systemtags/l10n/nl.js
+++ b/apps/systemtags/l10n/nl.js
@@ -3,7 +3,7 @@ OC.L10N.register(
{
"Tags" : "Markering",
"Update" : "Update",
- "Create" : "Creeër",
+ "Create" : "Opslaan",
"Select tag…" : "Selecteren markering…",
"Tagged files" : "Gemarkeerde bestanden",
"Select tags to filter by" : "Selecteer markering om op te filteren",
@@ -41,15 +41,15 @@ OC.L10N.register(
"%s (restricted)" : "%s (beperkt)",
"%s (invisible)" : "%s (onzichtbaar)",
"<strong>System tags</strong> for a file have been modified" : "<strong>Systeemmarkeringen</strong> voor een bestand zijn gewijzigd",
- "Collaborative tags" : "Samenwerk markeringen",
- "Create and edit collaborative tags. These tags affect all users." : "Maak en bewerk samenwerkingstags. Deze tags gelden voor alle gebruikers.",
+ "Collaborative tags" : "Systeemtags",
+ "Create and edit collaborative tags. These tags affect all users." : "Maak en bewerk systeemtags. Deze tags raken alle gebruikers.",
"Select tag …" : "Selecteer tag …",
- "Name" : "Naam",
+ "Name" : "Tag",
"Delete" : "Verwijder",
- "Public" : "Openbaar",
- "Restricted" : "Beperkt",
+ "Public" : "Standaard",
+ "Restricted" : "Beschermd",
"Invisible" : "Verborgen",
- "Reset" : "Reset",
+ "Reset" : "Herstellen",
"No files in here" : "Hier geen bestanden",
"No entries found in this folder" : "Niets gevonden in deze map",
"Size" : "Grootte",
diff --git a/apps/systemtags/l10n/nl.json b/apps/systemtags/l10n/nl.json
index 1915c7550b0..feac7b8cc93 100644
--- a/apps/systemtags/l10n/nl.json
+++ b/apps/systemtags/l10n/nl.json
@@ -1,7 +1,7 @@
{ "translations": {
"Tags" : "Markering",
"Update" : "Update",
- "Create" : "Creeër",
+ "Create" : "Opslaan",
"Select tag…" : "Selecteren markering…",
"Tagged files" : "Gemarkeerde bestanden",
"Select tags to filter by" : "Selecteer markering om op te filteren",
@@ -39,15 +39,15 @@
"%s (restricted)" : "%s (beperkt)",
"%s (invisible)" : "%s (onzichtbaar)",
"<strong>System tags</strong> for a file have been modified" : "<strong>Systeemmarkeringen</strong> voor een bestand zijn gewijzigd",
- "Collaborative tags" : "Samenwerk markeringen",
- "Create and edit collaborative tags. These tags affect all users." : "Maak en bewerk samenwerkingstags. Deze tags gelden voor alle gebruikers.",
+ "Collaborative tags" : "Systeemtags",
+ "Create and edit collaborative tags. These tags affect all users." : "Maak en bewerk systeemtags. Deze tags raken alle gebruikers.",
"Select tag …" : "Selecteer tag …",
- "Name" : "Naam",
+ "Name" : "Tag",
"Delete" : "Verwijder",
- "Public" : "Openbaar",
- "Restricted" : "Beperkt",
+ "Public" : "Standaard",
+ "Restricted" : "Beschermd",
"Invisible" : "Verborgen",
- "Reset" : "Reset",
+ "Reset" : "Herstellen",
"No files in here" : "Hier geen bestanden",
"No entries found in this folder" : "Niets gevonden in deze map",
"Size" : "Grootte",
diff --git a/apps/systemtags/l10n/sk.js b/apps/systemtags/l10n/sk.js
new file mode 100644
index 00000000000..77ddf39e4bb
--- /dev/null
+++ b/apps/systemtags/l10n/sk.js
@@ -0,0 +1,58 @@
+OC.L10N.register(
+ "systemtags",
+ {
+ "Tags" : "Štítky",
+ "Update" : "Aktualizovať",
+ "Create" : "Vytvoriť",
+ "Select tag…" : "Vyber štítok...",
+ "Tagged files" : "Súbory so štítkom",
+ "Select tags to filter by" : "Vybrať štítky pre filter",
+ "No tags found" : "Štítky sa nenašli",
+ "Please select tags to filter by" : "Vyberte štítky pre filtrovanie",
+ "No files found for the selected tags" : "Neboli nájdené žiadne súbory označené vybranými štítkami",
+ "Added system tag %1$s" : "Pridaný systémový štítok %1$s",
+ "Added system tag {systemtag}" : "Pridaný systémový štítok {systemtag}",
+ "%1$s added system tag %2$s" : "%1$s pridal(a) systémový štítok %2$s",
+ "{actor} added system tag {systemtag}" : "{actor} pridal(a) systémový štítok {systemtag}",
+ "Removed system tag %1$s" : "Odstránený systémový štítok %1$s",
+ "Removed system tag {systemtag}" : "Odstránený systémový štítok {systemtag}",
+ "%1$s removed system tag %2$s" : "%1$s odstránil(a) systémový štítok %2$s",
+ "{actor} removed system tag {systemtag}" : "{actor} odstránil(a) systémový štítok {systemtag}",
+ "You created system tag %1$s" : "Vytvorili ste systémový štítok %1$s",
+ "You created system tag {systemtag}" : "Vytvorili ste systémový štítok {systemtag}",
+ "%1$s created system tag %2$s" : "%1$s vytvoril systémový štítok %2$s",
+ "{actor} created system tag {systemtag}" : "{actor} vytvoril(a) systémový štítok {systemtag}",
+ "You deleted system tag %1$s" : "Zmazali ste systémový štítok %1$s",
+ "You deleted system tag {systemtag}" : "Odstránili ste systémový štítok {systemtag}",
+ "%1$s deleted system tag %2$s" : "%1$s zmazal(a) systémový štítok %2$s",
+ "{actor} deleted system tag {systemtag}" : "{actor} odstránil(a) systémový štítok {systemtag}",
+ "You updated system tag %2$s to %1$s" : "Aktualizovali ste systémový štítok %2$s na %1$s",
+ "You updated system tag {oldsystemtag} to {newsystemtag}" : "Aktualizovali ste systémový štítok {oldsystemtag} na {newsystemtag}",
+ "%1$s updated system tag %3$s to %2$s" : "%1$s aktualizoval(a) systémový štítok %3$s na %2$s",
+ "{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} aktualizoval(a) systémový štítok {oldsystemtag} na {newsystemtag}",
+ "You added system tag %2$s to %1$s" : "Pridali ste systémový štítok %2$s na %1$s",
+ "You added system tag {systemtag} to {file}" : "K {file} ste pridali systémový štítok {systemtag}",
+ "%1$s added system tag %3$s to %2$s" : "%1$s k %2$s pridal(a) systémový štítok %3$s",
+ "{actor} added system tag {systemtag} to {file}" : " {actor} k {file} pridal(a) systémový štítok {systemtag}",
+ "You removed system tag %2$s from %1$s" : "Z %2$s ste odstránili systémový štítok %1$s",
+ "You removed system tag {systemtag} from {file}" : "Z {file} ste odstránili systémový štítok {systemtag}",
+ "%1$s removed system tag %3$s from %2$s" : "%1$s odstránil(a) systémový štítok %3$s z %2$s",
+ "{actor} removed system tag {systemtag} from {file}" : "{actor} odstránil(a) systémový štítok {systemtag} z {file}",
+ "%s (restricted)" : "%s (obmedzené)",
+ "%s (invisible)" : "%s (neviditeľné)",
+ "<strong>System tags</strong> for a file have been modified" : "<strong>Systémové štítky</strong> súboru boli upravené",
+ "Collaborative tags" : "Značky pre spoluprácu",
+ "Create and edit collaborative tags. These tags affect all users." : "Vytvárajte a upravujte štítky pre spoluprácu. Tieto značky ovplyvnia všetkých používateľov.",
+ "Select tag …" : "Vybrať štítok ...",
+ "Name" : "Názov",
+ "Delete" : "Zmazať",
+ "Public" : "Verejné",
+ "Restricted" : "Obmedzené",
+ "Invisible" : "Neviditeľné",
+ "Reset" : "Vynulovať",
+ "No files in here" : "Žiadne súbory",
+ "No entries found in this folder" : "V tomto priečinku sa nič nenašlo",
+ "Size" : "Veľkosť",
+ "Modified" : "Upravené"
+},
+"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/systemtags/l10n/sk.json b/apps/systemtags/l10n/sk.json
new file mode 100644
index 00000000000..a4d4bb32264
--- /dev/null
+++ b/apps/systemtags/l10n/sk.json
@@ -0,0 +1,56 @@
+{ "translations": {
+ "Tags" : "Štítky",
+ "Update" : "Aktualizovať",
+ "Create" : "Vytvoriť",
+ "Select tag…" : "Vyber štítok...",
+ "Tagged files" : "Súbory so štítkom",
+ "Select tags to filter by" : "Vybrať štítky pre filter",
+ "No tags found" : "Štítky sa nenašli",
+ "Please select tags to filter by" : "Vyberte štítky pre filtrovanie",
+ "No files found for the selected tags" : "Neboli nájdené žiadne súbory označené vybranými štítkami",
+ "Added system tag %1$s" : "Pridaný systémový štítok %1$s",
+ "Added system tag {systemtag}" : "Pridaný systémový štítok {systemtag}",
+ "%1$s added system tag %2$s" : "%1$s pridal(a) systémový štítok %2$s",
+ "{actor} added system tag {systemtag}" : "{actor} pridal(a) systémový štítok {systemtag}",
+ "Removed system tag %1$s" : "Odstránený systémový štítok %1$s",
+ "Removed system tag {systemtag}" : "Odstránený systémový štítok {systemtag}",
+ "%1$s removed system tag %2$s" : "%1$s odstránil(a) systémový štítok %2$s",
+ "{actor} removed system tag {systemtag}" : "{actor} odstránil(a) systémový štítok {systemtag}",
+ "You created system tag %1$s" : "Vytvorili ste systémový štítok %1$s",
+ "You created system tag {systemtag}" : "Vytvorili ste systémový štítok {systemtag}",
+ "%1$s created system tag %2$s" : "%1$s vytvoril systémový štítok %2$s",
+ "{actor} created system tag {systemtag}" : "{actor} vytvoril(a) systémový štítok {systemtag}",
+ "You deleted system tag %1$s" : "Zmazali ste systémový štítok %1$s",
+ "You deleted system tag {systemtag}" : "Odstránili ste systémový štítok {systemtag}",
+ "%1$s deleted system tag %2$s" : "%1$s zmazal(a) systémový štítok %2$s",
+ "{actor} deleted system tag {systemtag}" : "{actor} odstránil(a) systémový štítok {systemtag}",
+ "You updated system tag %2$s to %1$s" : "Aktualizovali ste systémový štítok %2$s na %1$s",
+ "You updated system tag {oldsystemtag} to {newsystemtag}" : "Aktualizovali ste systémový štítok {oldsystemtag} na {newsystemtag}",
+ "%1$s updated system tag %3$s to %2$s" : "%1$s aktualizoval(a) systémový štítok %3$s na %2$s",
+ "{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} aktualizoval(a) systémový štítok {oldsystemtag} na {newsystemtag}",
+ "You added system tag %2$s to %1$s" : "Pridali ste systémový štítok %2$s na %1$s",
+ "You added system tag {systemtag} to {file}" : "K {file} ste pridali systémový štítok {systemtag}",
+ "%1$s added system tag %3$s to %2$s" : "%1$s k %2$s pridal(a) systémový štítok %3$s",
+ "{actor} added system tag {systemtag} to {file}" : " {actor} k {file} pridal(a) systémový štítok {systemtag}",
+ "You removed system tag %2$s from %1$s" : "Z %2$s ste odstránili systémový štítok %1$s",
+ "You removed system tag {systemtag} from {file}" : "Z {file} ste odstránili systémový štítok {systemtag}",
+ "%1$s removed system tag %3$s from %2$s" : "%1$s odstránil(a) systémový štítok %3$s z %2$s",
+ "{actor} removed system tag {systemtag} from {file}" : "{actor} odstránil(a) systémový štítok {systemtag} z {file}",
+ "%s (restricted)" : "%s (obmedzené)",
+ "%s (invisible)" : "%s (neviditeľné)",
+ "<strong>System tags</strong> for a file have been modified" : "<strong>Systémové štítky</strong> súboru boli upravené",
+ "Collaborative tags" : "Značky pre spoluprácu",
+ "Create and edit collaborative tags. These tags affect all users." : "Vytvárajte a upravujte štítky pre spoluprácu. Tieto značky ovplyvnia všetkých používateľov.",
+ "Select tag …" : "Vybrať štítok ...",
+ "Name" : "Názov",
+ "Delete" : "Zmazať",
+ "Public" : "Verejné",
+ "Restricted" : "Obmedzené",
+ "Invisible" : "Neviditeľné",
+ "Reset" : "Vynulovať",
+ "No files in here" : "Žiadne súbory",
+ "No entries found in this folder" : "V tomto priečinku sa nič nenašlo",
+ "Size" : "Veľkosť",
+ "Modified" : "Upravené"
+},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
+} \ No newline at end of file
diff --git a/apps/systemtags/lib/Activity/Listener.php b/apps/systemtags/lib/Activity/Listener.php
index 8c158410e4a..7d84726d537 100644
--- a/apps/systemtags/lib/Activity/Listener.php
+++ b/apps/systemtags/lib/Activity/Listener.php
@@ -34,7 +34,6 @@ use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IUser;
use OCP\IUserSession;
-use OCP\Share;
use OCP\Share\IShareHelper;
use OCP\SystemTag\ISystemTag;
use OCP\SystemTag\ISystemTagManager;
@@ -111,7 +110,7 @@ class Listener {
$activity->setApp('systemtags')
->setType('systemtags')
->setAuthor($actor)
- ->setObject('systemtag', $tag->getId(), $tag->getName());
+ ->setObject('systemtag', (int)$tag->getId(), $tag->getName());
if ($event->getEvent() === ManagerEvent::EVENT_CREATE) {
$activity->setSubject(Provider::CREATE_TAG, [
$actor,
diff --git a/apps/testing/appinfo/info.xml b/apps/testing/appinfo/info.xml
index d0d350a0364..81be7649d8e 100644
--- a/apps/testing/appinfo/info.xml
+++ b/apps/testing/appinfo/info.xml
@@ -1,15 +1,19 @@
-<?xml version="1.0"?>
-<info>
+<?xml version="1.0"?>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>testing</id>
<name>QA testing</name>
+ <summary>This app is only for testing! It is dangerous to have it enabled in a live instance</summary>
<description>This app is only for testing! It is dangerous to have it enabled in a live instance</description>
- <licence>AGPL</licence>
- <author>Joas Schilling</author>
<version>1.4.0</version>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
+ <licence>agpl</licence>
+ <author>Joas Schilling</author>
<types>
<authentication/>
</types>
+ <category>monitoring</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
</info>
diff --git a/apps/theming/appinfo/info.xml b/apps/theming/appinfo/info.xml
index d2eacea77b3..63ae7d196c1 100644
--- a/apps/theming/appinfo/info.xml
+++ b/apps/theming/appinfo/info.xml
@@ -1,23 +1,25 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>theming</id>
<name>Theming</name>
+ <summary>Adjust the Nextcloud theme</summary>
<description>Adjust the Nextcloud theme</description>
- <licence>AGPL</licence>
- <author>Nextcloud</author>
<version>1.5.0</version>
+ <licence>agpl</licence>
+ <author>Nextcloud</author>
<namespace>Theming</namespace>
- <category>other</category>
-
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
+ <default_enable/>
<types>
<logging/>
</types>
- <default_enable/>
+ <category>customization</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
<settings>
<admin>OCA\Theming\Settings\Admin</admin>
diff --git a/apps/theming/l10n/ar.js b/apps/theming/l10n/ar.js
index fb3c083e51a..a6e648fbec5 100644
--- a/apps/theming/l10n/ar.js
+++ b/apps/theming/l10n/ar.js
@@ -9,6 +9,9 @@ OC.L10N.register(
"The given web address is too long" : "هذا العنوان أطول مما يجب",
"The given slogan is too long" : "هذا الشعار أطول مما يجب",
"The given color is invalid" : "هناك خطأ في اللون",
+ "No file was uploaded" : "لم يتم رفع أي ملف",
+ "Missing a temporary folder" : "المجلد المؤقت غير موجود",
+ "Failed to write file to disk." : "خطأ في الكتابة على القرص الصلب.",
"No file uploaded" : "لم يتم رفع الملف",
"Unsupported image type" : "صيغة الصورة غير مقبولة",
"You are already using a custom theme" : "انت تستعمل قالب مخصص",
diff --git a/apps/theming/l10n/ar.json b/apps/theming/l10n/ar.json
index 940cdb418ba..5616648dd7e 100644
--- a/apps/theming/l10n/ar.json
+++ b/apps/theming/l10n/ar.json
@@ -7,6 +7,9 @@
"The given web address is too long" : "هذا العنوان أطول مما يجب",
"The given slogan is too long" : "هذا الشعار أطول مما يجب",
"The given color is invalid" : "هناك خطأ في اللون",
+ "No file was uploaded" : "لم يتم رفع أي ملف",
+ "Missing a temporary folder" : "المجلد المؤقت غير موجود",
+ "Failed to write file to disk." : "خطأ في الكتابة على القرص الصلب.",
"No file uploaded" : "لم يتم رفع الملف",
"Unsupported image type" : "صيغة الصورة غير مقبولة",
"You are already using a custom theme" : "انت تستعمل قالب مخصص",
diff --git a/apps/theming/l10n/ast.js b/apps/theming/l10n/ast.js
index 7d205db32a0..1155c63b78c 100644
--- a/apps/theming/l10n/ast.js
+++ b/apps/theming/l10n/ast.js
@@ -8,6 +8,8 @@ OC.L10N.register(
"The given web address is too long" : "La direición web dada ye perllarga",
"The given slogan is too long" : "La conseña dada ye perllarga",
"The given color is invalid" : "El color dau ye perllargu",
+ "No file was uploaded" : "Nun se xubieron fichjeros",
+ "Failed to write file to disk." : "Fallu al escribir el ficheru nel discu",
"No file uploaded" : "Nun se xubieron ficheros",
"Unsupported image type" : "Triba non sofitada d'imaxe",
"You are already using a custom theme" : "Yá tas usando un tema personalizáu",
diff --git a/apps/theming/l10n/ast.json b/apps/theming/l10n/ast.json
index e6a8a2e718a..d652ff9d5f5 100644
--- a/apps/theming/l10n/ast.json
+++ b/apps/theming/l10n/ast.json
@@ -6,6 +6,8 @@
"The given web address is too long" : "La direición web dada ye perllarga",
"The given slogan is too long" : "La conseña dada ye perllarga",
"The given color is invalid" : "El color dau ye perllargu",
+ "No file was uploaded" : "Nun se xubieron fichjeros",
+ "Failed to write file to disk." : "Fallu al escribir el ficheru nel discu",
"No file uploaded" : "Nun se xubieron ficheros",
"Unsupported image type" : "Triba non sofitada d'imaxe",
"You are already using a custom theme" : "Yá tas usando un tema personalizáu",
diff --git a/apps/theming/l10n/lv.js b/apps/theming/l10n/lv.js
index 474c584bd53..b4d012e5c63 100644
--- a/apps/theming/l10n/lv.js
+++ b/apps/theming/l10n/lv.js
@@ -9,7 +9,7 @@ OC.L10N.register(
"The given web address is too long" : "Norādītā adrese ir pārāk gara",
"The given slogan is too long" : "Norādītais teiciens ir pārāk garšs",
"The given color is invalid" : "Norādītā krāsa ir nederīga",
- "No file uploaded" : "Nav augšupielādēta faila",
+ "No file uploaded" : "Nav augšupielādēta datne",
"Unsupported image type" : "Neatbalstīts attēla tips",
"You are already using a custom theme" : "Tu jau izmanto pielāgotu tēmu",
"Theming" : "Dizains",
diff --git a/apps/theming/l10n/lv.json b/apps/theming/l10n/lv.json
index 2b38f8b5d5d..3a2e29f8d88 100644
--- a/apps/theming/l10n/lv.json
+++ b/apps/theming/l10n/lv.json
@@ -7,7 +7,7 @@
"The given web address is too long" : "Norādītā adrese ir pārāk gara",
"The given slogan is too long" : "Norādītais teiciens ir pārāk garšs",
"The given color is invalid" : "Norādītā krāsa ir nederīga",
- "No file uploaded" : "Nav augšupielādēta faila",
+ "No file uploaded" : "Nav augšupielādēta datne",
"Unsupported image type" : "Neatbalstīts attēla tips",
"You are already using a custom theme" : "Tu jau izmanto pielāgotu tēmu",
"Theming" : "Dizains",
diff --git a/apps/theming/l10n/nl.js b/apps/theming/l10n/nl.js
index a257a6ed683..5039188df9f 100644
--- a/apps/theming/l10n/nl.js
+++ b/apps/theming/l10n/nl.js
@@ -20,7 +20,7 @@ OC.L10N.register(
"No file uploaded" : "Geen bestand geüpload",
"Unsupported image type" : "Afbeeldingstype wordt niet ondersteund",
"You are already using a custom theme" : "Je gebruikt al een maatwerkthema",
- "Theming" : "Thema's",
+ "Theming" : "Uiterlijk",
"Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Thematiseren maakt het mogelijk om uiterlijk en gevoel van je systeem en ondersteunde clients aan te passen. Dit wordt zichtbaar voor alle gebruikers.",
"Name" : "Naam",
"Reset to default" : "Herstellen naar standaard",
diff --git a/apps/theming/l10n/nl.json b/apps/theming/l10n/nl.json
index cd0f5fd0751..28607407e1d 100644
--- a/apps/theming/l10n/nl.json
+++ b/apps/theming/l10n/nl.json
@@ -18,7 +18,7 @@
"No file uploaded" : "Geen bestand geüpload",
"Unsupported image type" : "Afbeeldingstype wordt niet ondersteund",
"You are already using a custom theme" : "Je gebruikt al een maatwerkthema",
- "Theming" : "Thema's",
+ "Theming" : "Uiterlijk",
"Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Thematiseren maakt het mogelijk om uiterlijk en gevoel van je systeem en ondersteunde clients aan te passen. Dit wordt zichtbaar voor alle gebruikers.",
"Name" : "Naam",
"Reset to default" : "Herstellen naar standaard",
diff --git a/apps/theming/l10n/pt_PT.js b/apps/theming/l10n/pt_PT.js
new file mode 100644
index 00000000000..8404ae98ca4
--- /dev/null
+++ b/apps/theming/l10n/pt_PT.js
@@ -0,0 +1,39 @@
+OC.L10N.register(
+ "theming",
+ {
+ "Loading preview…" : "A carregar pre-visualização...",
+ "Saved" : "Guardado",
+ "Admin" : "Administrador",
+ "a safe home for all your data" : "Um local seguro para todos os seus dados",
+ "The given name is too long" : "O nome atribuído é demasiado longo",
+ "The given web address is too long" : "O endereço web atribuído é demasiado longo",
+ "The given slogan is too long" : "O slogan atribuído é demasiado longo",
+ "The given color is invalid" : "A cor atribuída é inválida",
+ "There is no error, the file uploaded with success" : "Não ocorreu nenhum erro, o ficheiro foi carregado com sucesso",
+ "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "O ficheiro carregado excede a directiva upload_max_filesize no php.ini ",
+ "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "O ficheiro carregado excedo a directiva MAX_FILE_SIZE especificada no formulário HTML",
+ "The uploaded file was only partially uploaded" : "O ficheiro escolhido foi apenas parcialmente carregado",
+ "No file was uploaded" : "O ficheiro foi carregado",
+ "Missing a temporary folder" : "Falta uma pasta temporária",
+ "Failed to write file to disk." : "Falhou a escrever o ficheiro no disco.",
+ "A PHP extension stopped the file upload." : "Uma extensão PHP parou o carregamento do ficheiro.",
+ "No file uploaded" : "Nenhum ficheiro carregado",
+ "Unsupported image type" : "Tipo de imagem não suportado",
+ "You are already using a custom theme" : "Já está a usar um tema personalizado",
+ "Theming" : "Temática",
+ "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "A tematização possibilita a fácil personalização da aparência da sua instância e clientes suportados. Isto será visível para todos os utilizadores",
+ "Name" : "Nome",
+ "Reset to default" : "Repor original",
+ "Web address" : "Endereço Web",
+ "Web address https://…" : "Endereço Web https::// ...",
+ "Slogan" : "Slogan",
+ "Color" : "Cor",
+ "Logo" : "Logótipo",
+ "Upload new logo" : "Carregar novo logótipo",
+ "Login image" : "Imagem de Login",
+ "Upload new login background" : "Carregar imagem de segundo plano de Login",
+ "Remove background image" : "Remover imagem de segundo plano",
+ "Install the Imagemagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instale a extensão PHP Imagemagick com suporte para imagens SVG para gerar automaticamente favicons com base na cor e no logotipo carregado.",
+ "reset to default" : "restaurar valor padrão"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/theming/l10n/pt_PT.json b/apps/theming/l10n/pt_PT.json
new file mode 100644
index 00000000000..f71dd3a1962
--- /dev/null
+++ b/apps/theming/l10n/pt_PT.json
@@ -0,0 +1,37 @@
+{ "translations": {
+ "Loading preview…" : "A carregar pre-visualização...",
+ "Saved" : "Guardado",
+ "Admin" : "Administrador",
+ "a safe home for all your data" : "Um local seguro para todos os seus dados",
+ "The given name is too long" : "O nome atribuído é demasiado longo",
+ "The given web address is too long" : "O endereço web atribuído é demasiado longo",
+ "The given slogan is too long" : "O slogan atribuído é demasiado longo",
+ "The given color is invalid" : "A cor atribuída é inválida",
+ "There is no error, the file uploaded with success" : "Não ocorreu nenhum erro, o ficheiro foi carregado com sucesso",
+ "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "O ficheiro carregado excede a directiva upload_max_filesize no php.ini ",
+ "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "O ficheiro carregado excedo a directiva MAX_FILE_SIZE especificada no formulário HTML",
+ "The uploaded file was only partially uploaded" : "O ficheiro escolhido foi apenas parcialmente carregado",
+ "No file was uploaded" : "O ficheiro foi carregado",
+ "Missing a temporary folder" : "Falta uma pasta temporária",
+ "Failed to write file to disk." : "Falhou a escrever o ficheiro no disco.",
+ "A PHP extension stopped the file upload." : "Uma extensão PHP parou o carregamento do ficheiro.",
+ "No file uploaded" : "Nenhum ficheiro carregado",
+ "Unsupported image type" : "Tipo de imagem não suportado",
+ "You are already using a custom theme" : "Já está a usar um tema personalizado",
+ "Theming" : "Temática",
+ "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "A tematização possibilita a fácil personalização da aparência da sua instância e clientes suportados. Isto será visível para todos os utilizadores",
+ "Name" : "Nome",
+ "Reset to default" : "Repor original",
+ "Web address" : "Endereço Web",
+ "Web address https://…" : "Endereço Web https::// ...",
+ "Slogan" : "Slogan",
+ "Color" : "Cor",
+ "Logo" : "Logótipo",
+ "Upload new logo" : "Carregar novo logótipo",
+ "Login image" : "Imagem de Login",
+ "Upload new login background" : "Carregar imagem de segundo plano de Login",
+ "Remove background image" : "Remover imagem de segundo plano",
+ "Install the Imagemagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instale a extensão PHP Imagemagick com suporte para imagens SVG para gerar automaticamente favicons com base na cor e no logotipo carregado.",
+ "reset to default" : "restaurar valor padrão"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php
index f27841c0042..4e9ce1b646e 100644
--- a/apps/theming/lib/Controller/ThemingController.php
+++ b/apps/theming/lib/Controller/ThemingController.php
@@ -32,7 +32,6 @@
namespace OCA\Theming\Controller;
-use OC\Files\AppData\Factory;
use OC\Template\SCSSCacher;
use OCA\Theming\ThemingDefaults;
use OCP\AppFramework\Controller;
@@ -48,7 +47,6 @@ use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\IConfig;
use OCP\IL10N;
-use OCP\ILogger;
use OCP\IRequest;
use OCA\Theming\Util;
use OCP\ITempManager;
diff --git a/apps/theming/lib/Util.php b/apps/theming/lib/Util.php
index 2f6f4128365..b72cc5b8996 100644
--- a/apps/theming/lib/Util.php
+++ b/apps/theming/lib/Util.php
@@ -31,7 +31,6 @@ use OCP\Files\IAppData;
use OCP\Files\NotFoundException;
use OCP\Files\SimpleFS\ISimpleFile;
use OCP\IConfig;
-use OCP\Files\IRootFolder;
use Leafo\ScssPhp\Compiler;
class Util {
diff --git a/apps/twofactor_backupcodes/appinfo/info.xml b/apps/twofactor_backupcodes/appinfo/info.xml
index f2581de63e0..9fe0071a442 100644
--- a/apps/twofactor_backupcodes/appinfo/info.xml
+++ b/apps/twofactor_backupcodes/appinfo/info.xml
@@ -1,29 +1,32 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>twofactor_backupcodes</id>
<name>Two factor backup codes</name>
+ <summary>A two-factor auth backup codes provider</summary>
<description>A two-factor auth backup codes provider</description>
+ <version>1.3.0</version>
<licence>agpl</licence>
<author>Christoph Wurst</author>
- <version>1.3.0</version>
<namespace>TwoFactorBackupCodes</namespace>
- <category>other</category>
+ <category>integration</category>
+ <category>security</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
<two-factor-providers>
<provider>OCA\TwoFactorBackupCodes\Provider\BackupCodesProvider</provider>
</two-factor-providers>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
+ <settings>
+ <personal>OCA\TwoFactorBackupCodes\Settings\Personal</personal>
+ </settings>
<activity>
<providers>
<provider>OCA\TwoFactorBackupCodes\Activity\Provider</provider>
</providers>
</activity>
-
- <settings>
- <personal>OCA\TwoFactorBackupCodes\Settings\Personal</personal>
- </settings>
</info>
diff --git a/apps/twofactor_backupcodes/l10n/es.js b/apps/twofactor_backupcodes/l10n/es.js
index ef8ae363717..1e168e68dea 100644
--- a/apps/twofactor_backupcodes/l10n/es.js
+++ b/apps/twofactor_backupcodes/l10n/es.js
@@ -2,7 +2,7 @@ OC.L10N.register(
"twofactor_backupcodes",
{
"Generate backup codes" : "Generar códigos de respaldo",
- "Backup codes have been generated. {{used}} of {{total}} codes have been used." : "Los códigos de respaldo han sido generados. Ha usado {{used}} de {{total}}.",
+ "Backup codes have been generated. {{used}} of {{total}} codes have been used." : "Se han generado los códigos de respaldo. Estás usando {{used}} de {{total}}.",
"These are your backup codes. Please save and/or print them as you will not be able to read the codes again later" : "Estos son sus códigos de respaldo. Por favor guardelos y/o imprimalos ya que no podrá optenerlos nuevamente después.",
"Save backup codes" : "Guardar códigos de respaldo",
"Print backup codes" : "Imprimir códigos de respaldo",
diff --git a/apps/twofactor_backupcodes/l10n/es.json b/apps/twofactor_backupcodes/l10n/es.json
index 9c034570262..51a6e8253f6 100644
--- a/apps/twofactor_backupcodes/l10n/es.json
+++ b/apps/twofactor_backupcodes/l10n/es.json
@@ -1,6 +1,6 @@
{ "translations": {
"Generate backup codes" : "Generar códigos de respaldo",
- "Backup codes have been generated. {{used}} of {{total}} codes have been used." : "Los códigos de respaldo han sido generados. Ha usado {{used}} de {{total}}.",
+ "Backup codes have been generated. {{used}} of {{total}} codes have been used." : "Se han generado los códigos de respaldo. Estás usando {{used}} de {{total}}.",
"These are your backup codes. Please save and/or print them as you will not be able to read the codes again later" : "Estos son sus códigos de respaldo. Por favor guardelos y/o imprimalos ya que no podrá optenerlos nuevamente después.",
"Save backup codes" : "Guardar códigos de respaldo",
"Print backup codes" : "Imprimir códigos de respaldo",
diff --git a/apps/twofactor_backupcodes/l10n/hu.js b/apps/twofactor_backupcodes/l10n/hu.js
index 0d168f9f62b..c363ce82326 100644
--- a/apps/twofactor_backupcodes/l10n/hu.js
+++ b/apps/twofactor_backupcodes/l10n/hu.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"You created two-factor backup codes for your account" : "Kétfaktoros helyreállítási kódot hoztál létre a fiókodhoz",
"Backup code" : "Biztonsági kód",
"Use backup code" : "Biztonsági kód használata",
+ "Two factor backup codes" : "Kétfaktoros biztonsági mentési kódok",
"Second-factor backup codes" : "Második lépcsős biztonsági kódok"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/twofactor_backupcodes/l10n/hu.json b/apps/twofactor_backupcodes/l10n/hu.json
index 4e981a9acc6..fba5f6f594e 100644
--- a/apps/twofactor_backupcodes/l10n/hu.json
+++ b/apps/twofactor_backupcodes/l10n/hu.json
@@ -11,6 +11,7 @@
"You created two-factor backup codes for your account" : "Kétfaktoros helyreállítási kódot hoztál létre a fiókodhoz",
"Backup code" : "Biztonsági kód",
"Use backup code" : "Biztonsági kód használata",
+ "Two factor backup codes" : "Kétfaktoros biztonsági mentési kódok",
"Second-factor backup codes" : "Második lépcsős biztonsági kódok"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/twofactor_backupcodes/l10n/nb.js b/apps/twofactor_backupcodes/l10n/nb.js
index 82ce6520eb0..42fc5031948 100644
--- a/apps/twofactor_backupcodes/l10n/nb.js
+++ b/apps/twofactor_backupcodes/l10n/nb.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"You created two-factor backup codes for your account" : "Du opprettet to-trinns bekreftelse sikkerhetskopi-koder",
"Backup code" : "Sikkerhetskopi-kode",
"Use backup code" : "Bruker sikkerhetskopi-kode",
+ "Two factor backup codes" : "Sikkerhetskopikoder for tofaktor",
"Second-factor backup codes" : "To-trinns bekreftelse sikkerhetskopi-koder"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/twofactor_backupcodes/l10n/nb.json b/apps/twofactor_backupcodes/l10n/nb.json
index a5d95f4be41..25927e0f6e8 100644
--- a/apps/twofactor_backupcodes/l10n/nb.json
+++ b/apps/twofactor_backupcodes/l10n/nb.json
@@ -11,6 +11,7 @@
"You created two-factor backup codes for your account" : "Du opprettet to-trinns bekreftelse sikkerhetskopi-koder",
"Backup code" : "Sikkerhetskopi-kode",
"Use backup code" : "Bruker sikkerhetskopi-kode",
+ "Two factor backup codes" : "Sikkerhetskopikoder for tofaktor",
"Second-factor backup codes" : "To-trinns bekreftelse sikkerhetskopi-koder"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/twofactor_backupcodes/l10n/nl.js b/apps/twofactor_backupcodes/l10n/nl.js
index 968e9cdb1a6..3bad60ac7cc 100644
--- a/apps/twofactor_backupcodes/l10n/nl.js
+++ b/apps/twofactor_backupcodes/l10n/nl.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"You created two-factor backup codes for your account" : "Je creëerde tweefactor back-up codes voor je account",
"Backup code" : "Backup code",
"Use backup code" : "Gebruik backup code",
+ "Two factor backup codes" : "Twee-factor backupcode",
"Second-factor backup codes" : "Twee-factor backup code"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/twofactor_backupcodes/l10n/nl.json b/apps/twofactor_backupcodes/l10n/nl.json
index e3db86e4d93..02881d944b2 100644
--- a/apps/twofactor_backupcodes/l10n/nl.json
+++ b/apps/twofactor_backupcodes/l10n/nl.json
@@ -11,6 +11,7 @@
"You created two-factor backup codes for your account" : "Je creëerde tweefactor back-up codes voor je account",
"Backup code" : "Backup code",
"Use backup code" : "Gebruik backup code",
+ "Two factor backup codes" : "Twee-factor backupcode",
"Second-factor backup codes" : "Twee-factor backup code"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/updatenotification/appinfo/info.xml b/apps/updatenotification/appinfo/info.xml
index 14ec98916ab..a227ccd6557 100644
--- a/apps/updatenotification/appinfo/info.xml
+++ b/apps/updatenotification/appinfo/info.xml
@@ -1,13 +1,17 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>updatenotification</id>
<name>Update notification</name>
+ <summary>Displays update notifications for Nextcloud and provides the SSO for the updater.</summary>
<description>Displays update notifications for Nextcloud and provides the SSO for the updater.</description>
- <licence>AGPL</licence>
- <author>Lukas Reschke</author>
<version>1.4.1</version>
+ <licence>agpl</licence>
+ <author>Lukas Reschke</author>
<namespace>UpdateNotification</namespace>
<default_enable/>
+ <category>monitoring</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
diff --git a/apps/updatenotification/l10n/es.js b/apps/updatenotification/l10n/es.js
index fa2038ea0b8..baf5215988c 100644
--- a/apps/updatenotification/l10n/es.js
+++ b/apps/updatenotification/l10n/es.js
@@ -1,12 +1,12 @@
OC.L10N.register(
"updatenotification",
{
- "Could not start updater, please try the manual update" : "No se pudo iniciar el actualizador, por favor inténtalo de forma manual la actualización",
+ "Could not start updater, please try the manual update" : "No se ha podido iniciar el actualizador. Por favor, prueba a realizar la actualización de forma manual",
"{version} is available. Get more information on how to update." : "{version} está disponible. Obtenga más información sobre cómo actualizar.",
"Update notifications" : "Actualizar notificaciones",
"Channel updated" : "Canal actualizado",
- "The update server could not be reached since %d days to check for new updates." : "El servidor de actualización no se ha podido alcanzar desde hace %d días para comprobar nuevas actualizaciones.",
- "Please check the Nextcloud and server log files for errors." : "Por favor revise los archivos de registros para Nextcloud y el servidor en búsca de errores.",
+ "The update server could not be reached since %d days to check for new updates." : "No se ha podido contactar con el servidor de actualizaciones desde hace %d días para comprobar nuevas actualizaciones.",
+ "Please check the Nextcloud and server log files for errors." : "Por favor, revisa que no haya errores en Nextcloud y en los archivos de registro.",
"Update to %1$s is available." : "Actualización a %1$s esta disponible.",
"Update for %1$s to version %2$s is available." : "La actualización de %1$s a la versión %2$s está disponible.",
"Update for {app} to version %s is available." : "Actualización de {app} a la versión %s disponible.",
diff --git a/apps/updatenotification/l10n/es.json b/apps/updatenotification/l10n/es.json
index 6a8f4f87d5b..cca1c7e53fc 100644
--- a/apps/updatenotification/l10n/es.json
+++ b/apps/updatenotification/l10n/es.json
@@ -1,10 +1,10 @@
{ "translations": {
- "Could not start updater, please try the manual update" : "No se pudo iniciar el actualizador, por favor inténtalo de forma manual la actualización",
+ "Could not start updater, please try the manual update" : "No se ha podido iniciar el actualizador. Por favor, prueba a realizar la actualización de forma manual",
"{version} is available. Get more information on how to update." : "{version} está disponible. Obtenga más información sobre cómo actualizar.",
"Update notifications" : "Actualizar notificaciones",
"Channel updated" : "Canal actualizado",
- "The update server could not be reached since %d days to check for new updates." : "El servidor de actualización no se ha podido alcanzar desde hace %d días para comprobar nuevas actualizaciones.",
- "Please check the Nextcloud and server log files for errors." : "Por favor revise los archivos de registros para Nextcloud y el servidor en búsca de errores.",
+ "The update server could not be reached since %d days to check for new updates." : "No se ha podido contactar con el servidor de actualizaciones desde hace %d días para comprobar nuevas actualizaciones.",
+ "Please check the Nextcloud and server log files for errors." : "Por favor, revisa que no haya errores en Nextcloud y en los archivos de registro.",
"Update to %1$s is available." : "Actualización a %1$s esta disponible.",
"Update for %1$s to version %2$s is available." : "La actualización de %1$s a la versión %2$s está disponible.",
"Update for {app} to version %s is available." : "Actualización de {app} a la versión %s disponible.",
diff --git a/apps/updatenotification/l10n/hu.js b/apps/updatenotification/l10n/hu.js
index d9a9d308f63..a78f684ba0f 100644
--- a/apps/updatenotification/l10n/hu.js
+++ b/apps/updatenotification/l10n/hu.js
@@ -10,6 +10,7 @@ OC.L10N.register(
"Update to %1$s is available." : "%1$s frissítés elérhető.",
"Update for %1$s to version %2$s is available." : "%1$s frissíthető %2$s verzióra.",
"Update for {app} to version %s is available." : "{app} %s verzió frissítése elérhető",
+ "Update notification" : "Frissítési értesítés",
"A new version is available: %s" : "Új verzió érhető el: %s",
"Open updater" : "Frissítő megnyitása",
"Download now" : "Letöltés most",
diff --git a/apps/updatenotification/l10n/hu.json b/apps/updatenotification/l10n/hu.json
index f800931c2dc..823d230615a 100644
--- a/apps/updatenotification/l10n/hu.json
+++ b/apps/updatenotification/l10n/hu.json
@@ -8,6 +8,7 @@
"Update to %1$s is available." : "%1$s frissítés elérhető.",
"Update for %1$s to version %2$s is available." : "%1$s frissíthető %2$s verzióra.",
"Update for {app} to version %s is available." : "{app} %s verzió frissítése elérhető",
+ "Update notification" : "Frissítési értesítés",
"A new version is available: %s" : "Új verzió érhető el: %s",
"Open updater" : "Frissítő megnyitása",
"Download now" : "Letöltés most",
diff --git a/apps/updatenotification/l10n/nl.js b/apps/updatenotification/l10n/nl.js
index 89e6ecf2f14..49df2ea15b3 100644
--- a/apps/updatenotification/l10n/nl.js
+++ b/apps/updatenotification/l10n/nl.js
@@ -10,6 +10,7 @@ OC.L10N.register(
"Update to %1$s is available." : "Update naar %1$s is beschikbaar.",
"Update for %1$s to version %2$s is available." : "Update voor %1$s naar versie %2$s is beschikbaar.",
"Update for {app} to version %s is available." : "Update voor {app} naar versie %s is beschikbaar.",
+ "Update notification" : "Bijwerkmelding",
"A new version is available: %s" : "Er is een nieuwe versie beschikbaar: %s",
"Open updater" : "Open updater",
"Download now" : "Download nu",
diff --git a/apps/updatenotification/l10n/nl.json b/apps/updatenotification/l10n/nl.json
index 44e63a8c181..7bf173e3b1e 100644
--- a/apps/updatenotification/l10n/nl.json
+++ b/apps/updatenotification/l10n/nl.json
@@ -8,6 +8,7 @@
"Update to %1$s is available." : "Update naar %1$s is beschikbaar.",
"Update for %1$s to version %2$s is available." : "Update voor %1$s naar versie %2$s is beschikbaar.",
"Update for {app} to version %s is available." : "Update voor {app} naar versie %s is beschikbaar.",
+ "Update notification" : "Bijwerkmelding",
"A new version is available: %s" : "Er is een nieuwe versie beschikbaar: %s",
"Open updater" : "Open updater",
"Download now" : "Download nu",
diff --git a/apps/updatenotification/l10n/ru.js b/apps/updatenotification/l10n/ru.js
index 7f5a0833cdc..d223ecc3ba2 100644
--- a/apps/updatenotification/l10n/ru.js
+++ b/apps/updatenotification/l10n/ru.js
@@ -1,15 +1,16 @@
OC.L10N.register(
"updatenotification",
{
- "Could not start updater, please try the manual update" : "Не удалось обновить. Пожалуйста, выполните обновление вручную.",
+ "Could not start updater, please try the manual update" : "Не удалось обновить. Выполните обновление вручную.",
"{version} is available. Get more information on how to update." : "Доступна версия {version}. Получить дополнительную информацию о порядке обновления.",
"Update notifications" : "Уведомления об обновлениях",
"Channel updated" : "Канал обновлен.",
"The update server could not be reached since %d days to check for new updates." : "Сервер обновлений недоступен для проверки наличия обновлений дней: %d.",
- "Please check the Nextcloud and server log files for errors." : "Проверьте наличие ошибок в файлах журналов Nextcloud и сервера.",
+ "Please check the Nextcloud and server log files for errors." : "Проверьте наличие ошибок в файлах журналов Nextcloud и сервера.",
"Update to %1$s is available." : "Доступно обновление до версии %1$s.",
"Update for %1$s to version %2$s is available." : "Для приложения «%1$s» доступно обновление до версии %2$s.",
"Update for {app} to version %s is available." : "Для приложения «{app}» доступно обновление до версии %s.",
+ "Update notification" : "Уведомление о новой версии",
"A new version is available: %s" : "Доступна новая версия: %s",
"Open updater" : "Открыть окно обновления",
"Download now" : "Скачать сейчас",
@@ -19,7 +20,7 @@ OC.L10N.register(
"A non-default update server is in use to be checked for updates:" : "Не сервер по умолчанию используется как сервер для проверки обновлений:",
"Update channel:" : "Канал обновлений:",
"You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Вы всегда можете переключиться на экспериментальный канал обновлений для получения новейших версий. Но учтите, что вы не сможете переключиться обратно на канал обновлений для стабильных версий.",
- "Note that after a new release it can take some time before it shows up here. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found." : "Обратите внимание, что от момента выпуска новой версии до её появления здесь может пройти некоторое время. Мы растягиваем во времени распространение новых версий и иногда, при обнаружении проблем, пропускаем версию.",
+ "Note that after a new release it can take some time before it shows up here. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found." : "Обратите внимание, что с момента выпуска новой версии до её появления здесь может пройти некоторое время. Мы растягиваем во времени распространение новых версий и иногда, при обнаружении проблем, пропускаем версию.",
"Notify members of the following groups about available updates:" : "Уведомить членов следующих групп о наличии доступных обновлений:",
"Only notification for app updates are available." : "Только уведомления об обновлении приложений доступны.",
"The selected update channel makes dedicated notifications for the server obsolete." : "Выбранный канал обновлений высылает специальные уведомления, если сервер устарел.",
diff --git a/apps/updatenotification/l10n/ru.json b/apps/updatenotification/l10n/ru.json
index cb11fc0f0d0..85f02374b24 100644
--- a/apps/updatenotification/l10n/ru.json
+++ b/apps/updatenotification/l10n/ru.json
@@ -1,13 +1,14 @@
{ "translations": {
- "Could not start updater, please try the manual update" : "Не удалось обновить. Пожалуйста, выполните обновление вручную.",
+ "Could not start updater, please try the manual update" : "Не удалось обновить. Выполните обновление вручную.",
"{version} is available. Get more information on how to update." : "Доступна версия {version}. Получить дополнительную информацию о порядке обновления.",
"Update notifications" : "Уведомления об обновлениях",
"Channel updated" : "Канал обновлен.",
"The update server could not be reached since %d days to check for new updates." : "Сервер обновлений недоступен для проверки наличия обновлений дней: %d.",
- "Please check the Nextcloud and server log files for errors." : "Проверьте наличие ошибок в файлах журналов Nextcloud и сервера.",
+ "Please check the Nextcloud and server log files for errors." : "Проверьте наличие ошибок в файлах журналов Nextcloud и сервера.",
"Update to %1$s is available." : "Доступно обновление до версии %1$s.",
"Update for %1$s to version %2$s is available." : "Для приложения «%1$s» доступно обновление до версии %2$s.",
"Update for {app} to version %s is available." : "Для приложения «{app}» доступно обновление до версии %s.",
+ "Update notification" : "Уведомление о новой версии",
"A new version is available: %s" : "Доступна новая версия: %s",
"Open updater" : "Открыть окно обновления",
"Download now" : "Скачать сейчас",
@@ -17,7 +18,7 @@
"A non-default update server is in use to be checked for updates:" : "Не сервер по умолчанию используется как сервер для проверки обновлений:",
"Update channel:" : "Канал обновлений:",
"You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Вы всегда можете переключиться на экспериментальный канал обновлений для получения новейших версий. Но учтите, что вы не сможете переключиться обратно на канал обновлений для стабильных версий.",
- "Note that after a new release it can take some time before it shows up here. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found." : "Обратите внимание, что от момента выпуска новой версии до её появления здесь может пройти некоторое время. Мы растягиваем во времени распространение новых версий и иногда, при обнаружении проблем, пропускаем версию.",
+ "Note that after a new release it can take some time before it shows up here. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found." : "Обратите внимание, что с момента выпуска новой версии до её появления здесь может пройти некоторое время. Мы растягиваем во времени распространение новых версий и иногда, при обнаружении проблем, пропускаем версию.",
"Notify members of the following groups about available updates:" : "Уведомить членов следующих групп о наличии доступных обновлений:",
"Only notification for app updates are available." : "Только уведомления об обновлении приложений доступны.",
"The selected update channel makes dedicated notifications for the server obsolete." : "Выбранный канал обновлений высылает специальные уведомления, если сервер устарел.",
diff --git a/apps/updatenotification/l10n/sk.js b/apps/updatenotification/l10n/sk.js
index aaa96cebf0c..e03b9ebb29e 100644
--- a/apps/updatenotification/l10n/sk.js
+++ b/apps/updatenotification/l10n/sk.js
@@ -3,13 +3,14 @@ OC.L10N.register(
{
"Could not start updater, please try the manual update" : "Nebolo možné spustiť aktualizátor, skúste prosím manuálnu aktualizáciu",
"{version} is available. Get more information on how to update." : "{version} je dostupná. Získajte viac informácií o postupe aktualizácie.",
- "Update notifications" : "Upozornenia aktualizácií",
+ "Update notifications" : "Aktualizovať hlásenia",
"Channel updated" : "Kanál bol aktualizovaný",
"The update server could not be reached since %d days to check for new updates." : "Aktualizačný server je nedostupný %d dní pre kontrolu aktualizácií.",
"Please check the Nextcloud and server log files for errors." : "Chyby skontrolujte prosím v logoch Nextcloud a webového servera",
"Update to %1$s is available." : "Je dostupná aktualizácia na verziu %1$s.",
"Update for %1$s to version %2$s is available." : "Pre %1$s je dostupná aktualizácia na verziu %2$s.",
"Update for {app} to version %s is available." : "Pre {app} je dostupná aktualizácia na verziu %s.",
+ "Update notification" : "Aktualizovať hlásenie",
"A new version is available: %s" : "Je dostupná nová verzia: %s",
"Open updater" : "Otvoriť aktualizátor",
"Download now" : "Stiahnuť teraz",
diff --git a/apps/updatenotification/l10n/sk.json b/apps/updatenotification/l10n/sk.json
index 67391c3c882..c9ab08aa98f 100644
--- a/apps/updatenotification/l10n/sk.json
+++ b/apps/updatenotification/l10n/sk.json
@@ -1,13 +1,14 @@
{ "translations": {
"Could not start updater, please try the manual update" : "Nebolo možné spustiť aktualizátor, skúste prosím manuálnu aktualizáciu",
"{version} is available. Get more information on how to update." : "{version} je dostupná. Získajte viac informácií o postupe aktualizácie.",
- "Update notifications" : "Upozornenia aktualizácií",
+ "Update notifications" : "Aktualizovať hlásenia",
"Channel updated" : "Kanál bol aktualizovaný",
"The update server could not be reached since %d days to check for new updates." : "Aktualizačný server je nedostupný %d dní pre kontrolu aktualizácií.",
"Please check the Nextcloud and server log files for errors." : "Chyby skontrolujte prosím v logoch Nextcloud a webového servera",
"Update to %1$s is available." : "Je dostupná aktualizácia na verziu %1$s.",
"Update for %1$s to version %2$s is available." : "Pre %1$s je dostupná aktualizácia na verziu %2$s.",
"Update for {app} to version %s is available." : "Pre {app} je dostupná aktualizácia na verziu %s.",
+ "Update notification" : "Aktualizovať hlásenie",
"A new version is available: %s" : "Je dostupná nová verzia: %s",
"Open updater" : "Otvoriť aktualizátor",
"Download now" : "Stiahnuť teraz",
diff --git a/apps/updatenotification/l10n/sv.js b/apps/updatenotification/l10n/sv.js
index a360615d947..8d5ccfdc525 100644
--- a/apps/updatenotification/l10n/sv.js
+++ b/apps/updatenotification/l10n/sv.js
@@ -10,6 +10,7 @@ OC.L10N.register(
"Update to %1$s is available." : "Uppdatering till %1$s är tillgänglig.",
"Update for %1$s to version %2$s is available." : "Uppdatering för %1$s till version %2$s är tillgänglig.",
"Update for {app} to version %s is available." : "Uppdatering för {app} till version %s är tillgänglig.",
+ "Update notification" : "Uppdatera notifikation",
"A new version is available: %s" : "En ny version är tillgänglig: %s",
"Open updater" : "Öppna uppdateraren",
"Download now" : "Ladda ned nu",
diff --git a/apps/updatenotification/l10n/sv.json b/apps/updatenotification/l10n/sv.json
index 62451abf15e..3a6f4186f1f 100644
--- a/apps/updatenotification/l10n/sv.json
+++ b/apps/updatenotification/l10n/sv.json
@@ -8,6 +8,7 @@
"Update to %1$s is available." : "Uppdatering till %1$s är tillgänglig.",
"Update for %1$s to version %2$s is available." : "Uppdatering för %1$s till version %2$s är tillgänglig.",
"Update for {app} to version %s is available." : "Uppdatering för {app} till version %s är tillgänglig.",
+ "Update notification" : "Uppdatera notifikation",
"A new version is available: %s" : "En ny version är tillgänglig: %s",
"Open updater" : "Öppna uppdateraren",
"Download now" : "Ladda ned nu",
diff --git a/apps/user_ldap/appinfo/info.xml b/apps/user_ldap/appinfo/info.xml
index dbf9a736899..bb5ebce4fc5 100644
--- a/apps/user_ldap/appinfo/info.xml
+++ b/apps/user_ldap/appinfo/info.xml
@@ -1,43 +1,46 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>user_ldap</id>
<name>LDAP user and group backend</name>
+ <summary>This application enables administrators to connect Nextcloud to an LDAP-based user directory.</summary>
<description>This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.
A user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation.
</description>
- <licence>AGPL</licence>
+ <version>1.4.0</version>
+ <licence>agpl</licence>
<author>Dominik Schmidt</author>
<author>Arthur Schiwon</author>
- <version>1.4.0</version>
+ <namespace>User_LDAP</namespace>
<types>
<authentication/>
</types>
<documentation>
<admin>admin-ldap</admin>
</documentation>
+ <category>integration</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<lib>ldap</lib>
<nextcloud min-version="14" max-version="14" />
</dependencies>
- <namespace>User_LDAP</namespace>
-
<background-jobs>
<job>OCA\User_LDAP\Jobs\UpdateGroups</job>
<job>OCA\User_LDAP\Jobs\CleanUp</job>
<job>OCA\User_LDAP\Jobs\Sync</job>
</background-jobs>
- <settings>
- <admin>OCA\User_LDAP\Settings\Admin</admin>
- <admin-section>OCA\User_LDAP\Settings\Section</admin-section>
- </settings>
-
<repair-steps>
<post-migration>
<step>OCA\User_LDAP\Migration\UUIDFixInsert</step>
</post-migration>
</repair-steps>
+
+ <settings>
+ <admin>OCA\User_LDAP\Settings\Admin</admin>
+ <admin-section>OCA\User_LDAP\Settings\Section</admin-section>
+ </settings>
</info>
diff --git a/apps/user_ldap/l10n/es.js b/apps/user_ldap/l10n/es.js
index a23a7d8a9f3..1f51667ca20 100644
--- a/apps/user_ldap/l10n/es.js
+++ b/apps/user_ldap/l10n/es.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"user_ldap",
{
- "Failed to clear the mappings." : "Ocurrió un fallo al borrar las asignaciones.",
+ "Failed to clear the mappings." : "Se ha producido un fallo al borrar las asignaciones.",
"Failed to delete the server configuration" : "No se pudo borrar la configuración del servidor",
"Invalid configuration: Anonymous binding is not allowed." : "Configuración no válida: No se permite enlazado anónimo.",
"Valid configuration, connection established!" : "Configuración válida. ¡Conexión establecida!",
@@ -105,7 +105,7 @@ OC.L10N.register(
"Detect Base DN" : "Detectar Base DN",
"Test Base DN" : "Probar Base DN",
"Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita peticiones automáticas al LDAP. Mejor para grandes configuraciones, pero requiere cierto conocimiento de LDAP.",
- "Manually enter LDAP filters (recommended for large directories)" : "Ingrese manualmente los filtros LDAP (Recomendado para grandes directorios)",
+ "Manually enter LDAP filters (recommended for large directories)" : "Introduzca manualmente los filtros LDAP (recomendado para directorios grandes)",
"Listing and searching for users is constrained by these criteria:" : "El listado y la búsqueda de usuarios es restringido por estos criterios:",
"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." : "Los objetos de clases más comunes para los usuarios son organizationalPerson, persona, usuario y inetOrgPerson. Si no está seguro de qué objeto de clase seleccionar, por favor, consulte con su administrador de directorio. ",
"The filter specifies which LDAP users shall have access to the %s instance." : "El filtro especifica que usuarios LDAP pueden tener acceso a %s.",
diff --git a/apps/user_ldap/l10n/es.json b/apps/user_ldap/l10n/es.json
index 7538f0a0b0d..5d7352fd0c8 100644
--- a/apps/user_ldap/l10n/es.json
+++ b/apps/user_ldap/l10n/es.json
@@ -1,5 +1,5 @@
{ "translations": {
- "Failed to clear the mappings." : "Ocurrió un fallo al borrar las asignaciones.",
+ "Failed to clear the mappings." : "Se ha producido un fallo al borrar las asignaciones.",
"Failed to delete the server configuration" : "No se pudo borrar la configuración del servidor",
"Invalid configuration: Anonymous binding is not allowed." : "Configuración no válida: No se permite enlazado anónimo.",
"Valid configuration, connection established!" : "Configuración válida. ¡Conexión establecida!",
@@ -103,7 +103,7 @@
"Detect Base DN" : "Detectar Base DN",
"Test Base DN" : "Probar Base DN",
"Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita peticiones automáticas al LDAP. Mejor para grandes configuraciones, pero requiere cierto conocimiento de LDAP.",
- "Manually enter LDAP filters (recommended for large directories)" : "Ingrese manualmente los filtros LDAP (Recomendado para grandes directorios)",
+ "Manually enter LDAP filters (recommended for large directories)" : "Introduzca manualmente los filtros LDAP (recomendado para directorios grandes)",
"Listing and searching for users is constrained by these criteria:" : "El listado y la búsqueda de usuarios es restringido por estos criterios:",
"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." : "Los objetos de clases más comunes para los usuarios son organizationalPerson, persona, usuario y inetOrgPerson. Si no está seguro de qué objeto de clase seleccionar, por favor, consulte con su administrador de directorio. ",
"The filter specifies which LDAP users shall have access to the %s instance." : "El filtro especifica que usuarios LDAP pueden tener acceso a %s.",
diff --git a/apps/user_ldap/l10n/lt_LT.js b/apps/user_ldap/l10n/lt_LT.js
index 8bfd3fb123d..e0fc8e17149 100644
--- a/apps/user_ldap/l10n/lt_LT.js
+++ b/apps/user_ldap/l10n/lt_LT.js
@@ -158,15 +158,16 @@ OC.L10N.register(
"Default password policy DN" : "Numatytų slaptažodžio taisyklių DN.",
"The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "Numatytų slaptažodžio taisyklių DN, kuris bus naudojamas tvarkant slaptažodžio galiojimą. Veikia tik tada, kai yra įjungtas LDAP vartotojo slaptažodžio keitimas ir yra palaikomas tik OpenLDAP. Palikite tuščią, jei norite išjungti slaptažodžio galiojimo tvarkymą.",
"Special Attributes" : "Specialūs atributai",
- "Quota Field" : "Kvotos laukas",
- "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Palikite tuščią, jei norite, kad galiotų numatytoji naudotojų kvota. Kitu atveju, nurodykite LDAP/AD atributą.",
- "Quota Default" : "Numatyta kvota",
+ "Quota Field" : "Leidžiamo duomenų kiekio laukas",
+ "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Palikite tuščią, jei norite, kad galiotų numatytasis naudotojui leidžiamas duomenų kiekis. Kitu atveju, nurodykite LDAP/AD atributą.",
+ "Quota Default" : "Leidžiamo duomenų kiekio numatytoji reikšmė",
+ "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Nustelbti numatytąjį leidžiamą duomenų kiekį LDAP naudotojams, kurie leidžiamo duomenų kiekio lauke neturi nustatyto leidžiamo duomenų kiekio.",
"Email Field" : "El. pašto laukas",
"Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Naudotojų el. paštą nustatykite pagal jų LDAP atributą. Palikite tuščią jei norite, kad veiktų pagal numatytuosius parametrus.",
"User Home Folder Naming Rule" : "Naudotojo namų aplanko pavadinimo taisyklė",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Palikite tuščią naudotojo vardui (numatytoji reikšmė). Kitu atveju, nurodykite LDAP/AD atributą.",
"Internal Username" : "Vidinis naudotojo vardas",
- "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Pagal nutylėjimą vidinis naudotojo vardas bus sukurtas iš UUID atributo. Tai užtikrina naudotojo vardo unikalumą ir kad nereikia konvertuoti simbolių. Vidinis naudotojo vardas turi apribojimą, leidžiantį tik šiuos simbolius: [a-zA-Z0-9 _. @ -]. Kiti simboliai pakeičiami ASCII atitikmenimis arba tiesiog praleidžiami. Sutapimų konflikto atveju yra pridedamas/padidinamas skaičius. Vidinis naudotojo vardas naudojamas yra naudojamas identifikuoti naudotoją viduje. Tai kartu yra numatytasis vartotojo aplanko pavadinimas. Taip pat tai nuotolinių URL dalis, pavyzdžiui, visoms *DAV paslaugoms. Naudojant šį nustatymą, numatytoji elgsena gali būti panaikinta. Palikite tuščią, jei norite kad galiotų numatytąjį reikšmė. Pakeitimai įtakoja tik naujai priskirtiems (pridedamiems) LDAP vartotojams.",
+ "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Pagal numatymą vidinis naudotojo vardas bus sukurtas iš UUID atributo. Tai užtikrina naudotojo vardo unikalumą ir tuo pačiu nereikia konvertuoti simbolių. Vidinis naudotojo vardas turi apribojimą, leidžiantį tik šiuos simbolius: [ a-zA-Z0-9 _. @ - ]. Kiti simboliai pakeičiami ASCII atitikmenimis arba tiesiog praleidžiami. Sutapimų konflikto atveju yra pridedamas/padidinamas skaičius. Vidinis naudotojo vardas yra naudojamas identifikuoti naudotoją viduje. Tai kartu yra numatytasis naudotojo aplanko pavadinimas. Taip pat jis yra nuotolinių URL dalimi, pavyzdžiui, visoms *DAV paslaugoms. Naudojant šį nustatymą, numatytoji elgsena gali būti nustelbta. Palikite tuščią, jei norite kad galiotų numatytoji elgsena. Pakeitimai įsigalios tik naujai priskirtiems (pridėtiems) LDAP naudotojams.",
"Internal Username Attribute:" : "Vidinis naudotojo vardo atributas:",
"Override UUID detection" : "Perrašyti UUID aptikimą",
"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "naudotojo vardasnaudotojo vardasPagal nutylėjimą, UUID atributas yra automatiškai aptinkamas. UUID atributas yra naudojamas identifikuoti LDAP vartotojus ir grupes. Taigi, vidinis naudotojo vardas bus sukurtas remiantis UUID, jei nenurodyta kitaip. Jūs galite pakeisti nustatymus ir perduoti pasirinktus atributus. Turite įsitikinti, kad jūsų pasirinktas atributas gali būti rastas tiek prie vartotojų, tiek prie grupių, ir yra unikalus. Jei norite, kad veiktų pagal numatytuosius parametrus, palikite tuščią. Pakeitimai turės įtakos tik naujai susietiems (pridedamiems) LDAP naudotojams ir grupėms.",
diff --git a/apps/user_ldap/l10n/lt_LT.json b/apps/user_ldap/l10n/lt_LT.json
index bcd52d00e1c..15a2f4529c9 100644
--- a/apps/user_ldap/l10n/lt_LT.json
+++ b/apps/user_ldap/l10n/lt_LT.json
@@ -156,15 +156,16 @@
"Default password policy DN" : "Numatytų slaptažodžio taisyklių DN.",
"The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "Numatytų slaptažodžio taisyklių DN, kuris bus naudojamas tvarkant slaptažodžio galiojimą. Veikia tik tada, kai yra įjungtas LDAP vartotojo slaptažodžio keitimas ir yra palaikomas tik OpenLDAP. Palikite tuščią, jei norite išjungti slaptažodžio galiojimo tvarkymą.",
"Special Attributes" : "Specialūs atributai",
- "Quota Field" : "Kvotos laukas",
- "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Palikite tuščią, jei norite, kad galiotų numatytoji naudotojų kvota. Kitu atveju, nurodykite LDAP/AD atributą.",
- "Quota Default" : "Numatyta kvota",
+ "Quota Field" : "Leidžiamo duomenų kiekio laukas",
+ "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Palikite tuščią, jei norite, kad galiotų numatytasis naudotojui leidžiamas duomenų kiekis. Kitu atveju, nurodykite LDAP/AD atributą.",
+ "Quota Default" : "Leidžiamo duomenų kiekio numatytoji reikšmė",
+ "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Nustelbti numatytąjį leidžiamą duomenų kiekį LDAP naudotojams, kurie leidžiamo duomenų kiekio lauke neturi nustatyto leidžiamo duomenų kiekio.",
"Email Field" : "El. pašto laukas",
"Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Naudotojų el. paštą nustatykite pagal jų LDAP atributą. Palikite tuščią jei norite, kad veiktų pagal numatytuosius parametrus.",
"User Home Folder Naming Rule" : "Naudotojo namų aplanko pavadinimo taisyklė",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Palikite tuščią naudotojo vardui (numatytoji reikšmė). Kitu atveju, nurodykite LDAP/AD atributą.",
"Internal Username" : "Vidinis naudotojo vardas",
- "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Pagal nutylėjimą vidinis naudotojo vardas bus sukurtas iš UUID atributo. Tai užtikrina naudotojo vardo unikalumą ir kad nereikia konvertuoti simbolių. Vidinis naudotojo vardas turi apribojimą, leidžiantį tik šiuos simbolius: [a-zA-Z0-9 _. @ -]. Kiti simboliai pakeičiami ASCII atitikmenimis arba tiesiog praleidžiami. Sutapimų konflikto atveju yra pridedamas/padidinamas skaičius. Vidinis naudotojo vardas naudojamas yra naudojamas identifikuoti naudotoją viduje. Tai kartu yra numatytasis vartotojo aplanko pavadinimas. Taip pat tai nuotolinių URL dalis, pavyzdžiui, visoms *DAV paslaugoms. Naudojant šį nustatymą, numatytoji elgsena gali būti panaikinta. Palikite tuščią, jei norite kad galiotų numatytąjį reikšmė. Pakeitimai įtakoja tik naujai priskirtiems (pridedamiems) LDAP vartotojams.",
+ "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Pagal numatymą vidinis naudotojo vardas bus sukurtas iš UUID atributo. Tai užtikrina naudotojo vardo unikalumą ir tuo pačiu nereikia konvertuoti simbolių. Vidinis naudotojo vardas turi apribojimą, leidžiantį tik šiuos simbolius: [ a-zA-Z0-9 _. @ - ]. Kiti simboliai pakeičiami ASCII atitikmenimis arba tiesiog praleidžiami. Sutapimų konflikto atveju yra pridedamas/padidinamas skaičius. Vidinis naudotojo vardas yra naudojamas identifikuoti naudotoją viduje. Tai kartu yra numatytasis naudotojo aplanko pavadinimas. Taip pat jis yra nuotolinių URL dalimi, pavyzdžiui, visoms *DAV paslaugoms. Naudojant šį nustatymą, numatytoji elgsena gali būti nustelbta. Palikite tuščią, jei norite kad galiotų numatytoji elgsena. Pakeitimai įsigalios tik naujai priskirtiems (pridėtiems) LDAP naudotojams.",
"Internal Username Attribute:" : "Vidinis naudotojo vardo atributas:",
"Override UUID detection" : "Perrašyti UUID aptikimą",
"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "naudotojo vardasnaudotojo vardasPagal nutylėjimą, UUID atributas yra automatiškai aptinkamas. UUID atributas yra naudojamas identifikuoti LDAP vartotojus ir grupes. Taigi, vidinis naudotojo vardas bus sukurtas remiantis UUID, jei nenurodyta kitaip. Jūs galite pakeisti nustatymus ir perduoti pasirinktus atributus. Turite įsitikinti, kad jūsų pasirinktas atributas gali būti rastas tiek prie vartotojų, tiek prie grupių, ir yra unikalus. Jei norite, kad veiktų pagal numatytuosius parametrus, palikite tuščią. Pakeitimai turės įtakos tik naujai susietiems (pridedamiems) LDAP naudotojams ir grupėms.",
diff --git a/apps/user_ldap/lib/Connection.php b/apps/user_ldap/lib/Connection.php
index 1ea3cc67303..d2d8bc7395e 100644
--- a/apps/user_ldap/lib/Connection.php
+++ b/apps/user_ldap/lib/Connection.php
@@ -86,6 +86,8 @@ class Connection extends LDAPUtility {
protected $ignoreValidation = false;
+ protected $bindResult = [];
+
/**
* Constructor
* @param ILDAPWrapper $ldap
@@ -113,6 +115,7 @@ class Connection extends LDAPUtility {
public function __destruct() {
if(!$this->dontDestruct && $this->ldap->isResource($this->ldapConnectionRes)) {
@$this->ldap->unbind($this->ldapConnectionRes);
+ $this->bindResult = [];
}
}
@@ -202,6 +205,7 @@ class Connection extends LDAPUtility {
if(!is_null($this->ldapConnectionRes)) {
@$this->ldap->unbind($this->ldapConnectionRes);
$this->ldapConnectionRes = null;
+ $this->bindResult = [];
}
}
@@ -560,6 +564,7 @@ class Connection extends LDAPUtility {
if($isBackupHost && ($error !== 0 || $isOverrideMainServer)) {
$this->doConnect($this->configuration->ldapBackupHost,
$this->configuration->ldapBackupPort);
+ $this->bindResult = [];
$bindStatus = $this->bind();
$error = $this->ldap->isResource($this->ldapConnectionRes) ?
$this->ldap->errno($this->ldapConnectionRes) : -1;
@@ -612,13 +617,35 @@ class Connection extends LDAPUtility {
if(!$this->configuration->ldapConfigurationActive) {
return false;
}
- $cr = $this->getConnectionResource();
+ $cr = $this->ldapConnectionRes;
if(!$this->ldap->isResource($cr)) {
- return false;
+ $cr = $this->getConnectionResource();
+ }
+
+ if(
+ count($this->bindResult) !== 0
+ && $this->bindResult['dn'] === $this->configuration->ldapAgentName
+ && \OC::$server->getHasher()->verify(
+ $this->configPrefix . $this->configuration->ldapAgentPassword,
+ $this->bindResult['hash']
+ )
+ ) {
+ // don't attempt to bind again with the same data as before
+ // bind might have been invoked via getConnectionResource(),
+ // but we need results specifically for e.g. user login
+ return $this->bindResult['result'];
}
+
$ldapLogin = @$this->ldap->bind($cr,
$this->configuration->ldapAgentName,
$this->configuration->ldapAgentPassword);
+
+ $this->bindResult = [
+ 'dn' => $this->configuration->ldapAgentName,
+ 'hash' => \OC::$server->getHasher()->hash($this->configPrefix . $this->configuration->ldapAgentPassword),
+ 'result' => $ldapLogin,
+ ];
+
if(!$ldapLogin) {
$errno = $this->ldap->errno($cr);
diff --git a/apps/user_ldap/lib/Controller/RenewPasswordController.php b/apps/user_ldap/lib/Controller/RenewPasswordController.php
index 9cdcdddb141..f6b7ae12f0f 100644
--- a/apps/user_ldap/lib/Controller/RenewPasswordController.php
+++ b/apps/user_ldap/lib/Controller/RenewPasswordController.php
@@ -24,7 +24,6 @@
namespace OCA\User_LDAP\Controller;
use OC\HintException;
-use OC_Util;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\TemplateResponse;
diff --git a/apps/user_ldap/lib/Group_LDAP.php b/apps/user_ldap/lib/Group_LDAP.php
index 6cb56941463..2e7bddb9c4d 100644
--- a/apps/user_ldap/lib/Group_LDAP.php
+++ b/apps/user_ldap/lib/Group_LDAP.php
@@ -207,6 +207,7 @@ class Group_LDAP extends BackendUtility implements \OCP\GroupInterface, IGroupLD
* @param string $dnGroup
* @param array|null &$seen
* @return array|mixed|null
+ * @throws \OC\ServerNotAvailableException
*/
private function _groupMembers($dnGroup, &$seen = null) {
if ($seen === null) {
@@ -220,26 +221,26 @@ class Group_LDAP extends BackendUtility implements \OCP\GroupInterface, IGroupLD
// used extensively in cron job, caching makes sense for nested groups
$cacheKey = '_groupMembers'.$dnGroup;
$groupMembers = $this->access->connection->getFromCache($cacheKey);
- if(!is_null($groupMembers)) {
+ if($groupMembers !== null) {
return $groupMembers;
}
$seen[$dnGroup] = 1;
$members = $this->access->readAttribute($dnGroup, $this->access->connection->ldapGroupMemberAssocAttr,
$this->access->connection->ldapGroupFilter);
if (is_array($members)) {
- foreach ($members as $memberDN) {
- $allMembers[$memberDN] = 1;
+ foreach ($members as $member) {
+ $allMembers[$member] = 1;
$nestedGroups = $this->access->connection->ldapNestedGroups;
if (!empty($nestedGroups)) {
- $subMembers = $this->_groupMembers($memberDN, $seen);
+ $subMembers = $this->_groupMembers($member, $seen);
if ($subMembers) {
- $allMembers = array_merge($allMembers, $subMembers);
+ $allMembers += $subMembers;
}
}
}
}
- $allMembers = array_merge($allMembers, $this->getDynamicGroupMembers($dnGroup));
+ $allMembers += $this->getDynamicGroupMembers($dnGroup);
$this->access->connection->writeToCache($cacheKey, $allMembers);
return $allMembers;
diff --git a/apps/user_ldap/lib/Jobs/Sync.php b/apps/user_ldap/lib/Jobs/Sync.php
index 0cc0be7d3ca..4ef0636a2eb 100644
--- a/apps/user_ldap/lib/Jobs/Sync.php
+++ b/apps/user_ldap/lib/Jobs/Sync.php
@@ -25,10 +25,8 @@ namespace OCA\User_LDAP\Jobs;
use OC\BackgroundJob\TimedJob;
use OC\ServerNotAvailableException;
-use OCA\User_LDAP\Access;
use OCA\User_LDAP\AccessFactory;
use OCA\User_LDAP\Configuration;
-use OCA\User_LDAP\Connection;
use OCA\User_LDAP\ConnectionFactory;
use OCA\User_LDAP\FilesystemHelper;
use OCA\User_LDAP\Helper;
diff --git a/apps/user_ldap/lib/Notification/Notifier.php b/apps/user_ldap/lib/Notification/Notifier.php
index 8c9d20c12dc..34625a3bef4 100644
--- a/apps/user_ldap/lib/Notification/Notifier.php
+++ b/apps/user_ldap/lib/Notification/Notifier.php
@@ -26,8 +26,6 @@
namespace OCA\User_LDAP\Notification;
-use OCP\IUser;
-use OCP\IUserManager;
use OCP\L10N\IFactory;
use OCP\Notification\INotification;
use OCP\Notification\INotifier;
diff --git a/apps/user_ldap/templates/part.wizard-groupfilter.php b/apps/user_ldap/templates/part.wizard-groupfilter.php
index 640b0bccb8a..a059b466812 100644
--- a/apps/user_ldap/templates/part.wizard-groupfilter.php
+++ b/apps/user_ldap/templates/part.wizard-groupfilter.php
@@ -1,7 +1,7 @@
<fieldset id="ldapWizard4">
<div>
<p>
- <?php p($l->t('Groups meeting these criteria are available in %s:', $theme->getName()));?>
+ <?php p($l->t('Groups meeting these criteria are available in %s:', [$theme->getName()]));?>
</p>
<p>
<label for="ldap_groupfilter_objectclass">
@@ -45,7 +45,7 @@
<p id="rawGroupFilterContainer" class="invisible">
<textarea type="text" id="ldap_group_filter" name="ldap_group_filter"
placeholder="<?php p($l->t('Edit LDAP Query'));?>"
- title="<?php p($l->t('The filter specifies which LDAP groups shall have access to the %s instance.', $theme->getName()));?>">
+ title="<?php p($l->t('The filter specifies which LDAP groups shall have access to the %s instance.', [$theme->getName()]));?>">
</textarea>
</p>
<p>
diff --git a/apps/user_ldap/templates/part.wizard-loginfilter.php b/apps/user_ldap/templates/part.wizard-loginfilter.php
index 2b0bd3f230d..c7cbabb7aba 100644
--- a/apps/user_ldap/templates/part.wizard-loginfilter.php
+++ b/apps/user_ldap/templates/part.wizard-loginfilter.php
@@ -1,7 +1,7 @@
<fieldset id="ldapWizard3">
<div>
<p>
- <?php p($l->t('When logging in, %s will find the user based on the following attributes:', $theme->getName()));?>
+ <?php p($l->t('When logging in, %s will find the user based on the following attributes:', [$theme->getName()]));?>
</p>
<p>
<label for="ldap_loginfilter_username">
diff --git a/apps/user_ldap/templates/part.wizard-userfilter.php b/apps/user_ldap/templates/part.wizard-userfilter.php
index ebac944e56f..2b8c3adb686 100644
--- a/apps/user_ldap/templates/part.wizard-userfilter.php
+++ b/apps/user_ldap/templates/part.wizard-userfilter.php
@@ -49,7 +49,7 @@
<textarea type="text" id="ldap_userlist_filter" name="ldap_userlist_filter"
class="ldapFilterInputElement"
placeholder="<?php p($l->t('Edit LDAP Query'));?>"
- title="<?php p($l->t('The filter specifies which LDAP users shall have access to the %s instance.', $theme->getName()));?>">
+ title="<?php p($l->t('The filter specifies which LDAP users shall have access to the %s instance.', [$theme->getName()]));?>">
</textarea>
</p>
<p>
diff --git a/apps/user_ldap/templates/settings.php b/apps/user_ldap/templates/settings.php
index 1e1c85db247..d22b31ac333 100644
--- a/apps/user_ldap/templates/settings.php
+++ b/apps/user_ldap/templates/settings.php
@@ -83,7 +83,7 @@ style('user_ldap', 'settings');
<p><label for="ldap_backup_host"><?php p($l->t('Backup (Replica) Host'));?></label><input type="text" id="ldap_backup_host" name="ldap_backup_host" data-default="<?php p($_['ldap_backup_host_default']); ?>" title="<?php p($l->t('Give an optional backup host. It must be a replica of the main LDAP/AD server.'));?>"></p>
<p><label for="ldap_backup_port"><?php p($l->t('Backup (Replica) Port'));?></label><input type="number" id="ldap_backup_port" name="ldap_backup_port" data-default="<?php p($_['ldap_backup_port_default']); ?>" /></p>
<p><label for="ldap_override_main_server"><?php p($l->t('Disable Main Server'));?></label><input type="checkbox" id="ldap_override_main_server" name="ldap_override_main_server" value="1" data-default="<?php p($_['ldap_override_main_server_default']); ?>" title="<?php p($l->t('Only connect to the replica server.'));?>" /></p>
- <p><label for="ldap_turn_off_cert_check"><?php p($l->t('Turn off SSL certificate validation.'));?></label><input type="checkbox" id="ldap_turn_off_cert_check" name="ldap_turn_off_cert_check" title="<?php p($l->t('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.', $theme->getName() ));?>" data-default="<?php p($_['ldap_turn_off_cert_check_default']); ?>" value="1"><br/></p>
+ <p><label for="ldap_turn_off_cert_check"><?php p($l->t('Turn off SSL certificate validation.'));?></label><input type="checkbox" id="ldap_turn_off_cert_check" name="ldap_turn_off_cert_check" title="<?php p($l->t('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.', [$theme->getName()] ));?>" data-default="<?php p($_['ldap_turn_off_cert_check_default']); ?>" value="1"><br/></p>
<p><label for="ldap_cache_ttl"><?php p($l->t('Cache Time-To-Live'));?></label><input type="number" id="ldap_cache_ttl" name="ldap_cache_ttl" title="<?php p($l->t('in seconds. A change empties the cache.'));?>" data-default="<?php p($_['ldap_cache_ttl_default']); ?>" /></p>
</div>
<h3><?php p($l->t('Directory Settings'));?></h3>
diff --git a/apps/user_ldap/tests/ConnectionTest.php b/apps/user_ldap/tests/ConnectionTest.php
index c0f91d25d39..cead84b05b0 100644
--- a/apps/user_ldap/tests/ConnectionTest.php
+++ b/apps/user_ldap/tests/ConnectionTest.php
@@ -174,7 +174,7 @@ class ConnectionTest extends \Test\TestCase {
->method('connect')
->will($this->returnValue('ldapResource'));
- $this->ldap->expects($this->exactly(2))
+ $this->ldap->expects($this->once())
->method('bind')
->will($this->returnValue(false));
diff --git a/apps/user_ldap/tests/Group_LDAPTest.php b/apps/user_ldap/tests/Group_LDAPTest.php
index 03fd73f261f..ec8d888e2a0 100644
--- a/apps/user_ldap/tests/Group_LDAPTest.php
+++ b/apps/user_ldap/tests/Group_LDAPTest.php
@@ -39,6 +39,7 @@ use OCA\User_LDAP\Connection;
use OCA\User_LDAP\Group_LDAP as GroupLDAP;
use OCA\User_LDAP\ILDAPWrapper;
use OCA\User_LDAP\User\Manager;
+use Test\TestCase;
/**
* Class GroupLDAPTest
@@ -47,7 +48,7 @@ use OCA\User_LDAP\User\Manager;
*
* @package OCA\User_LDAP\Tests
*/
-class Group_LDAPTest extends \Test\TestCase {
+class Group_LDAPTest extends TestCase {
/**
* @return \PHPUnit_Framework_MockObject_MockObject|Access
*/
@@ -965,6 +966,88 @@ class Group_LDAPTest extends \Test\TestCase {
$ldap = new GroupLDAP($access, $pluginManager);
$ldap->getGroupDetails('gid');
- }
+ }
+
+ public function groupMemberProvider() {
+ $base = 'dc=species,dc=earth';
+
+ $groups0 = [
+ 'uid=3723,' . $base,
+ 'uid=8372,' . $base,
+ 'uid=8427,' . $base,
+ 'uid=2333,' . $base,
+ 'uid=4754,' . $base,
+ ];
+ $groups1 = [
+ '3723',
+ '8372',
+ '8427',
+ '2333',
+ '4754',
+ ];
+ $groups2Nested = ['6642', '1424'];
+ $expGroups2 = array_merge($groups1, $groups2Nested);
+
+ return [
+ [ #0 – test DNs
+ 'cn=Birds,' . $base,
+ $groups0,
+ ['cn=Birds,' . $base => $groups0]
+ ],
+ [ #1 – test uids
+ 'cn=Birds,' . $base,
+ $groups1,
+ ['cn=Birds,' . $base => $groups1]
+ ],
+ [ #2 – test uids with nested groups
+ 'cn=Birds,' . $base,
+ $expGroups2,
+ [
+ 'cn=Birds,' . $base => $groups1,
+ '8427' => $groups2Nested, // simplified - nested groups would work with DNs
+ ],
+ ],
+ ];
+ }
+
+ /**
+ * @param string $groupDN
+ * @param string[] $expectedMembers
+ * @param array $groupsInfo
+ * @dataProvider groupMemberProvider
+ */
+ public function testGroupMembers($groupDN, $expectedMembers, $groupsInfo = null) {
+ $access = $this->getAccessMock();
+ $access->expects($this->any())
+ ->method('readAttribute')
+ ->willReturnCallback(function($group) use ($groupDN, $expectedMembers, $groupsInfo) {
+ if(isset($groupsInfo[$group])) {
+ return $groupsInfo[$group];
+ }
+ return [];
+ });
+
+ $access->connection = $this->createMock(Connection::class);
+ if(count($groupsInfo) > 1) {
+ $access->connection->expects($this->any())
+ ->method('__get')
+ ->willReturnCallback(function($name) {
+ if($name === 'ldapNestedGroups') {
+ return 1;
+ }
+ return null;
+ });
+ }
+
+ /** @var GroupPluginManager $pluginManager */
+ $pluginManager = $this->createMock(GroupPluginManager::class);
+
+ $ldap = new GroupLDAP($access, $pluginManager);
+ $resultingMembers = $this->invokePrivate($ldap, '_groupMembers', [$groupDN]);
+
+ $expected = array_keys(array_flip($expectedMembers));
+
+ $this->assertEquals($expected, array_keys($resultingMembers), '', 0.0, 10, true);
+ }
}
diff --git a/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php b/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php
index 32dfb72d9c1..764c14bafe7 100644
--- a/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php
+++ b/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php
@@ -96,7 +96,7 @@ class ExceptionOnLostConnection {
*/
public function setUp() {
require_once __DIR__ . '/../../../../lib/base.php';
- \OC_App::loadApps('user_ldap');
+ \OC_App::loadApps(['user_ldap']);
$ch = $this->getCurl();
$proxyInfoJson = curl_exec($ch);
diff --git a/apps/workflowengine/appinfo/info.xml b/apps/workflowengine/appinfo/info.xml
index 5d51333f750..1c069ca5432 100644
--- a/apps/workflowengine/appinfo/info.xml
+++ b/apps/workflowengine/appinfo/info.xml
@@ -1,22 +1,24 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>workflowengine</id>
<name>Files workflow engine</name>
- <description></description>
- <licence>AGPL</licence>
- <author>Morris Jobke</author>
+ <summary>Files workflow engine</summary>
+ <description>Files workflow engine</description>
<version>1.4.0</version>
+ <licence>agpl</licence>
+ <author>Morris Jobke</author>
<namespace>WorkflowEngine</namespace>
- <category>other</category>
- <website>https://github.com/nextcloud/server</website>
- <bugs>https://github.com/nextcloud/server/issues</bugs>
- <repository type="git">https://github.com/nextcloud/server.git</repository>
-
<types>
<filesystem/>
</types>
+ <category>files</category>
+ <website>https://github.com/nextcloud/server</website>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <repository>https://github.com/nextcloud/server.git</repository>
+
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
diff --git a/apps/workflowengine/l10n/es.js b/apps/workflowengine/l10n/es.js
index c882ece0107..3dea8a6319c 100644
--- a/apps/workflowengine/l10n/es.js
+++ b/apps/workflowengine/l10n/es.js
@@ -2,7 +2,7 @@ OC.L10N.register(
"workflowengine",
{
"Saved" : "Guardado",
- "Saving failed:" : "Guardado fallido:",
+ "Saving failed:" : "Fallo al guardar:",
"File MIME type" : "Tipo MIME del archivo",
"is" : "es/esta",
"is not" : "no es/esta",
diff --git a/apps/workflowengine/l10n/es.json b/apps/workflowengine/l10n/es.json
index fd0e54bddae..47a76e1125c 100644
--- a/apps/workflowengine/l10n/es.json
+++ b/apps/workflowengine/l10n/es.json
@@ -1,6 +1,6 @@
{ "translations": {
"Saved" : "Guardado",
- "Saving failed:" : "Guardado fallido:",
+ "Saving failed:" : "Fallo al guardar:",
"File MIME type" : "Tipo MIME del archivo",
"is" : "es/esta",
"is not" : "no es/esta",
diff --git a/apps/workflowengine/l10n/hu.js b/apps/workflowengine/l10n/hu.js
index 8148a34b6a0..25190f7f619 100644
--- a/apps/workflowengine/l10n/hu.js
+++ b/apps/workflowengine/l10n/hu.js
@@ -59,6 +59,7 @@ OC.L10N.register(
"Check %s is invalid" : "%s érvénytelen, ellenőrizd",
"Check #%s does not exist" : "#%s nem létezik, ellenőrizd",
"Workflow" : "Munkafolyamat",
+ "Files workflow engine" : "Fájl munkafolyamat motor",
"Open documentation" : "Dokumentáció megnyitása",
"Add rule group" : "Szabály csoport hozzáadás",
"Short rule description" : "A szabály rövid leírása",
diff --git a/apps/workflowengine/l10n/hu.json b/apps/workflowengine/l10n/hu.json
index 98909aab244..9bae6fb384b 100644
--- a/apps/workflowengine/l10n/hu.json
+++ b/apps/workflowengine/l10n/hu.json
@@ -57,6 +57,7 @@
"Check %s is invalid" : "%s érvénytelen, ellenőrizd",
"Check #%s does not exist" : "#%s nem létezik, ellenőrizd",
"Workflow" : "Munkafolyamat",
+ "Files workflow engine" : "Fájl munkafolyamat motor",
"Open documentation" : "Dokumentáció megnyitása",
"Add rule group" : "Szabály csoport hozzáadás",
"Short rule description" : "A szabály rövid leírása",
diff --git a/apps/workflowengine/l10n/ja.js b/apps/workflowengine/l10n/ja.js
index 77f73ff7956..a6eca63cbc9 100644
--- a/apps/workflowengine/l10n/ja.js
+++ b/apps/workflowengine/l10n/ja.js
@@ -59,6 +59,7 @@ OC.L10N.register(
"Check %s is invalid" : "チェック %s は無効です",
"Check #%s does not exist" : "チェック #%s は存在しません",
"Workflow" : "ワークフロー",
+ "Files workflow engine" : "ファイルワークフローエンジン",
"Open documentation" : "ドキュメントを開く",
"Add rule group" : "ルールグループを追加する",
"Short rule description" : "ルールの簡潔な説明",
diff --git a/apps/workflowengine/l10n/ja.json b/apps/workflowengine/l10n/ja.json
index ecaf3af32f5..3f3b5673a24 100644
--- a/apps/workflowengine/l10n/ja.json
+++ b/apps/workflowengine/l10n/ja.json
@@ -57,6 +57,7 @@
"Check %s is invalid" : "チェック %s は無効です",
"Check #%s does not exist" : "チェック #%s は存在しません",
"Workflow" : "ワークフロー",
+ "Files workflow engine" : "ファイルワークフローエンジン",
"Open documentation" : "ドキュメントを開く",
"Add rule group" : "ルールグループを追加する",
"Short rule description" : "ルールの簡潔な説明",
diff --git a/apps/workflowengine/l10n/lv.js b/apps/workflowengine/l10n/lv.js
index 066d0254ac7..01d92d143a3 100644
--- a/apps/workflowengine/l10n/lv.js
+++ b/apps/workflowengine/l10n/lv.js
@@ -3,13 +3,13 @@ OC.L10N.register(
{
"Saved" : "Saglabāts",
"Saving failed:" : "Saglabāšana neizdevās:",
- "File MIME type" : "Faila MIME tips",
+ "File MIME type" : "Datnes MIME tips",
"is" : "ir",
"is not" : "nav",
"matches" : "atbilst",
"does not match" : "neatbilst",
"Example: {placeholder}" : "Piemērs: {placeholder}",
- "File size (upload)" : "Faila lielums (augšupielādēt)",
+ "File size (upload)" : "Datnes lielums (augšupielādēt)",
"less" : "mazāk",
"less or equals" : "mazāks vai vienāds ar",
"greater or equals" : "lielāks vai vienāds ar",
@@ -31,7 +31,7 @@ OC.L10N.register(
"Select timezone…" : "Izvēlieties laika joslu...",
"Request URL" : "Pieprasījuma URL",
"Predefined URLs" : "Standarta URLs",
- "Files WebDAV" : "WebDAV faili",
+ "Files WebDAV" : "WebDAV datnes",
"Request user agent" : "Nepieciešams lietotāja aģents",
"Sync clients" : "Sync klients",
"Android client" : "Android klients",
diff --git a/apps/workflowengine/l10n/lv.json b/apps/workflowengine/l10n/lv.json
index ad6792a57de..31f589674c2 100644
--- a/apps/workflowengine/l10n/lv.json
+++ b/apps/workflowengine/l10n/lv.json
@@ -1,13 +1,13 @@
{ "translations": {
"Saved" : "Saglabāts",
"Saving failed:" : "Saglabāšana neizdevās:",
- "File MIME type" : "Faila MIME tips",
+ "File MIME type" : "Datnes MIME tips",
"is" : "ir",
"is not" : "nav",
"matches" : "atbilst",
"does not match" : "neatbilst",
"Example: {placeholder}" : "Piemērs: {placeholder}",
- "File size (upload)" : "Faila lielums (augšupielādēt)",
+ "File size (upload)" : "Datnes lielums (augšupielādēt)",
"less" : "mazāk",
"less or equals" : "mazāks vai vienāds ar",
"greater or equals" : "lielāks vai vienāds ar",
@@ -29,7 +29,7 @@
"Select timezone…" : "Izvēlieties laika joslu...",
"Request URL" : "Pieprasījuma URL",
"Predefined URLs" : "Standarta URLs",
- "Files WebDAV" : "WebDAV faili",
+ "Files WebDAV" : "WebDAV datnes",
"Request user agent" : "Nepieciešams lietotāja aģents",
"Sync clients" : "Sync klients",
"Android client" : "Android klients",
diff --git a/apps/workflowengine/l10n/nl.js b/apps/workflowengine/l10n/nl.js
index ed5d36b0ea5..3a95f5f551d 100644
--- a/apps/workflowengine/l10n/nl.js
+++ b/apps/workflowengine/l10n/nl.js
@@ -58,7 +58,8 @@ OC.L10N.register(
"Check %s does not exist" : "Controleer: %s bestaat niet",
"Check %s is invalid" : "Controleer: %s is ongeldig",
"Check #%s does not exist" : "Controleer: #%s bestaat niet",
- "Workflow" : "Workflow",
+ "Workflow" : "Workflows",
+ "Files workflow engine" : "Betanden workflow engine",
"Open documentation" : "Open documentatie",
"Add rule group" : "Groepsrol toevoegen",
"Short rule description" : "Korte rolbeschrijving",
diff --git a/apps/workflowengine/l10n/nl.json b/apps/workflowengine/l10n/nl.json
index e4dee67cb1c..c267d4d5809 100644
--- a/apps/workflowengine/l10n/nl.json
+++ b/apps/workflowengine/l10n/nl.json
@@ -56,7 +56,8 @@
"Check %s does not exist" : "Controleer: %s bestaat niet",
"Check %s is invalid" : "Controleer: %s is ongeldig",
"Check #%s does not exist" : "Controleer: #%s bestaat niet",
- "Workflow" : "Workflow",
+ "Workflow" : "Workflows",
+ "Files workflow engine" : "Betanden workflow engine",
"Open documentation" : "Open documentatie",
"Add rule group" : "Groepsrol toevoegen",
"Short rule description" : "Korte rolbeschrijving",
diff --git a/apps/workflowengine/l10n/ru.js b/apps/workflowengine/l10n/ru.js
index 7f138020d02..e66ccb92598 100644
--- a/apps/workflowengine/l10n/ru.js
+++ b/apps/workflowengine/l10n/ru.js
@@ -58,7 +58,8 @@ OC.L10N.register(
"Check %s does not exist" : "Проверка %s не существует",
"Check %s is invalid" : "Проверка %s неверна",
"Check #%s does not exist" : "Проверка #%s не существует",
- "Workflow" : "Рабочий процесс",
+ "Workflow" : "Обработка файлов",
+ "Files workflow engine" : "Механизм обработки файлов",
"Open documentation" : "Открыть документацию",
"Add rule group" : "Добавить группу правил",
"Short rule description" : "Краткое описание правила",
diff --git a/apps/workflowengine/l10n/ru.json b/apps/workflowengine/l10n/ru.json
index 81fef0d18a3..cb5f32c259b 100644
--- a/apps/workflowengine/l10n/ru.json
+++ b/apps/workflowengine/l10n/ru.json
@@ -56,7 +56,8 @@
"Check %s does not exist" : "Проверка %s не существует",
"Check %s is invalid" : "Проверка %s неверна",
"Check #%s does not exist" : "Проверка #%s не существует",
- "Workflow" : "Рабочий процесс",
+ "Workflow" : "Обработка файлов",
+ "Files workflow engine" : "Механизм обработки файлов",
"Open documentation" : "Открыть документацию",
"Add rule group" : "Добавить группу правил",
"Short rule description" : "Краткое описание правила",
diff --git a/apps/workflowengine/l10n/sk.js b/apps/workflowengine/l10n/sk.js
index 8df92bdda39..fd19128944b 100644
--- a/apps/workflowengine/l10n/sk.js
+++ b/apps/workflowengine/l10n/sk.js
@@ -59,6 +59,7 @@ OC.L10N.register(
"Check %s is invalid" : "Kontrola %s je neplatná",
"Check #%s does not exist" : "Kontrola #%s neexistuje",
"Workflow" : "Systém práce",
+ "Files workflow engine" : "Typ spôsobu práce súborov",
"Open documentation" : "Otvoriť dokumentáciu",
"Add rule group" : "Pridať skupinu pravidiel",
"Short rule description" : "Zobraziť popis pravidla",
diff --git a/apps/workflowengine/l10n/sk.json b/apps/workflowengine/l10n/sk.json
index f380d30840e..8be52def123 100644
--- a/apps/workflowengine/l10n/sk.json
+++ b/apps/workflowengine/l10n/sk.json
@@ -57,6 +57,7 @@
"Check %s is invalid" : "Kontrola %s je neplatná",
"Check #%s does not exist" : "Kontrola #%s neexistuje",
"Workflow" : "Systém práce",
+ "Files workflow engine" : "Typ spôsobu práce súborov",
"Open documentation" : "Otvoriť dokumentáciu",
"Add rule group" : "Pridať skupinu pravidiel",
"Short rule description" : "Zobraziť popis pravidla",
diff --git a/autotest.sh b/autotest.sh
index ff59386e1bc..d8f62ce2367 100755
--- a/autotest.sh
+++ b/autotest.sh
@@ -380,17 +380,9 @@ function execute_tests {
echo "No coverage"
fi
- if [ -d "$2" ]; then
- for f in $(find "$2" -name '*Test.php'); do
- echo "${PHPUNIT[@]}" --configuration phpunit-autotest.xml $GROUP $COVER --log-junit "autotest-results-$DB.xml" "$2" / "$f" "$3"
- "${PHPUNIT[@]}" --configuration phpunit-autotest.xml $GROUP $COVER --log-junit "autotest-results-$DB.xml" "$f" "$3"
- RESULT=$?
- done;
- else
- echo "${PHPUNIT[@]}" --configuration phpunit-autotest.xml $GROUP $COVER --log-junit "autotest-results-$DB.xml" "$2" "$3"
- "${PHPUNIT[@]}" --configuration phpunit-autotest.xml $GROUP $COVER --log-junit "autotest-results-$DB.xml" "$2" "$3"
- RESULT=$?
- fi
+ echo "${PHPUNIT[@]}" --configuration phpunit-autotest.xml $GROUP $COVER --log-junit "autotest-results-$DB.xml" "$2" "$3"
+ "${PHPUNIT[@]}" --configuration phpunit-autotest.xml $GROUP $COVER --log-junit "autotest-results-$DB.xml" "$2" "$3"
+ RESULT=$?
if [ "$PRIMARY_STORAGE_CONFIG" == "swift" ] ; then
cd ..
diff --git a/build/integration/composer.json b/build/integration/composer.json
index d7ccd593277..2850caa511a 100644
--- a/build/integration/composer.json
+++ b/build/integration/composer.json
@@ -2,7 +2,7 @@
"require-dev": {
"phpunit/phpunit": "~4.6",
"behat/behat": "^3.0",
- "guzzlehttp/guzzle": "~5.0",
+ "guzzlehttp/guzzle": "6.3.0",
"jarnaiz/behat-junit-formatter": "^1.3",
"sabre/dav": "3.2"
}
diff --git a/build/integration/features/bootstrap/Auth.php b/build/integration/features/bootstrap/Auth.php
index b185dd0b8c8..da2698b429a 100644
--- a/build/integration/features/bootstrap/Auth.php
+++ b/build/integration/features/bootstrap/Auth.php
@@ -59,18 +59,20 @@ trait Auth {
$fullUrl = substr($this->baseUrl, 0, -5) . $url;
try {
if ($useCookies) {
- $request = $this->client->createRequest($method, $fullUrl, [
+ $options = [
'cookies' => $this->cookieJar,
- ]);
+ ];
} else {
- $request = $this->client->createRequest($method, $fullUrl);
+ $options = [];
}
if ($authHeader) {
- $request->setHeader('Authorization', $authHeader);
+ $options['headers'] = [
+ 'Authorization' => $authHeader
+ ];
}
- $request->setHeader('OCS_APIREQUEST', 'true');
- $request->setHeader('requesttoken', $this->requestToken);
- $this->response = $this->client->send($request);
+ $options['headers']['OCS_APIREQUEST'] = 'true';
+ $options['headers']['requesttoken'] = $this->requestToken;
+ $this->response = $this->client->request($method, $fullUrl, $options);
} catch (ClientException $ex) {
$this->response = $ex->getResponse();
} catch (ServerException $ex) {
@@ -90,7 +92,7 @@ trait Auth {
* @return object
*/
private function createClientToken($loginViaWeb = true) {
- if($loginViaWeb) {
+ if ($loginViaWeb) {
$this->loggingInUsingWebAs('user0');
}
@@ -101,7 +103,7 @@ trait Auth {
'user0',
$loginViaWeb ? '123456' : $this->restrictedClientToken,
],
- 'body' => [
+ 'form_params' => [
'requesttoken' => $this->requestToken,
'name' => md5(microtime()),
],
@@ -109,7 +111,7 @@ trait Auth {
];
try {
- $this->response = $client->send($client->createRequest('POST', $fullUrl, $options));
+ $this->response = $client->request('POST', $fullUrl, $options);
} catch (\GuzzleHttp\Exception\ServerException $e) {
$this->response = $e->getResponse();
}
@@ -119,7 +121,7 @@ trait Auth {
/**
* @Given a new restricted client token is added
*/
- public function aNewRestrictedClientTokenIsAdded() {
+ public function aNewRestrictedClientTokenIsAdded() {
$tokenObj = $this->createClientToken();
$newCreatedTokenId = $tokenObj->deviceToken->id;
$fullUrl = substr($this->baseUrl, 0, -5) . '/index.php/settings/personal/authtokens/' . $newCreatedTokenId;
@@ -136,7 +138,7 @@ trait Auth {
],
'cookies' => $this->cookieJar,
];
- $this->response = $client->send($client->createRequest('PUT', $fullUrl, $options));
+ $this->response = $client->request('PUT', $fullUrl, $options);
$this->restrictedClientToken = $tokenObj->token;
}
@@ -232,13 +234,13 @@ trait Auth {
$client = new Client();
$response = $client->post(
$loginUrl, [
- 'body' => [
- 'user' => 'user0',
- 'password' => '123456',
- 'remember_login' => $remember ? '1' : '0',
- 'requesttoken' => $this->requestToken,
- ],
- 'cookies' => $this->cookieJar,
+ 'form_params' => [
+ 'user' => 'user0',
+ 'password' => '123456',
+ 'remember_login' => $remember ? '1' : '0',
+ 'requesttoken' => $this->requestToken,
+ ],
+ 'cookies' => $this->cookieJar,
]
);
$this->extracRequestTokenFromResponse($response);
diff --git a/build/integration/features/bootstrap/BasicStructure.php b/build/integration/features/bootstrap/BasicStructure.php
index f2449242bee..0aead766f2a 100644
--- a/build/integration/features/bootstrap/BasicStructure.php
+++ b/build/integration/features/bootstrap/BasicStructure.php
@@ -32,7 +32,7 @@
use GuzzleHttp\Client;
use GuzzleHttp\Cookie\CookieJar;
use GuzzleHttp\Exception\ClientException;
-use GuzzleHttp\Message\ResponseInterface;
+use Psr\Http\Message\ResponseInterface;
require __DIR__ . '/../../vendor/autoload.php';
@@ -97,7 +97,7 @@ trait BasicStructure {
* @param string $version
*/
public function usingApiVersion($version) {
- $this->apiVersion = (int) $version;
+ $this->apiVersion = (int)$version;
}
/**
@@ -115,7 +115,7 @@ trait BasicStructure {
*/
public function usingServer($server) {
$previousServer = $this->currentServer;
- if ($server === 'LOCAL'){
+ if ($server === 'LOCAL') {
$this->baseUrl = $this->localBaseUrl;
$this->currentServer = 'LOCAL';
return $previousServer;
@@ -138,20 +138,24 @@ trait BasicStructure {
/**
* Parses the xml answer to get ocs response which doesn't match with
* http one in v1 of the api.
+ *
* @param ResponseInterface $response
* @return string
*/
public function getOCSResponse($response) {
- return $response->xml()->meta[0]->statuscode;
+ return simplexml_load_string($response->getBody())->meta[0]->statuscode;
}
/**
* This function is needed to use a vertical fashion in the gherkin tables.
+ *
* @param array $arrayOfArrays
* @return array
*/
- public function simplifyArray($arrayOfArrays){
- $a = array_map(function($subArray) { return $subArray[0]; }, $arrayOfArrays);
+ public function simplifyArray($arrayOfArrays) {
+ $a = array_map(function ($subArray) {
+ return $subArray[0];
+ }, $arrayOfArrays);
return $a;
}
@@ -175,18 +179,18 @@ trait BasicStructure {
];
if ($body instanceof \Behat\Gherkin\Node\TableNode) {
$fd = $body->getRowsHash();
- $options['body'] = $fd;
+ $options['form_params'] = $fd;
}
// TODO: Fix this hack!
if ($verb === 'PUT' && $body === null) {
- $options['body'] = [
+ $options['form_params'] = [
'foo' => 'bar',
];
}
try {
- $this->response = $client->send($client->createRequest($verb, $fullUrl, $options));
+ $this->response = $client->request($verb, $fullUrl, $options);
} catch (ClientException $ex) {
$this->response = $ex->getResponse();
}
@@ -212,20 +216,20 @@ trait BasicStructure {
}
if ($body instanceof \Behat\Gherkin\Node\TableNode) {
$fd = $body->getRowsHash();
- $options['body'] = $fd;
+ $options['form_params'] = $fd;
}
try {
- $this->response = $client->send($client->createRequest($verb, $fullUrl, $options));
+ $this->response = $client->request($verb, $fullUrl, $options);
} catch (ClientException $ex) {
$this->response = $ex->getResponse();
}
}
- public function isExpectedUrl($possibleUrl, $finalPart){
+ public function isExpectedUrl($possibleUrl, $finalPart) {
$baseUrlChopped = substr($this->baseUrl, 0, -4);
$endCharacter = strlen($baseUrlChopped) + strlen($finalPart);
- return (substr($possibleUrl,0,$endCharacter) == "$baseUrlChopped" . "$finalPart");
+ return (substr($possibleUrl, 0, $endCharacter) == "$baseUrlChopped" . "$finalPart");
}
/**
@@ -249,7 +253,7 @@ trait BasicStructure {
* @param string $contentType
*/
public function theContentTypeShouldbe($contentType) {
- PHPUnit_Framework_Assert::assertEquals($contentType, $this->response->getHeader('Content-Type'));
+ PHPUnit_Framework_Assert::assertEquals($contentType, $this->response->getHeader('Content-Type')[0]);
}
/**
@@ -281,7 +285,7 @@ trait BasicStructure {
$response = $client->post(
$loginUrl,
[
- 'body' => [
+ 'form_params' => [
'user' => $user,
'password' => $password,
'requesttoken' => $this->requestToken,
@@ -301,16 +305,17 @@ trait BasicStructure {
$baseUrl = substr($this->baseUrl, 0, -5);
$client = new Client();
- $request = $client->createRequest(
- $method,
- $baseUrl . $url,
- [
- 'cookies' => $this->cookieJar,
- ]
- );
- $request->addHeader('requesttoken', $this->requestToken);
try {
- $this->response = $client->send($request);
+ $this->response = $client->request(
+ $method,
+ $baseUrl . $url,
+ [
+ 'cookies' => $this->cookieJar,
+ 'headers' => [
+ 'requesttoken' => $this->requestToken
+ ]
+ ]
+ );
} catch (ClientException $e) {
$this->response = $e->getResponse();
}
@@ -325,21 +330,20 @@ trait BasicStructure {
$baseUrl = substr($this->baseUrl, 0, -5);
$client = new Client();
- $request = $client->createRequest(
- $method,
- $baseUrl . $url,
- [
- 'cookies' => $this->cookieJar,
- ]
- );
try {
- $this->response = $client->send($request);
+ $this->response = $client->request(
+ $method,
+ $baseUrl . $url,
+ [
+ 'cookies' => $this->cookieJar
+ ]
+ );
} catch (ClientException $e) {
$this->response = $e->getResponse();
}
}
- public static function removeFile($path, $filename){
+ public static function removeFile($path, $filename) {
if (file_exists("$path" . "$filename")) {
unlink("$path" . "$filename");
}
@@ -358,12 +362,12 @@ trait BasicStructure {
public function createFileSpecificSize($name, $size) {
$file = fopen("work/" . "$name", 'w');
- fseek($file, $size - 1 ,SEEK_CUR);
- fwrite($file,'a'); // write a dummy char at SIZE position
+ fseek($file, $size - 1, SEEK_CUR);
+ fwrite($file, 'a'); // write a dummy char at SIZE position
fclose($file);
}
- public function createFileWithText($name, $text){
+ public function createFileWithText($name, $text) {
$file = fopen("work/" . "$name", 'w');
fwrite($file, $text);
fclose($file);
@@ -398,8 +402,8 @@ trait BasicStructure {
/**
* @BeforeSuite
*/
- public static function addFilesToSkeleton(){
- for ($i=0; $i<5; $i++){
+ public static function addFilesToSkeleton() {
+ for ($i = 0; $i < 5; $i++) {
file_put_contents("../../core/skeleton/" . "textfile" . "$i" . ".txt", "Nextcloud test text file\n");
}
if (!file_exists("../../core/skeleton/FOLDER")) {
@@ -418,8 +422,8 @@ trait BasicStructure {
/**
* @AfterSuite
*/
- public static function removeFilesFromSkeleton(){
- for ($i=0; $i<5; $i++){
+ public static function removeFilesFromSkeleton() {
+ for ($i = 0; $i < 5; $i++) {
self::removeFile("../../core/skeleton/", "textfile" . "$i" . ".txt");
}
if (is_dir("../../core/skeleton/FOLDER")) {
@@ -438,24 +442,24 @@ trait BasicStructure {
/**
* @BeforeScenario @local_storage
*/
- public static function removeFilesFromLocalStorageBefore(){
+ public static function removeFilesFromLocalStorageBefore() {
$dir = "./work/local_storage/";
$di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
$ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
- foreach ( $ri as $file ) {
- $file->isDir() ? rmdir($file) : unlink($file);
+ foreach ($ri as $file) {
+ $file->isDir() ? rmdir($file) : unlink($file);
}
}
/**
* @AfterScenario @local_storage
*/
- public static function removeFilesFromLocalStorageAfter(){
+ public static function removeFilesFromLocalStorageAfter() {
$dir = "./work/local_storage/";
$di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
$ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
- foreach ( $ri as $file ) {
- $file->isDir() ? rmdir($file) : unlink($file);
+ foreach ($ri as $file) {
+ $file->isDir() ? rmdir($file) : unlink($file);
}
}
}
diff --git a/build/integration/features/bootstrap/CalDavContext.php b/build/integration/features/bootstrap/CalDavContext.php
index 27f26b20fbe..cbd29a4fbff 100644
--- a/build/integration/features/bootstrap/CalDavContext.php
+++ b/build/integration/features/bootstrap/CalDavContext.php
@@ -83,7 +83,7 @@ class CalDavContext implements \Behat\Behat\Context\Context {
$password = ($user === 'admin') ? 'admin' : '123456';
try {
- $request = $this->client->createRequest(
+ $this->response = $this->client->request(
'PROPFIND',
$davUrl,
[
@@ -93,7 +93,6 @@ class CalDavContext implements \Behat\Behat\Context\Context {
],
]
);
- $this->response = $this->client->send($request);
} catch (\GuzzleHttp\Exception\ClientException $e) {
$this->response = $e->getResponse();
}
@@ -170,7 +169,7 @@ class CalDavContext implements \Behat\Behat\Context\Context {
$davUrl = $this->baseUrl . '/remote.php/dav/calendars/'.$user.'/'.$name;
$password = ($user === 'admin') ? 'admin' : '123456';
- $request = $this->client->createRequest(
+ $this->response = $this->client->request(
'MKCALENDAR',
$davUrl,
[
@@ -181,8 +180,6 @@ class CalDavContext implements \Behat\Behat\Context\Context {
],
]
);
-
- $this->response = $this->client->send($request);
}
/**
@@ -195,7 +192,7 @@ class CalDavContext implements \Behat\Behat\Context\Context {
$davUrl = $this->baseUrl . '/remote.php/dav/calendars/'.$user.'/'.$name;
$password = ($user === 'admin') ? 'admin' : '123456';
- $request = $this->client->createRequest(
+ $this->response = $this->client->request(
'POST',
$davUrl,
[
@@ -209,8 +206,6 @@ class CalDavContext implements \Behat\Behat\Context\Context {
],
]
);
-
- $this->response = $this->client->send($request);
}
/**
diff --git a/build/integration/features/bootstrap/CapabilitiesContext.php b/build/integration/features/bootstrap/CapabilitiesContext.php
index 6ff9b1813c4..c3cbace5932 100644
--- a/build/integration/features/bootstrap/CapabilitiesContext.php
+++ b/build/integration/features/bootstrap/CapabilitiesContext.php
@@ -44,7 +44,7 @@ class CapabilitiesContext implements Context, SnippetAcceptingContext {
* @param \Behat\Gherkin\Node\TableNode|null $formData
*/
public function checkCapabilitiesResponse(\Behat\Gherkin\Node\TableNode $formData){
- $capabilitiesXML = $this->response->xml()->data->capabilities;
+ $capabilitiesXML = simplexml_load_string($this->response->getBody())->data->capabilities;
foreach ($formData->getHash() as $row) {
$path_to_element = explode('@@@', $row['path_to_element']);
diff --git a/build/integration/features/bootstrap/CardDavContext.php b/build/integration/features/bootstrap/CardDavContext.php
index dbac4e2254f..d971c42755a 100644
--- a/build/integration/features/bootstrap/CardDavContext.php
+++ b/build/integration/features/bootstrap/CardDavContext.php
@@ -86,7 +86,7 @@ class CardDavContext implements \Behat\Behat\Context\Context {
$password = ($user === 'admin') ? 'admin' : '123456';
try {
- $request = $this->client->createRequest(
+ $this->response = $this->client->request(
'PROPFIND',
$davUrl,
[
@@ -96,7 +96,6 @@ class CardDavContext implements \Behat\Behat\Context\Context {
],
]
);
- $this->response = $this->client->send($request);
} catch (\GuzzleHttp\Exception\ClientException $e) {
$this->response = $e->getResponse();
}
@@ -130,7 +129,7 @@ class CardDavContext implements \Behat\Behat\Context\Context {
$davUrl = $this->baseUrl . '/remote.php/dav/addressbooks/users/'.$user.'/'.$addressBook;
$password = ($user === 'admin') ? 'admin' : '123456';
- $request = $this->client->createRequest(
+ $this->response = $this->client->request(
'MKCOL',
$davUrl,
[
@@ -154,8 +153,6 @@ class CardDavContext implements \Behat\Behat\Context\Context {
]
);
- $this->response = $this->client->send($request);
-
if($this->response->getStatusCode() !== (int)$statusCode) {
throw new \Exception(
sprintf(
@@ -212,7 +209,7 @@ class CardDavContext implements \Behat\Behat\Context\Context {
$davUrl = $this->baseUrl . '/remote.php/dav/addressbooks/users/'.$user.'/'.$addressBook . '/' . $fileName;
$password = ($user === 'admin') ? 'admin' : '123456';
- $request = $this->client->createRequest(
+ $this->response = $this->client->request(
'PUT',
$davUrl,
[
@@ -227,8 +224,6 @@ class CardDavContext implements \Behat\Behat\Context\Context {
]
);
- $this->response = $this->client->send($request);
-
if($this->response->getStatusCode() !== 201) {
throw new \Exception(
sprintf(
@@ -248,7 +243,7 @@ class CardDavContext implements \Behat\Behat\Context\Context {
$password = ($user === 'admin') ? 'admin' : '123456';
try {
- $request = $this->client->createRequest(
+ $this->response = $this->client->request(
'GET',
$davUrl,
[
@@ -261,7 +256,6 @@ class CardDavContext implements \Behat\Behat\Context\Context {
],
]
);
- $this->response = $this->client->send($request);
} catch (\GuzzleHttp\Exception\ClientException $e) {
$this->response = $e->getResponse();
}
@@ -275,7 +269,7 @@ class CardDavContext implements \Behat\Behat\Context\Context {
$password = ($user === 'admin') ? 'admin' : '123456';
try {
- $request = $this->client->createRequest(
+ $this->response = $this->client->request(
'GET',
$davUrl,
[
@@ -288,7 +282,6 @@ class CardDavContext implements \Behat\Behat\Context\Context {
],
]
);
- $this->response = $this->client->send($request);
} catch (\GuzzleHttp\Exception\ClientException $e) {
$this->response = $e->getResponse();
}
@@ -303,7 +296,7 @@ class CardDavContext implements \Behat\Behat\Context\Context {
foreach($table->getTable() as $header) {
$headerName = $header[0];
$expectedHeaderValue = $header[1];
- $returnedHeader = $this->response->getHeader($headerName);
+ $returnedHeader = $this->response->getHeader($headerName)[0];
if($returnedHeader !== $expectedHeaderValue) {
throw new \Exception(
sprintf(
diff --git a/build/integration/features/bootstrap/ChecksumsContext.php b/build/integration/features/bootstrap/ChecksumsContext.php
index f2fc2d1d653..434a3b65f15 100644
--- a/build/integration/features/bootstrap/ChecksumsContext.php
+++ b/build/integration/features/bootstrap/ChecksumsContext.php
@@ -78,7 +78,7 @@ class ChecksumsContext implements \Behat\Behat\Context\Context {
*/
public function userUploadsFileToWithChecksum($user, $source, $destination, $checksum)
{
- $file = \GuzzleHttp\Stream\Stream::factory(fopen($source, 'r'));
+ $file = \GuzzleHttp\Psr7\stream_for(fopen($source, 'r'));
try {
$this->response = $this->client->put(
$this->baseUrl . '/remote.php/webdav' . $destination,
@@ -117,7 +117,7 @@ class ChecksumsContext implements \Behat\Behat\Context\Context {
*/
public function userRequestTheChecksumOfViaPropfind($user, $path)
{
- $request = $this->client->createRequest(
+ $this->response = $this->client->request(
'PROPFIND',
$this->baseUrl . '/remote.php/webdav' . $path,
[
@@ -133,7 +133,6 @@ class ChecksumsContext implements \Behat\Behat\Context\Context {
]
]
);
- $this->response = $this->client->send($request);
}
/**
@@ -182,8 +181,8 @@ class ChecksumsContext implements \Behat\Behat\Context\Context {
*/
public function theHeaderChecksumShouldMatch($checksum)
{
- if ($this->response->getHeader('OC-Checksum') !== $checksum) {
- throw new \Exception("Expected $checksum, got ".$this->response->getHeader('OC-Checksum'));
+ if ($this->response->getHeader('OC-Checksum')[0] !== $checksum) {
+ throw new \Exception("Expected $checksum, got ".$this->response->getHeader('OC-Checksum')[0]);
}
}
@@ -195,7 +194,7 @@ class ChecksumsContext implements \Behat\Behat\Context\Context {
*/
public function userCopiedFileTo($user, $source, $destination)
{
- $request = $this->client->createRequest(
+ $this->response = $this->client->request(
'MOVE',
$this->baseUrl . '/remote.php/webdav' . $source,
[
@@ -208,7 +207,6 @@ class ChecksumsContext implements \Behat\Behat\Context\Context {
],
]
);
- $this->response = $this->client->send($request);
}
/**
@@ -236,7 +234,7 @@ class ChecksumsContext implements \Behat\Behat\Context\Context {
public function theOcChecksumHeaderShouldNotBeThere()
{
if ($this->response->hasHeader('OC-Checksum')) {
- throw new \Exception("Expected no checksum header but got ".$this->response->getHeader('OC-Checksum'));
+ throw new \Exception("Expected no checksum header but got ".$this->response->getHeader('OC-Checksum')[0]);
}
}
diff --git a/build/integration/features/bootstrap/CommandLine.php b/build/integration/features/bootstrap/CommandLine.php
index 2c717e7f5ed..c6fd232ac9c 100644
--- a/build/integration/features/bootstrap/CommandLine.php
+++ b/build/integration/features/bootstrap/CommandLine.php
@@ -59,8 +59,7 @@ trait CommandLine {
// Clean opcode cache
$client = new GuzzleHttp\Client();
- $request = $client->createRequest('GET', 'http://localhost:8080/apps/testing/clean_opcode_cache.php');
- $client->send($request);
+ $client->request('GET', 'http://localhost:8080/apps/testing/clean_opcode_cache.php');
return $this->lastCode;
}
diff --git a/build/integration/features/bootstrap/CommentsContext.php b/build/integration/features/bootstrap/CommentsContext.php
index 651e8c5eedf..ce05b56689d 100644
--- a/build/integration/features/bootstrap/CommentsContext.php
+++ b/build/integration/features/bootstrap/CommentsContext.php
@@ -52,7 +52,7 @@ class CommentsContext implements \Behat\Behat\Context\Context {
$client = new \GuzzleHttp\Client();
try {
$client->delete(
- $this->baseUrl.'/remote.php/webdav/myFileToComment.txt',
+ $this->baseUrl . '/remote.php/webdav/myFileToComment.txt',
[
'auth' => [
'user0',
@@ -73,7 +73,7 @@ class CommentsContext implements \Behat\Behat\Context\Context {
* @return int
*/
private function getFileIdForPath($path) {
- $url = $this->baseUrl.'/remote.php/webdav/'.$path;
+ $url = $this->baseUrl . '/remote.php/webdav/' . $path;
$context = stream_context_create(array(
'http' => array(
'method' => 'PROPFIND',
@@ -100,10 +100,10 @@ class CommentsContext implements \Behat\Behat\Context\Context {
* @param int $statusCode
* @throws \Exception
*/
- public function postsACommentWithContentOnTheFileNamedItShouldReturn($user, $content, $fileName, $statusCode) {
+ public function postsACommentWithContentOnTheFileNamedItShouldReturn($user, $content, $fileName, $statusCode) {
$fileId = $this->getFileIdForPath($fileName);
$this->fileId = (int)$fileId;
- $url = $this->baseUrl.'/remote.php/dav/comments/files/'.$fileId.'/';
+ $url = $this->baseUrl . '/remote.php/dav/comments/files/' . $fileId . '/';
$client = new \GuzzleHttp\Client();
try {
@@ -124,8 +124,8 @@ class CommentsContext implements \Behat\Behat\Context\Context {
$res = $e->getResponse();
}
- if($res->getStatusCode() !== (int)$statusCode) {
- throw new \Exception("Response status code was not $statusCode (".$res->getStatusCode().")");
+ if ($res->getStatusCode() !== (int)$statusCode) {
+ throw new \Exception("Response status code was not $statusCode (" . $res->getStatusCode() . ")");
}
}
@@ -139,11 +139,11 @@ class CommentsContext implements \Behat\Behat\Context\Context {
*/
public function asLoadloadAllTheCommentsOfTheFileNamedItShouldReturn($user, $fileName, $statusCode) {
$fileId = $this->getFileIdForPath($fileName);
- $url = $this->baseUrl.'/remote.php/dav/comments/files/'.$fileId.'/';
+ $url = $this->baseUrl . '/remote.php/dav/comments/files/' . $fileId . '/';
try {
$client = new \GuzzleHttp\Client();
- $res = $client->createRequest(
+ $res = $client->request(
'REPORT',
$url,
[
@@ -162,16 +162,15 @@ class CommentsContext implements \Behat\Behat\Context\Context {
],
]
);
- $res = $client->send($res);
} catch (\GuzzleHttp\Exception\ClientException $e) {
$res = $e->getResponse();
}
- if($res->getStatusCode() !== (int)$statusCode) {
- throw new \Exception("Response status code was not $statusCode (".$res->getStatusCode().")");
+ if ($res->getStatusCode() !== (int)$statusCode) {
+ throw new \Exception("Response status code was not $statusCode (" . $res->getStatusCode() . ")");
}
- if($res->getStatusCode() === 207) {
+ if ($res->getStatusCode() === 207) {
$service = new Sabre\Xml\Service();
$this->response = $service->parse($res->getBody()->getContents());
$this->commentId = (int)$this->response[0]['value'][2]['value'][0]['value'][0]['value'];
@@ -191,11 +190,11 @@ class CommentsContext implements \Behat\Behat\Context\Context {
$options = [];
$options['auth'] = [$user, '123456'];
$fd = $body->getRowsHash();
- $options['body'] = $fd;
+ $options['form_params'] = $fd;
$options['headers'] = [
'OCS-APIREQUEST' => 'true',
];
- $client->send($client->createRequest($verb, $this->baseUrl.'/ocs/v1.php/'.$url, $options));
+ $client->request($verb, $this->baseUrl . '/ocs/v1.php/' . $url, $options);
}
/**
@@ -205,7 +204,7 @@ class CommentsContext implements \Behat\Behat\Context\Context {
* @throws \Exception
*/
public function asDeleteTheCreatedCommentItShouldReturn($user, $statusCode) {
- $url = $this->baseUrl.'/remote.php/dav/comments/files/'.$this->fileId.'/'.$this->commentId;
+ $url = $this->baseUrl . '/remote.php/dav/comments/files/' . $this->fileId . '/' . $this->commentId;
$client = new \GuzzleHttp\Client();
try {
@@ -225,8 +224,8 @@ class CommentsContext implements \Behat\Behat\Context\Context {
$res = $e->getResponse();
}
- if($res->getStatusCode() !== (int)$statusCode) {
- throw new \Exception("Response status code was not $statusCode (".$res->getStatusCode().")");
+ if ($res->getStatusCode() !== (int)$statusCode) {
+ throw new \Exception("Response status code was not $statusCode (" . $res->getStatusCode() . ")");
}
}
@@ -239,14 +238,14 @@ class CommentsContext implements \Behat\Behat\Context\Context {
public function theResponseShouldContainAPropertyWithValue($key, $value) {
$keys = $this->response[0]['value'][2]['value'][0]['value'];
$found = false;
- foreach($keys as $singleKey) {
- if($singleKey['name'] === '{http://owncloud.org/ns}'.substr($key, 3)) {
- if($singleKey['value'] === $value) {
+ foreach ($keys as $singleKey) {
+ if ($singleKey['name'] === '{http://owncloud.org/ns}' . substr($key, 3)) {
+ if ($singleKey['value'] === $value) {
$found = true;
}
}
}
- if($found === false) {
+ if ($found === false) {
throw new \Exception("Cannot find property $key with $value");
}
}
@@ -257,8 +256,8 @@ class CommentsContext implements \Behat\Behat\Context\Context {
* @throws \Exception
*/
public function theResponseShouldContainOnlyComments($number) {
- if(count($this->response) !== (int)$number) {
- throw new \Exception("Found more comments than $number (".count($this->response).")");
+ if (count($this->response) !== (int)$number) {
+ throw new \Exception("Found more comments than $number (" . count($this->response) . ")");
}
}
@@ -277,18 +276,18 @@ class CommentsContext implements \Behat\Behat\Context\Context {
<d:propertyupdate xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns">
<d:set>
<d:prop>
- <oc:message>'.$text.'</oc:message>
+ <oc:message>' . $text . '</oc:message>
</d:prop>
</d:set>
</d:propertyupdate>';
try {
- $res = $client->send($client->createRequest('PROPPATCH', $this->baseUrl.'/remote.php/dav/comments/files/' . $this->fileId . '/' . $this->commentId, $options));
+ $res = $client->request('PROPPATCH', $this->baseUrl . '/remote.php/dav/comments/files/' . $this->fileId . '/' . $this->commentId, $options);
} catch (\GuzzleHttp\Exception\ClientException $e) {
$res = $e->getResponse();
}
- if($res->getStatusCode() !== (int)$statusCode) {
- throw new \Exception("Response status code was not $statusCode (".$res->getStatusCode().")");
+ if ($res->getStatusCode() !== (int)$statusCode) {
+ throw new \Exception("Response status code was not $statusCode (" . $res->getStatusCode() . ")");
}
}
diff --git a/build/integration/features/bootstrap/FederationContext.php b/build/integration/features/bootstrap/FederationContext.php
index f6c6de335a8..f3eb004fb84 100644
--- a/build/integration/features/bootstrap/FederationContext.php
+++ b/build/integration/features/bootstrap/FederationContext.php
@@ -67,7 +67,7 @@ class FederationContext implements Context, SnippetAcceptingContext {
$this->sendingToWith('GET', "/apps/files_sharing/api/v1/remote_shares/pending", null);
$this->theHTTPStatusCodeShouldBe('200');
$this->theOCSStatusCodeShouldBe('100');
- $share_id = $this->response->xml()->data[0]->element[0]->id;
+ $share_id = simplexml_load_string($this->response->getBody())->data[0]->element[0]->id;
$this->sendingToWith('POST', "/apps/files_sharing/api/v1/remote_shares/pending/{$share_id}", null);
$this->theHTTPStatusCodeShouldBe('200');
$this->theOCSStatusCodeShouldBe('100');
diff --git a/build/integration/features/bootstrap/FilesDropContext.php b/build/integration/features/bootstrap/FilesDropContext.php
index 62d06ddf750..a81df559a23 100644
--- a/build/integration/features/bootstrap/FilesDropContext.php
+++ b/build/integration/features/bootstrap/FilesDropContext.php
@@ -50,13 +50,10 @@ class FilesDropContext implements Context, SnippetAcceptingContext {
$options['headers'] = [
'X-REQUESTED-WITH' => 'XMLHttpRequest'
];
-
- $request = $client->createRequest('PUT', $fullUrl, $options);
- $file = \GuzzleHttp\Stream\Stream::factory($content);
- $request->setBody($file);
+ $options['body'] = \GuzzleHttp\Psr7\stream_for($content);
try {
- $this->response = $client->send($request);
+ $this->response = $client->request('PUT', $fullUrl, $options);
} catch (\GuzzleHttp\Exception\ClientException $e) {
$this->response = $e->getResponse();
}
@@ -82,10 +79,8 @@ class FilesDropContext implements Context, SnippetAcceptingContext {
'X-REQUESTED-WITH' => 'XMLHttpRequest'
];
- $request = $client->createRequest('MKCOL', $fullUrl, $options);
-
try {
- $this->response = $client->send($request);
+ $this->response = $client->request('MKCOL', $fullUrl, $options);
} catch (\GuzzleHttp\Exception\ClientException $e) {
$this->response = $e->getResponse();
}
diff --git a/build/integration/features/bootstrap/LDAPContext.php b/build/integration/features/bootstrap/LDAPContext.php
index 237f316674f..3a9c59b52b4 100644
--- a/build/integration/features/bootstrap/LDAPContext.php
+++ b/build/integration/features/bootstrap/LDAPContext.php
@@ -35,7 +35,7 @@ class LDAPContext implements Context {
* @Given /^the response should contain a tag "([^"]*)"$/
*/
public function theResponseShouldContainATag($arg1) {
- $configID = $this->response->xml()->data[0]->$arg1;
+ $configID = simplexml_load_string($this->response->getBody())->data[0]->$arg1;
PHPUnit_Framework_Assert::assertInstanceOf(SimpleXMLElement::class, $configID[0]);
}
@@ -45,7 +45,7 @@ class LDAPContext implements Context {
public function creatingAnLDAPConfigurationAt($apiUrl) {
$this->apiUrl = $apiUrl;
$this->sendingToWith('POST', $this->apiUrl, null);
- $configElements = $this->response->xml()->data[0]->configID;
+ $configElements = simplexml_load_string($this->response->getBody())->data[0]->configID;
$this->configID = $configElements[0];
}
@@ -60,7 +60,7 @@ class LDAPContext implements Context {
* @Given /^the response should contain a tag "([^"]*)" with value "([^"]*)"$/
*/
public function theResponseShouldContainATagWithValue($tagName, $expectedValue) {
- $data = $this->response->xml()->data[0]->$tagName;
+ $data = simplexml_load_string($this->response->getBody())->data[0]->$tagName;
PHPUnit_Framework_Assert::assertEquals($expectedValue, $data[0]);
}
diff --git a/build/integration/features/bootstrap/Provisioning.php b/build/integration/features/bootstrap/Provisioning.php
index 00402d73a2c..2543777faa5 100644
--- a/build/integration/features/bootstrap/Provisioning.php
+++ b/build/integration/features/bootstrap/Provisioning.php
@@ -26,6 +26,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
+
use GuzzleHttp\Client;
use GuzzleHttp\Message\ResponseInterface;
@@ -42,7 +43,7 @@ trait Provisioning {
/** @var array */
private $createdRemoteGroups = [];
-
+
/** @var array */
private $createdGroups = [];
@@ -95,7 +96,7 @@ trait Provisioning {
$options['auth'] = $this->adminUser;
}
- $options['body'] = [
+ $options['form_params'] = [
'userid' => $user,
'password' => '123456'
];
@@ -103,8 +104,8 @@ trait Provisioning {
'OCS-APIREQUEST' => 'true',
];
- $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
- if ($this->currentServer === 'LOCAL'){
+ $this->response = $client->post($fullUrl, $options);
+ if ($this->currentServer === 'LOCAL') {
$this->createdUsers[$user] = $user;
} elseif ($this->currentServer === 'REMOTE') {
$this->createdRemoteUsers[$user] = $user;
@@ -117,8 +118,8 @@ trait Provisioning {
$options2['headers'] = [
'OCS-APIREQUEST' => 'true',
];
- $url = $fullUrl.'/'.$user;
- $client->send($client->createRequest('GET', $url, $options2));
+ $url = $fullUrl . '/' . $user;
+ $client->get($url, $options2);
}
/**
@@ -136,9 +137,9 @@ trait Provisioning {
'OCS-APIREQUEST' => 'true',
];
- $response = $client->send($client->createRequest("GET", $fullUrl, $options));
+ $response = $client->get($fullUrl, $options);
foreach ($settings->getRows() as $setting) {
- $value = json_decode(json_encode($response->xml()->data->{$setting[0]}), 1);
+ $value = json_decode(json_encode(simplexml_load_string($response->getBody())->data->{$setting[0]}), 1);
if (isset($value[0])) {
PHPUnit_Framework_Assert::assertEquals($setting[1], $value[0], "", 0.0, 10, true);
} else {
@@ -179,7 +180,7 @@ trait Provisioning {
$this->currentUser = $previous_user;
}
- public function userExists($user){
+ public function userExists($user) {
$fullUrl = $this->baseUrl . "v2.php/cloud/users/$user";
$client = new Client();
$options = [];
@@ -229,9 +230,9 @@ trait Provisioning {
$respondedArray = $this->getArrayOfGroupsResponded($this->response);
if (array_key_exists($group, $respondedArray)) {
- return True;
- } else{
- return False;
+ return true;
+ } else {
+ return false;
}
}
@@ -240,11 +241,11 @@ trait Provisioning {
* @param string $user
* @param string $group
*/
- public function assureUserBelongsToGroup($user, $group){
+ public function assureUserBelongsToGroup($user, $group) {
$previous_user = $this->currentUser;
$this->currentUser = "admin";
- if (!$this->userBelongsToGroup($user, $group)){
+ if (!$this->userBelongsToGroup($user, $group)) {
$this->addingUserToGroup($user, $group);
}
@@ -287,15 +288,15 @@ trait Provisioning {
$options['auth'] = $this->adminUser;
}
- $options['body'] = [
+ $options['form_params'] = [
'groupid' => $group,
];
$options['headers'] = [
'OCS-APIREQUEST' => 'true',
];
- $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
- if ($this->currentServer === 'LOCAL'){
+ $this->response = $client->post($fullUrl, $options);
+ if ($this->currentServer === 'LOCAL') {
$this->createdGroups[$group] = $group;
} elseif ($this->currentServer === 'REMOTE') {
$this->createdRemoteGroups[$group] = $group;
@@ -316,11 +317,11 @@ trait Provisioning {
'OCS-APIREQUEST' => 'true',
];
// TODO: fix hack
- $options['body'] = [
+ $options['form_params'] = [
'foo' => 'bar'
];
- $this->response = $client->send($client->createRequest("PUT", $fullUrl, $options));
+ $this->response = $client->put($fullUrl, $options);
}
/**
@@ -338,7 +339,7 @@ trait Provisioning {
'OCS-APIREQUEST' => 'true',
];
- $this->response = $client->send($client->createRequest("DELETE", $fullUrl, $options));
+ $this->response = $client->delete($fullUrl, $options);
}
/**
@@ -356,9 +357,9 @@ trait Provisioning {
'OCS-APIREQUEST' => 'true',
];
- $this->response = $client->send($client->createRequest("DELETE", $fullUrl, $options));
+ $this->response = $client->delete($fullUrl, $options);
- if ($this->currentServer === 'LOCAL'){
+ if ($this->currentServer === 'LOCAL') {
unset($this->createdGroups[$group]);
} elseif ($this->currentServer === 'REMOTE') {
unset($this->createdRemoteGroups[$group]);
@@ -393,11 +394,11 @@ trait Provisioning {
'OCS-APIREQUEST' => 'true',
];
- $options['body'] = [
+ $options['form_params'] = [
'groupid' => $group,
];
- $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
+ $this->response =$client->post($fullUrl, $options);
}
@@ -489,13 +490,13 @@ trait Provisioning {
if ($this->currentUser === 'admin') {
$options['auth'] = $this->adminUser;
}
- $options['body'] = [
+ $options['form_params'] = [
'groupid' => $group
];
$options['headers'] = [
'OCS-APIREQUEST' => 'true',
];
- $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
+ $this->response = $client->post($fullUrl, $options);
PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
}
@@ -588,44 +589,48 @@ trait Provisioning {
/**
* Parses the xml answer to get the array of users returned.
+ *
* @param ResponseInterface $resp
* @return array
*/
public function getArrayOfUsersResponded($resp) {
- $listCheckedElements = $resp->xml()->data[0]->users[0]->element;
+ $listCheckedElements = simplexml_load_string($resp->getBody())->data[0]->users[0]->element;
$extractedElementsArray = json_decode(json_encode($listCheckedElements), 1);
return $extractedElementsArray;
}
/**
* Parses the xml answer to get the array of groups returned.
+ *
* @param ResponseInterface $resp
* @return array
*/
public function getArrayOfGroupsResponded($resp) {
- $listCheckedElements = $resp->xml()->data[0]->groups[0]->element;
+ $listCheckedElements = simplexml_load_string($resp->getBody())->data[0]->groups[0]->element;
$extractedElementsArray = json_decode(json_encode($listCheckedElements), 1);
return $extractedElementsArray;
}
/**
* Parses the xml answer to get the array of apps returned.
+ *
* @param ResponseInterface $resp
* @return array
*/
public function getArrayOfAppsResponded($resp) {
- $listCheckedElements = $resp->xml()->data[0]->apps[0]->element;
+ $listCheckedElements = simplexml_load_string($resp->getBody())->data[0]->apps[0]->element;
$extractedElementsArray = json_decode(json_encode($listCheckedElements), 1);
return $extractedElementsArray;
}
/**
* Parses the xml answer to get the array of subadmins returned.
+ *
* @param ResponseInterface $resp
* @return array
*/
public function getArrayOfSubadminsResponded($resp) {
- $listCheckedElements = $resp->xml()->data[0]->element;
+ $listCheckedElements = simplexml_load_string($resp->getBody())->data[0]->element;
$extractedElementsArray = json_decode(json_encode($listCheckedElements), 1);
return $extractedElementsArray;
}
@@ -689,7 +694,7 @@ trait Provisioning {
];
$this->response = $client->get($fullUrl, $options);
- PHPUnit_Framework_Assert::assertEquals("false", $this->response->xml()->data[0]->enabled);
+ PHPUnit_Framework_Assert::assertEquals("false", simplexml_load_string($this->response->getBody())->data[0]->enabled);
}
/**
@@ -708,7 +713,7 @@ trait Provisioning {
];
$this->response = $client->get($fullUrl, $options);
- PHPUnit_Framework_Assert::assertEquals("true", $this->response->xml()->data[0]->enabled);
+ PHPUnit_Framework_Assert::assertEquals("true", simplexml_load_string($this->response->getBody())->data[0]->enabled);
}
/**
@@ -716,8 +721,7 @@ trait Provisioning {
* @param string $user
* @param string $quota
*/
- public function userHasAQuotaOf($user, $quota)
- {
+ public function userHasAQuotaOf($user, $quota) {
$body = new \Behat\Gherkin\Node\TableNode([
0 => ['key', 'quota'],
1 => ['value', $quota],
@@ -731,13 +735,13 @@ trait Provisioning {
* @Given user :user has unlimited quota
* @param string $user
*/
- public function userHasUnlimitedQuota($user)
- {
+ public function userHasUnlimitedQuota($user) {
$this->userHasAQuotaOf($user, 'none');
}
/**
* Returns home path of the given user
+ *
* @param string $user
*/
public function getUserHome($user) {
@@ -746,22 +750,21 @@ trait Provisioning {
$options = [];
$options['auth'] = $this->adminUser;
$this->response = $client->get($fullUrl, $options);
- return $this->response->xml()->data[0]->home;
+ return simplexml_load_string($this->response->getBody())->data[0]->home;
}
/**
* @BeforeScenario
* @AfterScenario
*/
- public function cleanupUsers()
- {
+ public function cleanupUsers() {
$previousServer = $this->currentServer;
$this->usingServer('LOCAL');
- foreach($this->createdUsers as $user) {
+ foreach ($this->createdUsers as $user) {
$this->deleteUser($user);
}
$this->usingServer('REMOTE');
- foreach($this->createdRemoteUsers as $remoteUser) {
+ foreach ($this->createdRemoteUsers as $remoteUser) {
$this->deleteUser($remoteUser);
}
$this->usingServer($previousServer);
@@ -771,15 +774,14 @@ trait Provisioning {
* @BeforeScenario
* @AfterScenario
*/
- public function cleanupGroups()
- {
+ public function cleanupGroups() {
$previousServer = $this->currentServer;
$this->usingServer('LOCAL');
- foreach($this->createdGroups as $group) {
+ foreach ($this->createdGroups as $group) {
$this->deleteGroup($group);
}
$this->usingServer('REMOTE');
- foreach($this->createdRemoteGroups as $remoteGroup) {
+ foreach ($this->createdRemoteGroups as $remoteGroup) {
$this->deleteGroup($remoteGroup);
}
$this->usingServer($previousServer);
diff --git a/build/integration/features/bootstrap/ShareesContext.php b/build/integration/features/bootstrap/ShareesContext.php
index f659495fcae..24b413ec091 100644
--- a/build/integration/features/bootstrap/ShareesContext.php
+++ b/build/integration/features/bootstrap/ShareesContext.php
@@ -23,7 +23,7 @@
*/
use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
-use GuzzleHttp\Message\ResponseInterface;
+use Psr\Http\Message\ResponseInterface;
require __DIR__ . '/../../vendor/autoload.php';
@@ -72,7 +72,7 @@ class ShareesContext implements Context, SnippetAcceptingContext {
}
public function getArrayOfShareesResponded(ResponseInterface $response, $shareeType) {
- $elements = $response->xml()->data;
+ $elements = simplexml_load_string($response->getBody())->data;
$elements = json_decode(json_encode($elements), 1);
if (strpos($shareeType, 'exact ') === 0) {
$elements = $elements['exact'];
diff --git a/build/integration/features/bootstrap/Sharing.php b/build/integration/features/bootstrap/Sharing.php
index 1921a86656d..7aa29e17ee6 100644
--- a/build/integration/features/bootstrap/Sharing.php
+++ b/build/integration/features/bootstrap/Sharing.php
@@ -44,6 +44,9 @@ trait Sharing {
/** @var int */
private $savedShareId = null;
+ /** @var \Psr\Http\Message\ResponseInterface */
+ private $response;
+
/**
* @Given /^as "([^"]*)" creating a share with$/
* @param string $user
@@ -69,16 +72,16 @@ trait Sharing {
$dateModification = $fd['expireDate'];
$fd['expireDate'] = date('Y-m-d', strtotime($dateModification));
}
- $options['body'] = $fd;
+ $options['form_params'] = $fd;
}
try {
- $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
+ $this->response = $client->request("POST", $fullUrl, $options);
} catch (\GuzzleHttp\Exception\ClientException $ex) {
$this->response = $ex->getResponse();
}
- $this->lastShareData = $this->response->xml();
+ $this->lastShareData = simplexml_load_string($this->response->getBody());
}
/**
@@ -159,8 +162,8 @@ trait Sharing {
$options['auth'] = [$this->currentUser, $this->regularUser];
}
$date = date('Y-m-d', strtotime("+3 days"));
- $options['body'] = ['expireDate' => $date];
- $this->response = $client->send($client->createRequest("PUT", $fullUrl, $options));
+ $options['form_params'] = ['expireDate' => $date];
+ $this->response = $this->response = $client->request("PUT", $fullUrl, $options);
PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
}
@@ -189,11 +192,11 @@ trait Sharing {
$dateModification = $fd['expireDate'];
$fd['expireDate'] = date('Y-m-d', strtotime($dateModification));
}
- $options['body'] = $fd;
+ $options['form_params'] = $fd;
}
try {
- $this->response = $client->send($client->createRequest("PUT", $fullUrl, $options));
+ $this->response = $client->request("PUT", $fullUrl, $options);
} catch (\GuzzleHttp\Exception\ClientException $ex) {
$this->response = $ex->getResponse();
}
@@ -221,38 +224,39 @@ trait Sharing {
} else {
$options['auth'] = [$user, $this->regularUser];
}
- $fd = [];
+ $body = [];
if (!is_null($path)){
- $fd['path'] = $path;
+ $body['path'] = $path;
}
if (!is_null($shareType)){
- $fd['shareType'] = $shareType;
+ $body['shareType'] = $shareType;
}
if (!is_null($shareWith)){
- $fd['shareWith'] = $shareWith;
+ $body['shareWith'] = $shareWith;
}
if (!is_null($publicUpload)){
- $fd['publicUpload'] = $publicUpload;
+ $body['publicUpload'] = $publicUpload;
}
if (!is_null($password)){
- $fd['password'] = $password;
+ $body['password'] = $password;
}
if (!is_null($permissions)){
- $fd['permissions'] = $permissions;
+ $body['permissions'] = $permissions;
}
- $options['body'] = $fd;
+ $options['form_params'] = $body;
try {
- $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
- $this->lastShareData = $this->response->xml();
+ $this->response = $client->request("POST", $fullUrl, $options);
+ $this->lastShareData = simplexml_load_string($this->response->getBody());
} catch (\GuzzleHttp\Exception\ClientException $ex) {
$this->response = $ex->getResponse();
+ throw new \Exception($this->response->getBody());
}
}
public function isFieldInResponse($field, $contentExpected){
- $data = $this->response->xml()->data[0];
+ $data = simplexml_load_string($this->response->getBody())->data[0];
if ((string)$field == 'expiration'){
$contentExpected = date('Y-m-d', strtotime($contentExpected)) . " 00:00:00";
}
@@ -330,7 +334,7 @@ trait Sharing {
}
public function isUserOrGroupInSharedData($userOrGroup, $permissions = null){
- $data = $this->response->xml()->data[0];
+ $data = simplexml_load_string($this->response->getBody())->data[0];
foreach($data as $element) {
if ($element->share_with == $userOrGroup && ($permissions === null || $permissions == $element->permissions)){
return True;
@@ -532,7 +536,7 @@ trait Sharing {
foreach($table->getTable() as $header) {
$headerName = $header[0];
$expectedHeaderValue = $header[1];
- $returnedHeader = $this->response->getHeader($headerName);
+ $returnedHeader = $this->response->getHeader($headerName)[0];
if($returnedHeader !== $expectedHeaderValue) {
throw new \Exception(
sprintf(
diff --git a/build/integration/features/bootstrap/TagsContext.php b/build/integration/features/bootstrap/TagsContext.php
index df2f1cae263..5ccb20eaafe 100644
--- a/build/integration/features/bootstrap/TagsContext.php
+++ b/build/integration/features/bootstrap/TagsContext.php
@@ -32,7 +32,7 @@ use GuzzleHttp\Client;
use GuzzleHttp\Message\ResponseInterface;
class TagsContext implements \Behat\Behat\Context\Context {
- /** @var string */
+ /** @var string */
private $baseUrl;
/** @var Client */
private $client;
@@ -61,9 +61,9 @@ class TagsContext implements \Behat\Behat\Context\Context {
public function tearDownScenario() {
$user = 'admin';
$tags = $this->requestTagsForUser($user);
- foreach($tags as $tagId => $tag) {
+ foreach ($tags as $tagId => $tag) {
$this->response = $this->client->delete(
- $this->baseUrl . '/remote.php/dav/systemtags/'.$tagId,
+ $this->baseUrl . '/remote.php/dav/systemtags/' . $tagId,
[
'auth' => [
$user,
@@ -88,7 +88,8 @@ class TagsContext implements \Behat\Behat\Context\Context {
],
]
);
- } catch (\GuzzleHttp\Exception\ClientException $e) {}
+ } catch (\GuzzleHttp\Exception\ClientException $e) {
+ }
}
/**
@@ -96,7 +97,7 @@ class TagsContext implements \Behat\Behat\Context\Context {
* @return string
*/
private function getPasswordForUser($userName) {
- if($userName === 'admin') {
+ if ($userName === 'admin') {
return 'admin';
}
return '123456';
@@ -181,8 +182,8 @@ class TagsContext implements \Behat\Behat\Context\Context {
* @throws \Exception
*/
public function theResponseShouldHaveAStatusCode($statusCode) {
- if((int)$statusCode !== $this->response->getStatusCode()) {
- throw new \Exception("Expected $statusCode, got ".$this->response->getStatusCode());
+ if ((int)$statusCode !== $this->response->getStatusCode()) {
+ throw new \Exception("Expected $statusCode, got " . $this->response->getStatusCode());
}
}
@@ -211,7 +212,7 @@ class TagsContext implements \Behat\Behat\Context\Context {
$body .= '
</d:prop>
</d:propfind>';
- $request = $this->client->createRequest(
+ $this->response = $this->client->request(
'PROPFIND',
$this->baseUrl . '/remote.php/dav/systemtags/',
[
@@ -225,7 +226,6 @@ class TagsContext implements \Behat\Behat\Context\Context {
],
]
);
- $this->response = $this->client->send($request);
} catch (\GuzzleHttp\Exception\ClientException $e) {
$this->response = $e->getResponse();
}
@@ -233,9 +233,9 @@ class TagsContext implements \Behat\Behat\Context\Context {
$tags = [];
$service = new Sabre\Xml\Service();
$parsed = $service->parse($this->response->getBody()->getContents());
- foreach($parsed as $entry) {
+ foreach ($parsed as $entry) {
$singleEntry = $entry['value'][1]['value'][0]['value'];
- if(empty($singleEntry[0]['value'])) {
+ if (empty($singleEntry[0]['value'])) {
continue;
}
@@ -263,7 +263,7 @@ class TagsContext implements \Behat\Behat\Context\Context {
public function theFollowingTagsShouldExistFor($user, TableNode $table) {
$tags = $this->requestTagsForUser($user);
- if(count($table->getRows()) !== count($tags)) {
+ if (count($table->getRows()) !== count($tags)) {
throw new \Exception(
sprintf(
"Expected %s tags, got %s.",
@@ -273,9 +273,9 @@ class TagsContext implements \Behat\Behat\Context\Context {
);
}
- foreach($table->getRowsHash() as $rowDisplayName => $row) {
- foreach($tags as $key => $tag) {
- if(
+ foreach ($table->getRowsHash() as $rowDisplayName => $row) {
+ foreach ($tags as $key => $tag) {
+ if (
$tag['display-name'] === $rowDisplayName &&
$tag['user-visible'] === $row[0] &&
$tag['user-assignable'] === $row[1]
@@ -284,7 +284,7 @@ class TagsContext implements \Behat\Behat\Context\Context {
}
}
}
- if(count($tags) !== 0) {
+ if (count($tags) !== 0) {
throw new \Exception('Not expected response');
}
}
@@ -331,9 +331,9 @@ class TagsContext implements \Behat\Behat\Context\Context {
* @param string $user
* @throws \Exception
*/
- public function tagsShouldExistFor($count, $user) {
- if((int)$count !== count($this->requestTagsForUser($user))) {
- throw new \Exception("Expected $count tags, got ".count($this->requestTagsForUser($user)));
+ public function tagsShouldExistFor($count, $user) {
+ if ((int)$count !== count($this->requestTagsForUser($user))) {
+ throw new \Exception("Expected $count tags, got " . count($this->requestTagsForUser($user)));
}
}
@@ -369,8 +369,8 @@ class TagsContext implements \Behat\Behat\Context\Context {
if ($tag['display-name'] === $tagName
&& $tag['user-visible'] === $userVisible
&& $tag['user-assignable'] === $userAssignable) {
- $foundTag = $tag;
- break;
+ $foundTag = $tag;
+ break;
}
}
return $foundTag;
@@ -383,8 +383,8 @@ class TagsContext implements \Behat\Behat\Context\Context {
private function findTagIdByName($name) {
$tags = $this->requestTagsForUser('admin');
$tagId = 0;
- foreach($tags as $id => $tag) {
- if($tag['display-name'] === $name) {
+ foreach ($tags as $id => $tag) {
+ if ($tag['display-name'] === $name) {
$tagId = $id;
break;
}
@@ -401,12 +401,12 @@ class TagsContext implements \Behat\Behat\Context\Context {
*/
public function editsTheTagWithNameAndSetsItsNameTo($user, $oldName, $newName) {
$tagId = $this->findTagIdByName($oldName);
- if($tagId === 0) {
+ if ($tagId === 0) {
throw new \Exception('Could not find tag to rename');
}
try {
- $request = $this->client->createRequest(
+ $this->response = $this->client->request(
'PROPPATCH',
$this->baseUrl . '/remote.php/dav/systemtags/' . $tagId,
[
@@ -424,7 +424,6 @@ class TagsContext implements \Behat\Behat\Context\Context {
],
]
);
- $this->response = $this->client->send($request);
} catch (\GuzzleHttp\Exception\ClientException $e) {
$this->response = $e->getResponse();
}
@@ -439,12 +438,12 @@ class TagsContext implements \Behat\Behat\Context\Context {
*/
public function editsTheTagWithNameAndSetsItsGroupsTo($user, $oldName, $groups) {
$tagId = $this->findTagIdByName($oldName);
- if($tagId === 0) {
+ if ($tagId === 0) {
throw new \Exception('Could not find tag to rename');
}
try {
- $request = $this->client->createRequest(
+ $this->response = $this->client->request(
'PROPPATCH',
$this->baseUrl . '/remote.php/dav/systemtags/' . $tagId,
[
@@ -462,7 +461,6 @@ class TagsContext implements \Behat\Behat\Context\Context {
],
]
);
- $this->response = $this->client->send($request);
} catch (\GuzzleHttp\Exception\ClientException $e) {
$this->response = $e->getResponse();
}
@@ -473,7 +471,7 @@ class TagsContext implements \Behat\Behat\Context\Context {
* @param string $user
* @param string $name
*/
- public function deletesTheTagWithName($user, $name) {
+ public function deletesTheTagWithName($user, $name) {
$tagId = $this->findTagIdByName($name);
try {
$this->response = $this->client->delete(
@@ -499,8 +497,8 @@ class TagsContext implements \Behat\Behat\Context\Context {
* @return int
*/
private function getFileIdForPath($path, $user) {
- $url = $this->baseUrl.'/remote.php/webdav/'.$path;
- $credentials = base64_encode($user .':'.$this->getPasswordForUser($user));
+ $url = $this->baseUrl . '/remote.php/webdav/' . $path;
+ $credentials = base64_encode($user . ':' . $this->getPasswordForUser($user));
$context = stream_context_create(array(
'http' => array(
'method' => 'PROPFIND',
@@ -531,7 +529,7 @@ class TagsContext implements \Behat\Behat\Context\Context {
try {
$this->response = $this->client->put(
- $this->baseUrl.'/remote.php/dav/systemtags-relations/files/'.$fileId.'/'.$tagId,
+ $this->baseUrl . '/remote.php/dav/systemtags-relations/files/' . $fileId . '/' . $tagId,
[
'auth' => [
$taggingUser,
@@ -551,17 +549,17 @@ class TagsContext implements \Behat\Behat\Context\Context {
* @param TableNode $table
* @throws \Exception
*/
- public function sharedByHasTheFollowingTags($fileName, $sharedOrOwnedBy, $sharingUser, TableNode $table) {
+ public function sharedByHasTheFollowingTags($fileName, $sharedOrOwnedBy, $sharingUser, TableNode $table) {
$loadedExpectedTags = $table->getTable();
$expectedTags = [];
- foreach($loadedExpectedTags as $expected) {
+ foreach ($loadedExpectedTags as $expected) {
$expectedTags[] = $expected[0];
}
// Get the real tags
- $request = $this->client->createRequest(
+ $response = $this->client->request(
'PROPFIND',
- $this->baseUrl.'/remote.php/dav/systemtags-relations/files/'.$this->getFileIdForPath($fileName, $sharingUser),
+ $this->baseUrl . '/remote.php/dav/systemtags-relations/files/' . $this->getFileIdForPath($fileName, $sharingUser),
[
'auth' => [
$sharingUser,
@@ -577,19 +575,18 @@ class TagsContext implements \Behat\Behat\Context\Context {
</d:prop>
</d:propfind>',
]
- );
- $response = $this->client->send($request)->getBody()->getContents();
+ )->getBody()->getContents();
preg_match_all('/\<oc:display-name\>(.*?)\<\/oc:display-name\>/', $response, $realTags);
- foreach($expectedTags as $key => $row) {
- foreach($realTags as $tag) {
- if($tag[0] === $row) {
+ foreach ($expectedTags as $key => $row) {
+ foreach ($realTags as $tag) {
+ if ($tag[0] === $row) {
unset($expectedTags[$key]);
}
}
}
- if(count($expectedTags) !== 0) {
+ if (count($expectedTags) !== 0) {
throw new \Exception('Not all tags found.');
}
}
@@ -605,13 +602,13 @@ class TagsContext implements \Behat\Behat\Context\Context {
public function sharedByHasTheFollowingTagsFor($fileName, $sharingUser, $user, TableNode $table) {
$loadedExpectedTags = $table->getTable();
$expectedTags = [];
- foreach($loadedExpectedTags as $expected) {
+ foreach ($loadedExpectedTags as $expected) {
$expectedTags[] = $expected[0];
}
// Get the real tags
try {
- $request = $this->client->createRequest(
+ $this->response = $this->client->request(
'PROPFIND',
$this->baseUrl . '/remote.php/dav/systemtags-relations/files/' . $this->getFileIdForPath($fileName, $sharingUser),
[
@@ -630,25 +627,24 @@ class TagsContext implements \Behat\Behat\Context\Context {
</d:propfind>',
]
);
- $this->response = $this->client->send($request)->getBody()->getContents();
} catch (\GuzzleHttp\Exception\ClientException $e) {
$this->response = $e->getResponse();
}
- preg_match_all('/\<oc:display-name\>(.*?)\<\/oc:display-name\>/', $this->response, $realTags);
+ preg_match_all('/\<oc:display-name\>(.*?)\<\/oc:display-name\>/', $this->response->getBody()->getContents(), $realTags);
$realTags = array_filter($realTags);
$expectedTags = array_filter($expectedTags);
- foreach($expectedTags as $key => $row) {
- foreach($realTags as $tag) {
- foreach($tag as $index => $foo) {
- if($tag[$index] === $row) {
+ foreach ($expectedTags as $key => $row) {
+ foreach ($realTags as $tag) {
+ foreach ($tag as $index => $foo) {
+ if ($tag[$index] === $row) {
unset($expectedTags[$key]);
}
}
}
}
- if(count($expectedTags) !== 0) {
+ if (count($expectedTags) !== 0) {
throw new \Exception('Not all tags found.');
}
}
@@ -666,7 +662,7 @@ class TagsContext implements \Behat\Behat\Context\Context {
try {
$this->response = $this->client->delete(
- $this->baseUrl.'/remote.php/dav/systemtags-relations/files/'.$fileId.'/'.$tagId,
+ $this->baseUrl . '/remote.php/dav/systemtags-relations/files/' . $fileId . '/' . $tagId,
[
'auth' => [
$user,
diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php
index 1354c0b1978..12f4a2cc3b3 100644
--- a/build/integration/features/bootstrap/WebDav.php
+++ b/build/integration/features/bootstrap/WebDav.php
@@ -28,6 +28,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
+
use GuzzleHttp\Client as GClient;
use GuzzleHttp\Message\ResponseInterface;
use Sabre\DAV\Client as SClient;
@@ -39,9 +40,9 @@ require __DIR__ . '/../../vendor/autoload.php';
trait WebDav {
use Sharing;
- /** @var string*/
+ /** @var string */
private $davPath = "remote.php/webdav";
- /** @var boolean*/
+ /** @var boolean */
private $usingOldDavPath = true;
/** @var ResponseInterface */
private $response;
@@ -73,40 +74,31 @@ trait WebDav {
$this->usingOldDavPath = false;
}
- public function getDavFilesPath($user){
- if ($this->usingOldDavPath === true){
+ public function getDavFilesPath($user) {
+ if ($this->usingOldDavPath === true) {
return $this->davPath;
} else {
return $this->davPath . '/files/' . $user;
}
}
- public function makeDavRequest($user, $method, $path, $headers, $body = null, $type = "files"){
- if ( $type === "files" ){
+ public function makeDavRequest($user, $method, $path, $headers, $body = null, $type = "files") {
+ if ($type === "files") {
$fullUrl = substr($this->baseUrl, 0, -4) . $this->getDavFilesPath($user) . "$path";
- } else if ( $type === "uploads" ){
+ } else if ($type === "uploads") {
$fullUrl = substr($this->baseUrl, 0, -4) . $this->davPath . "$path";
- }
+ }
$client = new GClient();
- $options = [];
+ $options = [
+ 'headers' => $headers,
+ 'body' => $body
+ ];
if ($user === 'admin') {
$options['auth'] = $this->adminUser;
} else {
$options['auth'] = [$user, $this->regularUser];
}
- $request = $client->createRequest($method, $fullUrl, $options);
- if (!is_null($headers)){
- foreach ($headers as $key => $value) {
- $request->addHeader($key, $value);
- }
- }
-
- if (!is_null($body)) {
- $request->setBody($body);
- }
-
-
- return $client->send($request);
+ return $client->request($method, $fullUrl, $options);
}
/**
@@ -115,7 +107,7 @@ trait WebDav {
* @param string $fileSource
* @param string $fileDestination
*/
- public function userMovedFile($user, $entry, $fileSource, $fileDestination){
+ public function userMovedFile($user, $entry, $fileSource, $fileDestination) {
$fullUrl = substr($this->baseUrl, 0, -4) . $this->getDavFilesPath($user);
$headers['Destination'] = $fullUrl . $fileDestination;
$this->response = $this->makeDavRequest($user, "MOVE", $fileSource, $headers);
@@ -128,7 +120,7 @@ trait WebDav {
* @param string $fileSource
* @param string $fileDestination
*/
- public function userMovesFile($user, $entry, $fileSource, $fileDestination){
+ public function userMovesFile($user, $entry, $fileSource, $fileDestination) {
$fullUrl = substr($this->baseUrl, 0, -4) . $this->getDavFilesPath($user);
$headers['Destination'] = $fullUrl . $fileDestination;
try {
@@ -160,7 +152,7 @@ trait WebDav {
* @param string $fileSource
* @param string $range
*/
- public function downloadFileWithRange($fileSource, $range){
+ public function downloadFileWithRange($fileSource, $range) {
$headers['Range'] = $range;
$this->response = $this->makeDavRequest($this->currentUser, "GET", $fileSource, $headers);
}
@@ -169,43 +161,44 @@ trait WebDav {
* @When /^Downloading last public shared file with range "([^"]*)"$/
* @param string $range
*/
- public function downloadPublicFileWithRange($range){
+ public function downloadPublicFileWithRange($range) {
$token = $this->lastShareData->data->token;
$fullUrl = substr($this->baseUrl, 0, -4) . "public.php/webdav";
$client = new GClient();
$options = [];
$options['auth'] = [$token, ""];
+ $options['headers'] = [
+ 'Range' => $range
+ ];
- $request = $client->createRequest("GET", $fullUrl, $options);
- $request->addHeader('Range', $range);
-
- $this->response = $client->send($request);
+ $this->response = $client->request("GET", $fullUrl, $options);
}
/**
* @When /^Downloading last public shared file inside a folder "([^"]*)" with range "([^"]*)"$/
* @param string $range
*/
- public function downloadPublicFileInsideAFolderWithRange($path, $range){
+ public function downloadPublicFileInsideAFolderWithRange($path, $range) {
$token = $this->lastShareData->data->token;
$fullUrl = substr($this->baseUrl, 0, -4) . "public.php/webdav" . "$path";
$client = new GClient();
- $options = [];
+ $options = [
+ 'headers' => [
+ 'Range' => $range
+ ]
+ ];
$options['auth'] = [$token, ""];
- $request = $client->createRequest("GET", $fullUrl, $options);
- $request->addHeader('Range', $range);
-
- $this->response = $client->send($request);
+ $this->response = $client->request("GET", $fullUrl, $options);
}
/**
* @Then /^Downloaded content should be "([^"]*)"$/
* @param string $content
*/
- public function downloadedContentShouldBe($content){
+ public function downloadedContentShouldBe($content) {
PHPUnit_Framework_Assert::assertEquals($content, (string)$this->response->getBody());
}
@@ -215,7 +208,7 @@ trait WebDav {
* @param string $range
* @param string $content
*/
- public function downloadedContentWhenDownloadindShouldBe($fileSource, $range, $content){
+ public function downloadedContentWhenDownloadindShouldBe($fileSource, $range, $content) {
$this->downloadFileWithRange($fileSource, $range);
$this->downloadedContentShouldBe($content);
}
@@ -238,11 +231,11 @@ trait WebDav {
* @throws \Exception
*/
public function theFollowingHeadersShouldBeSet(\Behat\Gherkin\Node\TableNode $table) {
- foreach($table->getTable() as $header) {
+ foreach ($table->getTable() as $header) {
$headerName = $header[0];
$expectedHeaderValue = $header[1];
- $returnedHeader = $this->response->getHeader($headerName);
- if($returnedHeader !== $expectedHeaderValue) {
+ $returnedHeader = $this->response->getHeader($headerName)[0];
+ if ($returnedHeader !== $expectedHeaderValue) {
throw new \Exception(
sprintf(
"Expected value '%s' for header '%s', got '%s'",
@@ -261,7 +254,7 @@ trait WebDav {
* @throws \Exception
*/
public function downloadedContentShouldStartWith($start) {
- if(strpos($this->response->getBody()->getContents(), $start) !== 0) {
+ if (strpos($this->response->getBody()->getContents(), $start) !== 0) {
throw new \Exception(
sprintf(
"Expected '%s', got '%s'",
@@ -345,8 +338,7 @@ trait WebDav {
/**
* @Then the response should contain a share-types property with
*/
- public function theResponseShouldContainAShareTypesPropertyWith($table)
- {
+ public function theResponseShouldContainAShareTypesPropertyWith($table) {
$keys = $this->response;
if (!array_key_exists('{http://owncloud.org/ns}share-types', $keys)) {
throw new \Exception("Cannot find property \"{http://owncloud.org/ns}share-types\"");
@@ -393,7 +385,7 @@ trait WebDav {
}
/*Returns the elements of a propfind, $folderDepth requires 1 to see elements without children*/
- public function listFolder($user, $path, $folderDepth, $properties = null){
+ public function listFolder($user, $path, $folderDepth, $properties = null) {
$client = $this->getSabreClient($user);
if (!$properties) {
$properties = [
@@ -412,7 +404,7 @@ trait WebDav {
* @param string $properties properties which needs to be included in the report
* @param string $filterRules filter-rules to choose what needs to appear in the report
*/
- public function reportFolder($user, $path, $properties, $filterRules){
+ public function reportFolder($user, $path, $properties, $filterRules) {
$client = $this->getSabreClient($user);
$body = '<?xml version="1.0" encoding="utf-8" ?>
@@ -457,14 +449,14 @@ trait WebDav {
* @param string $user
* @param \Behat\Gherkin\Node\TableNode|null $expectedElements
*/
- public function checkElementList($user, $expectedElements){
+ public function checkElementList($user, $expectedElements) {
$elementList = $this->listFolder($user, '/', 3);
if ($expectedElements instanceof \Behat\Gherkin\Node\TableNode) {
$elementRows = $expectedElements->getRows();
$elementsSimplified = $this->simplifyArray($elementRows);
- foreach($elementsSimplified as $expectedElement) {
+ foreach ($elementsSimplified as $expectedElement) {
$webdavPath = "/" . $this->getDavFilesPath($user) . $expectedElement;
- if (!array_key_exists($webdavPath,$elementList)){
+ if (!array_key_exists($webdavPath, $elementList)) {
PHPUnit_Framework_Assert::fail("$webdavPath" . " is not in propfind answer");
}
}
@@ -477,9 +469,8 @@ trait WebDav {
* @param string $source
* @param string $destination
*/
- public function userUploadsAFileTo($user, $source, $destination)
- {
- $file = \GuzzleHttp\Stream\Stream::factory(fopen($source, 'r'));
+ public function userUploadsAFileTo($user, $source, $destination) {
+ $file = \GuzzleHttp\Psr7\stream_for(fopen($source, 'r'));
try {
$this->response = $this->makeDavRequest($user, "PUT", $destination, [], $file);
} catch (\GuzzleHttp\Exception\ServerException $e) {
@@ -494,7 +485,7 @@ trait WebDav {
* @param string $bytes
* @param string $destination
*/
- public function userAddsAFileTo($user, $bytes, $destination){
+ public function userAddsAFileTo($user, $bytes, $destination) {
$filename = "filespecificSize.txt";
$this->createFileSpecificSize($filename, $bytes);
PHPUnit_Framework_Assert::assertEquals(1, file_exists("work/$filename"));
@@ -507,9 +498,8 @@ trait WebDav {
/**
* @When User :user uploads file with content :content to :destination
*/
- public function userUploadsAFileWithContentTo($user, $content, $destination)
- {
- $file = \GuzzleHttp\Stream\Stream::factory($content);
+ public function userUploadsAFileWithContentTo($user, $content, $destination) {
+ $file = \GuzzleHttp\Psr7\stream_for($content);
try {
$this->response = $this->makeDavRequest($user, "PUT", $destination, [], $file);
} catch (\GuzzleHttp\Exception\ServerException $e) {
@@ -524,7 +514,7 @@ trait WebDav {
* @param string $type
* @param string $file
*/
- public function userDeletesFile($user, $type, $file) {
+ public function userDeletesFile($user, $type, $file) {
try {
$this->response = $this->makeDavRequest($user, 'DELETE', $file, []);
} catch (\GuzzleHttp\Exception\ServerException $e) {
@@ -556,38 +546,34 @@ trait WebDav {
* @param string $data
* @param string $destination
*/
- public function userUploadsChunkFileOfWithToWithChecksum($user, $num, $total, $data, $destination)
- {
+ public function userUploadsChunkFileOfWithToWithChecksum($user, $num, $total, $data, $destination) {
$num -= 1;
- $data = \GuzzleHttp\Stream\Stream::factory($data);
+ $data = \GuzzleHttp\Psr7\stream_for($data);
$file = $destination . '-chunking-42-' . $total . '-' . $num;
- $this->makeDavRequest($user, 'PUT', $file, ['OC-Chunked' => '1'], $data, "uploads");
+ $this->makeDavRequest($user, 'PUT', $file, ['OC-Chunked' => '1'], $data, "uploads");
}
/**
* @Given user :user creates a new chunking upload with id :id
*/
- public function userCreatesANewChunkingUploadWithId($user, $id)
- {
- $destination = '/uploads/'.$user.'/'.$id;
+ public function userCreatesANewChunkingUploadWithId($user, $id) {
+ $destination = '/uploads/' . $user . '/' . $id;
$this->makeDavRequest($user, 'MKCOL', $destination, [], null, "uploads");
}
/**
* @Given user :user uploads new chunk file :num with :data to id :id
*/
- public function userUploadsNewChunkFileOfWithToId($user, $num, $data, $id)
- {
- $data = \GuzzleHttp\Stream\Stream::factory($data);
- $destination = '/uploads/'. $user .'/'. $id .'/' . $num;
+ public function userUploadsNewChunkFileOfWithToId($user, $num, $data, $id) {
+ $data = \GuzzleHttp\Psr7\stream_for($data);
+ $destination = '/uploads/' . $user . '/' . $id . '/' . $num;
$this->makeDavRequest($user, 'PUT', $destination, [], $data, "uploads");
}
/**
* @Given user :user moves new chunk file with id :id to :dest
*/
- public function userMovesNewChunkFileWithIdToMychunkedfile($user, $id, $dest)
- {
+ public function userMovesNewChunkFileWithIdToMychunkedfile($user, $id, $dest) {
$source = '/uploads/' . $user . '/' . $id . '/.file';
$destination = substr($this->baseUrl, 0, -4) . $this->getDavFilesPath($user) . $dest;
$this->makeDavRequest($user, 'MOVE', $source, [
@@ -598,8 +584,7 @@ trait WebDav {
/**
* @Then user :user moves new chunk file with id :id to :dest with size :size
*/
- public function userMovesNewChunkFileWithIdToMychunkedfileWithSize($user, $id, $dest, $size)
- {
+ public function userMovesNewChunkFileWithIdToMychunkedfileWithSize($user, $id, $dest, $size) {
$source = '/uploads/' . $user . '/' . $id . '/.file';
$destination = substr($this->baseUrl, 0, -4) . $this->getDavFilesPath($user) . $dest;
@@ -608,7 +593,7 @@ trait WebDav {
'Destination' => $destination,
'OC-Total-Length' => $size
], null, "uploads");
- } catch(\GuzzleHttp\Exception\BadResponseException $ex) {
+ } catch (\GuzzleHttp\Exception\BadResponseException $ex) {
$this->response = $ex->getResponse();
}
}
@@ -638,19 +623,19 @@ trait WebDav {
/**
* @When user :user favorites element :path
*/
- public function userFavoritesElement($user, $path){
+ public function userFavoritesElement($user, $path) {
$this->response = $this->changeFavStateOfAnElement($user, $path, 1, 0, null);
}
/**
* @When user :user unfavorites element :path
*/
- public function userUnfavoritesElement($user, $path){
+ public function userUnfavoritesElement($user, $path) {
$this->response = $this->changeFavStateOfAnElement($user, $path, 0, 0, null);
}
/*Set the elements of a proppatch, $folderDepth requires 1 to see elements without children*/
- public function changeFavStateOfAnElement($user, $path, $favOrUnfav, $folderDepth, $properties = null){
+ public function changeFavStateOfAnElement($user, $path, $favOrUnfav, $folderDepth, $properties = null) {
$fullUrl = substr($this->baseUrl, 0, -4);
$settings = [
'baseUri' => $fullUrl,
@@ -677,17 +662,17 @@ trait WebDav {
/**
* @Given user :user stores etag of element :path
*/
- public function userStoresEtagOfElement($user, $path){
+ public function userStoresEtagOfElement($user, $path) {
$propertiesTable = new \Behat\Gherkin\Node\TableNode([['{DAV:}getetag']]);
$this->asGetsPropertiesOfFolderWith($user, 'entry', $path, $propertiesTable);
$pathETAG[$path] = $this->response['{DAV:}getetag'];
- $this->storedETAG[$user]= $pathETAG;
+ $this->storedETAG[$user] = $pathETAG;
}
/**
* @Then etag of element :path of user :user has not changed
*/
- public function checkIfETAGHasNotChanged($path, $user){
+ public function checkIfETAGHasNotChanged($path, $user) {
$propertiesTable = new \Behat\Gherkin\Node\TableNode([['{DAV:}getetag']]);
$this->asGetsPropertiesOfFolderWith($user, 'entry', $path, $propertiesTable);
PHPUnit_Framework_Assert::assertEquals($this->response['{DAV:}getetag'], $this->storedETAG[$user][$path]);
@@ -696,7 +681,7 @@ trait WebDav {
/**
* @Then etag of element :path of user :user has changed
*/
- public function checkIfETAGHasChanged($path, $user){
+ public function checkIfETAGHasChanged($path, $user) {
$propertiesTable = new \Behat\Gherkin\Node\TableNode([['{DAV:}getetag']]);
$this->asGetsPropertiesOfFolderWith($user, 'entry', $path, $propertiesTable);
PHPUnit_Framework_Assert::assertNotEquals($this->response['{DAV:}getetag'], $this->storedETAG[$user][$path]);
@@ -724,25 +709,25 @@ trait WebDav {
throw new \Exception('Duplicate header found: ' . $headerName);
}
}
- }
+ }
- /**
+ /**
* @Then /^user "([^"]*)" in folder "([^"]*)" should have favorited the following elements$/
* @param string $user
* @param string $folder
* @param \Behat\Gherkin\Node\TableNode|null $expectedElements
*/
- public function checkFavoritedElements($user, $folder, $expectedElements){
+ public function checkFavoritedElements($user, $folder, $expectedElements) {
$elementList = $this->reportFolder($user,
- $folder,
- '<oc:favorite/>',
- '<oc:favorite>1</oc:favorite>');
+ $folder,
+ '<oc:favorite/>',
+ '<oc:favorite>1</oc:favorite>');
if ($expectedElements instanceof \Behat\Gherkin\Node\TableNode) {
$elementRows = $expectedElements->getRows();
$elementsSimplified = $this->simplifyArray($elementRows);
- foreach($elementsSimplified as $expectedElement) {
+ foreach ($elementsSimplified as $expectedElement) {
$webdavPath = "/" . $this->getDavFilesPath($user) . $expectedElement;
- if (!array_key_exists($webdavPath,$elementList)){
+ if (!array_key_exists($webdavPath, $elementList)) {
PHPUnit_Framework_Assert::fail("$webdavPath" . " is not in report answer");
}
}
@@ -754,12 +739,12 @@ trait WebDav {
* @param string $user
* @param string $folder
*/
- public function userDeletesEverythingInFolder($user, $folder) {
+ public function userDeletesEverythingInFolder($user, $folder) {
$elementList = $this->listFolder($user, $folder, 1);
$elementListKeys = array_keys($elementList);
array_shift($elementListKeys);
- $davPrefix = "/" . $this->getDavFilesPath($user);
- foreach($elementListKeys as $element) {
+ $davPrefix = "/" . $this->getDavFilesPath($user);
+ foreach ($elementListKeys as $element) {
if (substr($element, 0, strlen($davPrefix)) == $davPrefix) {
$element = substr($element, strlen($davPrefix));
}
@@ -776,7 +761,7 @@ trait WebDav {
private function getFileIdForPath($user, $path) {
$propertiesTable = new \Behat\Gherkin\Node\TableNode([["{http://owncloud.org/ns}fileid"]]);
$this->asGetsPropertiesOfFolderWith($user, 'file', $path, $propertiesTable);
- return (int) $this->response['{http://owncloud.org/ns}fileid'];
+ return (int)$this->response['{http://owncloud.org/ns}fileid'];
}
/**
diff --git a/core/Command/App/CheckCode.php b/core/Command/App/CheckCode.php
index 82a137e58e1..530c1d30ec0 100644
--- a/core/Command/App/CheckCode.php
+++ b/core/Command/App/CheckCode.php
@@ -44,20 +44,12 @@ use OC\App\CodeChecker\PrivateCheck;
class CheckCode extends Command implements CompletionAwareInterface {
- /** @var InfoParser */
- private $infoParser;
-
protected $checkers = [
'private' => PrivateCheck::class,
'deprecation' => DeprecationCheck::class,
'strong-comparison' => StrongComparisonCheck::class,
];
- public function __construct(InfoParser $infoParser) {
- parent::__construct();
- $this->infoParser = $infoParser;
- }
-
protected function configure() {
$this
->setName('app:check-code')
@@ -134,50 +126,11 @@ class CheckCode extends Command implements CompletionAwareInterface {
}
if(!$input->getOption('skip-validate-info')) {
- $infoChecker = new InfoChecker($this->infoParser);
-
- $infoChecker->listen('InfoChecker', 'mandatoryFieldMissing', function($key) use ($output) {
- $output->writeln("<error>Mandatory field missing: $key</error>");
- });
-
- $infoChecker->listen('InfoChecker', 'deprecatedFieldFound', function($key, $value) use ($output) {
- if($value === [] || is_null($value) || $value === '') {
- $output->writeln("<info>Deprecated field available: $key</info>");
- } else {
- $output->writeln("<info>Deprecated field available: $key => $value</info>");
- }
- });
-
- $infoChecker->listen('InfoChecker', 'missingRequirement', function($minMax) use ($output) {
- $output->writeln("<error>Nextcloud $minMax version requirement missing</error>");
- });
-
- $infoChecker->listen('InfoChecker', 'differentVersions', function($versionFile, $infoXML) use ($output) {
- $output->writeln("<error>Different versions provided (appinfo/version: $versionFile - appinfo/info.xml: $infoXML)</error>");
+ $infoChecker = new InfoChecker();
+ $infoChecker->listen('InfoChecker', 'parseError', function($error) use ($output) {
+ $output->writeln("<error>Invalid appinfo.xml file found: $error</error>");
});
- $infoChecker->listen('InfoChecker', 'sameVersions', function($path) use ($output) {
- $output->writeln("<info>Version file isn't needed anymore and can be safely removed ($path)</info>");
- });
-
- $infoChecker->listen('InfoChecker', 'migrateVersion', function($version) use ($output) {
- $output->writeln("<error>Migrate the app version to appinfo/info.xml (add <version>$version</version> to appinfo/info.xml and remove appinfo/version)</error>");
- });
-
- if(OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
- $infoChecker->listen('InfoChecker', 'mandatoryFieldFound', function($key, $value) use ($output) {
- $output->writeln("<info>Mandatory field available: $key => $value</info>");
- });
-
- $infoChecker->listen('InfoChecker', 'optionalFieldFound', function($key, $value) use ($output) {
- $output->writeln("<info>Optional field available: $key => $value</info>");
- });
-
- $infoChecker->listen('InfoChecker', 'unusedFieldFound', function($key, $value) use ($output) {
- $output->writeln("<info>Unused field available: $key => $value</info>");
- });
- }
-
$infoErrors = $infoChecker->analyse($appId);
$errors = array_merge($errors, $infoErrors);
diff --git a/core/Command/Db/ConvertFilecacheBigInt.php b/core/Command/Db/ConvertFilecacheBigInt.php
index 75d3a48a5c8..5960b7aa9dd 100644
--- a/core/Command/Db/ConvertFilecacheBigInt.php
+++ b/core/Command/Db/ConvertFilecacheBigInt.php
@@ -54,7 +54,7 @@ class ConvertFilecacheBigInt extends Command {
return [
'activity' => ['activity_id', 'object_id'],
'activity_mq' => ['mail_id'],
- 'filecache' => ['fileid', 'storage', 'parent', 'mimetype', 'mimepart'],
+ 'filecache' => ['fileid', 'storage', 'parent', 'mimetype', 'mimepart', 'mtime', 'storage_mtime'],
'mimetypes' => ['id'],
'storages' => ['numeric_id'],
];
diff --git a/core/Command/Group/AddUser.php b/core/Command/Group/AddUser.php
index 05ae4e2d526..738c25ae13d 100644
--- a/core/Command/Group/AddUser.php
+++ b/core/Command/Group/AddUser.php
@@ -26,10 +26,8 @@ namespace OC\Core\Command\Group;
use OC\Core\Command\Base;
use OCP\IGroupManager;
use OCP\IUserManager;
-use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class AddUser extends Base {
diff --git a/core/Command/Group/ListCommand.php b/core/Command/Group/ListCommand.php
index f3703bc1099..a2b694b30e4 100644
--- a/core/Command/Group/ListCommand.php
+++ b/core/Command/Group/ListCommand.php
@@ -26,9 +26,6 @@ namespace OC\Core\Command\Group;
use OC\Core\Command\Base;
use OCP\IGroup;
use OCP\IGroupManager;
-use OCP\IUser;
-use OCP\IUserManager;
-use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
diff --git a/core/Command/Group/RemoveUser.php b/core/Command/Group/RemoveUser.php
index 09f081004d2..964691597bf 100644
--- a/core/Command/Group/RemoveUser.php
+++ b/core/Command/Group/RemoveUser.php
@@ -26,10 +26,8 @@ namespace OC\Core\Command\Group;
use OC\Core\Command\Base;
use OCP\IGroupManager;
use OCP\IUserManager;
-use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class RemoveUser extends Base {
diff --git a/core/Command/Maintenance/UpdateHtaccess.php b/core/Command/Maintenance/UpdateHtaccess.php
index 001f07187d6..04c870f07a4 100644
--- a/core/Command/Maintenance/UpdateHtaccess.php
+++ b/core/Command/Maintenance/UpdateHtaccess.php
@@ -22,12 +22,8 @@
*/
namespace OC\Core\Command\Maintenance;
-use InvalidArgumentException;
-use OC\Setup;
-use OCP\IConfig;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class UpdateHtaccess extends Command {
diff --git a/core/Command/Security/ImportCertificate.php b/core/Command/Security/ImportCertificate.php
index 38a774add50..02c64b81d9a 100644
--- a/core/Command/Security/ImportCertificate.php
+++ b/core/Command/Security/ImportCertificate.php
@@ -24,11 +24,8 @@ namespace OC\Core\Command\Security;
use OC\Core\Command\Base;
use OCP\ICertificateManager;
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class ImportCertificate extends Base {
diff --git a/core/Command/Security/ListCertificates.php b/core/Command/Security/ListCertificates.php
index fe19348876a..2ee9909813c 100644
--- a/core/Command/Security/ListCertificates.php
+++ b/core/Command/Security/ListCertificates.php
@@ -26,10 +26,8 @@ use OC\Core\Command\Base;
use OCP\ICertificate;
use OCP\ICertificateManager;
use OCP\IL10N;
-use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class ListCertificates extends Base {
diff --git a/core/Command/Security/RemoveCertificate.php b/core/Command/Security/RemoveCertificate.php
index 8be7123ad08..31ddc73877b 100644
--- a/core/Command/Security/RemoveCertificate.php
+++ b/core/Command/Security/RemoveCertificate.php
@@ -25,11 +25,8 @@ namespace OC\Core\Command\Security;
use OC\Core\Command\Base;
use OCP\ICertificateManager;
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class RemoveCertificate extends Base {
diff --git a/core/Command/TwoFactorAuth/Base.php b/core/Command/TwoFactorAuth/Base.php
index c5340656534..aa4f40fc771 100644
--- a/core/Command/TwoFactorAuth/Base.php
+++ b/core/Command/TwoFactorAuth/Base.php
@@ -25,7 +25,6 @@ namespace OC\Core\Command\TwoFactorAuth;
use OCP\IUserManager;
use OCP\IUser;
-use Stecman\Component\Symfony\Console\BashCompletion\Completion\CompletionAwareInterface;
use Stecman\Component\Symfony\Console\BashCompletion\CompletionContext;
class Base extends \OC\Core\Command\Base {
diff --git a/core/Command/Upgrade.php b/core/Command/Upgrade.php
index 1611b121f33..5a2deea0b6c 100644
--- a/core/Command/Upgrade.php
+++ b/core/Command/Upgrade.php
@@ -44,7 +44,6 @@ use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\EventDispatcher\GenericEvent;
class Upgrade extends Command {
diff --git a/core/Command/User/Disable.php b/core/Command/User/Disable.php
index 94be87e6ee0..7c6e8315702 100644
--- a/core/Command/User/Disable.php
+++ b/core/Command/User/Disable.php
@@ -22,7 +22,6 @@
namespace OC\Core\Command\User;
-use OCP\IUser;
use OCP\IUserManager;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
diff --git a/core/Command/User/Enable.php b/core/Command/User/Enable.php
index d8a983155d2..164027d809a 100644
--- a/core/Command/User/Enable.php
+++ b/core/Command/User/Enable.php
@@ -22,7 +22,6 @@
namespace OC\Core\Command\User;
-use OCP\IUser;
use OCP\IUserManager;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
diff --git a/core/Command/User/Info.php b/core/Command/User/Info.php
index f1b5579eb94..3906f40c6a0 100644
--- a/core/Command/User/Info.php
+++ b/core/Command/User/Info.php
@@ -25,9 +25,7 @@ namespace OC\Core\Command\User;
use OC\Core\Command\Base;
use OCP\IGroupManager;
-use OCP\IUser;
use OCP\IUserManager;
-use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
diff --git a/core/Command/User/ListCommand.php b/core/Command/User/ListCommand.php
index 77d99eb2130..06ba1f0b858 100644
--- a/core/Command/User/ListCommand.php
+++ b/core/Command/User/ListCommand.php
@@ -26,7 +26,6 @@ namespace OC\Core\Command\User;
use OC\Core\Command\Base;
use OCP\IUser;
use OCP\IUserManager;
-use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
diff --git a/core/Controller/AutoCompleteController.php b/core/Controller/AutoCompleteController.php
index 1619f9b9edd..93ab9291322 100644
--- a/core/Controller/AutoCompleteController.php
+++ b/core/Controller/AutoCompleteController.php
@@ -27,7 +27,6 @@ use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\DataResponse;
use OCP\Collaboration\AutoComplete\IManager;
use OCP\Collaboration\Collaborators\ISearch;
-use OCP\IConfig;
use OCP\IRequest;
use OCP\Share;
@@ -36,21 +35,17 @@ class AutoCompleteController extends Controller {
private $collaboratorSearch;
/** @var IManager */
private $autoCompleteManager;
- /** @var IConfig */
- private $config;
public function __construct(
$appName,
IRequest $request,
ISearch $collaboratorSearch,
- IManager $autoCompleteManager,
- IConfig $config
+ IManager $autoCompleteManager
) {
parent::__construct($appName, $request);
$this->collaboratorSearch = $collaboratorSearch;
$this->autoCompleteManager = $autoCompleteManager;
- $this->config = $config;
}
/**
diff --git a/core/Controller/AvatarController.php b/core/Controller/AvatarController.php
index 0d0a0274414..14709d65fed 100644
--- a/core/Controller/AvatarController.php
+++ b/core/Controller/AvatarController.php
@@ -34,7 +34,6 @@ use OCP\AppFramework\Http\FileDisplayResponse;
use OCP\AppFramework\Http\JSONResponse;
use OCP\Files\File;
use OCP\Files\IRootFolder;
-use OCP\Files\NotFoundException;
use OCP\IAvatarManager;
use OCP\ICache;
use OCP\ILogger;
diff --git a/core/Controller/LoginController.php b/core/Controller/LoginController.php
index d3659a1c48c..d0a91320e1f 100644
--- a/core/Controller/LoginController.php
+++ b/core/Controller/LoginController.php
@@ -264,13 +264,15 @@ class LoginController extends Controller {
$users = $this->userManager->getByEmail($user);
// we only allow login by email if unique
if (count($users) === 1) {
+ $previousUser = $user;
$user = $users[0]->getUID();
- $loginResult = $this->userManager->checkPassword($user, $password);
- } else {
- $this->logger->warning('Login failed: \''. $user .'\' (Remote IP: \''. $this->request->getRemoteAddress(). '\')', ['app' => 'core']);
+ if($user !== $previousUser) {
+ $loginResult = $this->userManager->checkPassword($user, $password);
+ }
}
}
if ($loginResult === false) {
+ $this->logger->warning('Login failed: \''. $user .'\' (Remote IP: \''. $this->request->getRemoteAddress(). '\')', ['app' => 'core']);
// 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] : [];
if (!is_null($redirect_url)) {
diff --git a/core/Controller/LostController.php b/core/Controller/LostController.php
index e7462180388..90a1176ae83 100644
--- a/core/Controller/LostController.php
+++ b/core/Controller/LostController.php
@@ -321,12 +321,12 @@ class LostController extends Controller {
$emailTemplate->addHeading($this->l10n->t('Password reset'));
$emailTemplate->addBodyText(
- $this->l10n->t('Click the following button to reset your password. If you have not requested the password reset, then ignore this email.'),
+ htmlspecialchars($this->l10n->t('Click the following button to reset your password. If you have not requested the password reset, then ignore this email.')),
$this->l10n->t('Click the following link to reset your password. If you have not requested the password reset, then ignore this email.')
);
$emailTemplate->addBodyButton(
- $this->l10n->t('Reset your password'),
+ htmlspecialchars($this->l10n->t('Reset your password')),
$link,
false
);
diff --git a/core/Controller/NavigationController.php b/core/Controller/NavigationController.php
new file mode 100644
index 00000000000..3521fac3b46
--- /dev/null
+++ b/core/Controller/NavigationController.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Härtl <jus@bitgrid.net>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+namespace OC\Core\Controller;
+
+use OCP\AppFramework\Http\DataResponse;
+use OCP\AppFramework\OCSController;
+use OCP\INavigationManager;
+use OCP\IRequest;
+use OCP\IURLGenerator;
+
+class NavigationController extends OCSController {
+
+ /** @var INavigationManager */
+ private $navigationManager;
+
+ /** @var IURLGenerator */
+ private $urlGenerator;
+
+ public function __construct(string $appName, IRequest $request, INavigationManager $navigationManager, IURLGenerator $urlGenerator) {
+ parent::__construct($appName, $request);
+ $this->navigationManager = $navigationManager;
+ $this->urlGenerator = $urlGenerator;
+ }
+
+ /**
+ * @NoAdminRequired
+ * @NoCSRFRequired
+ *
+ * @param bool $absolute
+ * @return DataResponse
+ */
+ public function getAppsNavigation(bool $absolute = false): DataResponse {
+ $navigation = $this->navigationManager->getAll();
+ if ($absolute) {
+ $navigation = $this->rewriteToAbsoluteUrls($navigation);
+ }
+ return new DataResponse($navigation);
+ }
+
+ /**
+ * @NoAdminRequired
+ * @NoCSRFRequired
+ *
+ * @param bool $absolute
+ * @return DataResponse
+ */
+ public function getSettingsNavigation(bool $absolute = false): DataResponse {
+ $navigation = $this->navigationManager->getAll('settings');
+ if ($absolute) {
+ $navigation = $this->rewriteToAbsoluteUrls($navigation);
+ }
+ return new DataResponse($navigation);
+ }
+
+ /**
+ * Rewrite href attribute of navigation entries to an absolute URL
+ *
+ * @param array $navigation
+ * @return array
+ */
+ private function rewriteToAbsoluteUrls(array $navigation): array {
+ foreach ($navigation as &$entry) {
+ if (0 !== strpos($entry['href'], $this->urlGenerator->getBaseUrl())) {
+ $entry['href'] = $this->urlGenerator->getAbsoluteURL($entry['href']);
+ }
+ if (0 !== strpos($entry['icon'], $this->urlGenerator->getBaseUrl())) {
+ $entry['icon'] = $this->urlGenerator->getAbsoluteURL($entry['icon']);
+ }
+ }
+ return $navigation;
+ }
+}
diff --git a/core/css/icons.scss b/core/css/icons.scss
index fbf36e2fbbc..3c3dff56c1a 100644
--- a/core/css/icons.scss
+++ b/core/css/icons.scss
@@ -516,6 +516,20 @@ img, object, video, button, textarea, input, select, div[contenteditable=true] {
background-image: url('../img/places/picture.svg?v=1');
}
+/* CLIENTS ------------------------------------------------------------------- */
+
+.icon-desktop {
+ background-image: url('../img/clients/desktop.svg?v=1');
+}
+
+.icon-phone {
+ background-image: url('../img/clients/phone.svg?v=1');
+}
+
+.icon-tablet {
+ background-image: url('../img/clients/tablet.svg?v=1');
+}
+
/* APP CATEGORIES ------------------------------------------------------------------- */
.icon-category-installed {
background-image: url('../img/actions/user.svg?v=1');
diff --git a/core/css/systemtags.scss b/core/css/systemtags.scss
index 76db389a6dc..bffafe101e3 100644
--- a/core/css/systemtags.scss
+++ b/core/css/systemtags.scss
@@ -43,6 +43,7 @@
position: relative;
input {
display: inline-block;
+ height: 30px;
width: calc(100% - 40px);
}
}
diff --git a/core/fonts/OpenSans-Light.ttf b/core/fonts/OpenSans-Light.ttf
new file mode 100644
index 00000000000..0d381897da2
--- /dev/null
+++ b/core/fonts/OpenSans-Light.ttf
Binary files differ
diff --git a/core/fonts/OpenSans-Semibold.ttf b/core/fonts/OpenSans-Semibold.ttf
new file mode 100644
index 00000000000..1a7679e3949
--- /dev/null
+++ b/core/fonts/OpenSans-Semibold.ttf
Binary files differ
diff --git a/core/img/clients/desktop.svg b/core/img/clients/desktop.svg
new file mode 100644
index 00000000000..df4f5b6884a
--- /dev/null
+++ b/core/img/clients/desktop.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.233 4.233"><path d="M1.597 3.082v.47l-.085.043-.395.202h2l-.403-.206-.079-.04v-.469zM.267.436C.175.436.04.512.04.606v2.307c0 .094.075.17.167.17h3.82a.168.168 0 0 0 .168-.17V.606a.169.169 0 0 0-.167-.17zm-.035.16L3.967.57c.052 0 .09.042.09.095v2.141c0 .053-.04.095-.09.095h-3.7a.092.092 0 0 1-.093-.094V.675A.14.14 0 0 1 .232.597z" stroke="#000" stroke-width=".079" stroke-linejoin="round"/></svg> \ No newline at end of file
diff --git a/core/img/clients/phone.svg b/core/img/clients/phone.svg
new file mode 100644
index 00000000000..a45c5c4c729
--- /dev/null
+++ b/core/img/clients/phone.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.233 4.233"><path d="M1.19 0a.399.399 0 0 0-.396.396v3.441a.4.4 0 0 0 .396.397h1.72a.4.4 0 0 0 .397-.397V.396a.399.399 0 0 0-.396-.397zm.135.398h1.453a.13.13 0 0 1 .134.133v2.974a.13.13 0 0 1-.133.133H1.325a.13.13 0 0 1-.134-.133V.531a.13.13 0 0 1 .134-.133z"/></svg> \ No newline at end of file
diff --git a/core/img/clients/tablet.svg b/core/img/clients/tablet.svg
new file mode 100644
index 00000000000..a4d41be3057
--- /dev/null
+++ b/core/img/clients/tablet.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.233 4.233"><path d="M.971 0A.452.452 0 0 0 .53.455v3.323c0 .249.2.455.442.455h2.29a.452.452 0 0 0 .443-.455V.455c0-.249-.2-.455-.442-.455zm0 .426h2.29c.02 0 .03.008.03.029v3.323c0 .02-.01.03-.03.03H.972c-.02 0-.027-.01-.027-.03V.455c0-.02.008-.029.027-.029z"/></svg> \ No newline at end of file
diff --git a/core/js/js.js b/core/js/js.js
index 872761c02bb..9b8829de250 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -1237,7 +1237,6 @@ OC.Notification={
* @param {string} [options.type] notification type
*/
showTemporary: function(text, options) {
- var self = this;
var defaults = {
isHTML: false,
timeout: 7
diff --git a/core/js/sharedialogshareelistview.js b/core/js/sharedialogshareelistview.js
index 30cbeff3c64..e76a25bd020 100644
--- a/core/js/sharedialogshareelistview.js
+++ b/core/js/sharedialogshareelistview.js
@@ -30,7 +30,7 @@
'<span class="sharingOptionsGroup">' +
'{{#if editPermissionPossible}}' +
'<span class="shareOption">' +
- '<input id="canEdit-{{cid}}-{{shareWith}}" type="checkbox" name="edit" class="permissions checkbox" {{#if hasEditPermission}}checked="checked"{{/if}} />' +
+ '<input id="canEdit-{{cid}}-{{shareWith}}" type="checkbox" name="edit" class="permissions checkbox" />' +
'<label for="canEdit-{{cid}}-{{shareWith}}">{{canEditLabel}}</label>' +
'</span>' +
'{{/if}}' +
@@ -232,7 +232,7 @@
return _.extend(hasPermissionOverride, {
cid: this.cid,
hasSharePermission: this.model.hasSharePermission(shareIndex),
- hasEditPermission: this.model.hasEditPermission(shareIndex),
+ editPermissionState: this.model.editPermissionState(shareIndex),
hasCreatePermission: this.model.hasCreatePermission(shareIndex),
hasUpdatePermission: this.model.hasUpdatePermission(shareIndex),
hasDeletePermission: this.model.hasDeletePermission(shareIndex),
@@ -379,16 +379,18 @@
$.extend(sharee, this.getShareProperties());
var $li = this.$('li[data-share-id=' + permissionChangeShareId + ']');
$li.find('.sharingOptionsGroup .popovermenu').replaceWith(this.popoverMenuTemplate(sharee));
-
- var checkBoxId = 'canEdit-' + this.cid + '-' + sharee.shareWith;
- checkBoxId = '#' + checkBoxId.replace( /(:|\.|\[|\]|,|=|@)/g, "\\$1");
- var $edit = $li.parent().find(checkBoxId);
- if($edit.length === 1) {
- $edit.prop('checked', sharee.hasEditPermission);
- }
}
var _this = this;
+ this.getShareeList().forEach(function(sharee) {
+ var checkBoxId = 'canEdit-' + _this.cid + '-' + sharee.shareWith;
+ checkBoxId = '#' + checkBoxId.replace( /(:|\.|\[|\]|,|=|@|\/)/g, "\\$1");
+ var $edit = _this.$(checkBoxId);
+ if($edit.length === 1) {
+ $edit.prop('checked', sharee.editPermissionState === 'checked');
+ $edit.prop('indeterminate', sharee.editPermissionState === 'indeterminate');
+ }
+ });
this.$('.popovermenu').on('afterHide', function() {
_this._menuOpen = false;
});
@@ -627,8 +629,10 @@
}
} else {
var numberChecked = $checkboxes.filter(':checked').length;
- checked = numberChecked > 0;
- $('input[name="edit"]', $li).prop('checked', checked);
+ checked = numberChecked === $checkboxes.length;
+ var $editCb = $('input[name="edit"]', $li);
+ $editCb.prop('checked', checked);
+ $editCb.prop('indeterminate', !checked && numberChecked > 0);
}
} else {
if ($element.attr('name') === 'edit' && $element.is(':checked')) {
diff --git a/core/js/shareitemmodel.js b/core/js/shareitemmodel.js
index afe86fa464b..b699513c734 100644
--- a/core/js/shareitemmodel.js
+++ b/core/js/shareitemmodel.js
@@ -567,12 +567,26 @@
},
/**
- * @returns {boolean}
- */
- hasEditPermission: function(shareIndex) {
- return this.hasCreatePermission(shareIndex)
- || this.hasUpdatePermission(shareIndex)
- || this.hasDeletePermission(shareIndex);
+ * @returns {string}
+ * The state that the 'can edit' permission checkbox should have.
+ * Possible values:
+ * - empty string: no permission
+ * - 'checked': all applicable permissions
+ * - 'indeterminate': some but not all permissions
+ */
+ editPermissionState: function(shareIndex) {
+ var hcp = this.hasCreatePermission(shareIndex);
+ var hup = this.hasUpdatePermission(shareIndex);
+ var hdp = this.hasDeletePermission(shareIndex);
+ if (!hcp && !hup && !hdp) {
+ return '';
+ }
+ if ( (this.createPermissionPossible() && !hcp)
+ || (this.updatePermissionPossible() && !hup)
+ || (this.deletePermissionPossible() && !hdp) ) {
+ return 'indeterminate';
+ }
+ return 'checked';
},
/**
diff --git a/core/js/tests/specs/sharedialogshareelistview.js b/core/js/tests/specs/sharedialogshareelistview.js
index 8ee2c48fe39..cc0268ba580 100644
--- a/core/js/tests/specs/sharedialogshareelistview.js
+++ b/core/js/tests/specs/sharedialogshareelistview.js
@@ -89,6 +89,37 @@ describe('OC.Share.ShareDialogShareeListView', function () {
updateShareStub.restore();
});
+ describe('Sets correct initial checkbox state', function () {
+ it('marks edit box as indeterminate when only some permissions are given', function () {
+ shareModel.set('shares', [{
+ id: 100,
+ item_source: 123,
+ permissions: 1 | OC.PERMISSION_UPDATE,
+ share_type: OC.Share.SHARE_TYPE_USER,
+ share_with: 'user1',
+ share_with_displayname: 'User One',
+ itemType: 'folder'
+ }]);
+ shareModel.set('itemType', 'folder');
+ listView.render();
+ expect(listView.$el.find("input[name='edit']").is(':indeterminate')).toEqual(true);
+ });
+
+ it('Checks edit box when all permissions are given', function () {
+ shareModel.set('shares', [{
+ id: 100,
+ item_source: 123,
+ permissions: 1 | OC.PERMISSION_CREATE | OC.PERMISSION_UPDATE | OC.PERMISSION_DELETE,
+ share_type: OC.Share.SHARE_TYPE_USER,
+ share_with: 'user1',
+ share_with_displayname: 'User One',
+ itemType: 'folder'
+ }]);
+ shareModel.set('itemType', 'folder');
+ listView.render();
+ expect(listView.$el.find("input[name='edit']").is(':checked')).toEqual(true);
+ });
+ });
describe('Manages checkbox events correctly', function () {
it('Checks cruds boxes when edit box checked', function () {
shareModel.set('shares', [{
@@ -106,7 +137,7 @@ describe('OC.Share.ShareDialogShareeListView', function () {
expect(updateShareStub.calledOnce).toEqual(true);
});
- it('Checks edit box when create/update/delete are checked', function () {
+ it('marks edit box as indeterminate when some of create/update/delete are checked', function () {
shareModel.set('shares', [{
id: 100,
item_source: 123,
@@ -119,6 +150,23 @@ describe('OC.Share.ShareDialogShareeListView', function () {
shareModel.set('itemType', 'folder');
listView.render();
listView.$el.find("input[name='update']").click();
+ expect(listView.$el.find("input[name='edit']").is(':indeterminate')).toEqual(true);
+ expect(updateShareStub.calledOnce).toEqual(true);
+ });
+
+ it('Checks edit box when all of create/update/delete are checked', function () {
+ shareModel.set('shares', [{
+ id: 100,
+ item_source: 123,
+ permissions: 1 | OC.PERMISSION_CREATE | OC.PERMISSION_DELETE,
+ share_type: OC.Share.SHARE_TYPE_USER,
+ share_with: 'user1',
+ share_with_displayname: 'User One',
+ itemType: 'folder'
+ }]);
+ shareModel.set('itemType', 'folder');
+ listView.render();
+ listView.$el.find("input[name='update']").click();
expect(listView.$el.find("input[name='edit']").is(':checked')).toEqual(true);
expect(updateShareStub.calledOnce).toEqual(true);
});
diff --git a/core/l10n/ar.js b/core/l10n/ar.js
new file mode 100644
index 00000000000..73d96421607
--- /dev/null
+++ b/core/l10n/ar.js
@@ -0,0 +1,202 @@
+OC.L10N.register(
+ "core",
+ {
+ "Please select a file." : "يرجى تحديد ملف.",
+ "File is too big" : "الملف كبير جدا",
+ "The selected file is not an image." : "الملف المحدد ليس صورة ",
+ "The selected file cannot be read." : "الملف المحدد لا يمكن قرأته",
+ "Invalid file provided" : "تم تقديم ملف غير صالح",
+ "No image or file provided" : "لم يتم توفير صورة أو ملف",
+ "Unknown filetype" : "نوع الملف غير معروف",
+ "Invalid image" : "الصورة غير صالحة",
+ "An error occurred. Please contact your admin." : "حدث خطأ، يرجى مراجعة المسؤول.",
+ "No temporary profile picture available, try again" : "لا تتوفر صورة ملف شخصي مؤقتة، حاول مرة أخرى",
+ "Crop is not square" : "القص ليس مربعا",
+ "Password reset is disabled" : "تم تعطيل إعادة تعيين كلمة المرور",
+ "%s password reset" : "%s إعادة تعيين كلمة مرور ",
+ "Password reset" : "إعادة تعيين كلمة مرور",
+ "Reset your password" : "أعد تعيين كلمة المرور",
+ "Couldn't send reset email. Please contact your administrator." : "تعذر إرسال البريد الإلكتروني لإعادة التعيين. يرجى مراجعة المسؤول.",
+ "Couldn't send reset email. Please make sure your username is correct." : "تعذر إرسال البريد الإلكتروني لإعادة التعيين. الرجاء التأكد من صحة اسم المستخدم.",
+ "Preparing update" : "جارٍ تهيئة التحديث",
+ "[%d / %d]: %s" : "[%d/%d]: %s",
+ "Repair error: " : "خطأ في الإصلاح:",
+ "Turned on maintenance mode" : "تشغيل وضع الصيانة.",
+ "Turned off maintenance mode" : "تعطيل وضع الصيانة.",
+ "Updated database" : "قاعدة بيانات محدثة",
+ "Checking updates of apps" : "التحقق من تحديثات التطبيقات",
+ "Checking for update of app \"%s\" in appstore" : "التحقق من تحديثات التطبيقات \"%s\" في متجر التطبيقات",
+ "Update app \"%s\" from appstore" : "قم بتحديث التطبيق \"%s\" عن طريق متجر التطبيقات",
+ "Checked for update of app \"%s\" in appstore" : "التحقق من تحديثات التطبيقات \" %s \" في متجر التطبيقات",
+ "Already up to date" : "محدّثة مسبقاً",
+ "Show all contacts …" : "إظهار كافة المراسلين …",
+ "Loading your contacts …" : "تحميل جهات الاتصال",
+ "Looking for {term} …" : "جاري البحث عن {term}",
+ "No action available" : "لا يتوفر أي إجراء",
+ "Error fetching contact actions" : "حدث خطأ أثناء جلب إجراءات جهات الاتصال",
+ "Settings" : "الضبط",
+ "Connection to server lost" : "تم فقد الاتصال بالخادم",
+ "Saving..." : "جاري الحفظ...",
+ "Dismiss" : "تجاهل",
+ "This action requires you to confirm your password" : "يتطلب هذا الإجراء منك تأكيد كلمة المرور",
+ "Authentication required" : "المصادقة مطلوبة",
+ "Password" : "كلمة المرور",
+ "Cancel" : "الغاء",
+ "Confirm" : "تأكيد",
+ "Failed to authenticate, try again" : "أخفق المصادقة، أعد المحاولة",
+ "seconds ago" : "منذ ثواني",
+ "Logging in …" : "تسجيل الدخول …",
+ "I know what I'm doing" : "أعرف ماذا أفعل",
+ "Password can not be changed. Please contact your administrator." : "كلمة المرور لا يمكن تغييرها. فضلاً تحدث مع المسؤول",
+ "Reset password" : "تعديل كلمة السر",
+ "Sending email …" : "جارٍ إرسال البريد …",
+ "No" : "لا",
+ "Yes" : "نعم",
+ "No files in here" : "لا توجد ملفات هنا",
+ "Choose" : "اختيار",
+ "Copy" : "نسخ",
+ "Move" : "نقل",
+ "OK" : "موافق",
+ "read-only" : "قراءة فقط",
+ "New Files" : "ملفات جديدة",
+ "Already existing files" : "المفات موجودة مسبقاً",
+ "Which files do you want to keep?" : "ماهي الملفات التي ترغب في إبقاءها ؟",
+ "If you select both versions, the copied file will have a number added to its name." : "عند إختيار كلا النسختين. المف المنسوخ سيحتوي على رقم في إسمه.",
+ "Continue" : "المتابعة",
+ "(all selected)" : "(إختيار الكل)",
+ "Pending" : "معلّق",
+ "Copy to {folder}" : "أنسخ إلى {folder}",
+ "Move to {folder}" : "النقل إلى {folder}",
+ "Very weak password" : "كلمة السر ضعيفة جدا",
+ "Weak password" : "كلمة السر ضعيفة",
+ "Good password" : "كلمة السر جيدة",
+ "Strong password" : "كلمة السر قوية",
+ "Shared" : "مشارك",
+ "Shared with" : "تمت مشاركته مع",
+ "Shared by" : "شاركه",
+ "Error setting expiration date" : "حصل خطأ عند عملية تعيين تاريخ إنتهاء الصلاحية",
+ "Set expiration date" : "تعيين تاريخ إنتهاء الصلاحية",
+ "Expiration" : "إنتهاء",
+ "Expiration date" : "تاريخ إنتهاء الصلاحية",
+ "Choose a password for the public link" : "اختر كلمة مرور للرابط العام",
+ "Choose a password for the public link or press the \"Enter\" key" : "اختر كلمة مرور للرابط العام أو إضغط على زر \"Enter\"",
+ "Copied!" : "تم نسخه !",
+ "Not supported!" : "غير مدعوم !",
+ "Press ⌘-C to copy." : "إضغط C-⌘ للنسخ.",
+ "Press Ctrl-C to copy." : "للنسخ إضغط على CTRL+C.",
+ "Resharing is not allowed" : "لا يسمح بعملية إعادة المشاركة",
+ "Share to {name}" : "تمت مشاركته مع {name}",
+ "Share link" : "شارك الرابط",
+ "Link" : "الرابط",
+ "Password protect" : "حماية كلمة السر",
+ "Allow editing" : "السماح بالتعديلات",
+ "Email link to person" : "ارسل الرابط بالبريد الى صديق",
+ "Send" : "أرسل",
+ "Allow upload and editing" : "السماح بالرفع و التعديل",
+ "Read only" : "القراءة فقط",
+ "Shared with you and the group {group} by {owner}" : "شورك معك ومع المجموعة {group} من قبل {owner}",
+ "Shared with you by {owner}" : "شورك معك من قبل {owner}",
+ "group" : "مجموعة",
+ "remote" : "عن بعد",
+ "email" : "البريد الإلكتروني",
+ "shared by {sharer}" : "شارَكه {sharer}",
+ "Unshare" : "إلغاء مشاركة",
+ "Can reshare" : "يمكنه إعادة المشاركة",
+ "Can edit" : "يمكنه التغيير",
+ "Can create" : "يمكنه الإنشاء",
+ "Can change" : "يمكنه تعديله",
+ "Can delete" : "يمكنه الحذف",
+ "Access control" : "مراقبة النفاذ",
+ "Could not unshare" : "لا يمكن إلغاء المشاركة",
+ "Error while sharing" : "حصل خطأ عند عملية المشاركة",
+ "An error occurred. Please try again" : "طرأ هناك خطأ. الرجاء إعادة المحاولة",
+ "{sharee} (group)" : "{sharee} (group)",
+ "{sharee} (remote)" : "{sharee} (remote)",
+ "{sharee} (email)" : "{sharee} (email)",
+ "Share" : "شارك",
+ "Name or email address..." : "الإسم أو عنوان البريد الإلكتروني …",
+ "Name or federated cloud ID..." : "الإسم أو معرّف السحابة المتحدة …",
+ "Name..." : "التسمية …",
+ "Error" : "خطأ",
+ "restricted" : "مُقيَّد",
+ "invisible" : "مخفي",
+ "({scope})" : "({scope})",
+ "Delete" : "إلغاء",
+ "Rename" : "إعادة التسمية",
+ "No tags found" : "لم يُعثَر على أي وسم",
+ "unknown text" : "النص غير معروف",
+ "Hello world!" : "مرحبا بالعالم!",
+ "sunny" : "مشمس",
+ "Hello {name}" : "مرحبا {name}",
+ "new" : "جديد",
+ "_download %n file_::_download %n files_" : ["تنزيل %n ملف","تنزيل ملف واحد","تنزيل ملفين","تنزيل %n ملفات","تنزيل %n ملفات","تنزيل %n ملفات"],
+ "Update to {version}" : "التحديث إلى {version}",
+ "An error occurred." : "طرأ هناك خطأ.",
+ "Please reload the page." : "رجاء أعد تحميل الصفحة.",
+ "Continue to Nextcloud" : "المواصلة إلى ناكست كلاود",
+ "Searching other places" : "البحث في أماكن أخرى",
+ "Personal" : "شخصي",
+ "Users" : "المستخدمين",
+ "Apps" : "التطبيقات",
+ "Admin" : "المدير",
+ "Help" : "المساعدة",
+ "Access forbidden" : "التوصّل محظور",
+ "File not found" : "لم يتم العثور على الملف",
+ "Technical details" : "تفاصيل تقنية",
+ "Remote Address: %s" : "العنوان البعدي : %s",
+ "Type: %s" : "النوع : %s",
+ "Code: %s" : "الرمز : %s",
+ "Message: %s" : "الرسالة : %s",
+ "File: %s" : "ملف : %s",
+ "Line: %s" : "السطر: %s",
+ "Security warning" : "تحذير الأمان",
+ "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "مجلدات البيانات والملفات الخاصة قد تكون قابلة للوصول اليها عن طريق شبكة الانترنت وذلك بسبب ان ملف .htaccess لا يعمل بشكل صحيح.",
+ "Create an <strong>admin account</strong>" : "أضف </strong>مستخدم رئيسي <strong>",
+ "Username" : "إسم المستخدم",
+ "Storage & database" : "التخزين و قاعدة البيانات",
+ "Data folder" : "مجلد المعلومات",
+ "Configure the database" : "أسس قاعدة البيانات",
+ "Only %s is available." : "لم يتبقى إلّا %s.",
+ "For more details check out the documentation." : "للمزيد من التفاصيل، يرجى الإطلاع على الدليل.",
+ "Database user" : "مستخدم قاعدة البيانات",
+ "Database password" : "كلمة سر مستخدم قاعدة البيانات",
+ "Database name" : "إسم قاعدة البيانات",
+ "Database tablespace" : "مساحة جدول قاعدة البيانات",
+ "Database host" : "خادم قاعدة البيانات",
+ "Performance warning" : "تحذير حول الأداء",
+ "Finish setup" : "انهاء التعديلات",
+ "Finishing …" : "إنهاء …",
+ "Need help?" : "محتاج مساعدة؟",
+ "See the documentation" : "اطلع على التعليمات",
+ "More apps" : "المزيد من التطبيقات",
+ "Search" : "البحث",
+ "Reset search" : "إعادة تعيين البحث",
+ "Confirm your password" : "تأكيد كلمتك السرية",
+ "Username or email" : "اسم المستخدم أو البريد الالكتروني",
+ "Log in" : "أدخل",
+ "Wrong password." : "كلمة السر خاطئة.",
+ "Forgot password?" : "هل نسيت كلمة السر ؟",
+ "Back to log in" : "العودة إلى تسجيل الدخول",
+ "Alternative Logins" : "اسماء دخول بديلة",
+ "Account access" : "حساب النفاذ",
+ "Grant access" : "السماح بالنفاذ",
+ "Redirecting …" : "عملية التحويل جارية …",
+ "New password" : "كلمات سر جديدة",
+ "New Password" : "كلمة السر الجديدة",
+ "Two-factor authentication" : "المصادقة بخطوتين",
+ "Cancel log in" : "إلغاء تسجيل الدخول",
+ "Use backup code" : "إستخدم الرمز الإحتياطي",
+ "Add \"%s\" as trusted domain" : "إضافة \"%s\" كنطاق موثوق فيه",
+ "App update required" : "تحديث التطبيق مطلوب",
+ "These apps will be updated:" : "سوف يتم تحديث هذه التطبيقات :",
+ "Start update" : "تشغيل التحديث",
+ "Detailed logs" : "السجلات المفصلة",
+ "Update needed" : "التحديث مطلوب",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">documentation</a>." : "للمساعدة يُرجى الإطلاع على <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">الدليل</a>.",
+ "Thank you for your patience." : "شكرا لك على صبرك.",
+ "Shared with {recipients}" : "تمت مشاركته مع {recipients}",
+ "This action requires you to confirm your password:" : "يتطلب منك هذا الإجراء تأكيد كلمة المرور :",
+ "Wrong password. Reset it?" : "كلمة السر خاطئة. هل تريد إعادة تعيينها ؟",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "للمساعدة يُرجى الإطلاع على <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">الدليل</a>."
+},
+"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/core/l10n/ar.json b/core/l10n/ar.json
new file mode 100644
index 00000000000..59af4cfbf8e
--- /dev/null
+++ b/core/l10n/ar.json
@@ -0,0 +1,200 @@
+{ "translations": {
+ "Please select a file." : "يرجى تحديد ملف.",
+ "File is too big" : "الملف كبير جدا",
+ "The selected file is not an image." : "الملف المحدد ليس صورة ",
+ "The selected file cannot be read." : "الملف المحدد لا يمكن قرأته",
+ "Invalid file provided" : "تم تقديم ملف غير صالح",
+ "No image or file provided" : "لم يتم توفير صورة أو ملف",
+ "Unknown filetype" : "نوع الملف غير معروف",
+ "Invalid image" : "الصورة غير صالحة",
+ "An error occurred. Please contact your admin." : "حدث خطأ، يرجى مراجعة المسؤول.",
+ "No temporary profile picture available, try again" : "لا تتوفر صورة ملف شخصي مؤقتة، حاول مرة أخرى",
+ "Crop is not square" : "القص ليس مربعا",
+ "Password reset is disabled" : "تم تعطيل إعادة تعيين كلمة المرور",
+ "%s password reset" : "%s إعادة تعيين كلمة مرور ",
+ "Password reset" : "إعادة تعيين كلمة مرور",
+ "Reset your password" : "أعد تعيين كلمة المرور",
+ "Couldn't send reset email. Please contact your administrator." : "تعذر إرسال البريد الإلكتروني لإعادة التعيين. يرجى مراجعة المسؤول.",
+ "Couldn't send reset email. Please make sure your username is correct." : "تعذر إرسال البريد الإلكتروني لإعادة التعيين. الرجاء التأكد من صحة اسم المستخدم.",
+ "Preparing update" : "جارٍ تهيئة التحديث",
+ "[%d / %d]: %s" : "[%d/%d]: %s",
+ "Repair error: " : "خطأ في الإصلاح:",
+ "Turned on maintenance mode" : "تشغيل وضع الصيانة.",
+ "Turned off maintenance mode" : "تعطيل وضع الصيانة.",
+ "Updated database" : "قاعدة بيانات محدثة",
+ "Checking updates of apps" : "التحقق من تحديثات التطبيقات",
+ "Checking for update of app \"%s\" in appstore" : "التحقق من تحديثات التطبيقات \"%s\" في متجر التطبيقات",
+ "Update app \"%s\" from appstore" : "قم بتحديث التطبيق \"%s\" عن طريق متجر التطبيقات",
+ "Checked for update of app \"%s\" in appstore" : "التحقق من تحديثات التطبيقات \" %s \" في متجر التطبيقات",
+ "Already up to date" : "محدّثة مسبقاً",
+ "Show all contacts …" : "إظهار كافة المراسلين …",
+ "Loading your contacts …" : "تحميل جهات الاتصال",
+ "Looking for {term} …" : "جاري البحث عن {term}",
+ "No action available" : "لا يتوفر أي إجراء",
+ "Error fetching contact actions" : "حدث خطأ أثناء جلب إجراءات جهات الاتصال",
+ "Settings" : "الضبط",
+ "Connection to server lost" : "تم فقد الاتصال بالخادم",
+ "Saving..." : "جاري الحفظ...",
+ "Dismiss" : "تجاهل",
+ "This action requires you to confirm your password" : "يتطلب هذا الإجراء منك تأكيد كلمة المرور",
+ "Authentication required" : "المصادقة مطلوبة",
+ "Password" : "كلمة المرور",
+ "Cancel" : "الغاء",
+ "Confirm" : "تأكيد",
+ "Failed to authenticate, try again" : "أخفق المصادقة، أعد المحاولة",
+ "seconds ago" : "منذ ثواني",
+ "Logging in …" : "تسجيل الدخول …",
+ "I know what I'm doing" : "أعرف ماذا أفعل",
+ "Password can not be changed. Please contact your administrator." : "كلمة المرور لا يمكن تغييرها. فضلاً تحدث مع المسؤول",
+ "Reset password" : "تعديل كلمة السر",
+ "Sending email …" : "جارٍ إرسال البريد …",
+ "No" : "لا",
+ "Yes" : "نعم",
+ "No files in here" : "لا توجد ملفات هنا",
+ "Choose" : "اختيار",
+ "Copy" : "نسخ",
+ "Move" : "نقل",
+ "OK" : "موافق",
+ "read-only" : "قراءة فقط",
+ "New Files" : "ملفات جديدة",
+ "Already existing files" : "المفات موجودة مسبقاً",
+ "Which files do you want to keep?" : "ماهي الملفات التي ترغب في إبقاءها ؟",
+ "If you select both versions, the copied file will have a number added to its name." : "عند إختيار كلا النسختين. المف المنسوخ سيحتوي على رقم في إسمه.",
+ "Continue" : "المتابعة",
+ "(all selected)" : "(إختيار الكل)",
+ "Pending" : "معلّق",
+ "Copy to {folder}" : "أنسخ إلى {folder}",
+ "Move to {folder}" : "النقل إلى {folder}",
+ "Very weak password" : "كلمة السر ضعيفة جدا",
+ "Weak password" : "كلمة السر ضعيفة",
+ "Good password" : "كلمة السر جيدة",
+ "Strong password" : "كلمة السر قوية",
+ "Shared" : "مشارك",
+ "Shared with" : "تمت مشاركته مع",
+ "Shared by" : "شاركه",
+ "Error setting expiration date" : "حصل خطأ عند عملية تعيين تاريخ إنتهاء الصلاحية",
+ "Set expiration date" : "تعيين تاريخ إنتهاء الصلاحية",
+ "Expiration" : "إنتهاء",
+ "Expiration date" : "تاريخ إنتهاء الصلاحية",
+ "Choose a password for the public link" : "اختر كلمة مرور للرابط العام",
+ "Choose a password for the public link or press the \"Enter\" key" : "اختر كلمة مرور للرابط العام أو إضغط على زر \"Enter\"",
+ "Copied!" : "تم نسخه !",
+ "Not supported!" : "غير مدعوم !",
+ "Press ⌘-C to copy." : "إضغط C-⌘ للنسخ.",
+ "Press Ctrl-C to copy." : "للنسخ إضغط على CTRL+C.",
+ "Resharing is not allowed" : "لا يسمح بعملية إعادة المشاركة",
+ "Share to {name}" : "تمت مشاركته مع {name}",
+ "Share link" : "شارك الرابط",
+ "Link" : "الرابط",
+ "Password protect" : "حماية كلمة السر",
+ "Allow editing" : "السماح بالتعديلات",
+ "Email link to person" : "ارسل الرابط بالبريد الى صديق",
+ "Send" : "أرسل",
+ "Allow upload and editing" : "السماح بالرفع و التعديل",
+ "Read only" : "القراءة فقط",
+ "Shared with you and the group {group} by {owner}" : "شورك معك ومع المجموعة {group} من قبل {owner}",
+ "Shared with you by {owner}" : "شورك معك من قبل {owner}",
+ "group" : "مجموعة",
+ "remote" : "عن بعد",
+ "email" : "البريد الإلكتروني",
+ "shared by {sharer}" : "شارَكه {sharer}",
+ "Unshare" : "إلغاء مشاركة",
+ "Can reshare" : "يمكنه إعادة المشاركة",
+ "Can edit" : "يمكنه التغيير",
+ "Can create" : "يمكنه الإنشاء",
+ "Can change" : "يمكنه تعديله",
+ "Can delete" : "يمكنه الحذف",
+ "Access control" : "مراقبة النفاذ",
+ "Could not unshare" : "لا يمكن إلغاء المشاركة",
+ "Error while sharing" : "حصل خطأ عند عملية المشاركة",
+ "An error occurred. Please try again" : "طرأ هناك خطأ. الرجاء إعادة المحاولة",
+ "{sharee} (group)" : "{sharee} (group)",
+ "{sharee} (remote)" : "{sharee} (remote)",
+ "{sharee} (email)" : "{sharee} (email)",
+ "Share" : "شارك",
+ "Name or email address..." : "الإسم أو عنوان البريد الإلكتروني …",
+ "Name or federated cloud ID..." : "الإسم أو معرّف السحابة المتحدة …",
+ "Name..." : "التسمية …",
+ "Error" : "خطأ",
+ "restricted" : "مُقيَّد",
+ "invisible" : "مخفي",
+ "({scope})" : "({scope})",
+ "Delete" : "إلغاء",
+ "Rename" : "إعادة التسمية",
+ "No tags found" : "لم يُعثَر على أي وسم",
+ "unknown text" : "النص غير معروف",
+ "Hello world!" : "مرحبا بالعالم!",
+ "sunny" : "مشمس",
+ "Hello {name}" : "مرحبا {name}",
+ "new" : "جديد",
+ "_download %n file_::_download %n files_" : ["تنزيل %n ملف","تنزيل ملف واحد","تنزيل ملفين","تنزيل %n ملفات","تنزيل %n ملفات","تنزيل %n ملفات"],
+ "Update to {version}" : "التحديث إلى {version}",
+ "An error occurred." : "طرأ هناك خطأ.",
+ "Please reload the page." : "رجاء أعد تحميل الصفحة.",
+ "Continue to Nextcloud" : "المواصلة إلى ناكست كلاود",
+ "Searching other places" : "البحث في أماكن أخرى",
+ "Personal" : "شخصي",
+ "Users" : "المستخدمين",
+ "Apps" : "التطبيقات",
+ "Admin" : "المدير",
+ "Help" : "المساعدة",
+ "Access forbidden" : "التوصّل محظور",
+ "File not found" : "لم يتم العثور على الملف",
+ "Technical details" : "تفاصيل تقنية",
+ "Remote Address: %s" : "العنوان البعدي : %s",
+ "Type: %s" : "النوع : %s",
+ "Code: %s" : "الرمز : %s",
+ "Message: %s" : "الرسالة : %s",
+ "File: %s" : "ملف : %s",
+ "Line: %s" : "السطر: %s",
+ "Security warning" : "تحذير الأمان",
+ "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "مجلدات البيانات والملفات الخاصة قد تكون قابلة للوصول اليها عن طريق شبكة الانترنت وذلك بسبب ان ملف .htaccess لا يعمل بشكل صحيح.",
+ "Create an <strong>admin account</strong>" : "أضف </strong>مستخدم رئيسي <strong>",
+ "Username" : "إسم المستخدم",
+ "Storage & database" : "التخزين و قاعدة البيانات",
+ "Data folder" : "مجلد المعلومات",
+ "Configure the database" : "أسس قاعدة البيانات",
+ "Only %s is available." : "لم يتبقى إلّا %s.",
+ "For more details check out the documentation." : "للمزيد من التفاصيل، يرجى الإطلاع على الدليل.",
+ "Database user" : "مستخدم قاعدة البيانات",
+ "Database password" : "كلمة سر مستخدم قاعدة البيانات",
+ "Database name" : "إسم قاعدة البيانات",
+ "Database tablespace" : "مساحة جدول قاعدة البيانات",
+ "Database host" : "خادم قاعدة البيانات",
+ "Performance warning" : "تحذير حول الأداء",
+ "Finish setup" : "انهاء التعديلات",
+ "Finishing …" : "إنهاء …",
+ "Need help?" : "محتاج مساعدة؟",
+ "See the documentation" : "اطلع على التعليمات",
+ "More apps" : "المزيد من التطبيقات",
+ "Search" : "البحث",
+ "Reset search" : "إعادة تعيين البحث",
+ "Confirm your password" : "تأكيد كلمتك السرية",
+ "Username or email" : "اسم المستخدم أو البريد الالكتروني",
+ "Log in" : "أدخل",
+ "Wrong password." : "كلمة السر خاطئة.",
+ "Forgot password?" : "هل نسيت كلمة السر ؟",
+ "Back to log in" : "العودة إلى تسجيل الدخول",
+ "Alternative Logins" : "اسماء دخول بديلة",
+ "Account access" : "حساب النفاذ",
+ "Grant access" : "السماح بالنفاذ",
+ "Redirecting …" : "عملية التحويل جارية …",
+ "New password" : "كلمات سر جديدة",
+ "New Password" : "كلمة السر الجديدة",
+ "Two-factor authentication" : "المصادقة بخطوتين",
+ "Cancel log in" : "إلغاء تسجيل الدخول",
+ "Use backup code" : "إستخدم الرمز الإحتياطي",
+ "Add \"%s\" as trusted domain" : "إضافة \"%s\" كنطاق موثوق فيه",
+ "App update required" : "تحديث التطبيق مطلوب",
+ "These apps will be updated:" : "سوف يتم تحديث هذه التطبيقات :",
+ "Start update" : "تشغيل التحديث",
+ "Detailed logs" : "السجلات المفصلة",
+ "Update needed" : "التحديث مطلوب",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">documentation</a>." : "للمساعدة يُرجى الإطلاع على <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">الدليل</a>.",
+ "Thank you for your patience." : "شكرا لك على صبرك.",
+ "Shared with {recipients}" : "تمت مشاركته مع {recipients}",
+ "This action requires you to confirm your password:" : "يتطلب منك هذا الإجراء تأكيد كلمة المرور :",
+ "Wrong password. Reset it?" : "كلمة السر خاطئة. هل تريد إعادة تعيينها ؟",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "للمساعدة يُرجى الإطلاع على <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">الدليل</a>."
+},"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/core/l10n/es.js b/core/l10n/es.js
index efd6751c0c0..00950c29fe9 100644
--- a/core/l10n/es.js
+++ b/core/l10n/es.js
@@ -293,7 +293,7 @@ OC.L10N.register(
"Enhanced security is enabled for your account. Please authenticate using a second factor." : "La seguridad mejorada se ha habilitado para tu cuenta. Por favor, autenticar utilizando un segundo factor.",
"Cancel log in" : "Cancelar inicio de sesión",
"Use backup code" : "Usar código de respaldo",
- "Error while validating your second factor" : "Error mientras validaba su factor segundo",
+ "Error while validating your second factor" : "Error al validar su segundo factor",
"Access through untrusted domain" : "Acceso a través de un dominio en el que no se confía",
"Please contact your administrator. If you are an administrator, edit the \"trusted_domains\" setting in config/config.php like the example in config.sample.php." : "Por favor, ponte en contacto con tu administrador. Si eres un administrador, edita la configuración \"trusted_domains\" en config/config.php como el ejemplo que aparece en config.sample.php.",
"Depending on your configuration, this button could also work to trust the domain:" : "Dependiendo de tu configuración, este botón también podría servir para confiar en el dominio:",
diff --git a/core/l10n/es.json b/core/l10n/es.json
index fb9f9746df3..9220911b623 100644
--- a/core/l10n/es.json
+++ b/core/l10n/es.json
@@ -291,7 +291,7 @@
"Enhanced security is enabled for your account. Please authenticate using a second factor." : "La seguridad mejorada se ha habilitado para tu cuenta. Por favor, autenticar utilizando un segundo factor.",
"Cancel log in" : "Cancelar inicio de sesión",
"Use backup code" : "Usar código de respaldo",
- "Error while validating your second factor" : "Error mientras validaba su factor segundo",
+ "Error while validating your second factor" : "Error al validar su segundo factor",
"Access through untrusted domain" : "Acceso a través de un dominio en el que no se confía",
"Please contact your administrator. If you are an administrator, edit the \"trusted_domains\" setting in config/config.php like the example in config.sample.php." : "Por favor, ponte en contacto con tu administrador. Si eres un administrador, edita la configuración \"trusted_domains\" en config/config.php como el ejemplo que aparece en config.sample.php.",
"Depending on your configuration, this button could also work to trust the domain:" : "Dependiendo de tu configuración, este botón también podría servir para confiar en el dominio:",
diff --git a/core/l10n/lt_LT.js b/core/l10n/lt_LT.js
index 1c8e7088c2d..30f6f966d17 100644
--- a/core/l10n/lt_LT.js
+++ b/core/l10n/lt_LT.js
@@ -56,6 +56,7 @@ OC.L10N.register(
"Search contacts …" : "Pažįstamų asmenų paieška...",
"No contacts found" : "Pažįstamų asmenų nerasta",
"Show all contacts …" : "Rodyti visus pažįstamus asmenis...",
+ "Could not load your contacts" : "Nepavyko įkelti jūsų kontaktų",
"Loading your contacts …" : "Kraunami informacija apie pažįstamus asmenis",
"Looking for {term} …" : "Ieškoma {term} ...",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Buvo problemų su kodo vientisumo patikrinimu. Daugiau informacijos…</a>",
@@ -294,6 +295,10 @@ OC.L10N.register(
"This %s instance is currently in maintenance mode, which may take a while." : "Šis %s egzempliorius šiuo metu yra techninės priežiūros veiksenoje, kas savo ruožtu gali šiek tiek užtrukti.",
"This page will refresh itself when the %s instance is available again." : "Šis puslapis bus įkeltas iš naujo, kai %s egzempliorius bus ir vėl prieinamas.",
"Contact your system administrator if this message persists or appeared unexpectedly." : "Susisiekite su savo sistemos administratoriumi jei šis pranešimas nedingsta arba jei jis pasirodė netikėtai.",
- "Thank you for your patience." : "Dėkojame už jūsų kantrumą."
+ "Thank you for your patience." : "Dėkojame už jūsų kantrumą.",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "Išsamesnei informacijai apie tai kaip tinkamai sukonfigūruoti savo serverį, žiūrėkite <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dokumentaciją</a>.",
+ "This action requires you to confirm your password:" : "Šis veiksmas reikalauja, kad patvirtintumėte savo slaptažodį:",
+ "Wrong password. Reset it?" : "Neteisingas slaptažodis. Atstatyti jį?",
+ "You are about to grant \"%s\" access to your %s account." : "Ketinate suteikti \"%s\" prieigą prie savo %s paskyros."
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/core/l10n/lt_LT.json b/core/l10n/lt_LT.json
index 78e151f0b91..09cbafb4f20 100644
--- a/core/l10n/lt_LT.json
+++ b/core/l10n/lt_LT.json
@@ -54,6 +54,7 @@
"Search contacts …" : "Pažįstamų asmenų paieška...",
"No contacts found" : "Pažįstamų asmenų nerasta",
"Show all contacts …" : "Rodyti visus pažįstamus asmenis...",
+ "Could not load your contacts" : "Nepavyko įkelti jūsų kontaktų",
"Loading your contacts …" : "Kraunami informacija apie pažįstamus asmenis",
"Looking for {term} …" : "Ieškoma {term} ...",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Buvo problemų su kodo vientisumo patikrinimu. Daugiau informacijos…</a>",
@@ -292,6 +293,10 @@
"This %s instance is currently in maintenance mode, which may take a while." : "Šis %s egzempliorius šiuo metu yra techninės priežiūros veiksenoje, kas savo ruožtu gali šiek tiek užtrukti.",
"This page will refresh itself when the %s instance is available again." : "Šis puslapis bus įkeltas iš naujo, kai %s egzempliorius bus ir vėl prieinamas.",
"Contact your system administrator if this message persists or appeared unexpectedly." : "Susisiekite su savo sistemos administratoriumi jei šis pranešimas nedingsta arba jei jis pasirodė netikėtai.",
- "Thank you for your patience." : "Dėkojame už jūsų kantrumą."
+ "Thank you for your patience." : "Dėkojame už jūsų kantrumą.",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "Išsamesnei informacijai apie tai kaip tinkamai sukonfigūruoti savo serverį, žiūrėkite <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dokumentaciją</a>.",
+ "This action requires you to confirm your password:" : "Šis veiksmas reikalauja, kad patvirtintumėte savo slaptažodį:",
+ "Wrong password. Reset it?" : "Neteisingas slaptažodis. Atstatyti jį?",
+ "You are about to grant \"%s\" access to your %s account." : "Ketinate suteikti \"%s\" prieigą prie savo %s paskyros."
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/core/l10n/lv.js b/core/l10n/lv.js
index 1db9f05839c..59314767678 100644
--- a/core/l10n/lv.js
+++ b/core/l10n/lv.js
@@ -1,10 +1,10 @@
OC.L10N.register(
"core",
{
- "Please select a file." : "Lūdzu izvēlies failu.",
+ "Please select a file." : "Lūdzu izvēlies datni.",
"File is too big" : "Datne ir par lielu",
- "The selected file is not an image." : "Atlasītais fails nav attēls.",
- "The selected file cannot be read." : "Atlasīto failu nevar nolasīt.",
+ "The selected file is not an image." : "Atlasītā datne nav attēls.",
+ "The selected file cannot be read." : "Atlasīto datni nevar nolasīt.",
"Invalid file provided" : "Norādīta nederīga datne",
"No image or file provided" : "Nav norādīts attēls vai datne",
"Unknown filetype" : "Nezināms datnes tips",
diff --git a/core/l10n/lv.json b/core/l10n/lv.json
index 18b944abb66..1fefe08c15f 100644
--- a/core/l10n/lv.json
+++ b/core/l10n/lv.json
@@ -1,8 +1,8 @@
{ "translations": {
- "Please select a file." : "Lūdzu izvēlies failu.",
+ "Please select a file." : "Lūdzu izvēlies datni.",
"File is too big" : "Datne ir par lielu",
- "The selected file is not an image." : "Atlasītais fails nav attēls.",
- "The selected file cannot be read." : "Atlasīto failu nevar nolasīt.",
+ "The selected file is not an image." : "Atlasītā datne nav attēls.",
+ "The selected file cannot be read." : "Atlasīto datni nevar nolasīt.",
"Invalid file provided" : "Norādīta nederīga datne",
"No image or file provided" : "Nav norādīts attēls vai datne",
"Unknown filetype" : "Nezināms datnes tips",
diff --git a/core/l10n/nb.js b/core/l10n/nb.js
index 1938d375467..0f70985894e 100644
--- a/core/l10n/nb.js
+++ b/core/l10n/nb.js
@@ -316,7 +316,7 @@ OC.L10N.register(
"This page will refresh itself when the %s instance is available again." : "Denne siden vil bli lastet på nytt når %s-instansen er tilgjengelig igjen.",
"Contact your system administrator if this message persists or appeared unexpectedly." : "Kontakt systemadministratoren hvis denne meldingen var uventet eller ikke forsvinner.",
"Thank you for your patience." : "Takk for din tålmodighet.",
- "%s (3rdparty)" : "%s (3dje-part)",
+ "%s (3rdparty)" : "%s (tredjepart)",
"There was an error loading your contacts" : "Feil ved innlasting av kontaktene dine",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Vev-tjeneren din er ikke satt opp til å tillate synkronisering av filer ennå, fordi WebDAV-grensesnittet ikke ser ut til å virke.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Din vevtjener er ikke satt opp korrekt for å hente \"{url}\". Mer informasjon finner du i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasjon</a>.",
diff --git a/core/l10n/nb.json b/core/l10n/nb.json
index cec1884ec64..2d732a1bb4b 100644
--- a/core/l10n/nb.json
+++ b/core/l10n/nb.json
@@ -314,7 +314,7 @@
"This page will refresh itself when the %s instance is available again." : "Denne siden vil bli lastet på nytt når %s-instansen er tilgjengelig igjen.",
"Contact your system administrator if this message persists or appeared unexpectedly." : "Kontakt systemadministratoren hvis denne meldingen var uventet eller ikke forsvinner.",
"Thank you for your patience." : "Takk for din tålmodighet.",
- "%s (3rdparty)" : "%s (3dje-part)",
+ "%s (3rdparty)" : "%s (tredjepart)",
"There was an error loading your contacts" : "Feil ved innlasting av kontaktene dine",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Vev-tjeneren din er ikke satt opp til å tillate synkronisering av filer ennå, fordi WebDAV-grensesnittet ikke ser ut til å virke.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Din vevtjener er ikke satt opp korrekt for å hente \"{url}\". Mer informasjon finner du i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasjon</a>.",
diff --git a/core/l10n/nl.js b/core/l10n/nl.js
index 866661e23df..b6b1e26dd95 100644
--- a/core/l10n/nl.js
+++ b/core/l10n/nl.js
@@ -20,7 +20,7 @@ OC.L10N.register(
"Couldn't reset password because the token is expired" : "Kon het wachtwoord niet herstellen, omdat het token verlopen is",
"Could not send reset email because there is no email address for this username. Please contact your administrator." : "Kon geen herstel e-mail versturen, omdat er geen emailadres bekend is bij deze gebruikersnaam. Neem contact op met je beheerder.",
"%s password reset" : "%s reset wachtwoord",
- "Password reset" : "Herstel wachtwoord",
+ "Password reset" : "Herstel wachtwoord",
"Click the following button to reset your password. If you have not requested the password reset, then ignore this email." : "Klik op de volgende knop om je wachtwoord te herstellen. Als je geen wachtwoordherstel hebt aangevraagd, negeer dan dit emailbericht.",
"Click the following link to reset your password. If you have not requested the password reset, then ignore this email." : "Klik op de volgende link om je wachtwoord te herstellen. Als je geen wachtwoordherstel hebt aangevraagd, negeer dan dit emailbericht.",
"Reset your password" : "Herstel je wachtwoord",
@@ -45,7 +45,7 @@ OC.L10N.register(
"Checked for update of app \"%s\" in appstore" : "Op updates gecontroleerd voor de app \"%s\"",
"Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "Controleert of het databaseschema voor %s geüpdatet kan worden (dit kan lang duren afhankelijk van de grootte van de database)",
"Checked database schema update for apps" : "Databaseschema update voor apps gecontroleerd",
- "Updated \"%s\" to %s" : "Bijgewerkt \"%s\" naar %s",
+ "Updated \"%s\" to %s" : "\"%s\" geüpdatet naar %s",
"Set log level to debug" : "Debug logniveau instellen",
"Reset log level" : "Terugzetten logniveau",
"Starting code integrity check" : "Starten code betrouwbaarheidscontrole",
@@ -196,7 +196,7 @@ OC.L10N.register(
"({scope})" : "({scope})",
"Delete" : "Verwijder",
"Rename" : "Naam wijzigen",
- "Collaborative tags" : "Samenwerk markeringen",
+ "Collaborative tags" : "Systeemtags",
"No tags found" : "Geen tags gevonden",
"unknown text" : "onbekende tekst",
"Hello world!" : "Hallo wereld!",
@@ -207,7 +207,7 @@ OC.L10N.register(
"new" : "nieuw",
"_download %n file_::_download %n files_" : ["download %n bestand","download %n bestanden"],
"The update is in progress, leaving this page might interrupt the process in some environments." : "De update is bezig, deze pagina verlaten kan het updateproces in sommige omgevingen onderbreken.",
- "Update to {version}" : "Bijwerken naar {version}",
+ "Update to {version}" : "Geüpdatet naar {version}",
"An error occurred." : "Er heeft zich een fout voorgedaan.",
"Please reload the page." : "Herlaad deze pagina.",
"The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "De update was niet succesvol. Voor meer informatie <a href=\"{url}\">zie ons bericht op het forum</a> over dit probleem.",
@@ -299,7 +299,7 @@ OC.L10N.register(
"Depending on your configuration, this button could also work to trust the domain:" : "Afhankelijk van je configuratie kan deze knop ook werken om het volgende domein te vertrouwen:",
"Add \"%s\" as trusted domain" : "\"%s\" toevoegen als vertrouwd domein",
"App update required" : "Bijwerken App vereist",
- "%s will be updated to version %s" : "%s wordt bijgewerkt naar versie %s",
+ "%s will be updated to version %s" : "%s wordt geüpdatet naar versie %s",
"These apps will be updated:" : "Deze apps worden bijgewerkt:",
"These incompatible apps will be disabled:" : "De volgende incompatibele apps worden uitgeschakeld:",
"The theme %s has been disabled." : "Het thema %s is uitgeschakeld.",
@@ -319,15 +319,29 @@ OC.L10N.register(
"%s (3rdparty)" : "%s (3rdparty)",
"There was an error loading your contacts" : "Er is een fout opgetreden tijdens het laden van uw contacten",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Uw webserver is nog niet juist ingesteld voor het synchroniseren van bestanden omdat de WebDAV-interface niet naar behoren werkt.",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Je webserver is niet goed ingesteld om me \"{url}\" om te kunnen gaan. Meer informatie vindt je in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</a>.",
"This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Deze server heeft geen werkende internetverbinding: Meerdere (eind)punten konden niet bereikt worden. Dit betekent dat sommige onderdelen, zoals het koppelen van externe opslag, het ontvangen van notificaties over updates of de installatie van third-party apps, niet zullen werken. Ook het benaderen van bestanden op afstand en het verzenden van notificatie via e-mail werkt mogelijk niet. Als je alle onderdelen wil gebruiken, moet je de internetverbinding van deze server aanzetten.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Er is niks ingesteld voor caching. Om de prestaties te verbeteren kun je een cache instellen als dit beschikbaar is. Meer informatie vindt je in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</a>.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom kan niet gelezen worden door PHP en dat wordt sterk afgeraden ivm veiligheid van je server. Meer informatie vindt je in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</a>.",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Je gebruikt momenteel PHP versie {version}. We raden je aan om PHP te upgraden om zo te profiteren van <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">prestatieverbeteringen en veiligheidsupdates aangeboden door de PHP Group</a> zodra het besturingssysteem van je server dit ondersteunt.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Sommige bestanden hebben de integriteitscontrole niet doorstaan. Meer informatie over hoe je dit probleem kunt oplossen vindt je in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lijst van ongeldige bestanden…</a> / <a href=\"{rescanEndpoint}\">Opnieuw scannen</a>)",
+ "The PHP OPcache is not properly configured. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">For better performance we recommend</a> to use following settings in the <code>php.ini</code>:" : "De PHP OPcache is niet goed ingesteld. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Voor betere prestaties raden we je aan</a> om de volgende instellingen te gebruiken in <code>php.ini</code>:",
"The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. We strongly recommend enabling this function." : "De PHP functie \"set_time_limit\" is niet beschikbaar. Dit kan er voor zorgen dat scripts gestopt worden tijdens de uitvoeren ervan, wat resulteert in een defecte installatie. We raden sterk aan deze functie aan te zetten.",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. It is strongly recommended 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." : "De datafolder en bestanden zijn waarschijnlijk te benaderen via het internet. Het .htaccess bestand werkt niet. Het is sterk aangeraden om de webserver in te stellen dat de datafolder niet meer te benaderen is, of dat je de datafolder verplaatst naar een locatie buiten de hoofdmap voor documenten van de webserver.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "De \"{header}\" HTTP header is niet ingesteld om gelijk te zijn aan \"{expected}\". Dit is een mogelijk beveiligings- of privacyrisico en we raden je aan deze instellingen aan te passen.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "De \"Strict-Transport-Security\" HTTP header is niet ingesteld op minimaal \"{seconds}\" seconde. Voor een veiliger systeem raden we je aan om HSTS aan te zetten, zoals beschreven in onze <a href=\"{docUrl}\" rel=\"noreferrer\">beveiligingstips</a>.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Je bezoekt deze site via een HTTP-verbinding. We raden je ten sterkste aan om je server beveiligde verbindingen (HTTPS) te verseisen, zoals beschreven in onze <a href=\"{docUrl}\">beveiligingstips</a>.",
"Shared with {recipients}" : "Delen met {recipients}",
"The server encountered an internal error and was unable to complete your request." : "Er is een interne fout opgetreden op de server en kon daarom je verzoek niet verwerken.",
"Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Neem alstublieft contact op met de serverbeheerder als deze foutmelding meerdere keren terugkomt, en neem onderstaande technische details hierin op. ",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "Voor meer informatie over het correct instellen van je server, verwijzen we je graag naar onze <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentatie</a>.",
"This action requires you to confirm your password:" : "Deze actie moet je met je wachtwoord bevestigen:",
"Wrong password. Reset it?" : "Onjuist wachtwoord. Wachtwoord resetten?",
- "You are accessing the server from an untrusted domain." : "Je benadert de server van een niet-vertrouwd domein."
+ "You are about to grant \"%s\" access to your %s account." : "Je staat op het punt om \"%s\" toegang te geven tot je %s account.",
+ "You are accessing the server from an untrusted domain." : "Je benadert de server van een niet-vertrouwd domein.",
+ "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." : "Neem contact op met de beheerder. Als je zelf de beheerder bent van deze installatie, zorg dan de \"trusted_domains\" instellingen goed zijn ingesteld in config/config.php. Een voorbeeldconfiguratie vind je in 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." : "Afhankelijk van je instellingen kun je mogelijk als admin ook de onderstaande knop gebruiken om dit domein te vertrouwen.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Voor hulp, zie de <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentatie</a>.",
+ "Your PHP does not have freetype support. This will result in broken profile pictures and settings interface." : "Je PHP ondersteunt geen freetype. Daardoor kunnen profielfoto's en de instellingen niet goed weergegeven worden."
},
"nplurals=2; plural=(n != 1);");
diff --git a/core/l10n/nl.json b/core/l10n/nl.json
index 42cfbd01120..bc2943158a8 100644
--- a/core/l10n/nl.json
+++ b/core/l10n/nl.json
@@ -18,7 +18,7 @@
"Couldn't reset password because the token is expired" : "Kon het wachtwoord niet herstellen, omdat het token verlopen is",
"Could not send reset email because there is no email address for this username. Please contact your administrator." : "Kon geen herstel e-mail versturen, omdat er geen emailadres bekend is bij deze gebruikersnaam. Neem contact op met je beheerder.",
"%s password reset" : "%s reset wachtwoord",
- "Password reset" : "Herstel wachtwoord",
+ "Password reset" : "Herstel wachtwoord",
"Click the following button to reset your password. If you have not requested the password reset, then ignore this email." : "Klik op de volgende knop om je wachtwoord te herstellen. Als je geen wachtwoordherstel hebt aangevraagd, negeer dan dit emailbericht.",
"Click the following link to reset your password. If you have not requested the password reset, then ignore this email." : "Klik op de volgende link om je wachtwoord te herstellen. Als je geen wachtwoordherstel hebt aangevraagd, negeer dan dit emailbericht.",
"Reset your password" : "Herstel je wachtwoord",
@@ -43,7 +43,7 @@
"Checked for update of app \"%s\" in appstore" : "Op updates gecontroleerd voor de app \"%s\"",
"Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "Controleert of het databaseschema voor %s geüpdatet kan worden (dit kan lang duren afhankelijk van de grootte van de database)",
"Checked database schema update for apps" : "Databaseschema update voor apps gecontroleerd",
- "Updated \"%s\" to %s" : "Bijgewerkt \"%s\" naar %s",
+ "Updated \"%s\" to %s" : "\"%s\" geüpdatet naar %s",
"Set log level to debug" : "Debug logniveau instellen",
"Reset log level" : "Terugzetten logniveau",
"Starting code integrity check" : "Starten code betrouwbaarheidscontrole",
@@ -194,7 +194,7 @@
"({scope})" : "({scope})",
"Delete" : "Verwijder",
"Rename" : "Naam wijzigen",
- "Collaborative tags" : "Samenwerk markeringen",
+ "Collaborative tags" : "Systeemtags",
"No tags found" : "Geen tags gevonden",
"unknown text" : "onbekende tekst",
"Hello world!" : "Hallo wereld!",
@@ -205,7 +205,7 @@
"new" : "nieuw",
"_download %n file_::_download %n files_" : ["download %n bestand","download %n bestanden"],
"The update is in progress, leaving this page might interrupt the process in some environments." : "De update is bezig, deze pagina verlaten kan het updateproces in sommige omgevingen onderbreken.",
- "Update to {version}" : "Bijwerken naar {version}",
+ "Update to {version}" : "Geüpdatet naar {version}",
"An error occurred." : "Er heeft zich een fout voorgedaan.",
"Please reload the page." : "Herlaad deze pagina.",
"The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "De update was niet succesvol. Voor meer informatie <a href=\"{url}\">zie ons bericht op het forum</a> over dit probleem.",
@@ -297,7 +297,7 @@
"Depending on your configuration, this button could also work to trust the domain:" : "Afhankelijk van je configuratie kan deze knop ook werken om het volgende domein te vertrouwen:",
"Add \"%s\" as trusted domain" : "\"%s\" toevoegen als vertrouwd domein",
"App update required" : "Bijwerken App vereist",
- "%s will be updated to version %s" : "%s wordt bijgewerkt naar versie %s",
+ "%s will be updated to version %s" : "%s wordt geüpdatet naar versie %s",
"These apps will be updated:" : "Deze apps worden bijgewerkt:",
"These incompatible apps will be disabled:" : "De volgende incompatibele apps worden uitgeschakeld:",
"The theme %s has been disabled." : "Het thema %s is uitgeschakeld.",
@@ -317,15 +317,29 @@
"%s (3rdparty)" : "%s (3rdparty)",
"There was an error loading your contacts" : "Er is een fout opgetreden tijdens het laden van uw contacten",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Uw webserver is nog niet juist ingesteld voor het synchroniseren van bestanden omdat de WebDAV-interface niet naar behoren werkt.",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Je webserver is niet goed ingesteld om me \"{url}\" om te kunnen gaan. Meer informatie vindt je in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</a>.",
"This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Deze server heeft geen werkende internetverbinding: Meerdere (eind)punten konden niet bereikt worden. Dit betekent dat sommige onderdelen, zoals het koppelen van externe opslag, het ontvangen van notificaties over updates of de installatie van third-party apps, niet zullen werken. Ook het benaderen van bestanden op afstand en het verzenden van notificatie via e-mail werkt mogelijk niet. Als je alle onderdelen wil gebruiken, moet je de internetverbinding van deze server aanzetten.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Er is niks ingesteld voor caching. Om de prestaties te verbeteren kun je een cache instellen als dit beschikbaar is. Meer informatie vindt je in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</a>.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom kan niet gelezen worden door PHP en dat wordt sterk afgeraden ivm veiligheid van je server. Meer informatie vindt je in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</a>.",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Je gebruikt momenteel PHP versie {version}. We raden je aan om PHP te upgraden om zo te profiteren van <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">prestatieverbeteringen en veiligheidsupdates aangeboden door de PHP Group</a> zodra het besturingssysteem van je server dit ondersteunt.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Sommige bestanden hebben de integriteitscontrole niet doorstaan. Meer informatie over hoe je dit probleem kunt oplossen vindt je in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lijst van ongeldige bestanden…</a> / <a href=\"{rescanEndpoint}\">Opnieuw scannen</a>)",
+ "The PHP OPcache is not properly configured. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">For better performance we recommend</a> to use following settings in the <code>php.ini</code>:" : "De PHP OPcache is niet goed ingesteld. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Voor betere prestaties raden we je aan</a> om de volgende instellingen te gebruiken in <code>php.ini</code>:",
"The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. We strongly recommend enabling this function." : "De PHP functie \"set_time_limit\" is niet beschikbaar. Dit kan er voor zorgen dat scripts gestopt worden tijdens de uitvoeren ervan, wat resulteert in een defecte installatie. We raden sterk aan deze functie aan te zetten.",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. It is strongly recommended 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." : "De datafolder en bestanden zijn waarschijnlijk te benaderen via het internet. Het .htaccess bestand werkt niet. Het is sterk aangeraden om de webserver in te stellen dat de datafolder niet meer te benaderen is, of dat je de datafolder verplaatst naar een locatie buiten de hoofdmap voor documenten van de webserver.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "De \"{header}\" HTTP header is niet ingesteld om gelijk te zijn aan \"{expected}\". Dit is een mogelijk beveiligings- of privacyrisico en we raden je aan deze instellingen aan te passen.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "De \"Strict-Transport-Security\" HTTP header is niet ingesteld op minimaal \"{seconds}\" seconde. Voor een veiliger systeem raden we je aan om HSTS aan te zetten, zoals beschreven in onze <a href=\"{docUrl}\" rel=\"noreferrer\">beveiligingstips</a>.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Je bezoekt deze site via een HTTP-verbinding. We raden je ten sterkste aan om je server beveiligde verbindingen (HTTPS) te verseisen, zoals beschreven in onze <a href=\"{docUrl}\">beveiligingstips</a>.",
"Shared with {recipients}" : "Delen met {recipients}",
"The server encountered an internal error and was unable to complete your request." : "Er is een interne fout opgetreden op de server en kon daarom je verzoek niet verwerken.",
"Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Neem alstublieft contact op met de serverbeheerder als deze foutmelding meerdere keren terugkomt, en neem onderstaande technische details hierin op. ",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "Voor meer informatie over het correct instellen van je server, verwijzen we je graag naar onze <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentatie</a>.",
"This action requires you to confirm your password:" : "Deze actie moet je met je wachtwoord bevestigen:",
"Wrong password. Reset it?" : "Onjuist wachtwoord. Wachtwoord resetten?",
- "You are accessing the server from an untrusted domain." : "Je benadert de server van een niet-vertrouwd domein."
+ "You are about to grant \"%s\" access to your %s account." : "Je staat op het punt om \"%s\" toegang te geven tot je %s account.",
+ "You are accessing the server from an untrusted domain." : "Je benadert de server van een niet-vertrouwd domein.",
+ "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." : "Neem contact op met de beheerder. Als je zelf de beheerder bent van deze installatie, zorg dan de \"trusted_domains\" instellingen goed zijn ingesteld in config/config.php. Een voorbeeldconfiguratie vind je in 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." : "Afhankelijk van je instellingen kun je mogelijk als admin ook de onderstaande knop gebruiken om dit domein te vertrouwen.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Voor hulp, zie de <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentatie</a>.",
+ "Your PHP does not have freetype support. This will result in broken profile pictures and settings interface." : "Je PHP ondersteunt geen freetype. Daardoor kunnen profielfoto's en de instellingen niet goed weergegeven worden."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/core/l10n/pt_PT.js b/core/l10n/pt_PT.js
index 58e7a617482..589462bce98 100644
--- a/core/l10n/pt_PT.js
+++ b/core/l10n/pt_PT.js
@@ -14,6 +14,7 @@ OC.L10N.register(
"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",
+ "State token does not match" : "O token de estado não corresponde",
"Password reset is disabled" : "A reposição da senha está desativada",
"Couldn't reset password because the token is invalid" : "Não foi possível repor a senha porque a senha é inválida",
"Couldn't reset password because the token is expired" : "Não foi possível repor a senha porque a senha expirou",
@@ -27,8 +28,8 @@ OC.L10N.register(
"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.",
"Preparing update" : "A preparar atualização",
"[%d / %d]: %s" : "[%d / %d]: %s",
- "Repair warning: " : "Aviso de correção:",
- "Repair error: " : "Erro de correção:",
+ "Repair warning: " : "Aviso de correcção:",
+ "Repair error: " : "Erro de correcçã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" : "Ativou o modo de manutenção",
@@ -41,6 +42,7 @@ OC.L10N.register(
"Checking updates of apps" : "A procurar por atualizações das aplicações",
"Checking for update of app \"%s\" in appstore" : "A procurar por atualizações da aplicação \"%s\" na appstore",
"Update app \"%s\" from appstore" : "Atualizar app \"%s\" da appstore",
+ "Checked for update of app \"%s\" in appstore" : "Actualização pra a aplicação \"%s\" procuradas na loja.",
"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 para as aplicações verificada.",
"Updated \"%s\" to %s" : "Atualizado \"%s\" para %s",
@@ -59,6 +61,7 @@ OC.L10N.register(
"Looking for {term} …" : "Procurando por {term} …",
"<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>",
"No action available" : "Nenhuma acção disponível",
+ "Error fetching contact actions" : "Erro ao obter acções dos contactos",
"Settings" : "Configurações",
"Connection to server lost" : "Ligação perdida ao servidor",
"_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Problema a carregar a página. A recarregar dentro de %n segundos","Problema ao carregar a página. A recarregar dentro de %n segundos"],
@@ -106,7 +109,25 @@ OC.L10N.register(
"So-so password" : "Senha aceitável",
"Good password" : "Senha boa",
"Strong password" : "Senha forte",
+ "Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "O seu servidor da Web não está configurado corretamente para permitir a sincronização de ficheiros, porque a interface WebDAV parece estar com problemas.",
+ "Your web server is not properly set up to resolve \"{url}\". Further information can be found in the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentation</a>." : "O seu servidor web não está configurado corretamente para resolver \"{url}\". Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
+ "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the Internet to enjoy all features." : "Este servidor não tem ligação à Internet: Não foi possível detectar vários pontos de extremidade. Isso significa que alguns dos recursos como a montagem de armazenamento externo, notificações sobre actualizações ou instalação de aplicações de terceiros não funcionarão. Pode também não ser possível aceder a ficheiros remotamente e enviar emails de notificação. Sugerimos que active a ligação à Internet para este servidor se desejar ter todos os recursos.",
+ "No memory cache has been configured. To enhance performance, please configure a memcache, if available. Further information can be found in the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentation</a>." : "Nenhuma memória cache foi configurada. Para melhorar o seu desempenho, por favor configure a memcache, se disponível. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não é legível pelo PHP, o que é altamente desencorajado por motivos de segurança. Pode ser encontrada mais informação na <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentação</a>.",
+ "You are currently running PHP {version}. Upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Neste momento está a executar PHP {version}. Aconselhamos actualizar a versão de PHP para tirar partido das <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">actualizações de desempenho e segurança fornecidas pelo PHP Group</a> assim que a sua distribuição as suporte.",
+ "You are currently running PHP 5.6. The current major version of Nextcloud is the last that is supported on PHP 5.6. It is recommended to upgrade the PHP version to 7.0+ to be able to upgrade to Nextcloud 14." : "Está actualmente a correr PHP 5.6. A versão actual mais alta do Nextcloud é a última suportada no PHP 5.6. Aconselhamos que actualize a versão do PHP para 7.0+ para que possa actualizar para o Nextcloud 14.",
+ "The reverse proxy header configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If not, this is a security issue and can allow an attacker to spoof their IP address as visible to the Nextcloud. Further information can be found in the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentation</a>." : "A configuração dos cabeçalhos de reverse proxy está incorrecta, ou está a tentar ao Nextcloud através de um proxy confiável. Se não for o caso, trata-se de um problema de segurança e pode permitir a um atacante fazer spoof do endereço IP visível para a Nextcloud. Mais informações podem ser obtidas na <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentação</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "A Memcached está configurada como cache distribuida, mas o módulo PHP \"memcache\" instalado está incorrecto. \\OC\\Memcache\\Memcached apenas suporta \"memcached\" e não \"memcache\". Ver em <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{wikiLink}\">memcached wiki sobre ambos os módulos</a>.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns ficheiros não passaram no teste de integridade. Mais informação sobre a resolução deste problema pode ser encontrada na <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de ficheiros inválidos...</a> / <a href=\"{rescanEndpoint}\">Analisar novamente ...</a>)",
+ "The PHP OPcache is not properly configured. <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">For better performance it is recommended</a> to use the following settings in the <code>php.ini</code>:" : "A OPcache PHP não está devidamente configurada. <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">Para melhorar a performance recomendamos</a> que use as seguintes definições no <code>php.ini</code>:",
+ "The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. Enabling this function is strongly recommended." : "A função PHP \"set_time_limit\" não está disponível. Isto pode resultar na paragem de scripts a meio da execução, corrompendo a instalação. A activação desta função é altamente recomendada.",
+ "Your PHP does not have FreeType support, resulting in breakage of profile pictures and the settings interface." : "O seu PHP não suporta FreeType, podendo resultar em fotos de perfil e interface de definições corrompidos. ",
"Error occurred while checking server setup" : "Ocorreu um erro durante a verificação da configuração do servidor",
+ "Your data directory and files are probably accessible from the Internet. The .htaccess file is not working. It is strongly recommended that you configure your web server so that the data directory is no longer accessible, or move the data directory outside the web server document root." : "Os directórios de datos e ficheiros estão provavelmente acessíveis através da Internet. O ficheiro .htaccess não está a funcionar. É altamente recomendado que configure o seu servidor web para que o directório de dados deixa de estar acessível, ou movê-lo para fora da raiz de documentos do servidor web. ",
+ "The \"{header}\" HTTP header is not set to \"{expected}\". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly." : "O cabeçalho HTTP \"{cabeçalho}\" não está definido como \"{esperado}\". Isto é um potencial risco de segurança ou privacidade, pelo que recomendamos que ajuste esta opção em conformidade.",
+ "The \"{header}\" HTTP header is not set to \"{expected}\". Some features might not work correctly, as it is recommended to adjust this setting accordingly." : "O cabeçalho HTTP \"{cabeçalho}\" não está definido como \"{esperado}\". Algumas funcionalidades poderão não funcionar correctamente, pelo que recomendamos que ajuste esta opção em conformidade.",
+ "The \"Strict-Transport-Security\" HTTP header is not set to at least \"{seconds}\" seconds. For enhanced security, it is recommended to enable HSTS as described in the <a href=\"{docUrl}\" rel=\"noreferrer noopener\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está definido para pelo menos \"{segundos}\" segundos. Para melhorar a segurança, recomendamos que active o HSTS como descrito em <a href=\"{docUrl}\" rel=\"noreferrer noopener\">dicas de segurança</a>.",
+ "Accessing site insecurely via HTTP. You are strongly adviced to set up your server to require HTTPS instead, as described in the <a href=\"{docUrl}\">security tips</a>." : "Acedendo ao site de forma insegura usando HTTP. Recomendamos vivamente que configure o servidor para requerer HTTPS, tal como descrito em <a href=\"{docUrl}\">dicas de segurança</a>.",
"Shared" : "Partilhado",
"Shared with" : "Partilhado com ",
"Shared by" : "Partilhado por",
@@ -160,6 +181,7 @@ OC.L10N.register(
"{sharee} (email)" : "{sharee} (email)",
"{sharee} ({type}, {owner})" : "{sharee} ({type}, {owner})",
"Share" : "Partilhar",
+ "Share with other people by entering a user or group, a federated cloud ID or an email address." : "Partilhar com terceiros introduzindo um nome de utilizador ou grupo, um identificador de federação ou um endereço de e-mail.",
"Share with other people by entering a user or group or a federated cloud ID." : "Partilhar com terceiros introduzindo um nome de utilizador ou grupo, um ID de cloud federada ou um endereço de e-mail.",
"Share with other people by entering a user or group or an email address." : "Partilhar com terceiros introduzindo um nome de utilizador ou grupo ou um endereço de e-mail.",
"Name or email address..." : "Nome ou endereço de email...",
@@ -219,6 +241,7 @@ OC.L10N.register(
"Trace" : "Rasto",
"Security warning" : "Aviso de Segurança",
"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "A pasta de dados e os respetivos ficheiros estão provavelmente acessíveis a partir da internet pois o ficheiro .htaccess não funciona.",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">documentation</a>." : "Para obter informações de como configurar correctamente o servidor, veja em: <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentação</a>.",
"Create an <strong>admin account</strong>" : "Criar uma <strong>conta administrativa</strong>",
"Username" : "Nome de utilizador",
"Storage & database" : "Armazenamento e base de dados",
@@ -253,10 +276,16 @@ OC.L10N.register(
"Username or email" : "Utilizador ou e-mail",
"Log in" : "Iniciar Sessão",
"Wrong password." : "Senha errada.",
+ "We have detected multiple invalid login attempts from your IP. Therefore your next login is throttled up to 30 seconds." : "Detectamos múltiplas tentativas falhadas de login do seu IP. Por esse motivo, o seu próximo login será adiado por, até, 30 segundos. ",
"Stay logged in" : "Manter sessão iniciada",
"Forgot password?" : "Senha esquecida?",
"Back to log in" : "Voltar à entrada",
"Alternative Logins" : "Contas de Acesso Alternativas",
+ "Account access" : "Acesso a conta",
+ "You are about to grant %s access to your %s account." : "Está prestes a permitir %s aceder á sua conta %s.",
+ "Grant access" : "Conceder acesso",
+ "App token" : "Token da aplicação",
+ "Alternative login using app token" : "Autenticação alternativa usando token da aplicação",
"Redirecting …" : "A redirecionar...",
"New password" : "Nova senha",
"New Password" : "Nova senha",
@@ -265,6 +294,9 @@ OC.L10N.register(
"Cancel log in" : "Cancelar entrada",
"Use backup code" : "Usar código de cópia de segurança",
"Error while validating your second factor" : "Erro ao validar o segundo factor",
+ "Access through untrusted domain" : "Aceder através de um domínio não confiável",
+ "Please contact your administrator. If you are an administrator, edit the \"trusted_domains\" setting in config/config.php like the example in config.sample.php." : "Por favor contacte o seu administrador. Se é um administrador, edite a definição \"trusted_domains\" no config/config.php como no exemplo em config.sample.php.",
+ "Depending on your configuration, this button could also work to trust the domain:" : "Dependendo da sua configuração, este botão poderá servir para confiar no domínio:",
"Add \"%s\" as trusted domain" : "Adicionar \"%s\" como um domínio de confiança",
"App update required" : "É necessário atualizar a aplicação",
"%s will be updated to version %s" : "%s será atualizada para a versão %s.",
@@ -276,10 +308,42 @@ OC.L10N.register(
"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ário atualizar",
+ "Please use the command line updater because you have a big instance with more than 50 users." : "Por favor use o actualizador da linha de comandos porque tem uma instância grande com mais de 50 utilizadores.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">documentation</a>." : "Para obter ajuda, veja a <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">documentação</a>.",
+ "I know that if I continue doing the update via web UI has the risk, that the request runs into a timeout and could cause data loss, but I have a backup and know how to restore my instance in case of a failure." : "Sei que se continuar a fazer a actualização via interface web arrisco a que o pedido expire e pode causar a perda de dados, no entanto tenho uma cópia de segurança e sei como restaurar a minha instância em caso de falha. ",
"Upgrade via web on my own risk" : "Atualizar via web por minha conta e risco.",
"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.",
"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."
+ "Thank you for your patience." : "Obrigado pela sua paciência.",
+ "%s (3rdparty)" : "%s (terceiros)",
+ "There was an error loading your contacts" : "Ocorreu um erro ao carregar os seus contactos",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "O seu servidor web ainda não está devidamente configurado para permitir sincronização de ficheiros porque a interface WebDAV não está a funcionar correctamente.",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "O seu servidor web ainda não está devidamente configurado para traduzir \"{url}\". Mais informações podem ser obtidas na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
+ "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor não tem conexão à Internet: Não foi possível alcançar vários endpoints. Isto significa que algumas das funcionalidades tal como montar armazenamento externo, notificações sobre actualizações ou a instalação de aplicações de terceiros poderão não funcionar. O acesso remoto a ficheiros e o envio de notificações por e-mail também poderá não funcionar. Sugerimos que active a conexão à Internet neste servidor se quiser usar todas as funcionalidades.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Não foi configurada memória de cache. Para melhorar o desempenho configure a memcache se estiver disponível. Mais informações podem ser obtidas na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não é legível pelo PHP o que é altamente desaconselhado por motivos de segurança. Mais informações podem er obtidas na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Actualmente está a correr PHP {versão}. Aconselhamos que actualize a versão do PHP para tirar partido das vantagens de <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\"> desempenho e actualizações de segurança disponibilizados pelo Grupo PHP</a> assim que a sua distribuição a suporte.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração dos cabeçalhos de reverse proxy está incorrecta, ou está a tentar ao Nextcloud através de um proxy confiável. Se não está a aceder ao Nextcloud através de um proxy confiável, isto é um problema de segurança e pode permitir a um atacante fazer spoof do endereço IP visível para a Nextcloud. Mais informações podem ser obtidas na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "A Memcached está configurada como cache distribuida, mas o módulo PHP \"memcache\" instalado está incorrecto. \\OC\\Memcache\\Memcached apenas suporta \"memcached\" e não \"memcache\". Ver em <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki sobre ambos os módulos</a>.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns ficheiros não passaram no teste de integridade. Mais informação sobre a resolução deste problema pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de ficheiros inválidos...</a> / <a href=\"{rescanEndpoint}\">Analisar novamente ...</a>)",
+ "The PHP OPcache is not properly configured. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">For better performance we recommend</a> to use following settings in the <code>php.ini</code>:" : "A OPcache PHP não está devidamente configurada. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Para melhorar a performance recomendamos</a> que use as seguintes definições no <code>php.ini</code>:",
+ "The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. We strongly recommend enabling this function." : "A função PHP \"set_time_limit\" não está disponível. Isto pode resultar na paragem de script a meio da execução, corrompendo a instalação. Recomendamos vivamente que active esta função.",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. It is strongly recommended that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "O seu directório de dados e os seus ficheiros estão provavelmente acessíveis através da Internet. O ficheiro .htaccess não está a funcionar. Recomendamos vivamente que configure o seu servidor web de forma a que o directório de dados deixe de estar acessível ou mova-o para fora da raíz de documentos do servidor web.",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "O cabeçalho HTTP \"{cabeçalho}\" não está configurado tal como \"{esperado}\". Isto é um potencial risco de segurança ou privacidade pelo que recomendamos que ajuste esta definição.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está definido para pelo menos \"{segundos}\" segundos. Para melhorar a segurança recomendamos que active o HSTS como descrito em <a href=\"{docUrl}\" rel=\"noreferrer\">dicas de segurança</a>.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Está a aceder a este site via HTTP. Recomendamos vivamente que configure o seu servidor para requerer a utilização de HTTPS como descrito nas nossas <a href=\"{docUrl}\">dicas de segurança</a>.",
+ "Shared with {recipients}" : "Partilhado com receptores",
+ "The server encountered an internal error and was unable to complete your request." : "Ocorreu um erro interno no servidor e não foi possível completar o pedido",
+ "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Por favor contacte o administrador do servidor se o erro se repetir múltiplas vezes, incluindo os detalhes técnicos abaixo mencionados no seu relatório",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "Para obter informação sobre como configurar correctamente o seu servidor, por favor veja a <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentação</a>.",
+ "This action requires you to confirm your password:" : "Esta acção requer a confirmação da senha:",
+ "Wrong password. Reset it?" : "Senha errada. Redefini-la?",
+ "You are about to grant \"%s\" access to your %s account." : "Está prestes a permitir \"%s\" aceder à sua conta %s.",
+ "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 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 administrador poderá também conseguir usar o botão que se segue para confiar neste domínio.",
+ "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>.",
+ "Your PHP does not have freetype support. This will result in broken profile pictures and settings interface." : "O seu PHP não suporta freetype. Isto irá resultar em fotos de perfil e interface de definições corrompidas."
},
"nplurals=2; plural=(n != 1);");
diff --git a/core/l10n/pt_PT.json b/core/l10n/pt_PT.json
index 53b19e170e8..07a92036624 100644
--- a/core/l10n/pt_PT.json
+++ b/core/l10n/pt_PT.json
@@ -12,6 +12,7 @@
"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",
+ "State token does not match" : "O token de estado não corresponde",
"Password reset is disabled" : "A reposição da senha está desativada",
"Couldn't reset password because the token is invalid" : "Não foi possível repor a senha porque a senha é inválida",
"Couldn't reset password because the token is expired" : "Não foi possível repor a senha porque a senha expirou",
@@ -25,8 +26,8 @@
"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.",
"Preparing update" : "A preparar atualização",
"[%d / %d]: %s" : "[%d / %d]: %s",
- "Repair warning: " : "Aviso de correção:",
- "Repair error: " : "Erro de correção:",
+ "Repair warning: " : "Aviso de correcção:",
+ "Repair error: " : "Erro de correcçã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" : "Ativou o modo de manutenção",
@@ -39,6 +40,7 @@
"Checking updates of apps" : "A procurar por atualizações das aplicações",
"Checking for update of app \"%s\" in appstore" : "A procurar por atualizações da aplicação \"%s\" na appstore",
"Update app \"%s\" from appstore" : "Atualizar app \"%s\" da appstore",
+ "Checked for update of app \"%s\" in appstore" : "Actualização pra a aplicação \"%s\" procuradas na loja.",
"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 para as aplicações verificada.",
"Updated \"%s\" to %s" : "Atualizado \"%s\" para %s",
@@ -57,6 +59,7 @@
"Looking for {term} …" : "Procurando por {term} …",
"<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>",
"No action available" : "Nenhuma acção disponível",
+ "Error fetching contact actions" : "Erro ao obter acções dos contactos",
"Settings" : "Configurações",
"Connection to server lost" : "Ligação perdida ao servidor",
"_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Problema a carregar a página. A recarregar dentro de %n segundos","Problema ao carregar a página. A recarregar dentro de %n segundos"],
@@ -104,7 +107,25 @@
"So-so password" : "Senha aceitável",
"Good password" : "Senha boa",
"Strong password" : "Senha forte",
+ "Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "O seu servidor da Web não está configurado corretamente para permitir a sincronização de ficheiros, porque a interface WebDAV parece estar com problemas.",
+ "Your web server is not properly set up to resolve \"{url}\". Further information can be found in the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentation</a>." : "O seu servidor web não está configurado corretamente para resolver \"{url}\". Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
+ "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the Internet to enjoy all features." : "Este servidor não tem ligação à Internet: Não foi possível detectar vários pontos de extremidade. Isso significa que alguns dos recursos como a montagem de armazenamento externo, notificações sobre actualizações ou instalação de aplicações de terceiros não funcionarão. Pode também não ser possível aceder a ficheiros remotamente e enviar emails de notificação. Sugerimos que active a ligação à Internet para este servidor se desejar ter todos os recursos.",
+ "No memory cache has been configured. To enhance performance, please configure a memcache, if available. Further information can be found in the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentation</a>." : "Nenhuma memória cache foi configurada. Para melhorar o seu desempenho, por favor configure a memcache, se disponível. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não é legível pelo PHP, o que é altamente desencorajado por motivos de segurança. Pode ser encontrada mais informação na <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentação</a>.",
+ "You are currently running PHP {version}. Upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Neste momento está a executar PHP {version}. Aconselhamos actualizar a versão de PHP para tirar partido das <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">actualizações de desempenho e segurança fornecidas pelo PHP Group</a> assim que a sua distribuição as suporte.",
+ "You are currently running PHP 5.6. The current major version of Nextcloud is the last that is supported on PHP 5.6. It is recommended to upgrade the PHP version to 7.0+ to be able to upgrade to Nextcloud 14." : "Está actualmente a correr PHP 5.6. A versão actual mais alta do Nextcloud é a última suportada no PHP 5.6. Aconselhamos que actualize a versão do PHP para 7.0+ para que possa actualizar para o Nextcloud 14.",
+ "The reverse proxy header configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If not, this is a security issue and can allow an attacker to spoof their IP address as visible to the Nextcloud. Further information can be found in the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentation</a>." : "A configuração dos cabeçalhos de reverse proxy está incorrecta, ou está a tentar ao Nextcloud através de um proxy confiável. Se não for o caso, trata-se de um problema de segurança e pode permitir a um atacante fazer spoof do endereço IP visível para a Nextcloud. Mais informações podem ser obtidas na <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentação</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "A Memcached está configurada como cache distribuida, mas o módulo PHP \"memcache\" instalado está incorrecto. \\OC\\Memcache\\Memcached apenas suporta \"memcached\" e não \"memcache\". Ver em <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{wikiLink}\">memcached wiki sobre ambos os módulos</a>.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns ficheiros não passaram no teste de integridade. Mais informação sobre a resolução deste problema pode ser encontrada na <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de ficheiros inválidos...</a> / <a href=\"{rescanEndpoint}\">Analisar novamente ...</a>)",
+ "The PHP OPcache is not properly configured. <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">For better performance it is recommended</a> to use the following settings in the <code>php.ini</code>:" : "A OPcache PHP não está devidamente configurada. <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">Para melhorar a performance recomendamos</a> que use as seguintes definições no <code>php.ini</code>:",
+ "The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. Enabling this function is strongly recommended." : "A função PHP \"set_time_limit\" não está disponível. Isto pode resultar na paragem de scripts a meio da execução, corrompendo a instalação. A activação desta função é altamente recomendada.",
+ "Your PHP does not have FreeType support, resulting in breakage of profile pictures and the settings interface." : "O seu PHP não suporta FreeType, podendo resultar em fotos de perfil e interface de definições corrompidos. ",
"Error occurred while checking server setup" : "Ocorreu um erro durante a verificação da configuração do servidor",
+ "Your data directory and files are probably accessible from the Internet. The .htaccess file is not working. It is strongly recommended that you configure your web server so that the data directory is no longer accessible, or move the data directory outside the web server document root." : "Os directórios de datos e ficheiros estão provavelmente acessíveis através da Internet. O ficheiro .htaccess não está a funcionar. É altamente recomendado que configure o seu servidor web para que o directório de dados deixa de estar acessível, ou movê-lo para fora da raiz de documentos do servidor web. ",
+ "The \"{header}\" HTTP header is not set to \"{expected}\". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly." : "O cabeçalho HTTP \"{cabeçalho}\" não está definido como \"{esperado}\". Isto é um potencial risco de segurança ou privacidade, pelo que recomendamos que ajuste esta opção em conformidade.",
+ "The \"{header}\" HTTP header is not set to \"{expected}\". Some features might not work correctly, as it is recommended to adjust this setting accordingly." : "O cabeçalho HTTP \"{cabeçalho}\" não está definido como \"{esperado}\". Algumas funcionalidades poderão não funcionar correctamente, pelo que recomendamos que ajuste esta opção em conformidade.",
+ "The \"Strict-Transport-Security\" HTTP header is not set to at least \"{seconds}\" seconds. For enhanced security, it is recommended to enable HSTS as described in the <a href=\"{docUrl}\" rel=\"noreferrer noopener\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está definido para pelo menos \"{segundos}\" segundos. Para melhorar a segurança, recomendamos que active o HSTS como descrito em <a href=\"{docUrl}\" rel=\"noreferrer noopener\">dicas de segurança</a>.",
+ "Accessing site insecurely via HTTP. You are strongly adviced to set up your server to require HTTPS instead, as described in the <a href=\"{docUrl}\">security tips</a>." : "Acedendo ao site de forma insegura usando HTTP. Recomendamos vivamente que configure o servidor para requerer HTTPS, tal como descrito em <a href=\"{docUrl}\">dicas de segurança</a>.",
"Shared" : "Partilhado",
"Shared with" : "Partilhado com ",
"Shared by" : "Partilhado por",
@@ -158,6 +179,7 @@
"{sharee} (email)" : "{sharee} (email)",
"{sharee} ({type}, {owner})" : "{sharee} ({type}, {owner})",
"Share" : "Partilhar",
+ "Share with other people by entering a user or group, a federated cloud ID or an email address." : "Partilhar com terceiros introduzindo um nome de utilizador ou grupo, um identificador de federação ou um endereço de e-mail.",
"Share with other people by entering a user or group or a federated cloud ID." : "Partilhar com terceiros introduzindo um nome de utilizador ou grupo, um ID de cloud federada ou um endereço de e-mail.",
"Share with other people by entering a user or group or an email address." : "Partilhar com terceiros introduzindo um nome de utilizador ou grupo ou um endereço de e-mail.",
"Name or email address..." : "Nome ou endereço de email...",
@@ -217,6 +239,7 @@
"Trace" : "Rasto",
"Security warning" : "Aviso de Segurança",
"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "A pasta de dados e os respetivos ficheiros estão provavelmente acessíveis a partir da internet pois o ficheiro .htaccess não funciona.",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">documentation</a>." : "Para obter informações de como configurar correctamente o servidor, veja em: <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentação</a>.",
"Create an <strong>admin account</strong>" : "Criar uma <strong>conta administrativa</strong>",
"Username" : "Nome de utilizador",
"Storage & database" : "Armazenamento e base de dados",
@@ -251,10 +274,16 @@
"Username or email" : "Utilizador ou e-mail",
"Log in" : "Iniciar Sessão",
"Wrong password." : "Senha errada.",
+ "We have detected multiple invalid login attempts from your IP. Therefore your next login is throttled up to 30 seconds." : "Detectamos múltiplas tentativas falhadas de login do seu IP. Por esse motivo, o seu próximo login será adiado por, até, 30 segundos. ",
"Stay logged in" : "Manter sessão iniciada",
"Forgot password?" : "Senha esquecida?",
"Back to log in" : "Voltar à entrada",
"Alternative Logins" : "Contas de Acesso Alternativas",
+ "Account access" : "Acesso a conta",
+ "You are about to grant %s access to your %s account." : "Está prestes a permitir %s aceder á sua conta %s.",
+ "Grant access" : "Conceder acesso",
+ "App token" : "Token da aplicação",
+ "Alternative login using app token" : "Autenticação alternativa usando token da aplicação",
"Redirecting …" : "A redirecionar...",
"New password" : "Nova senha",
"New Password" : "Nova senha",
@@ -263,6 +292,9 @@
"Cancel log in" : "Cancelar entrada",
"Use backup code" : "Usar código de cópia de segurança",
"Error while validating your second factor" : "Erro ao validar o segundo factor",
+ "Access through untrusted domain" : "Aceder através de um domínio não confiável",
+ "Please contact your administrator. If you are an administrator, edit the \"trusted_domains\" setting in config/config.php like the example in config.sample.php." : "Por favor contacte o seu administrador. Se é um administrador, edite a definição \"trusted_domains\" no config/config.php como no exemplo em config.sample.php.",
+ "Depending on your configuration, this button could also work to trust the domain:" : "Dependendo da sua configuração, este botão poderá servir para confiar no domínio:",
"Add \"%s\" as trusted domain" : "Adicionar \"%s\" como um domínio de confiança",
"App update required" : "É necessário atualizar a aplicação",
"%s will be updated to version %s" : "%s será atualizada para a versão %s.",
@@ -274,10 +306,42 @@
"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ário atualizar",
+ "Please use the command line updater because you have a big instance with more than 50 users." : "Por favor use o actualizador da linha de comandos porque tem uma instância grande com mais de 50 utilizadores.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">documentation</a>." : "Para obter ajuda, veja a <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">documentação</a>.",
+ "I know that if I continue doing the update via web UI has the risk, that the request runs into a timeout and could cause data loss, but I have a backup and know how to restore my instance in case of a failure." : "Sei que se continuar a fazer a actualização via interface web arrisco a que o pedido expire e pode causar a perda de dados, no entanto tenho uma cópia de segurança e sei como restaurar a minha instância em caso de falha. ",
"Upgrade via web on my own risk" : "Atualizar via web por minha conta e risco.",
"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.",
"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."
+ "Thank you for your patience." : "Obrigado pela sua paciência.",
+ "%s (3rdparty)" : "%s (terceiros)",
+ "There was an error loading your contacts" : "Ocorreu um erro ao carregar os seus contactos",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "O seu servidor web ainda não está devidamente configurado para permitir sincronização de ficheiros porque a interface WebDAV não está a funcionar correctamente.",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "O seu servidor web ainda não está devidamente configurado para traduzir \"{url}\". Mais informações podem ser obtidas na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
+ "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor não tem conexão à Internet: Não foi possível alcançar vários endpoints. Isto significa que algumas das funcionalidades tal como montar armazenamento externo, notificações sobre actualizações ou a instalação de aplicações de terceiros poderão não funcionar. O acesso remoto a ficheiros e o envio de notificações por e-mail também poderá não funcionar. Sugerimos que active a conexão à Internet neste servidor se quiser usar todas as funcionalidades.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Não foi configurada memória de cache. Para melhorar o desempenho configure a memcache se estiver disponível. Mais informações podem ser obtidas na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não é legível pelo PHP o que é altamente desaconselhado por motivos de segurança. Mais informações podem er obtidas na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Actualmente está a correr PHP {versão}. Aconselhamos que actualize a versão do PHP para tirar partido das vantagens de <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\"> desempenho e actualizações de segurança disponibilizados pelo Grupo PHP</a> assim que a sua distribuição a suporte.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração dos cabeçalhos de reverse proxy está incorrecta, ou está a tentar ao Nextcloud através de um proxy confiável. Se não está a aceder ao Nextcloud através de um proxy confiável, isto é um problema de segurança e pode permitir a um atacante fazer spoof do endereço IP visível para a Nextcloud. Mais informações podem ser obtidas na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "A Memcached está configurada como cache distribuida, mas o módulo PHP \"memcache\" instalado está incorrecto. \\OC\\Memcache\\Memcached apenas suporta \"memcached\" e não \"memcache\". Ver em <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki sobre ambos os módulos</a>.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns ficheiros não passaram no teste de integridade. Mais informação sobre a resolução deste problema pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de ficheiros inválidos...</a> / <a href=\"{rescanEndpoint}\">Analisar novamente ...</a>)",
+ "The PHP OPcache is not properly configured. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">For better performance we recommend</a> to use following settings in the <code>php.ini</code>:" : "A OPcache PHP não está devidamente configurada. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Para melhorar a performance recomendamos</a> que use as seguintes definições no <code>php.ini</code>:",
+ "The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. We strongly recommend enabling this function." : "A função PHP \"set_time_limit\" não está disponível. Isto pode resultar na paragem de script a meio da execução, corrompendo a instalação. Recomendamos vivamente que active esta função.",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. It is strongly recommended that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "O seu directório de dados e os seus ficheiros estão provavelmente acessíveis através da Internet. O ficheiro .htaccess não está a funcionar. Recomendamos vivamente que configure o seu servidor web de forma a que o directório de dados deixe de estar acessível ou mova-o para fora da raíz de documentos do servidor web.",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "O cabeçalho HTTP \"{cabeçalho}\" não está configurado tal como \"{esperado}\". Isto é um potencial risco de segurança ou privacidade pelo que recomendamos que ajuste esta definição.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está definido para pelo menos \"{segundos}\" segundos. Para melhorar a segurança recomendamos que active o HSTS como descrito em <a href=\"{docUrl}\" rel=\"noreferrer\">dicas de segurança</a>.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Está a aceder a este site via HTTP. Recomendamos vivamente que configure o seu servidor para requerer a utilização de HTTPS como descrito nas nossas <a href=\"{docUrl}\">dicas de segurança</a>.",
+ "Shared with {recipients}" : "Partilhado com receptores",
+ "The server encountered an internal error and was unable to complete your request." : "Ocorreu um erro interno no servidor e não foi possível completar o pedido",
+ "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Por favor contacte o administrador do servidor se o erro se repetir múltiplas vezes, incluindo os detalhes técnicos abaixo mencionados no seu relatório",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "Para obter informação sobre como configurar correctamente o seu servidor, por favor veja a <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentação</a>.",
+ "This action requires you to confirm your password:" : "Esta acção requer a confirmação da senha:",
+ "Wrong password. Reset it?" : "Senha errada. Redefini-la?",
+ "You are about to grant \"%s\" access to your %s account." : "Está prestes a permitir \"%s\" aceder à sua conta %s.",
+ "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 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 administrador poderá também conseguir usar o botão que se segue para confiar neste domínio.",
+ "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>.",
+ "Your PHP does not have freetype support. This will result in broken profile pictures and settings interface." : "O seu PHP não suporta freetype. Isto irá resultar em fotos de perfil e interface de definições corrompidas."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/core/l10n/ru.js b/core/l10n/ru.js
index 5da8e5103c5..088b2361d36 100644
--- a/core/l10n/ru.js
+++ b/core/l10n/ru.js
@@ -236,7 +236,7 @@ OC.L10N.register(
"Type: %s" : "Тип: %s",
"Code: %s" : "Код: %s",
"Message: %s" : "Сообщение: %s",
- "File: %s" : "Файл: %s",
+ "File: %s" : "Файл: «%s»",
"Line: %s" : "Строка: %s",
"Trace" : "Трассировка",
"Security warning" : "Предупреждение безопасности",
@@ -315,6 +315,35 @@ OC.L10N.register(
"This %s instance is currently in maintenance mode, which may take a while." : "Этот сервер %s находится в режиме технического обслуживания, которое может занять некоторое время.",
"This page will refresh itself when the %s instance is available again." : "Эта страница обновится автоматически когда сервер %s снова станет доступен.",
"Contact your system administrator if this message persists or appeared unexpectedly." : "Обратитесь к вашему системному администратору если это сообщение не исчезает или появляется неожиданно.",
- "Thank you for your patience." : "Спасибо за терпение."
+ "Thank you for your patience." : "Спасибо за терпение.",
+ "%s (3rdparty)" : "%s (стороннее)",
+ "There was an error loading your contacts" : "При загрузке контактов произошла ошибка",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Ваш веб-сервер ещё не настроен должным образом для синхронизации файлов — интерфейс WebDAV, кажется, испорчен.",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Веб-сервер не настроен верно для разрешения «{url}». Дополнительная информация содержится в нашей <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</a>.",
+ "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Этот сервер не подключён к Интернету: множество сетевых узлов не доступны. Это означает, функции, зависящие от соединения с Интернет, такие как подключение внешнего хранилища, уведомления об обновлениях или установка сторонних приложений, не будут работать. Так же могут не работать удалённый доступ к файлам и отправка уведомлений по электронной почте. Для обеспечения работы всех функций рекомендуется разрешить серверу доступ в Интернет.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Механизм кэширования не настроен. Для увеличения производительности сервера, по возможности, настройте memcache. Дополнительная информация в нашей <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</a>.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "PHP не имеет доступа на чтение к /dev/urandom, что крайне нежелательно по соображениям безопасности. Дополнительная информация содержится в нашей <a target=\"_blank\" href=\"{docLink}\"> документации </a>.",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Используется PHP {version}. Рекомендуется обновить PHP, чтобы воспользоваться <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">улучшениями производительности и безопасности, внедрёнными PHP Group</a>, как только новая версия будет доступна в вашем дистрибутиве. ",
+ "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Заголовки обратного прокси настроены неправильно, либо вы подключены к серверу Nextcloud через доверенный прокси. Если Nextcloud открыт не через доверенный прокси, то это проблема безопасности, которая может позволить атакующему подделать IP-адрес, определяемый сервером Nextcloud. Дополнительная информация содержится в <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached настроен на распределенный кэш, но установлен неподдерживаемый модуль PHP «memcache». \\OC\\Memcache\\Memcached поддерживает только модуль «memcached», но не «memcache». Дополнительная информации на <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">wiki странице memcached об обоих модулях</a>.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Некоторые файлы не прошли проверку целостности. Дополнительная информация о способах решения этой проблемы содержится в <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">документации</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Список проблемных файлов…</a> / <a href=\"{rescanEndpoint}\">Выполнить повторное сканирование…</a>)",
+ "The PHP OPcache is not properly configured. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">For better performance we recommend</a> to use following settings in the <code>php.ini</code>:" : "PHP OPcache не настроен правильно. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Для обеспечения лучшей производительности рекомендуется </a> задать в файле <code>php.ini</code> следующие значения параметров:",
+ "The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. We strongly recommend enabling this function." : "Функция PHP «set_time_limit» недоступна. В случае остановки скриптов во время работы это может привести к повреждению установки сервера Nextcloud. Настоятельно рекомендуется включить эту функцию.",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. It is strongly recommended that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Каталог данных и файлы, возможно, доступны из Интернета. Файл .htaccess не работает. Настоятельно рекомендуется настроить веб-сервер таким образом, чтобы каталог данных не был доступен из внешней сети, либо переместить каталог данных за пределы корневого каталога веб-сервера.",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Заголовок HTTP «{header}» не настроен на значение «{expected}». Это потенциальная проблема безопасности и рекомендуется изменить эти настройки.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "Значение HTTP-заголовка «Strict-Transport-Security» должно быть настроено минимум на «{seconds}» секунд. Для улучшения безопасности рекомендуется включить HSTS согласно нашим <a href=\"{docUrl}\">советам по безопасности</a>.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Используется небезопасное соподчинение по протоколу HTTP. Настоятельно рекомендуется настроить сервер на использование HTTPS согласно нашим <a href=\"{docUrl}\">советам по безопасности</a>.",
+ "Shared with {recipients}" : "Вы поделились с {recipients}",
+ "The server encountered an internal error and was unable to complete your request." : "Запрос не выполнен, на сервере произошла ошибка.",
+ "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Пожалуйста, свяжитесь с администратором сервера если эта ошибка будет повторяться. Прикрепите указанную ниже техническую информацию к своему сообщению.",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "Информацию о правильной настройке сервера можно найти в <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">документации</a>.",
+ "This action requires you to confirm your password:" : "Это действие требует подтверждения вашего пароля:",
+ "Wrong password. Reset it?" : "Неверный пароль. Сбросить его?",
+ "You are about to grant \"%s\" access to your %s account." : "Вы собираетесь предоставить «%s» доступ ко своей учётной записи %s.",
+ "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_domains» в файле «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." : "В зависимости от конфигурации, вы, как администратор, можете также добавить домен в список доверенных при помощи кнопки, расположенной ниже.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Для получения помощи обратитесь к <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">документации</a>.",
+ "Your PHP does not have freetype support. This will result in broken profile pictures and settings interface." : "Установленная версия PHP не поддерживает библиотеку FreeType, что приводит к неверному отображению изображений профиля и интерфейса настроек."
},
"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/core/l10n/ru.json b/core/l10n/ru.json
index 9fb9c4643b3..1b6dce6f0b8 100644
--- a/core/l10n/ru.json
+++ b/core/l10n/ru.json
@@ -234,7 +234,7 @@
"Type: %s" : "Тип: %s",
"Code: %s" : "Код: %s",
"Message: %s" : "Сообщение: %s",
- "File: %s" : "Файл: %s",
+ "File: %s" : "Файл: «%s»",
"Line: %s" : "Строка: %s",
"Trace" : "Трассировка",
"Security warning" : "Предупреждение безопасности",
@@ -313,6 +313,35 @@
"This %s instance is currently in maintenance mode, which may take a while." : "Этот сервер %s находится в режиме технического обслуживания, которое может занять некоторое время.",
"This page will refresh itself when the %s instance is available again." : "Эта страница обновится автоматически когда сервер %s снова станет доступен.",
"Contact your system administrator if this message persists or appeared unexpectedly." : "Обратитесь к вашему системному администратору если это сообщение не исчезает или появляется неожиданно.",
- "Thank you for your patience." : "Спасибо за терпение."
+ "Thank you for your patience." : "Спасибо за терпение.",
+ "%s (3rdparty)" : "%s (стороннее)",
+ "There was an error loading your contacts" : "При загрузке контактов произошла ошибка",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Ваш веб-сервер ещё не настроен должным образом для синхронизации файлов — интерфейс WebDAV, кажется, испорчен.",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Веб-сервер не настроен верно для разрешения «{url}». Дополнительная информация содержится в нашей <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</a>.",
+ "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Этот сервер не подключён к Интернету: множество сетевых узлов не доступны. Это означает, функции, зависящие от соединения с Интернет, такие как подключение внешнего хранилища, уведомления об обновлениях или установка сторонних приложений, не будут работать. Так же могут не работать удалённый доступ к файлам и отправка уведомлений по электронной почте. Для обеспечения работы всех функций рекомендуется разрешить серверу доступ в Интернет.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Механизм кэширования не настроен. Для увеличения производительности сервера, по возможности, настройте memcache. Дополнительная информация в нашей <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</a>.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "PHP не имеет доступа на чтение к /dev/urandom, что крайне нежелательно по соображениям безопасности. Дополнительная информация содержится в нашей <a target=\"_blank\" href=\"{docLink}\"> документации </a>.",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Используется PHP {version}. Рекомендуется обновить PHP, чтобы воспользоваться <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">улучшениями производительности и безопасности, внедрёнными PHP Group</a>, как только новая версия будет доступна в вашем дистрибутиве. ",
+ "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Заголовки обратного прокси настроены неправильно, либо вы подключены к серверу Nextcloud через доверенный прокси. Если Nextcloud открыт не через доверенный прокси, то это проблема безопасности, которая может позволить атакующему подделать IP-адрес, определяемый сервером Nextcloud. Дополнительная информация содержится в <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached настроен на распределенный кэш, но установлен неподдерживаемый модуль PHP «memcache». \\OC\\Memcache\\Memcached поддерживает только модуль «memcached», но не «memcache». Дополнительная информации на <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">wiki странице memcached об обоих модулях</a>.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Некоторые файлы не прошли проверку целостности. Дополнительная информация о способах решения этой проблемы содержится в <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"{docLink}\">документации</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Список проблемных файлов…</a> / <a href=\"{rescanEndpoint}\">Выполнить повторное сканирование…</a>)",
+ "The PHP OPcache is not properly configured. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">For better performance we recommend</a> to use following settings in the <code>php.ini</code>:" : "PHP OPcache не настроен правильно. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Для обеспечения лучшей производительности рекомендуется </a> задать в файле <code>php.ini</code> следующие значения параметров:",
+ "The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. We strongly recommend enabling this function." : "Функция PHP «set_time_limit» недоступна. В случае остановки скриптов во время работы это может привести к повреждению установки сервера Nextcloud. Настоятельно рекомендуется включить эту функцию.",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. It is strongly recommended that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Каталог данных и файлы, возможно, доступны из Интернета. Файл .htaccess не работает. Настоятельно рекомендуется настроить веб-сервер таким образом, чтобы каталог данных не был доступен из внешней сети, либо переместить каталог данных за пределы корневого каталога веб-сервера.",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Заголовок HTTP «{header}» не настроен на значение «{expected}». Это потенциальная проблема безопасности и рекомендуется изменить эти настройки.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "Значение HTTP-заголовка «Strict-Transport-Security» должно быть настроено минимум на «{seconds}» секунд. Для улучшения безопасности рекомендуется включить HSTS согласно нашим <a href=\"{docUrl}\">советам по безопасности</a>.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Используется небезопасное соподчинение по протоколу HTTP. Настоятельно рекомендуется настроить сервер на использование HTTPS согласно нашим <a href=\"{docUrl}\">советам по безопасности</a>.",
+ "Shared with {recipients}" : "Вы поделились с {recipients}",
+ "The server encountered an internal error and was unable to complete your request." : "Запрос не выполнен, на сервере произошла ошибка.",
+ "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Пожалуйста, свяжитесь с администратором сервера если эта ошибка будет повторяться. Прикрепите указанную ниже техническую информацию к своему сообщению.",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "Информацию о правильной настройке сервера можно найти в <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">документации</a>.",
+ "This action requires you to confirm your password:" : "Это действие требует подтверждения вашего пароля:",
+ "Wrong password. Reset it?" : "Неверный пароль. Сбросить его?",
+ "You are about to grant \"%s\" access to your %s account." : "Вы собираетесь предоставить «%s» доступ ко своей учётной записи %s.",
+ "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_domains» в файле «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." : "В зависимости от конфигурации, вы, как администратор, можете также добавить домен в список доверенных при помощи кнопки, расположенной ниже.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Для получения помощи обратитесь к <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">документации</a>.",
+ "Your PHP does not have freetype support. This will result in broken profile pictures and settings interface." : "Установленная версия PHP не поддерживает библиотеку FreeType, что приводит к неверному отображению изображений профиля и интерфейса настроек."
},"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/core/l10n/sv.js b/core/l10n/sv.js
index 269813ec8fe..a45d01668b0 100644
--- a/core/l10n/sv.js
+++ b/core/l10n/sv.js
@@ -56,6 +56,7 @@ OC.L10N.register(
"Search contacts …" : "Sök kontakter ...",
"No contacts found" : "Inga kontakter hittades",
"Show all contacts …" : "Visa alla kontakter ...",
+ "Could not load your contacts" : "Kunde inte ladda dina kontakter",
"Loading your contacts …" : "Laddar dina kontakter ...",
"Looking for {term} …" : "Letar efter {term} …",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\"> Ett problem uppstod under integritetskontrollen av koden. Mer information ... </a>",
diff --git a/core/l10n/sv.json b/core/l10n/sv.json
index e27c630f31f..4fdb3f6f680 100644
--- a/core/l10n/sv.json
+++ b/core/l10n/sv.json
@@ -54,6 +54,7 @@
"Search contacts …" : "Sök kontakter ...",
"No contacts found" : "Inga kontakter hittades",
"Show all contacts …" : "Visa alla kontakter ...",
+ "Could not load your contacts" : "Kunde inte ladda dina kontakter",
"Loading your contacts …" : "Laddar dina kontakter ...",
"Looking for {term} …" : "Letar efter {term} …",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\"> Ett problem uppstod under integritetskontrollen av koden. Mer information ... </a>",
diff --git a/core/register_command.php b/core/register_command.php
index 372d775dc14..578b4f799b6 100644
--- a/core/register_command.php
+++ b/core/register_command.php
@@ -40,8 +40,7 @@
$application->add(new \Stecman\Component\Symfony\Console\BashCompletion\CompletionCommand());
$application->add(new OC\Core\Command\Status);
$application->add(new OC\Core\Command\Check(\OC::$server->getSystemConfig()));
-$infoParser = new \OC\App\InfoParser();
-$application->add(new OC\Core\Command\App\CheckCode($infoParser));
+$application->add(new OC\Core\Command\App\CheckCode());
$application->add(new OC\Core\Command\L10n\CreateJs());
$application->add(new \OC\Core\Command\Integrity\SignApp(
\OC::$server->getIntegrityCodeChecker(),
diff --git a/core/routes.php b/core/routes.php
index 0eed8ed1796..97a8621fc39 100644
--- a/core/routes.php
+++ b/core/routes.php
@@ -71,6 +71,8 @@ $application->registerRoutes($this, [
['root' => '', 'name' => 'OCS#getConfig', 'url' => '/config', 'verb' => 'GET'],
['root' => '/person', 'name' => 'OCS#personCheck', 'url' => '/check', 'verb' => 'POST'],
['root' => '/identityproof', 'name' => 'OCS#getIdentityProof', 'url' => '/key/{cloudId}', 'verb' => 'GET'],
+ ['root' => '/core', 'name' => 'Navigation#getAppsNavigation', 'url' => '/navigation/apps', 'verb' => 'GET'],
+ ['root' => '/core', 'name' => 'Navigation#getSettingsNavigation', 'url' => '/navigation/settings', 'verb' => 'GET'],
],
]);
diff --git a/core/templates/exception.php b/core/templates/exception.php
index 0ae82b9308d..fcfa8687710 100644
--- a/core/templates/exception.php
+++ b/core/templates/exception.php
@@ -12,14 +12,14 @@ style('core', ['styles', 'header']);
<h3><?php p($l->t('Technical details')) ?></h3>
<ul>
- <li><?php p($l->t('Remote Address: %s', $_['remoteAddr'])) ?></li>
- <li><?php p($l->t('Request ID: %s', $_['requestID'])) ?></li>
+ <li><?php p($l->t('Remote Address: %s', [$_['remoteAddr']])) ?></li>
+ <li><?php p($l->t('Request ID: %s', [$_['requestID']])) ?></li>
<?php if($_['debugMode']): ?>
- <li><?php p($l->t('Type: %s', $_['errorClass'])) ?></li>
- <li><?php p($l->t('Code: %s', $_['errorCode'])) ?></li>
- <li><?php p($l->t('Message: %s', $_['errorMsg'])) ?></li>
- <li><?php p($l->t('File: %s', $_['file'])) ?></li>
- <li><?php p($l->t('Line: %s', $_['line'])) ?></li>
+ <li><?php p($l->t('Type: %s', [$_['errorClass']])) ?></li>
+ <li><?php p($l->t('Code: %s', [$_['errorCode']])) ?></li>
+ <li><?php p($l->t('Message: %s', [$_['errorMsg']])) ?></li>
+ <li><?php p($l->t('File: %s', [$_['file']])) ?></li>
+ <li><?php p($l->t('Line: %s', [$_['line']])) ?></li>
<?php endif; ?>
</ul>
diff --git a/core/templates/installation.php b/core/templates/installation.php
index 0d274f0f881..616ca1f47da 100644
--- a/core/templates/installation.php
+++ b/core/templates/installation.php
@@ -31,7 +31,7 @@ script('core', [
<p><?php p($l->t('Your data directory and files are probably accessible from the internet because the .htaccess file does not work.'));?><br>
<?php print_unescaped($l->t(
'For information how to properly configure your server, please see the <a href="%s" target="_blank" rel="noreferrer noopener">documentation</a>.',
- link_to_docs('admin-install')
+ [link_to_docs('admin-install')]
)); ?></p>
</fieldset>
<?php endif; ?>
diff --git a/lib/autoloader.php b/lib/autoloader.php
index efab84b44f9..eca326ffc14 100644
--- a/lib/autoloader.php
+++ b/lib/autoloader.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -63,7 +64,7 @@ class Autoloader {
*
* @param string $root
*/
- public function addValidRoot($root) {
+ public function addValidRoot(string $root) {
$root = stream_resolve_include_path($root);
$this->validRoots[$root] = true;
}
@@ -86,12 +87,12 @@ class Autoloader {
* get the possible paths for a class
*
* @param string $class
- * @return array|bool an array of possible paths or false if the class is not part of ownCloud
+ * @return array an array of possible paths
*/
- public function findClass($class) {
+ public function findClass(string $class): array {
$class = trim($class, '\\');
- $paths = array();
+ $paths = [];
if ($this->useGlobalClassPath && array_key_exists($class, \OC::$CLASSPATH)) {
$paths[] = \OC::$CLASSPATH[$class];
/**
@@ -124,8 +125,9 @@ class Autoloader {
/**
* @param string $fullPath
* @return bool
+ * @throws AutoloadNotAllowedException
*/
- protected function isValidPath($fullPath) {
+ protected function isValidPath(string $fullPath): bool {
foreach ($this->validRoots as $root => $true) {
if (substr($fullPath, 0, strlen($root) + 1) === $root . '/') {
return true;
@@ -139,8 +141,9 @@ class Autoloader {
*
* @param string $class
* @return bool
+ * @throws AutoloadNotAllowedException
*/
- public function load($class) {
+ public function load(string $class): bool {
$pathsToRequire = null;
if ($this->memoryCache) {
$pathsToRequire = $this->memoryCache->get($class);
diff --git a/lib/base.php b/lib/base.php
index 05da2814d4c..c5eabe1910a 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -373,6 +373,7 @@ class OC {
// get third party apps
$ocVersion = \OCP\Util::getVersion();
+ $ocVersion = implode('.', $ocVersion);
$incompatibleApps = $appManager->getIncompatibleApps($ocVersion);
$incompatibleShippedApps = [];
foreach ($incompatibleApps as $appInfo) {
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index 3eb532be0c6..b3158ac7e04 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -521,6 +521,7 @@ return array(
'OC\\Core\\Controller\\JsController' => $baseDir . '/core/Controller/JsController.php',
'OC\\Core\\Controller\\LoginController' => $baseDir . '/core/Controller/LoginController.php',
'OC\\Core\\Controller\\LostController' => $baseDir . '/core/Controller/LostController.php',
+ 'OC\\Core\\Controller\\NavigationController' => $baseDir . '/core/Controller/NavigationController.php',
'OC\\Core\\Controller\\OCJSController' => $baseDir . '/core/Controller/OCJSController.php',
'OC\\Core\\Controller\\OCSController' => $baseDir . '/core/Controller/OCSController.php',
'OC\\Core\\Controller\\PreviewController' => $baseDir . '/core/Controller/PreviewController.php',
@@ -652,6 +653,7 @@ return array(
'OC\\Files\\ObjectStore\\S3Signature' => $baseDir . '/lib/private/Files/ObjectStore/S3Signature.php',
'OC\\Files\\ObjectStore\\StorageObjectStore' => $baseDir . '/lib/private/Files/ObjectStore/StorageObjectStore.php',
'OC\\Files\\ObjectStore\\Swift' => $baseDir . '/lib/private/Files/ObjectStore/Swift.php',
+ 'OC\\Files\\ObjectStore\\SwiftFactory' => $baseDir . '/lib/private/Files/ObjectStore/SwiftFactory.php',
'OC\\Files\\Search\\SearchBinaryOperator' => $baseDir . '/lib/private/Files/Search/SearchBinaryOperator.php',
'OC\\Files\\Search\\SearchComparison' => $baseDir . '/lib/private/Files/Search/SearchComparison.php',
'OC\\Files\\Search\\SearchOrder' => $baseDir . '/lib/private/Files/Search/SearchOrder.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index 2483b5689b3..65b36cc489e 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -551,6 +551,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Core\\Controller\\JsController' => __DIR__ . '/../../..' . '/core/Controller/JsController.php',
'OC\\Core\\Controller\\LoginController' => __DIR__ . '/../../..' . '/core/Controller/LoginController.php',
'OC\\Core\\Controller\\LostController' => __DIR__ . '/../../..' . '/core/Controller/LostController.php',
+ 'OC\\Core\\Controller\\NavigationController' => __DIR__ . '/../../..' . '/core/Controller/NavigationController.php',
'OC\\Core\\Controller\\OCJSController' => __DIR__ . '/../../..' . '/core/Controller/OCJSController.php',
'OC\\Core\\Controller\\OCSController' => __DIR__ . '/../../..' . '/core/Controller/OCSController.php',
'OC\\Core\\Controller\\PreviewController' => __DIR__ . '/../../..' . '/core/Controller/PreviewController.php',
@@ -682,6 +683,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Files\\ObjectStore\\S3Signature' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/S3Signature.php',
'OC\\Files\\ObjectStore\\StorageObjectStore' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/StorageObjectStore.php',
'OC\\Files\\ObjectStore\\Swift' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/Swift.php',
+ 'OC\\Files\\ObjectStore\\SwiftFactory' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/SwiftFactory.php',
'OC\\Files\\Search\\SearchBinaryOperator' => __DIR__ . '/../../..' . '/lib/private/Files/Search/SearchBinaryOperator.php',
'OC\\Files\\Search\\SearchComparison' => __DIR__ . '/../../..' . '/lib/private/Files/Search/SearchComparison.php',
'OC\\Files\\Search\\SearchOrder' => __DIR__ . '/../../..' . '/lib/private/Files/Search/SearchOrder.php',
diff --git a/lib/l10n/ar.js b/lib/l10n/ar.js
index d5c3652f6d0..1cfe6fa1ce2 100644
--- a/lib/l10n/ar.js
+++ b/lib/l10n/ar.js
@@ -21,23 +21,41 @@ OC.L10N.register(
"The library %s is not available." : "مكتبة %s غير متوفرة.",
"Unknown filetype" : "نوع الملف غير معروف",
"Invalid image" : "الصورة غير صالحة",
+ "Avatar image is not square" : "الصورة الرمزية ليست على شكل مربّع",
"today" : "اليوم",
+ "tomorrow" : "غدًا",
"yesterday" : "يوم أمس",
"_%n day ago_::_%n days ago_" : ["قبل ساعات","قبل يوم","قبل يومين","قبل %n يوماً","قبل %n يوماً","قبل %n يوماً"],
+ "next month" : "الشهر القادم",
"last month" : "الشهر الماضي",
"_%n month ago_::_%n months ago_" : ["قبل عدة أيام","قبل شهر","قبل شهرين","قبل %n شهراً","قبل %n شهراً","قبل %n شهراً"],
+ "next year" : "العام القادم",
"last year" : "السنةالماضية",
+ "in a few seconds" : "خلال بضع ثواني",
"seconds ago" : "منذ ثواني",
"File name is a reserved word" : "اسم الملف كلمة محجوزة",
"File name contains at least one invalid character" : "اسم الملف به ، على الأقل ، حرف غير صالح",
"File name is too long" : "اسم الملف طويل جداً",
"Empty filename is not allowed" : "لا يسمح بأسماء فارغة للملفات",
+ "Help" : "المساعدة",
"Apps" : "التطبيقات",
+ "Settings" : "الإعدادات",
+ "Log out" : "الخروج",
"Users" : "المستخدمين",
"Unknown user" : "المستخدم غير معروف",
"Basic settings" : "الإعدادات الأساسية",
+ "Sharing" : "المشاركة",
+ "Security" : "الأمان",
+ "Encryption" : "التعمية",
"Additional settings" : "الإعدادات المتقدمة",
+ "Tips & tricks" : "نصائح و تلميحات",
+ "Personal info" : "المعلومات الشخصية",
+ "Sync clients" : "مزامنة العملاء",
+ "Unlimited" : "غير محدود",
"__language_name__" : "اللغة العربية",
+ "Verifying" : "التحقق",
+ "Verifying …" : "عملية التحقق جارية …",
+ "Verify" : "التحقق",
"%s enter the database username and name." : "%s أدخِل اسم قاعدة البيانات واسم مستخدمها.",
"%s enter the database username." : "%s ادخل اسم المستخدم الخاص بقاعدة البيانات.",
"%s enter the database name." : "%s ادخل اسم فاعدة البيانات",
@@ -58,13 +76,67 @@ OC.L10N.register(
"Sharing %s failed, because the user %s does not exist" : "فشلت مشاركة %s لأن المستخدم %s غير موجود",
"Share type %s is not valid for %s" : "مشاركة النوع %s غير صالحة لـ %s",
"%s shared »%s« with you" : "%s شارك »%s« معك",
+ "Click the button below to open it." : "أنقر على الزر أدناه لفتحه.",
"%s via %s" : "%s عبر %s",
"Could not find category \"%s\"" : "تعذر العثور على المجلد \"%s\"",
+ "Sunday" : "الأحد",
+ "Monday" : "الإثنين",
+ "Tuesday" : "الثلاثاء",
+ "Wednesday" : "الأربعاء",
+ "Thursday" : "الخميس",
+ "Friday" : "الجمعة",
+ "Saturday" : "السبت",
+ "Sun." : "أح.",
+ "Mon." : "إث.",
+ "Tue." : "ثلا.",
+ "Wed." : "أر.",
+ "Thu." : "خم.",
+ "Fri." : "جم.",
+ "Sat." : "سب.",
+ "Su" : "أح",
+ "Mo" : "إث",
+ "Tu" : "ثلا",
+ "We" : "أر",
+ "Th" : "خم",
+ "Fr" : "جم",
+ "Sa" : "سب",
+ "January" : "جانفي",
+ "February" : "فيفري",
+ "March" : "مارس",
+ "April" : "أفريل",
+ "May" : "ماي",
+ "June" : "جوان",
+ "July" : "جويلية",
+ "August" : "أوت",
+ "September" : "سبتمبر",
+ "October" : "أكتوبر",
+ "November" : "نوفمبر",
+ "December" : "ديسمبر",
+ "Jan." : "جان.",
+ "Feb." : "فيف.",
+ "Mar." : "مار.",
+ "Apr." : "أفر.",
+ "May." : "ماي",
+ "Jun." : "جوا.",
+ "Jul." : "جوي.",
+ "Aug." : "أوت",
+ "Sep." : "سبت.",
+ "Oct." : "أكت.",
+ "Nov." : "نوف.",
+ "Dec." : "ديس.",
"A valid username must be provided" : "يجب ادخال اسم مستخدم صحيح",
+ "Username contains whitespace at the beginning or at the end" : "إنّ إسم المستخدم يحتوي على مسافة بيضاء سواءا في البداية أو النهاية",
"A valid password must be provided" : "يجب ادخال كلمة مرور صحيحة",
+ "Could not create user" : "لا يمكن إنشاء المستخدم",
+ "User disabled" : "المستخدم معطّل",
+ "Login canceled by app" : "تم إلغاء الدخول مِن طرف التطبيق",
"a safe home for all your data" : "المكان الآمن لجميع بياناتك",
+ "File is currently busy, please try again later" : "إنّ الملف مشغول الآمن، يرجى إعادة المحاولة لاحقًا",
+ "Can't read file" : "لا يمكن قراءة الملف",
"Application is not enabled" : "التطبيق غير مفعّل",
"Authentication error" : "لم يتم التأكد من الشخصية بنجاح",
- "Token expired. Please reload page." : "انتهت صلاحية الكلمة , يرجى اعادة تحميل الصفحة"
+ "Token expired. Please reload page." : "انتهت صلاحية الكلمة , يرجى اعادة تحميل الصفحة",
+ "Personal" : "الحساب الشخصي",
+ "Admin" : "المدير"
},
"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/lib/l10n/ar.json b/lib/l10n/ar.json
index 7c8b3f37ac1..386a516e0a6 100644
--- a/lib/l10n/ar.json
+++ b/lib/l10n/ar.json
@@ -19,23 +19,41 @@
"The library %s is not available." : "مكتبة %s غير متوفرة.",
"Unknown filetype" : "نوع الملف غير معروف",
"Invalid image" : "الصورة غير صالحة",
+ "Avatar image is not square" : "الصورة الرمزية ليست على شكل مربّع",
"today" : "اليوم",
+ "tomorrow" : "غدًا",
"yesterday" : "يوم أمس",
"_%n day ago_::_%n days ago_" : ["قبل ساعات","قبل يوم","قبل يومين","قبل %n يوماً","قبل %n يوماً","قبل %n يوماً"],
+ "next month" : "الشهر القادم",
"last month" : "الشهر الماضي",
"_%n month ago_::_%n months ago_" : ["قبل عدة أيام","قبل شهر","قبل شهرين","قبل %n شهراً","قبل %n شهراً","قبل %n شهراً"],
+ "next year" : "العام القادم",
"last year" : "السنةالماضية",
+ "in a few seconds" : "خلال بضع ثواني",
"seconds ago" : "منذ ثواني",
"File name is a reserved word" : "اسم الملف كلمة محجوزة",
"File name contains at least one invalid character" : "اسم الملف به ، على الأقل ، حرف غير صالح",
"File name is too long" : "اسم الملف طويل جداً",
"Empty filename is not allowed" : "لا يسمح بأسماء فارغة للملفات",
+ "Help" : "المساعدة",
"Apps" : "التطبيقات",
+ "Settings" : "الإعدادات",
+ "Log out" : "الخروج",
"Users" : "المستخدمين",
"Unknown user" : "المستخدم غير معروف",
"Basic settings" : "الإعدادات الأساسية",
+ "Sharing" : "المشاركة",
+ "Security" : "الأمان",
+ "Encryption" : "التعمية",
"Additional settings" : "الإعدادات المتقدمة",
+ "Tips & tricks" : "نصائح و تلميحات",
+ "Personal info" : "المعلومات الشخصية",
+ "Sync clients" : "مزامنة العملاء",
+ "Unlimited" : "غير محدود",
"__language_name__" : "اللغة العربية",
+ "Verifying" : "التحقق",
+ "Verifying …" : "عملية التحقق جارية …",
+ "Verify" : "التحقق",
"%s enter the database username and name." : "%s أدخِل اسم قاعدة البيانات واسم مستخدمها.",
"%s enter the database username." : "%s ادخل اسم المستخدم الخاص بقاعدة البيانات.",
"%s enter the database name." : "%s ادخل اسم فاعدة البيانات",
@@ -56,13 +74,67 @@
"Sharing %s failed, because the user %s does not exist" : "فشلت مشاركة %s لأن المستخدم %s غير موجود",
"Share type %s is not valid for %s" : "مشاركة النوع %s غير صالحة لـ %s",
"%s shared »%s« with you" : "%s شارك »%s« معك",
+ "Click the button below to open it." : "أنقر على الزر أدناه لفتحه.",
"%s via %s" : "%s عبر %s",
"Could not find category \"%s\"" : "تعذر العثور على المجلد \"%s\"",
+ "Sunday" : "الأحد",
+ "Monday" : "الإثنين",
+ "Tuesday" : "الثلاثاء",
+ "Wednesday" : "الأربعاء",
+ "Thursday" : "الخميس",
+ "Friday" : "الجمعة",
+ "Saturday" : "السبت",
+ "Sun." : "أح.",
+ "Mon." : "إث.",
+ "Tue." : "ثلا.",
+ "Wed." : "أر.",
+ "Thu." : "خم.",
+ "Fri." : "جم.",
+ "Sat." : "سب.",
+ "Su" : "أح",
+ "Mo" : "إث",
+ "Tu" : "ثلا",
+ "We" : "أر",
+ "Th" : "خم",
+ "Fr" : "جم",
+ "Sa" : "سب",
+ "January" : "جانفي",
+ "February" : "فيفري",
+ "March" : "مارس",
+ "April" : "أفريل",
+ "May" : "ماي",
+ "June" : "جوان",
+ "July" : "جويلية",
+ "August" : "أوت",
+ "September" : "سبتمبر",
+ "October" : "أكتوبر",
+ "November" : "نوفمبر",
+ "December" : "ديسمبر",
+ "Jan." : "جان.",
+ "Feb." : "فيف.",
+ "Mar." : "مار.",
+ "Apr." : "أفر.",
+ "May." : "ماي",
+ "Jun." : "جوا.",
+ "Jul." : "جوي.",
+ "Aug." : "أوت",
+ "Sep." : "سبت.",
+ "Oct." : "أكت.",
+ "Nov." : "نوف.",
+ "Dec." : "ديس.",
"A valid username must be provided" : "يجب ادخال اسم مستخدم صحيح",
+ "Username contains whitespace at the beginning or at the end" : "إنّ إسم المستخدم يحتوي على مسافة بيضاء سواءا في البداية أو النهاية",
"A valid password must be provided" : "يجب ادخال كلمة مرور صحيحة",
+ "Could not create user" : "لا يمكن إنشاء المستخدم",
+ "User disabled" : "المستخدم معطّل",
+ "Login canceled by app" : "تم إلغاء الدخول مِن طرف التطبيق",
"a safe home for all your data" : "المكان الآمن لجميع بياناتك",
+ "File is currently busy, please try again later" : "إنّ الملف مشغول الآمن، يرجى إعادة المحاولة لاحقًا",
+ "Can't read file" : "لا يمكن قراءة الملف",
"Application is not enabled" : "التطبيق غير مفعّل",
"Authentication error" : "لم يتم التأكد من الشخصية بنجاح",
- "Token expired. Please reload page." : "انتهت صلاحية الكلمة , يرجى اعادة تحميل الصفحة"
+ "Token expired. Please reload page." : "انتهت صلاحية الكلمة , يرجى اعادة تحميل الصفحة",
+ "Personal" : "الحساب الشخصي",
+ "Admin" : "المدير"
},"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/lib/l10n/ast.js b/lib/l10n/ast.js
index 73955dbdb93..3d9a5084ab9 100644
--- a/lib/l10n/ast.js
+++ b/lib/l10n/ast.js
@@ -25,6 +25,7 @@ OC.L10N.register(
"Invalid image" : "Imaxe inválida",
"Avatar image is not square" : "La imaxe del avatar nun ye cuadrada",
"today" : "güei",
+ "tomorrow" : "mañana",
"yesterday" : "ayeri",
"_%n day ago_::_%n days ago_" : ["hai %n día","hai %n díes"],
"last month" : "mes caberu",
diff --git a/lib/l10n/ast.json b/lib/l10n/ast.json
index 3e0047ee423..a52d3721b34 100644
--- a/lib/l10n/ast.json
+++ b/lib/l10n/ast.json
@@ -23,6 +23,7 @@
"Invalid image" : "Imaxe inválida",
"Avatar image is not square" : "La imaxe del avatar nun ye cuadrada",
"today" : "güei",
+ "tomorrow" : "mañana",
"yesterday" : "ayeri",
"_%n day ago_::_%n days ago_" : ["hai %n día","hai %n díes"],
"last month" : "mes caberu",
diff --git a/lib/l10n/es.js b/lib/l10n/es.js
index b411012a627..a0f23e34d2c 100644
--- a/lib/l10n/es.js
+++ b/lib/l10n/es.js
@@ -75,18 +75,18 @@ OC.L10N.register(
"Personal info" : "Información personal",
"Sync clients" : "Clientes de sincronización",
"Unlimited" : "Ilimitado",
- "__language_name__" : "Español",
+ "__language_name__" : "Castellano",
"Verifying" : "Verificando",
"Verifying …" : "Verificando...",
"Verify" : "Verificar",
"%s enter the database username and name." : "%s introduzca el nombre de usuario y la contraseña de la BBDD.",
- "%s enter the database username." : "%s ingresar el usuario de la base de datos.",
- "%s enter the database name." : "%s ingresar el nombre de la base de datos",
+ "%s enter the database username." : "%s introduzca el usuario de la base de datos.",
+ "%s enter the database name." : "%s introduzca el nombre de la base de datos",
"%s you may not use dots in the database name" : "%s puede utilizar puntos en el nombre de la base de datos",
"Oracle connection could not be established" : "No se pudo establecer la conexión a Oracle",
"Oracle username and/or password not valid" : "Usuario y/o contraseña de Oracle no válidos",
"PostgreSQL username and/or password not valid" : "Usuario y/o contraseña de PostgreSQL no válidos",
- "You need to enter details of an existing account." : "Necesita ingresar detalles de una cuenta existente.",
+ "You need to enter details of an existing account." : "Tienes que introducir los datos de una cuenta existente.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X no está soportado y %s no funcionará bien en esta plataforma. ¡Úsela bajo su propio riesgo! ",
"For the best results, please consider using a GNU/Linux server instead." : "Para obtener los mejores resultados, considera utilizar un servidor 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." : "Parece que esta instancia %s está funcionando en un entorno PHP de 32-bits y el open_basedir se ha configurado en php.ini. Esto acarreará problemas con arhivos de tamaño superior a 4GB y resulta totalmente desaconsejado.",
diff --git a/lib/l10n/es.json b/lib/l10n/es.json
index 0607da188b6..ec5252d028f 100644
--- a/lib/l10n/es.json
+++ b/lib/l10n/es.json
@@ -73,18 +73,18 @@
"Personal info" : "Información personal",
"Sync clients" : "Clientes de sincronización",
"Unlimited" : "Ilimitado",
- "__language_name__" : "Español",
+ "__language_name__" : "Castellano",
"Verifying" : "Verificando",
"Verifying …" : "Verificando...",
"Verify" : "Verificar",
"%s enter the database username and name." : "%s introduzca el nombre de usuario y la contraseña de la BBDD.",
- "%s enter the database username." : "%s ingresar el usuario de la base de datos.",
- "%s enter the database name." : "%s ingresar el nombre de la base de datos",
+ "%s enter the database username." : "%s introduzca el usuario de la base de datos.",
+ "%s enter the database name." : "%s introduzca el nombre de la base de datos",
"%s you may not use dots in the database name" : "%s puede utilizar puntos en el nombre de la base de datos",
"Oracle connection could not be established" : "No se pudo establecer la conexión a Oracle",
"Oracle username and/or password not valid" : "Usuario y/o contraseña de Oracle no válidos",
"PostgreSQL username and/or password not valid" : "Usuario y/o contraseña de PostgreSQL no válidos",
- "You need to enter details of an existing account." : "Necesita ingresar detalles de una cuenta existente.",
+ "You need to enter details of an existing account." : "Tienes que introducir los datos de una cuenta existente.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X no está soportado y %s no funcionará bien en esta plataforma. ¡Úsela bajo su propio riesgo! ",
"For the best results, please consider using a GNU/Linux server instead." : "Para obtener los mejores resultados, considera utilizar un servidor 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." : "Parece que esta instancia %s está funcionando en un entorno PHP de 32-bits y el open_basedir se ha configurado en php.ini. Esto acarreará problemas con arhivos de tamaño superior a 4GB y resulta totalmente desaconsejado.",
diff --git a/lib/l10n/lt_LT.js b/lib/l10n/lt_LT.js
index bb8c53361f9..41c0e32e0a6 100644
--- a/lib/l10n/lt_LT.js
+++ b/lib/l10n/lt_LT.js
@@ -72,6 +72,7 @@ OC.L10N.register(
"PostgreSQL username and/or password not valid" : "Neteisingas PostgreSQL naudotojo vardas ir/arba slaptažodis",
"You need to enter details of an existing account." : "Jūs turite suvesti egzistuojančios paskyros duomenis.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nėra palaikomas, %s neveiks tinkamai šioje platformoje. Naudodami prisiimate visą riziką !",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Pašalinkite savo php.ini faile open_basedir nustatymą arba persijunkite į 64-bitų PHP.",
"Set an admin username." : "Nustatyti administratoriaus naudotojo vardą.",
"Set an admin password." : "Nustatyti administratoriaus slaptažodį.",
"Can't create or write into the data directory %s" : "Negalima nuskaityti arba rašyti į duomenų katalogą. %s",
@@ -198,6 +199,11 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Nepilna saugyklos konfigūracija. %s",
"Storage connection error. %s" : "Saugyklos sujungimo ryšio klaida. %s",
"Storage is temporarily not available" : "Saugykla yra laikinai neprieinama",
- "Storage connection timeout. %s" : "Sujungimo su saugykla laikas baigėsi. %s"
+ "Storage connection timeout. %s" : "Sujungimo su saugykla laikas baigėsi. %s",
+ "DB Error: \"%s\"" : "DB klaida: \"%s\"",
+ "Files can't be shared with delete permissions" : "Failai negali būti bendrinami su ištrynimo leidimais",
+ "Files can't be shared with create permissions" : "Failai negali būti bendrinami su sukūrimo leidimais",
+ "No app name specified" : "Nenurodytas programėlės pavadinimas",
+ "App '%s' could not be installed!" : "Nepavyko įdiegti \"%s\" programėlės!"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/lib/l10n/lt_LT.json b/lib/l10n/lt_LT.json
index 5548e6ceebe..34fbc073acf 100644
--- a/lib/l10n/lt_LT.json
+++ b/lib/l10n/lt_LT.json
@@ -70,6 +70,7 @@
"PostgreSQL username and/or password not valid" : "Neteisingas PostgreSQL naudotojo vardas ir/arba slaptažodis",
"You need to enter details of an existing account." : "Jūs turite suvesti egzistuojančios paskyros duomenis.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nėra palaikomas, %s neveiks tinkamai šioje platformoje. Naudodami prisiimate visą riziką !",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Pašalinkite savo php.ini faile open_basedir nustatymą arba persijunkite į 64-bitų PHP.",
"Set an admin username." : "Nustatyti administratoriaus naudotojo vardą.",
"Set an admin password." : "Nustatyti administratoriaus slaptažodį.",
"Can't create or write into the data directory %s" : "Negalima nuskaityti arba rašyti į duomenų katalogą. %s",
@@ -196,6 +197,11 @@
"Storage incomplete configuration. %s" : "Nepilna saugyklos konfigūracija. %s",
"Storage connection error. %s" : "Saugyklos sujungimo ryšio klaida. %s",
"Storage is temporarily not available" : "Saugykla yra laikinai neprieinama",
- "Storage connection timeout. %s" : "Sujungimo su saugykla laikas baigėsi. %s"
+ "Storage connection timeout. %s" : "Sujungimo su saugykla laikas baigėsi. %s",
+ "DB Error: \"%s\"" : "DB klaida: \"%s\"",
+ "Files can't be shared with delete permissions" : "Failai negali būti bendrinami su ištrynimo leidimais",
+ "Files can't be shared with create permissions" : "Failai negali būti bendrinami su sukūrimo leidimais",
+ "No app name specified" : "Nenurodytas programėlės pavadinimas",
+ "App '%s' could not be installed!" : "Nepavyko įdiegti \"%s\" programėlės!"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/lib/l10n/lv.js b/lib/l10n/lv.js
index b3d655e3769..54d625af61c 100644
--- a/lib/l10n/lv.js
+++ b/lib/l10n/lv.js
@@ -4,7 +4,7 @@ OC.L10N.register(
"Cannot write into \"config\" directory!" : "Nevar rakstīt \"config\" mapē!",
"This can usually be fixed by giving the webserver write access to the config directory" : "To parasti var labot, dodot tīmekļa servera rakstīšanas piekļuvi config direktorijai",
"See %s" : "Skatīt %s",
- "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Faili no programmas %$1s netika aizvietoti pareizi. Pārliecinieties, vai tā ir versija, kas ir saderīga ar serveri.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Datnes no programmas %$1s netika aizvietotas pareizi. Pārliecinieties, vai tā ir versija, kas ir saderīga ar serveri.",
"Sample configuration detected" : "Atrasta konfigurācijas paraugs",
"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" : "Konstatēts, ka paraug konfigurācija ir nokopēta. Tas var izjaukt jūsu instalāciju un nav atbalstīts. Lūdzu, izlasiet dokumentāciju, pirms veicat izmaiņas config.php",
"%1$s and %2$s" : "%1$s un %2$s",
diff --git a/lib/l10n/lv.json b/lib/l10n/lv.json
index 33956326c84..7a549f53c4f 100644
--- a/lib/l10n/lv.json
+++ b/lib/l10n/lv.json
@@ -2,7 +2,7 @@
"Cannot write into \"config\" directory!" : "Nevar rakstīt \"config\" mapē!",
"This can usually be fixed by giving the webserver write access to the config directory" : "To parasti var labot, dodot tīmekļa servera rakstīšanas piekļuvi config direktorijai",
"See %s" : "Skatīt %s",
- "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Faili no programmas %$1s netika aizvietoti pareizi. Pārliecinieties, vai tā ir versija, kas ir saderīga ar serveri.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Datnes no programmas %$1s netika aizvietotas pareizi. Pārliecinieties, vai tā ir versija, kas ir saderīga ar serveri.",
"Sample configuration detected" : "Atrasta konfigurācijas paraugs",
"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" : "Konstatēts, ka paraug konfigurācija ir nokopēta. Tas var izjaukt jūsu instalāciju un nav atbalstīts. Lūdzu, izlasiet dokumentāciju, pirms veicat izmaiņas config.php",
"%1$s and %2$s" : "%1$s un %2$s",
diff --git a/lib/l10n/nl.js b/lib/l10n/nl.js
index 393927174da..a13c99f77d8 100644
--- a/lib/l10n/nl.js
+++ b/lib/l10n/nl.js
@@ -230,6 +230,10 @@ OC.L10N.register(
"Storage connection timeout. %s" : "Opslag verbinding time-out. %s",
"Personal" : "Persoonlijk",
"Admin" : "Beheerder",
- "DB Error: \"%s\"" : "DB Fout: \"%s\""
+ "DB Error: \"%s\"" : "DB Fout: \"%s\"",
+ "Files can't be shared with delete permissions" : "Bestanden kunnen niet gedeeld worden met 'verwijder' rechten",
+ "Files can't be shared with create permissions" : "Bestanden kunnen niet gedeeld worden met 'creëer' rechten",
+ "No app name specified" : "Geen app naam gespecificeerd",
+ "App '%s' could not be installed!" : "App '%s' kon niet geïnstalleerd worden!"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/nl.json b/lib/l10n/nl.json
index c3c8f6cf072..3cd3b329711 100644
--- a/lib/l10n/nl.json
+++ b/lib/l10n/nl.json
@@ -228,6 +228,10 @@
"Storage connection timeout. %s" : "Opslag verbinding time-out. %s",
"Personal" : "Persoonlijk",
"Admin" : "Beheerder",
- "DB Error: \"%s\"" : "DB Fout: \"%s\""
+ "DB Error: \"%s\"" : "DB Fout: \"%s\"",
+ "Files can't be shared with delete permissions" : "Bestanden kunnen niet gedeeld worden met 'verwijder' rechten",
+ "Files can't be shared with create permissions" : "Bestanden kunnen niet gedeeld worden met 'creëer' rechten",
+ "No app name specified" : "Geen app naam gespecificeerd",
+ "App '%s' could not be installed!" : "App '%s' kon niet geïnstalleerd worden!"
},"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 223f7286a00..a79b72ae673 100644
--- a/lib/l10n/pt_PT.js
+++ b/lib/l10n/pt_PT.js
@@ -1,12 +1,21 @@
OC.L10N.register(
"lib",
{
- "Cannot write into \"config\" directory!" : "Não é possível gravar na diretoria \"configurar\"!",
+ "Cannot write into \"config\" directory!" : "Não é possível gravar no directório \"config\"!",
"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 giving the webserver write access to the config directory. See %s" : "Isto pode geralmente ser corrigido ao adicionar permissões de escrita à pasta de configuração ao servidor web. Ver %s.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Os ficheiros na aplicação %$1s não foram correctamente substituídos. Garanta que é uma versão compatível com o servidor.",
"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",
+ "%1$s and %2$s" : "%1$s e %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s e %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s e %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s e %5$s",
+ "Education Edition" : "Edição Educação",
+ "Enterprise bundle" : "Pacote Empresa",
+ "Groupware bundle" : "Pacote Colaborativo",
+ "Social sharing bundle" : "Pacote Partilha Social",
"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." : "Necessário PHP %sbit ou superior.",
@@ -16,22 +25,38 @@ OC.L10N.register(
"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",
+ "Server version %s or higher is required." : "É necessária versão do servidor %s or superior. ",
+ "Server version %s or lower is required." : "É necessária versão do servidor %s or inferior.",
"Unknown filetype" : "Tipo de ficheiro desconhecido",
"Invalid image" : "Imagem inválida",
+ "Avatar image is not square" : "A imagem do avatar não é quadrada.",
"today" : "hoje",
"tomorrow" : "Amanhã",
"yesterday" : "ontem",
+ "_in %n day_::_in %n days_" : ["em %n dia","em %n dias"],
"_%n day ago_::_%n days ago_" : ["%n dia atrás","%n dias atrás"],
+ "next month" : "Próximo mês",
"last month" : "ultimo mês",
+ "_in %n month_::_in %n months_" : ["em %n mês","em %n meses"],
+ "_%n month ago_::_%n months ago_" : ["%n mês atrás","%n meses atrás"],
+ "next year" : "Próximo ano",
"last year" : "ano passado",
+ "_in %n year_::_in %n years_" : ["dentro de%n ano","dentro de%n anos"],
"_%n year ago_::_%n years ago_" : ["%n ano atrás","%n anos atrás"],
+ "_in %n hour_::_in %n hours_" : ["dentro de %n hora","dentro de %n horas"],
+ "_%n hour ago_::_%n hours ago_" : ["%n hora atrás","%n horas atrás"],
+ "_in %n minute_::_in %n minutes_" : ["dentro de %n minuto","dentro de %n minutos"],
+ "_%n minute ago_::_%n minutes ago_" : ["%n minuto atrás","%n minutos atrás"],
+ "in a few seconds" : "em breves segundos",
"seconds ago" : "Minutos atrás",
+ "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Módulo com ID: %s não existe. Por favor active-o nas definições da aplicação ou contacte o administrador.",
"File name is a reserved word" : "Nome de ficheiro é uma palavra reservada",
"File name contains at least one invalid character" : "Nome de ficheiro contém pelo menos um caráter inválido",
"File name is too long" : "Nome do ficheiro demasiado longo",
"Dot files are not allowed" : "Ficheiros dot não são permitidos",
"Empty filename is not allowed" : "Não é permitido um ficheiro sem nome",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "A app \"%s\" não pode ser instalada porque o ficheiro appinfo não pode ser lido.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "A aplicação \"%s\" não pode ser instada porque não é compatível com esta versão do servidor.",
"This is an automatically sent email, please do not reply." : "Este e-mail foi enviado automaticamente, por favor não responda a este e-mail.",
"Help" : "Ajuda",
"Apps" : "Apps",
@@ -39,9 +64,21 @@ OC.L10N.register(
"Log out" : "Sair",
"Users" : "Utilizadores",
"Unknown user" : "Utilizador desconhecido",
+ "APCu" : "APCu",
+ "Redis" : "Redis",
+ "Basic settings" : "Definições básicas",
"Sharing" : "Partilhar",
"Security" : "Segurança",
+ "Encryption" : "Encriptação",
+ "Additional settings" : "Definições adicionais",
+ "Tips & tricks" : "Dicas e truques",
+ "Personal info" : "Informação pessoal",
+ "Sync clients" : "Sincronizar clientes",
+ "Unlimited" : "Ilimitado",
"__language_name__" : "Português",
+ "Verifying" : "A verificar",
+ "Verifying …" : "A verificar...",
+ "Verify" : "Verificar",
"%s enter the database username and name." : "%s introduza o nome de utilizador da base de dados e o nome da base de dados.",
"%s enter the database username." : "%s introduza o nome de utilizador da base de dados",
"%s enter the database name." : "%s introduza o nome da base de dados",
@@ -49,6 +86,7 @@ OC.L10N.register(
"Oracle connection could not be established" : "Não foi possível estabelecer a ligação Oracle",
"Oracle username and/or password not valid" : "Nome de utilizador/password do Oracle inválida",
"PostgreSQL username and/or password not valid" : "Nome de utilizador/password do PostgreSQL inválido",
+ "You need to enter details of an existing account." : "Precisa de introduzir detalhes de uma conta existente.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Esta plataforma não suporta o sistema operativo Mac OS X e o %s poderá não funcionar correctamente. Utilize por sua conta e risco.",
"For the best results, please consider using a GNU/Linux server instead." : "Para um melhor resultado, utilize antes o servidor 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." : "Parece que a instância %s está a ser executada num ambiente PHP de 32-bits e o open_basedir foi configurado no php.ini. Isto levará a problemas com ficheiros de tamanho superior a 4 GB e é altamente desencorajado.",
@@ -82,19 +120,74 @@ OC.L10N.register(
"Sharing %s failed, because resharing is not allowed" : "A partilha %s falhou, porque repartilhar não é permitido",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "A partilha %s falhou porque a partilha da interface para %s não conseguiu encontrar a sua fonte",
"Sharing %s failed, because the file could not be found in the file cache" : "A partilha %s falhou, devido ao ficheiro não poder ser encontrado na cache de ficheiros",
+ "Can’t increase permissions of %s" : "Não é possível aumentar as permissões de %s",
+ "Files can’t be shared with delete permissions" : "Ficheiros não podem ser partilhados com permissões de apagar",
+ "Files can’t be shared with create permissions" : "Ficheiros não podem ser partilhados com permissões de criação",
"Expiration date is in the past" : "A data de expiração está no passado",
+ "Can’t set expiration date more than %s days in the future" : "Não é possível definir data de expiração a mais de %s dias no futuro",
"%s shared »%s« with you" : "%s partilhado »%s« consigo",
+ "%s shared »%s« with you." : "%s partilhou »%s« consigo.",
+ "Click the button below to open it." : "Clicar no botão abaixo para abrir.",
+ "Open »%s«" : "Abrir »%s«",
"%s via %s" : "%s via %s",
+ "The requested share does not exist anymore" : "A partilha requisitada já não existe",
"Could not find category \"%s\"" : "Não foi encontrado a categoria \"%s\"",
+ "Sunday" : "Domingo",
+ "Monday" : "Segunda-feira",
+ "Tuesday" : "Terça-feira",
+ "Wednesday" : "Quarta-feira",
+ "Thursday" : "Quinta-feira",
+ "Friday" : "Sexta-feira",
+ "Saturday" : "Sábado",
+ "Sun." : "Dom.",
+ "Mon." : "Seg.",
+ "Tue." : "Ter.",
+ "Wed." : "Qua.",
+ "Thu." : "Qui.",
+ "Fri." : "Sex.",
+ "Sat." : "Sáb.",
+ "Su" : "Dom",
+ "Mo" : "Seg",
+ "Tu" : "Ter",
+ "We" : "Qua",
+ "Th" : "Qui",
+ "Fr" : "Sex",
+ "Sa" : "Sáb",
+ "January" : "Janeiro",
+ "February" : "Fevereiro",
+ "March" : "Março",
+ "April" : "Abril",
+ "May" : "Maio",
+ "June" : "Junho",
+ "July" : "Julho",
+ "August" : "Agosto",
+ "September" : "Setembro",
+ "October" : "Outubro",
+ "November" : "Novembro",
+ "December" : "Dezembro",
+ "Jan." : "Jan.",
+ "Feb." : "Fev.",
+ "Mar." : "Mar.",
+ "Apr." : "Abr.",
+ "May." : "Mai.",
+ "Jun." : "Jun.",
+ "Jul." : "Jul.",
+ "Aug." : "Ago.",
+ "Sep." : "Set.",
+ "Oct." : "Out.",
+ "Nov." : "Nov.",
+ "Dec." : "Dez.",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Apenas os seguintes caracteres são permitidos num nome de utilizador: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-'\"",
"A valid username must be provided" : "Um nome de utilizador válido deve ser fornecido",
"Username contains whitespace at the beginning or at the end" : "Nome de utilizador contém espaço em branco no início ou no fim",
+ "Username must not consist of dots only" : "O utilizador não pode consistir de apenas pontos",
"A valid password must be provided" : "Uma password válida deve ser fornecida",
"The username is already being used" : "O nome de utilizador já está a ser usado",
"Could not create user" : "Não foi possível criar o utilizador",
"User disabled" : "Utilizador desativado",
"Login canceled by app" : "Sessão cancelada pela app",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "A aplicação \"%s\" não pode ser instalada porque as seguintes dependências não podem ser realizadas: %s",
+ "a safe home for all your data" : "Um lugar seguro para todos os seus dados",
"File is currently busy, please try again later" : "O ficheiro está ocupado, por favor, tente mais tarde",
"Can't read file" : "Não é possível ler o ficheiro",
"Application is not enabled" : "A aplicação não está activada",
@@ -103,11 +196,16 @@ OC.L10N.register(
"No database drivers (sqlite, mysql, or postgresql) installed." : "Nenhuma base de dados de drivers (sqlite, mysql, or postgresql) instaladas.",
"Cannot write into \"config\" directory" : "Não é possível escrever na directoria \"configurar\"",
"Cannot write into \"apps\" directory" : "Não é possivel escrever na directoria \"aplicações\"",
+ "This can usually be fixed by giving the webserver write access to the apps directory or disabling the appstore in the config file. See %s" : "Isto pode ser normalmente resolvido dando ao servidor web direito de escrita para o directório de aplicação ou desactivando a loja de aplicações no ficheiro de configuração. Ver %s",
+ "Cannot create \"data\" directory" : "Não é possivel criar a directoria \"data\"",
+ "This can usually be fixed by giving the webserver write access to the root directory. See %s" : "Isto pode geralmente ser corrigido ao adicionar permissões de escrita à pasta de raiz. Ver %s",
+ "Permissions can usually be fixed by giving the webserver write access to the root directory. See %s." : "As permissões podem geralmente ser corrigidas dando ao servidor web permissões de escrita na pasta de raiz. Ver %s.",
"Setting locale to %s failed" : "Definindo local para %s falhado",
"Please install one of these locales on your system and restart your webserver." : "Por favor instale um destes locais no seu sistema e reinicie o seu servidor web.",
"Please ask your server administrator to install the module." : "Por favor pergunte ao seu administrador do servidor para instalar o modulo.",
"PHP module %s not installed." : "O modulo %s PHP não está instalado.",
"PHP setting \"%s\" is not set to \"%s\"." : "Configuração PHP \"%s\" não está definida para \"%s\".",
+ "Adjusting this setting in php.ini will make Nextcloud run again" : "Ajustar esta definição no php.ini fará com que o Nextcloud inicie novamente",
"mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload está configurado para \"%s\" invés do valor habitual de \"0\"",
"To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Para corrigir este problema altere o <code>mbstring.func_overload</code> para <code>0</code> no seu php.ini",
"libxml2 2.7.0 is at least required. Currently %s is installed." : "Necessária pelo menos libxml2 2.7.0. Atualmente %s está instalada.",
@@ -119,11 +217,30 @@ OC.L10N.register(
"PostgreSQL >= 9 required" : "Necessita PostgreSQL >= 9",
"Please upgrade your database version" : "Por favor actualize a sua versão da base de dados",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Por favor altere as permissões para 0770 para que esse directório não possa ser listado por outros utilizadores.",
+ "Your data directory is readable by other users" : "O seu directório de dados é legível por outros utilizadores",
+ "Your data directory must be an absolute path" : "O seu directório de dados deve ser um caminho absoluto",
"Check the value of \"datadirectory\" in your configuration" : "Verifique o valor de \"datadirectory\" na sua configuração",
+ "Your data directory is invalid" : "O seu directório de dados é inválido",
+ "Ensure there is a file called \".ocdata\" in the root of the data directory." : "Garanta que existe um ficheiro chamado \".occdata\" na raiz do directório de dados",
"Could not obtain lock type %d on \"%s\"." : "Não foi possível obter o tipo de bloqueio %d em \"%s\".",
"Storage unauthorized. %s" : "Armazenamento desautorizado. %s",
"Storage incomplete configuration. %s" : "Configuração incompleta do armazenamento. %s",
"Storage connection error. %s" : "Erro de ligação ao armazenamento. %s",
- "Storage connection timeout. %s" : "Tempo de ligação ao armazenamento expirou. %s"
+ "Storage is temporarily not available" : "Armazenamento temporariamente indisponível",
+ "Storage connection timeout. %s" : "Tempo de ligação ao armazenamento expirou. %s",
+ "Personal" : "Pessoal",
+ "Admin" : "Admin",
+ "DB Error: \"%s\"" : "Erro de BD:\"%s\"",
+ "Offending command was: \"%s\"" : "O comando transgressor foi:\"%s\"",
+ "Offending command was: \"%s\", name: %s, password: %s" : "O comando transgressor foi: \"%s\", nome: %s, password: %s",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Definição das permissões para %s falhou porque excedem as permissões concedidas a %s",
+ "Setting permissions for %s failed, because the item was not found" : "Definição das permissões para %s falhou porque o item não foi encontrado",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Não é possível remover a data de expiração. Partilhas precisam de ter data de expiração.",
+ "Cannot increase permissions of %s" : "Não é possível aumentar as permissões de %s",
+ "Files can't be shared with delete permissions" : "Ficheiros não podem ser partilhados com permissões para apagar",
+ "Files can't be shared with create permissions" : "Ficheiros não podem ser partilhados com permissões para criar",
+ "Cannot set expiration date more than %s days in the future" : "Não é possível definir data de expiração superior a %s dias no futuro",
+ "No app name specified" : "Nome da aplicação não especificado",
+ "App '%s' could not be installed!" : "Aplicação '%s' não pôde ser instalada"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/pt_PT.json b/lib/l10n/pt_PT.json
index d0403a5fcce..9161b238040 100644
--- a/lib/l10n/pt_PT.json
+++ b/lib/l10n/pt_PT.json
@@ -1,10 +1,19 @@
{ "translations": {
- "Cannot write into \"config\" directory!" : "Não é possível gravar na diretoria \"configurar\"!",
+ "Cannot write into \"config\" directory!" : "Não é possível gravar no directório \"config\"!",
"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 giving the webserver write access to the config directory. See %s" : "Isto pode geralmente ser corrigido ao adicionar permissões de escrita à pasta de configuração ao servidor web. Ver %s.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Os ficheiros na aplicação %$1s não foram correctamente substituídos. Garanta que é uma versão compatível com o servidor.",
"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",
+ "%1$s and %2$s" : "%1$s e %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s e %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s e %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s e %5$s",
+ "Education Edition" : "Edição Educação",
+ "Enterprise bundle" : "Pacote Empresa",
+ "Groupware bundle" : "Pacote Colaborativo",
+ "Social sharing bundle" : "Pacote Partilha Social",
"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." : "Necessário PHP %sbit ou superior.",
@@ -14,22 +23,38 @@
"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",
+ "Server version %s or higher is required." : "É necessária versão do servidor %s or superior. ",
+ "Server version %s or lower is required." : "É necessária versão do servidor %s or inferior.",
"Unknown filetype" : "Tipo de ficheiro desconhecido",
"Invalid image" : "Imagem inválida",
+ "Avatar image is not square" : "A imagem do avatar não é quadrada.",
"today" : "hoje",
"tomorrow" : "Amanhã",
"yesterday" : "ontem",
+ "_in %n day_::_in %n days_" : ["em %n dia","em %n dias"],
"_%n day ago_::_%n days ago_" : ["%n dia atrás","%n dias atrás"],
+ "next month" : "Próximo mês",
"last month" : "ultimo mês",
+ "_in %n month_::_in %n months_" : ["em %n mês","em %n meses"],
+ "_%n month ago_::_%n months ago_" : ["%n mês atrás","%n meses atrás"],
+ "next year" : "Próximo ano",
"last year" : "ano passado",
+ "_in %n year_::_in %n years_" : ["dentro de%n ano","dentro de%n anos"],
"_%n year ago_::_%n years ago_" : ["%n ano atrás","%n anos atrás"],
+ "_in %n hour_::_in %n hours_" : ["dentro de %n hora","dentro de %n horas"],
+ "_%n hour ago_::_%n hours ago_" : ["%n hora atrás","%n horas atrás"],
+ "_in %n minute_::_in %n minutes_" : ["dentro de %n minuto","dentro de %n minutos"],
+ "_%n minute ago_::_%n minutes ago_" : ["%n minuto atrás","%n minutos atrás"],
+ "in a few seconds" : "em breves segundos",
"seconds ago" : "Minutos atrás",
+ "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Módulo com ID: %s não existe. Por favor active-o nas definições da aplicação ou contacte o administrador.",
"File name is a reserved word" : "Nome de ficheiro é uma palavra reservada",
"File name contains at least one invalid character" : "Nome de ficheiro contém pelo menos um caráter inválido",
"File name is too long" : "Nome do ficheiro demasiado longo",
"Dot files are not allowed" : "Ficheiros dot não são permitidos",
"Empty filename is not allowed" : "Não é permitido um ficheiro sem nome",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "A app \"%s\" não pode ser instalada porque o ficheiro appinfo não pode ser lido.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "A aplicação \"%s\" não pode ser instada porque não é compatível com esta versão do servidor.",
"This is an automatically sent email, please do not reply." : "Este e-mail foi enviado automaticamente, por favor não responda a este e-mail.",
"Help" : "Ajuda",
"Apps" : "Apps",
@@ -37,9 +62,21 @@
"Log out" : "Sair",
"Users" : "Utilizadores",
"Unknown user" : "Utilizador desconhecido",
+ "APCu" : "APCu",
+ "Redis" : "Redis",
+ "Basic settings" : "Definições básicas",
"Sharing" : "Partilhar",
"Security" : "Segurança",
+ "Encryption" : "Encriptação",
+ "Additional settings" : "Definições adicionais",
+ "Tips & tricks" : "Dicas e truques",
+ "Personal info" : "Informação pessoal",
+ "Sync clients" : "Sincronizar clientes",
+ "Unlimited" : "Ilimitado",
"__language_name__" : "Português",
+ "Verifying" : "A verificar",
+ "Verifying …" : "A verificar...",
+ "Verify" : "Verificar",
"%s enter the database username and name." : "%s introduza o nome de utilizador da base de dados e o nome da base de dados.",
"%s enter the database username." : "%s introduza o nome de utilizador da base de dados",
"%s enter the database name." : "%s introduza o nome da base de dados",
@@ -47,6 +84,7 @@
"Oracle connection could not be established" : "Não foi possível estabelecer a ligação Oracle",
"Oracle username and/or password not valid" : "Nome de utilizador/password do Oracle inválida",
"PostgreSQL username and/or password not valid" : "Nome de utilizador/password do PostgreSQL inválido",
+ "You need to enter details of an existing account." : "Precisa de introduzir detalhes de uma conta existente.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Esta plataforma não suporta o sistema operativo Mac OS X e o %s poderá não funcionar correctamente. Utilize por sua conta e risco.",
"For the best results, please consider using a GNU/Linux server instead." : "Para um melhor resultado, utilize antes o servidor 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." : "Parece que a instância %s está a ser executada num ambiente PHP de 32-bits e o open_basedir foi configurado no php.ini. Isto levará a problemas com ficheiros de tamanho superior a 4 GB e é altamente desencorajado.",
@@ -80,19 +118,74 @@
"Sharing %s failed, because resharing is not allowed" : "A partilha %s falhou, porque repartilhar não é permitido",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "A partilha %s falhou porque a partilha da interface para %s não conseguiu encontrar a sua fonte",
"Sharing %s failed, because the file could not be found in the file cache" : "A partilha %s falhou, devido ao ficheiro não poder ser encontrado na cache de ficheiros",
+ "Can’t increase permissions of %s" : "Não é possível aumentar as permissões de %s",
+ "Files can’t be shared with delete permissions" : "Ficheiros não podem ser partilhados com permissões de apagar",
+ "Files can’t be shared with create permissions" : "Ficheiros não podem ser partilhados com permissões de criação",
"Expiration date is in the past" : "A data de expiração está no passado",
+ "Can’t set expiration date more than %s days in the future" : "Não é possível definir data de expiração a mais de %s dias no futuro",
"%s shared »%s« with you" : "%s partilhado »%s« consigo",
+ "%s shared »%s« with you." : "%s partilhou »%s« consigo.",
+ "Click the button below to open it." : "Clicar no botão abaixo para abrir.",
+ "Open »%s«" : "Abrir »%s«",
"%s via %s" : "%s via %s",
+ "The requested share does not exist anymore" : "A partilha requisitada já não existe",
"Could not find category \"%s\"" : "Não foi encontrado a categoria \"%s\"",
+ "Sunday" : "Domingo",
+ "Monday" : "Segunda-feira",
+ "Tuesday" : "Terça-feira",
+ "Wednesday" : "Quarta-feira",
+ "Thursday" : "Quinta-feira",
+ "Friday" : "Sexta-feira",
+ "Saturday" : "Sábado",
+ "Sun." : "Dom.",
+ "Mon." : "Seg.",
+ "Tue." : "Ter.",
+ "Wed." : "Qua.",
+ "Thu." : "Qui.",
+ "Fri." : "Sex.",
+ "Sat." : "Sáb.",
+ "Su" : "Dom",
+ "Mo" : "Seg",
+ "Tu" : "Ter",
+ "We" : "Qua",
+ "Th" : "Qui",
+ "Fr" : "Sex",
+ "Sa" : "Sáb",
+ "January" : "Janeiro",
+ "February" : "Fevereiro",
+ "March" : "Março",
+ "April" : "Abril",
+ "May" : "Maio",
+ "June" : "Junho",
+ "July" : "Julho",
+ "August" : "Agosto",
+ "September" : "Setembro",
+ "October" : "Outubro",
+ "November" : "Novembro",
+ "December" : "Dezembro",
+ "Jan." : "Jan.",
+ "Feb." : "Fev.",
+ "Mar." : "Mar.",
+ "Apr." : "Abr.",
+ "May." : "Mai.",
+ "Jun." : "Jun.",
+ "Jul." : "Jul.",
+ "Aug." : "Ago.",
+ "Sep." : "Set.",
+ "Oct." : "Out.",
+ "Nov." : "Nov.",
+ "Dec." : "Dez.",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Apenas os seguintes caracteres são permitidos num nome de utilizador: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-'\"",
"A valid username must be provided" : "Um nome de utilizador válido deve ser fornecido",
"Username contains whitespace at the beginning or at the end" : "Nome de utilizador contém espaço em branco no início ou no fim",
+ "Username must not consist of dots only" : "O utilizador não pode consistir de apenas pontos",
"A valid password must be provided" : "Uma password válida deve ser fornecida",
"The username is already being used" : "O nome de utilizador já está a ser usado",
"Could not create user" : "Não foi possível criar o utilizador",
"User disabled" : "Utilizador desativado",
"Login canceled by app" : "Sessão cancelada pela app",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "A aplicação \"%s\" não pode ser instalada porque as seguintes dependências não podem ser realizadas: %s",
+ "a safe home for all your data" : "Um lugar seguro para todos os seus dados",
"File is currently busy, please try again later" : "O ficheiro está ocupado, por favor, tente mais tarde",
"Can't read file" : "Não é possível ler o ficheiro",
"Application is not enabled" : "A aplicação não está activada",
@@ -101,11 +194,16 @@
"No database drivers (sqlite, mysql, or postgresql) installed." : "Nenhuma base de dados de drivers (sqlite, mysql, or postgresql) instaladas.",
"Cannot write into \"config\" directory" : "Não é possível escrever na directoria \"configurar\"",
"Cannot write into \"apps\" directory" : "Não é possivel escrever na directoria \"aplicações\"",
+ "This can usually be fixed by giving the webserver write access to the apps directory or disabling the appstore in the config file. See %s" : "Isto pode ser normalmente resolvido dando ao servidor web direito de escrita para o directório de aplicação ou desactivando a loja de aplicações no ficheiro de configuração. Ver %s",
+ "Cannot create \"data\" directory" : "Não é possivel criar a directoria \"data\"",
+ "This can usually be fixed by giving the webserver write access to the root directory. See %s" : "Isto pode geralmente ser corrigido ao adicionar permissões de escrita à pasta de raiz. Ver %s",
+ "Permissions can usually be fixed by giving the webserver write access to the root directory. See %s." : "As permissões podem geralmente ser corrigidas dando ao servidor web permissões de escrita na pasta de raiz. Ver %s.",
"Setting locale to %s failed" : "Definindo local para %s falhado",
"Please install one of these locales on your system and restart your webserver." : "Por favor instale um destes locais no seu sistema e reinicie o seu servidor web.",
"Please ask your server administrator to install the module." : "Por favor pergunte ao seu administrador do servidor para instalar o modulo.",
"PHP module %s not installed." : "O modulo %s PHP não está instalado.",
"PHP setting \"%s\" is not set to \"%s\"." : "Configuração PHP \"%s\" não está definida para \"%s\".",
+ "Adjusting this setting in php.ini will make Nextcloud run again" : "Ajustar esta definição no php.ini fará com que o Nextcloud inicie novamente",
"mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload está configurado para \"%s\" invés do valor habitual de \"0\"",
"To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Para corrigir este problema altere o <code>mbstring.func_overload</code> para <code>0</code> no seu php.ini",
"libxml2 2.7.0 is at least required. Currently %s is installed." : "Necessária pelo menos libxml2 2.7.0. Atualmente %s está instalada.",
@@ -117,11 +215,30 @@
"PostgreSQL >= 9 required" : "Necessita PostgreSQL >= 9",
"Please upgrade your database version" : "Por favor actualize a sua versão da base de dados",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Por favor altere as permissões para 0770 para que esse directório não possa ser listado por outros utilizadores.",
+ "Your data directory is readable by other users" : "O seu directório de dados é legível por outros utilizadores",
+ "Your data directory must be an absolute path" : "O seu directório de dados deve ser um caminho absoluto",
"Check the value of \"datadirectory\" in your configuration" : "Verifique o valor de \"datadirectory\" na sua configuração",
+ "Your data directory is invalid" : "O seu directório de dados é inválido",
+ "Ensure there is a file called \".ocdata\" in the root of the data directory." : "Garanta que existe um ficheiro chamado \".occdata\" na raiz do directório de dados",
"Could not obtain lock type %d on \"%s\"." : "Não foi possível obter o tipo de bloqueio %d em \"%s\".",
"Storage unauthorized. %s" : "Armazenamento desautorizado. %s",
"Storage incomplete configuration. %s" : "Configuração incompleta do armazenamento. %s",
"Storage connection error. %s" : "Erro de ligação ao armazenamento. %s",
- "Storage connection timeout. %s" : "Tempo de ligação ao armazenamento expirou. %s"
+ "Storage is temporarily not available" : "Armazenamento temporariamente indisponível",
+ "Storage connection timeout. %s" : "Tempo de ligação ao armazenamento expirou. %s",
+ "Personal" : "Pessoal",
+ "Admin" : "Admin",
+ "DB Error: \"%s\"" : "Erro de BD:\"%s\"",
+ "Offending command was: \"%s\"" : "O comando transgressor foi:\"%s\"",
+ "Offending command was: \"%s\", name: %s, password: %s" : "O comando transgressor foi: \"%s\", nome: %s, password: %s",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Definição das permissões para %s falhou porque excedem as permissões concedidas a %s",
+ "Setting permissions for %s failed, because the item was not found" : "Definição das permissões para %s falhou porque o item não foi encontrado",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Não é possível remover a data de expiração. Partilhas precisam de ter data de expiração.",
+ "Cannot increase permissions of %s" : "Não é possível aumentar as permissões de %s",
+ "Files can't be shared with delete permissions" : "Ficheiros não podem ser partilhados com permissões para apagar",
+ "Files can't be shared with create permissions" : "Ficheiros não podem ser partilhados com permissões para criar",
+ "Cannot set expiration date more than %s days in the future" : "Não é possível definir data de expiração superior a %s dias no futuro",
+ "No app name specified" : "Nome da aplicação não especificado",
+ "App '%s' could not be installed!" : "Aplicação '%s' não pôde ser instalada"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js
index 084a79561bb..76c7165d87c 100644
--- a/lib/l10n/ru.js
+++ b/lib/l10n/ru.js
@@ -227,6 +227,16 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Неполная конфигурация хранилища. %s",
"Storage connection error. %s" : "Ошибка подключения к хранилищу. %s",
"Storage is temporarily not available" : "Хранилище временно недоступно",
- "Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s"
+ "Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s",
+ "Personal" : "Личное",
+ "Admin" : "Администратор",
+ "DB Error: \"%s\"" : "Ошибка БД: «%s»",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Невозможно очистить дату истечения срока действия. Общие ресурсы должны иметь срок действия.",
+ "Cannot increase permissions of %s" : "Невозможно повысить права доступа %s",
+ "Files can't be shared with delete permissions" : "Права на удаление файлов не позволяют открывать общий доступ к ним",
+ "Files can't be shared with create permissions" : "Права на создание файлов не позволяют открывать общий доступ к ним",
+ "Cannot set expiration date more than %s days in the future" : "Срок окончания не может быть более %s дней (дня)",
+ "No app name specified" : "Не указано имя приложения",
+ "App '%s' could not be installed!" : "Приложение «%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 f9bd45402e8..1ae1702af49 100644
--- a/lib/l10n/ru.json
+++ b/lib/l10n/ru.json
@@ -225,6 +225,16 @@
"Storage incomplete configuration. %s" : "Неполная конфигурация хранилища. %s",
"Storage connection error. %s" : "Ошибка подключения к хранилищу. %s",
"Storage is temporarily not available" : "Хранилище временно недоступно",
- "Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s"
+ "Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s",
+ "Personal" : "Личное",
+ "Admin" : "Администратор",
+ "DB Error: \"%s\"" : "Ошибка БД: «%s»",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Невозможно очистить дату истечения срока действия. Общие ресурсы должны иметь срок действия.",
+ "Cannot increase permissions of %s" : "Невозможно повысить права доступа %s",
+ "Files can't be shared with delete permissions" : "Права на удаление файлов не позволяют открывать общий доступ к ним",
+ "Files can't be shared with create permissions" : "Права на создание файлов не позволяют открывать общий доступ к ним",
+ "Cannot set expiration date more than %s days in the future" : "Срок окончания не может быть более %s дней (дня)",
+ "No app name specified" : "Не указано имя приложения",
+ "App '%s' could not be installed!" : "Приложение «%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/private/App/AppManager.php b/lib/private/App/AppManager.php
index 0e921ba1b7f..4bf15c23fab 100644
--- a/lib/private/App/AppManager.php
+++ b/lib/private/App/AppManager.php
@@ -380,10 +380,10 @@ class AppManager implements IAppManager {
return $data;
}
- public function getAppVersion(string $appId, bool $useCache = true) {
+ public function getAppVersion(string $appId, bool $useCache = true): string {
if(!$useCache || !isset($this->appVersions[$appId])) {
$appInfo = \OC::$server->getAppManager()->getAppInfo($appId);
- $this->appVersions[$appId] = ($appInfo !== null) ? $appInfo['version'] : '0';
+ $this->appVersions[$appId] = ($appInfo !== null && isset($appInfo['version'])) ? $appInfo['version'] : '0';
}
return $this->appVersions[$appId];
}
@@ -397,7 +397,7 @@ class AppManager implements IAppManager {
*
* @internal
*/
- public function getIncompatibleApps($version) {
+ public function getIncompatibleApps(string $version): array {
$apps = $this->getInstalledApps();
$incompatibleApps = array();
foreach ($apps as $appId) {
@@ -411,6 +411,7 @@ class AppManager implements IAppManager {
/**
* @inheritdoc
+ * In case you change this method, also change \OC\App\CodeChecker\InfoChecker::isShipped()
*/
public function isShipped($appId) {
$this->loadShippedJson();
@@ -422,6 +423,10 @@ class AppManager implements IAppManager {
return in_array($appId, $alwaysEnabled, true);
}
+ /**
+ * In case you change this method, also change \OC\App\CodeChecker\InfoChecker::loadShippedJson()
+ * @throws \Exception
+ */
private function loadShippedJson() {
if ($this->shippedApps === null) {
$shippedJson = \OC::$SERVERROOT . '/core/shipped.json';
diff --git a/lib/private/App/AppStore/Fetcher/Fetcher.php b/lib/private/App/AppStore/Fetcher/Fetcher.php
index 8bf9ca15349..4dbc360c0c4 100644
--- a/lib/private/App/AppStore/Fetcher/Fetcher.php
+++ b/lib/private/App/AppStore/Fetcher/Fetcher.php
@@ -174,6 +174,7 @@ abstract class Fetcher {
$this->logger->logException($e, ['app' => 'appstoreFetcher', 'level' => Util::INFO, 'message' => 'Could not connect to appstore']);
return [];
} catch (\Exception $e) {
+ $this->logger->logException($e, ['app' => 'appstoreFetcher', 'level' => Util::INFO]);
return [];
}
}
diff --git a/lib/private/App/CodeChecker/DeprecationCheck.php b/lib/private/App/CodeChecker/DeprecationCheck.php
index c337e71f27e..722697f3313 100644
--- a/lib/private/App/CodeChecker/DeprecationCheck.php
+++ b/lib/private/App/CodeChecker/DeprecationCheck.php
@@ -146,6 +146,8 @@ class DeprecationCheck extends AbstractCheck {
'OCP\IServerContainer::getDb' => '8.1.0',
'OCP\IServerContainer::getHTTPHelper' => '8.1.0',
+ 'OCP\Response::disableCaching' => '14.0.0',
+
'OCP\User::getUser' => '8.0.0',
'OCP\User::getUsers' => '8.1.0',
'OCP\User::getDisplayName' => '8.1.0',
diff --git a/lib/private/App/CodeChecker/InfoChecker.php b/lib/private/App/CodeChecker/InfoChecker.php
index e8791bd7037..f5de6d376d8 100644
--- a/lib/private/App/CodeChecker/InfoChecker.php
+++ b/lib/private/App/CodeChecker/InfoChecker.php
@@ -23,121 +23,88 @@
namespace OC\App\CodeChecker;
-use OC\App\InfoParser;
use OC\Hooks\BasicEmitter;
+use OCP\App\AppPathNotFoundException;
+use OCP\App\IAppManager;
class InfoChecker extends BasicEmitter {
- /** @var InfoParser */
- private $infoParser;
+ /** @var string[] */
+ private $shippedApps;
- private $mandatoryFields = [
- 'author',
- 'description',
- 'dependencies',
- 'id',
- 'licence',
- 'name',
- 'version',
- ];
- private $optionalFields = [
- 'bugs',
- 'category',
- 'default_enable',
- 'documentation',
- 'namespace',
- 'ocsid',
- 'public',
- 'remote',
- 'repository',
- 'types',
- 'website',
- ];
- private $deprecatedFields = [
- 'info',
- 'require',
- 'requiremax',
- 'requiremin',
- 'shipped',
- 'standalone',
- ];
-
- public function __construct(InfoParser $infoParser) {
- $this->infoParser = $infoParser;
- }
+ /** @var string[] */
+ private $alwaysEnabled;
/**
* @param string $appId
* @return array
+ * @throws \RuntimeException
*/
- public function analyse($appId) {
+ public function analyse($appId): array {
$appPath = \OC_App::getAppPath($appId);
if ($appPath === false) {
throw new \RuntimeException("No app with given id <$appId> known.");
}
- $errors = [];
-
- $info = $this->infoParser->parse($appPath . '/appinfo/info.xml');
-
- if (!isset($info['dependencies']['nextcloud']['@attributes']['min-version'])) {
- $errors[] = [
- 'type' => 'missingRequirement',
- 'field' => 'min',
- ];
- $this->emit('InfoChecker', 'missingRequirement', ['min']);
- }
-
- if (!isset($info['dependencies']['nextcloud']['@attributes']['max-version'])) {
- $errors[] = [
- 'type' => 'missingRequirement',
- 'field' => 'max',
- ];
- $this->emit('InfoChecker', 'missingRequirement', ['max']);
- }
-
- foreach ($info as $key => $value) {
- if(is_array($value)) {
- $value = json_encode($value);
- }
- if (in_array($key, $this->mandatoryFields)) {
- $this->emit('InfoChecker', 'mandatoryFieldFound', [$key, $value]);
- continue;
- }
+ $xml = new \DOMDocument();
+ $xml->load($appPath . '/appinfo/info.xml');
- if (in_array($key, $this->optionalFields)) {
- $this->emit('InfoChecker', 'optionalFieldFound', [$key, $value]);
- continue;
+ $schema = \OC::$SERVERROOT . '/resources/app-info.xsd';
+ try {
+ if ($this->isShipped($appId)) {
+ // Shipped apps are allowed to have the public and default_enabled tags
+ $schema = \OC::$SERVERROOT . '/resources/app-info-shipped.xsd';
}
-
- if (in_array($key, $this->deprecatedFields)) {
- // skip empty arrays - empty arrays for remote and public are always added
- if($value === '[]' && in_array($key, ['public', 'remote', 'info'])) {
- continue;
- }
- $this->emit('InfoChecker', 'deprecatedFieldFound', [$key, $value]);
- continue;
- }
-
- $this->emit('InfoChecker', 'unusedFieldFound', [$key, $value]);
+ } catch (\Exception $e) {
+ // Assume it is not shipped
}
- foreach ($this->mandatoryFields as $key) {
- if(!isset($info[$key])) {
- $this->emit('InfoChecker', 'mandatoryFieldMissing', [$key]);
+ $errors = [];
+ if (!$xml->schemaValidate($schema)) {
+ foreach (libxml_get_errors() as $error) {
$errors[] = [
- 'type' => 'mandatoryFieldMissing',
- 'field' => $key,
+ 'type' => 'parseError',
+ 'field' => $error->message,
];
+ $this->emit('InfoChecker', 'parseError', [$error->message]);
}
}
- $versionFile = $appPath . '/appinfo/version';
- if (is_file($versionFile)) {
- $version = trim(file_get_contents($versionFile));
- $this->emit('InfoChecker', 'migrateVersion', [$version]);
- }
-
return $errors;
}
+
+ /**
+ * This is a copy of \OC\App\AppManager::isShipped(), keep both in sync.
+ * This method is copied, so the code checker works even when Nextcloud is
+ * not installed yet. The AppManager requires a database connection, which
+ * fails in that case.
+ *
+ * @param string $appId
+ * @return bool
+ * @throws \Exception
+ */
+ protected function isShipped(string $appId): bool {
+ $this->loadShippedJson();
+ return \in_array($appId, $this->shippedApps, true);
+ }
+
+ /**
+ * This is a copy of \OC\App\AppManager::loadShippedJson(), keep both in sync
+ * This method is copied, so the code checker works even when Nextcloud is
+ * not installed yet. The AppManager requires a database connection, which
+ * fails in that case.
+ *
+ * @throws \Exception
+ */
+ protected function loadShippedJson() {
+ if ($this->shippedApps === null) {
+ $shippedJson = \OC::$SERVERROOT . '/core/shipped.json';
+ if (!file_exists($shippedJson)) {
+ throw new \Exception("File not found: $shippedJson");
+ }
+ $content = json_decode(file_get_contents($shippedJson), true);
+ $this->shippedApps = $content['shippedApps'];
+ $this->alwaysEnabled = $content['alwaysEnabled'];
+ }
+ }
}
diff --git a/lib/private/App/DependencyAnalyzer.php b/lib/private/App/DependencyAnalyzer.php
index 4193ee5083f..e8da5a0b63a 100644
--- a/lib/private/App/DependencyAnalyzer.php
+++ b/lib/private/App/DependencyAnalyzer.php
@@ -140,19 +140,19 @@ class DependencyAnalyzer {
if (isset($dependencies['php']['@attributes']['min-version'])) {
$minVersion = $dependencies['php']['@attributes']['min-version'];
if ($this->compareSmaller($this->platform->getPhpVersion(), $minVersion)) {
- $missing[] = (string)$this->l->t('PHP %s or higher is required.', $minVersion);
+ $missing[] = (string)$this->l->t('PHP %s or higher is required.', [$minVersion]);
}
}
if (isset($dependencies['php']['@attributes']['max-version'])) {
$maxVersion = $dependencies['php']['@attributes']['max-version'];
if ($this->compareBigger($this->platform->getPhpVersion(), $maxVersion)) {
- $missing[] = (string)$this->l->t('PHP with a version lower than %s is required.', $maxVersion);
+ $missing[] = (string)$this->l->t('PHP with a version lower than %s is required.', [$maxVersion]);
}
}
if (isset($dependencies['php']['@attributes']['min-int-size'])) {
$intSize = $dependencies['php']['@attributes']['min-int-size'];
if ($intSize > $this->platform->getIntSize()*8) {
- $missing[] = (string)$this->l->t('%sbit or higher PHP required.', $intSize);
+ $missing[] = (string)$this->l->t('%sbit or higher PHP required.', [$intSize]);
}
}
return $missing;
@@ -209,7 +209,7 @@ class DependencyAnalyzer {
}
$commandName = $this->getValue($command);
if (!$this->platform->isCommandKnown($commandName)) {
- $missing[] = (string)$this->l->t('The command line tool %s could not be found', $commandName);
+ $missing[] = (string)$this->l->t('The command line tool %s could not be found', [$commandName]);
}
}
return $missing;
@@ -236,7 +236,7 @@ class DependencyAnalyzer {
$libName = $this->getValue($lib);
$libVersion = $this->platform->getLibraryVersion($libName);
if (is_null($libVersion)) {
- $missing[] = (string)$this->l->t('The library %s is not available.', $libName);
+ $missing[] = (string)$this->l->t('The library %s is not available.', [$libName]);
continue;
}
diff --git a/lib/private/AppFramework/DependencyInjection/DIContainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php
index 5fe925c2998..44c268bdea6 100644
--- a/lib/private/AppFramework/DependencyInjection/DIContainer.php
+++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php
@@ -152,10 +152,6 @@ class DIContainer extends SimpleContainer implements IAppContainer {
return $c->query('ServerContainer')->getWebRoot();
});
- $this->registerService('fromMailAddress', function() {
- return Util::getDefaultEmailAddress('no-reply');
- });
-
$this->registerService('OC_Defaults', function ($c) {
return $c->getServer()->getThemingDefaults();
});
diff --git a/lib/private/AppFramework/Http/Dispatcher.php b/lib/private/AppFramework/Http/Dispatcher.php
index ecf8462ebb6..7b9ad015de6 100644
--- a/lib/private/AppFramework/Http/Dispatcher.php
+++ b/lib/private/AppFramework/Http/Dispatcher.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -44,9 +45,16 @@ use OCP\IRequest;
*/
class Dispatcher {
+ /** @var MiddlewareDispatcher */
private $middlewareDispatcher;
+
+ /** @var Http */
private $protocol;
+
+ /** @var ControllerMethodReflector */
private $reflector;
+
+ /** @var IRequest */
private $request;
/**
@@ -78,8 +86,8 @@ class Dispatcher {
* the response output
* @throws \Exception
*/
- public function dispatch(Controller $controller, $methodName) {
- $out = array(null, array(), null);
+ public function dispatch(Controller $controller, string $methodName): array {
+ $out = [null, [], null];
try {
// prefill reflector with everything thats needed for the
@@ -97,9 +105,6 @@ class Dispatcher {
} catch(\Exception $exception){
$response = $this->middlewareDispatcher->afterException(
$controller, $methodName, $exception);
- if (is_null($response)) {
- throw $exception;
- }
}
$response = $this->middlewareDispatcher->afterController(
@@ -126,11 +131,11 @@ class Dispatcher {
* @param string $methodName the method on the controller that should be executed
* @return Response
*/
- private function executeController($controller, $methodName) {
- $arguments = array();
+ private function executeController(Controller $controller, string $methodName): Response {
+ $arguments = [];
// valid types that will be casted
- $types = array('int', 'integer', 'bool', 'boolean', 'float');
+ $types = ['int', 'integer', 'bool', 'boolean', 'float'];
foreach($this->reflector->getParameters() as $param => $default) {
@@ -151,14 +156,14 @@ class Dispatcher {
) {
$value = false;
- } elseif($value !== null && in_array($type, $types)) {
+ } elseif($value !== null && \in_array($type, $types, true)) {
settype($value, $type);
}
$arguments[] = $value;
}
- $response = call_user_func_array(array($controller, $methodName), $arguments);
+ $response = \call_user_func_array([$controller, $methodName], $arguments);
// format response
if($response instanceof DataResponse || !($response instanceof Response)) {
diff --git a/lib/private/AppFramework/Http/Request.php b/lib/private/AppFramework/Http/Request.php
index 975c4255d5a..86ba884141f 100644
--- a/lib/private/AppFramework/Http/Request.php
+++ b/lib/private/AppFramework/Http/Request.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -87,8 +88,8 @@ class Request implements \ArrayAccess, \Countable, IRequest {
protected $inputStream;
protected $content;
- protected $items = array();
- protected $allowedKeys = array(
+ protected $items = [];
+ protected $allowedKeys = [
'get',
'post',
'files',
@@ -99,7 +100,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
'parameters',
'method',
'requesttoken',
- );
+ ];
/** @var ISecureRandom */
protected $secureRandom;
/** @var IConfig */
@@ -131,13 +132,13 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @param string $stream
* @see http://www.php.net/manual/en/reserved.variables.php
*/
- public function __construct(array $vars=array(),
+ public function __construct(array $vars= [],
ISecureRandom $secureRandom = null,
IConfig $config,
CsrfTokenManager $csrfTokenManager = null,
- $stream = 'php://input') {
+ string $stream = 'php://input') {
$this->inputStream = $stream;
- $this->items['params'] = array();
+ $this->items['params'] = [];
$this->secureRandom = $secureRandom;
$this->config = $config;
$this->csrfTokenManager = $csrfTokenManager;
@@ -149,7 +150,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
foreach($this->allowedKeys as $name) {
$this->items[$name] = isset($vars[$name])
? $vars[$name]
- : array();
+ : [];
}
$this->items['parameters'] = array_merge(
@@ -175,8 +176,8 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* Countable method
* @return int
*/
- public function count() {
- return count(array_keys($this->items['parameters']));
+ public function count(): int {
+ return \count($this->items['parameters']);
}
/**
@@ -199,13 +200,15 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @param string $offset The key to lookup
* @return boolean
*/
- public function offsetExists($offset) {
+ public function offsetExists($offset): bool {
return isset($this->items['parameters'][$offset]);
}
/**
- * @see offsetExists
- */
+ * @see offsetExists
+ * @param string $offset
+ * @return mixed
+ */
public function offsetGet($offset) {
return isset($this->items['parameters'][$offset])
? $this->items['parameters'][$offset]
@@ -213,15 +216,18 @@ class Request implements \ArrayAccess, \Countable, IRequest {
}
/**
- * @see offsetExists
- */
+ * @see offsetExists
+ * @param string $offset
+ * @param mixed $value
+ */
public function offsetSet($offset, $value) {
throw new \RuntimeException('You cannot change the contents of the request object');
}
/**
- * @see offsetExists
- */
+ * @see offsetExists
+ * @param string $offset
+ */
public function offsetUnset($offset) {
throw new \RuntimeException('You cannot change the contents of the request object');
}
@@ -284,7 +290,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @return bool
*/
public function __isset($name) {
- if (in_array($name, $this->allowedKeys, true)) {
+ if (\in_array($name, $this->allowedKeys, true)) {
return true;
}
return isset($this->items['parameters'][$name]);
@@ -305,9 +311,9 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @param string $name
* @return string
*/
- public function getHeader($name) {
+ public function getHeader(string $name): string {
- $name = strtoupper(str_replace(array('-'),array('_'),$name));
+ $name = strtoupper(str_replace('-', '_',$name));
if (isset($this->server['HTTP_' . $name])) {
return $this->server['HTTP_' . $name];
}
@@ -340,7 +346,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @param mixed $default If the key is not found, this value will be returned
* @return mixed the content of the array
*/
- public function getParam($key, $default = null) {
+ public function getParam(string $key, $default = null) {
return isset($this->parameters[$key])
? $this->parameters[$key]
: $default;
@@ -351,7 +357,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* (as GET or POST) or throuh the URL by the route
* @return array the array with all parameters
*/
- public function getParams() {
+ public function getParams(): array {
return $this->parameters;
}
@@ -359,7 +365,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* Returns the method of the request
* @return string the method of the request (POST, GET, etc)
*/
- public function getMethod() {
+ public function getMethod(): string {
return $this->method;
}
@@ -368,7 +374,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @param string $key the key that will be taken from the $_FILES array
* @return array the file in the $_FILES element
*/
- public function getUploadedFile($key) {
+ public function getUploadedFile(string $key) {
return isset($this->files[$key]) ? $this->files[$key] : null;
}
@@ -377,7 +383,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @param string $key the key that will be taken from the $_ENV array
* @return array the value in the $_ENV element
*/
- public function getEnv($key) {
+ public function getEnv(string $key) {
return isset($this->env[$key]) ? $this->env[$key] : null;
}
@@ -386,7 +392,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @param string $key the key that will be taken from the $_COOKIE array
* @return string the value in the $_COOKIE element
*/
- public function getCookie($key) {
+ public function getCookie(string $key) {
return isset($this->cookies[$key]) ? $this->cookies[$key] : null;
}
@@ -435,7 +441,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
// 'application/json' must be decoded manually.
if (strpos($this->getHeader('Content-Type'), 'application/json') !== false) {
$params = json_decode(file_get_contents($this->inputStream), true);
- if($params !== null && count($params) > 0) {
+ if($params !== null && \count($params) > 0) {
$this->items['params'] = $params;
if($this->method === 'POST') {
$this->items['post'] = $params;
@@ -449,12 +455,12 @@ class Request implements \ArrayAccess, \Countable, IRequest {
&& strpos($this->getHeader('Content-Type'), 'application/x-www-form-urlencoded') !== false) {
parse_str(file_get_contents($this->inputStream), $params);
- if(is_array($params)) {
+ if(\is_array($params)) {
$this->items['params'] = $params;
}
}
- if (is_array($params)) {
+ if (\is_array($params)) {
$this->items['parameters'] = array_merge($this->items['parameters'], $params);
}
$this->contentDecoded = true;
@@ -465,7 +471,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* Checks if the CSRF check was correct
* @return bool true if CSRF check passed
*/
- public function passesCSRFCheck() {
+ public function passesCSRFCheck(): bool {
if($this->csrfTokenManager === null) {
return false;
}
@@ -494,7 +500,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
*
* @return bool
*/
- private function cookieCheckRequired() {
+ private function cookieCheckRequired(): bool {
if ($this->getHeader('OCS-APIREQUEST')) {
return false;
}
@@ -510,7 +516,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
*
* @return array
*/
- public function getCookieParams() {
+ public function getCookieParams(): array {
return session_get_cookie_params();
}
@@ -520,7 +526,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @param string $name
* @return string
*/
- protected function getProtectedCookieName($name) {
+ protected function getProtectedCookieName(string $name): string {
$cookieParams = $this->getCookieParams();
$prefix = '';
if($cookieParams['secure'] === true && $cookieParams['path'] === '/') {
@@ -537,7 +543,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @return bool
* @since 9.1.0
*/
- public function passesStrictCookieCheck() {
+ public function passesStrictCookieCheck(): bool {
if(!$this->cookieCheckRequired()) {
return true;
}
@@ -557,7 +563,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @return bool
* @since 9.1.0
*/
- public function passesLaxCookieCheck() {
+ public function passesLaxCookieCheck(): bool {
if(!$this->cookieCheckRequired()) {
return true;
}
@@ -575,7 +581,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* If `mod_unique_id` is installed this value will be taken.
* @return string
*/
- public function getId() {
+ public function getId(): string {
if(isset($this->server['UNIQUE_ID'])) {
return $this->server['UNIQUE_ID'];
}
@@ -595,11 +601,11 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* Do always use this instead of $_SERVER['REMOTE_ADDR']
* @return string IP address
*/
- public function getRemoteAddress() {
+ public function getRemoteAddress(): string {
$remoteAddress = isset($this->server['REMOTE_ADDR']) ? $this->server['REMOTE_ADDR'] : '';
$trustedProxies = $this->config->getSystemValue('trusted_proxies', []);
- if(is_array($trustedProxies) && in_array($remoteAddress, $trustedProxies)) {
+ if(\is_array($trustedProxies) && \in_array($remoteAddress, $trustedProxies)) {
$forwardedForHeaders = $this->config->getSystemValue('forwarded_for_headers', [
'HTTP_X_FORWARDED_FOR'
// only have one default, so we cannot ship an insecure product out of the box
@@ -625,7 +631,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @param string $type
* @return bool
*/
- private function isOverwriteCondition($type = '') {
+ private function isOverwriteCondition(string $type = ''): bool {
$regex = '/' . $this->config->getSystemValue('overwritecondaddr', '') . '/';
$remoteAddr = isset($this->server['REMOTE_ADDR']) ? $this->server['REMOTE_ADDR'] : '';
return $regex === '//' || preg_match($regex, $remoteAddr) === 1
@@ -637,7 +643,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* and load balancers
* @return string Server protocol (http or https)
*/
- public function getServerProtocol() {
+ public function getServerProtocol(): string {
if($this->config->getSystemValue('overwriteprotocol') !== ''
&& $this->isOverwriteCondition('protocol')) {
return $this->config->getSystemValue('overwriteprotocol');
@@ -671,8 +677,12 @@ class Request implements \ArrayAccess, \Countable, IRequest {
*
* @return string HTTP protocol. HTTP/2, HTTP/1.1 or HTTP/1.0.
*/
- public function getHttpProtocol() {
- $claimedProtocol = strtoupper($this->server['SERVER_PROTOCOL']);
+ public function getHttpProtocol(): string {
+ $claimedProtocol = $this->server['SERVER_PROTOCOL'];
+
+ if (\is_string($claimedProtocol)) {
+ $claimedProtocol = strtoupper($claimedProtocol);
+ }
$validProtocols = [
'HTTP/1.0',
@@ -680,7 +690,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
'HTTP/2',
];
- if(in_array($claimedProtocol, $validProtocols, true)) {
+ if(\in_array($claimedProtocol, $validProtocols, true)) {
return $claimedProtocol;
}
@@ -692,10 +702,10 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* reverse proxies
* @return string
*/
- public function getRequestUri() {
+ public function getRequestUri(): string {
$uri = isset($this->server['REQUEST_URI']) ? $this->server['REQUEST_URI'] : '';
if($this->config->getSystemValue('overwritewebroot') !== '' && $this->isOverwriteCondition()) {
- $uri = $this->getScriptName() . substr($uri, strlen($this->server['SCRIPT_NAME']));
+ $uri = $this->getScriptName() . substr($uri, \strlen($this->server['SCRIPT_NAME']));
}
return $uri;
}
@@ -705,7 +715,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @throws \Exception
* @return string Path info
*/
- public function getRawPathInfo() {
+ public function getRawPathInfo(): string {
$requestUri = isset($this->server['REQUEST_URI']) ? $this->server['REQUEST_URI'] : '';
// remove too many leading slashes - can be caused by reverse proxy configuration
if (strpos($requestUri, '/') === 0) {
@@ -727,16 +737,20 @@ class Request implements \ArrayAccess, \Countable, IRequest {
list($path, $name) = \Sabre\Uri\split($scriptName);
if (!empty($path)) {
if($path === $pathInfo || strpos($pathInfo, $path.'/') === 0) {
- $pathInfo = substr($pathInfo, strlen($path));
+ $pathInfo = substr($pathInfo, \strlen($path));
} else {
throw new \Exception("The requested uri($requestUri) cannot be processed by the script '$scriptName')");
}
}
+ if ($name === null) {
+ $name = '';
+ }
+
if (strpos($pathInfo, '/'.$name) === 0) {
- $pathInfo = substr($pathInfo, strlen($name) + 1);
+ $pathInfo = substr($pathInfo, \strlen($name) + 1);
}
- if (strpos($pathInfo, $name) === 0) {
- $pathInfo = substr($pathInfo, strlen($name));
+ if ($name !== '' && strpos($pathInfo, $name) === 0) {
+ $pathInfo = substr($pathInfo, \strlen($name));
}
if($pathInfo === false || $pathInfo === '/'){
return '';
@@ -770,13 +784,13 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* reverse proxies
* @return string the script name
*/
- public function getScriptName() {
+ public function getScriptName(): string {
$name = $this->server['SCRIPT_NAME'];
$overwriteWebRoot = $this->config->getSystemValue('overwritewebroot');
if ($overwriteWebRoot !== '' && $this->isOverwriteCondition()) {
// FIXME: This code is untestable due to __DIR__, also that hardcoded path is really dangerous
- $serverRoot = str_replace('\\', '/', substr(__DIR__, 0, -strlen('lib/private/appframework/http/')));
- $suburi = str_replace('\\', '/', substr(realpath($this->server['SCRIPT_FILENAME']), strlen($serverRoot)));
+ $serverRoot = str_replace('\\', '/', substr(__DIR__, 0, -\strlen('lib/private/appframework/http/')));
+ $suburi = str_replace('\\', '/', substr(realpath($this->server['SCRIPT_FILENAME']), \strlen($serverRoot)));
$name = '/' . ltrim($overwriteWebRoot . $suburi, '/');
}
return $name;
@@ -787,7 +801,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @param array $agent array of agent names
* @return bool true if at least one of the given agent matches, false otherwise
*/
- public function isUserAgent(array $agent) {
+ public function isUserAgent(array $agent): bool {
if (!isset($this->server['HTTP_USER_AGENT'])) {
return false;
}
@@ -804,7 +818,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* whether it is a trusted domain
* @return string Server host
*/
- public function getInsecureServerHost() {
+ public function getInsecureServerHost(): string {
$host = 'localhost';
if (isset($this->server['HTTP_X_FORWARDED_HOST'])) {
if (strpos($this->server['HTTP_X_FORWARDED_HOST'], ',') !== false) {
@@ -829,7 +843,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* trusted domain if the host isn't in the trusted list
* @return string Server host
*/
- public function getServerHost() {
+ public function getServerHost(): string {
// overwritehost is always trusted
$host = $this->getOverwriteHost();
if ($host !== null) {
diff --git a/lib/private/AppFramework/Middleware/MiddlewareDispatcher.php b/lib/private/AppFramework/Middleware/MiddlewareDispatcher.php
index 60d2ae8b5c9..e1262b6c712 100644
--- a/lib/private/AppFramework/Middleware/MiddlewareDispatcher.php
+++ b/lib/private/AppFramework/Middleware/MiddlewareDispatcher.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -30,7 +31,7 @@ namespace OC\AppFramework\Middleware;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Response;
-use OCP\AppFramework\MiddleWare;
+use OCP\AppFramework\Middleware;
/**
* This class is used to store and run all the middleware in correct order
@@ -53,7 +54,7 @@ class MiddlewareDispatcher {
* Constructor
*/
public function __construct(){
- $this->middlewares = array();
+ $this->middlewares = [];
$this->middlewareCounter = 0;
}
@@ -71,7 +72,7 @@ class MiddlewareDispatcher {
* returns an array with all middleware elements
* @return array the middlewares
*/
- public function getMiddlewares(){
+ public function getMiddlewares(): array {
return $this->middlewares;
}
@@ -84,10 +85,10 @@ class MiddlewareDispatcher {
* @param string $methodName the name of the method that will be called on
* the controller
*/
- public function beforeController(Controller $controller, $methodName){
+ public function beforeController(Controller $controller, string $methodName){
// we need to count so that we know which middlewares we have to ask in
// case there is an exception
- $middlewareCount = count($this->middlewares);
+ $middlewareCount = \count($this->middlewares);
for($i = 0; $i < $middlewareCount; $i++){
$this->middlewareCounter++;
$middleware = $this->middlewares[$i];
@@ -111,7 +112,7 @@ class MiddlewareDispatcher {
* exception
* @throws \Exception the passed in exception if it can't handle it
*/
- public function afterException(Controller $controller, $methodName, \Exception $exception){
+ public function afterException(Controller $controller, string $methodName, \Exception $exception): Response {
for($i=$this->middlewareCounter-1; $i>=0; $i--){
$middleware = $this->middlewares[$i];
try {
@@ -134,8 +135,8 @@ class MiddlewareDispatcher {
* @param Response $response the generated response from the controller
* @return Response a Response object
*/
- public function afterController(Controller $controller, $methodName, Response $response){
- for($i=count($this->middlewares)-1; $i>=0; $i--){
+ public function afterController(Controller $controller, string $methodName, Response $response): Response {
+ for($i= \count($this->middlewares)-1; $i>=0; $i--){
$middleware = $this->middlewares[$i];
$response = $middleware->afterController($controller, $methodName, $response);
}
@@ -153,8 +154,8 @@ class MiddlewareDispatcher {
* @param string $output the generated output from a response
* @return string the output that should be printed
*/
- public function beforeOutput(Controller $controller, $methodName, $output){
- for($i=count($this->middlewares)-1; $i>=0; $i--){
+ public function beforeOutput(Controller $controller, string $methodName, string $output): string {
+ for($i= \count($this->middlewares)-1; $i>=0; $i--){
$middleware = $this->middlewares[$i];
$output = $middleware->beforeOutput($controller, $methodName, $output);
}
diff --git a/lib/private/AppFramework/Middleware/Security/BruteForceMiddleware.php b/lib/private/AppFramework/Middleware/Security/BruteForceMiddleware.php
index 79359b142ac..e09dfdfcb87 100644
--- a/lib/private/AppFramework/Middleware/Security/BruteForceMiddleware.php
+++ b/lib/private/AppFramework/Middleware/Security/BruteForceMiddleware.php
@@ -26,7 +26,6 @@ namespace OC\AppFramework\Middleware\Security;
use OC\AppFramework\Utility\ControllerMethodReflector;
use OC\Security\Bruteforce\Throttler;
-use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Middleware;
use OCP\IRequest;
diff --git a/lib/private/AppFramework/Middleware/Security/RateLimitingMiddleware.php b/lib/private/AppFramework/Middleware/Security/RateLimitingMiddleware.php
index c3b5a844ed5..dca761bdfc0 100644
--- a/lib/private/AppFramework/Middleware/Security/RateLimitingMiddleware.php
+++ b/lib/private/AppFramework/Middleware/Security/RateLimitingMiddleware.php
@@ -27,7 +27,6 @@ namespace OC\AppFramework\Middleware\Security;
use OC\AppFramework\Utility\ControllerMethodReflector;
use OC\Security\RateLimiting\Exception\RateLimitExceededException;
use OC\Security\RateLimiting\Limiter;
-use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Middleware;
diff --git a/lib/private/AppFramework/Utility/ControllerMethodReflector.php b/lib/private/AppFramework/Utility/ControllerMethodReflector.php
index 7c777c52c12..ef4a1959d66 100644
--- a/lib/private/AppFramework/Utility/ControllerMethodReflector.php
+++ b/lib/private/AppFramework/Utility/ControllerMethodReflector.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -42,32 +43,34 @@ class ControllerMethodReflector implements IControllerMethodReflector {
* @param object $object an object or classname
* @param string $method the method which we want to inspect
*/
- public function reflect($object, $method){
+ public function reflect($object, string $method){
$reflection = new \ReflectionMethod($object, $method);
$docs = $reflection->getDocComment();
- // extract everything prefixed by @ and first letter uppercase
- preg_match_all('/^\h+\*\h+@(?P<annotation>[A-Z]\w+)((?P<parameter>.*))?$/m', $docs, $matches);
- foreach($matches['annotation'] as $key => $annontation) {
- $annotationValue = $matches['parameter'][$key];
- if(isset($annotationValue[0]) && $annotationValue[0] === '(' && $annotationValue[strlen($annotationValue) - 1] === ')') {
- $cutString = substr($annotationValue, 1, -1);
- $cutString = str_replace(' ', '', $cutString);
- $splittedArray = explode(',', $cutString);
- foreach($splittedArray as $annotationValues) {
- list($key, $value) = explode('=', $annotationValues);
- $this->annotations[$annontation][$key] = $value;
+ if ($docs !== false) {
+ // extract everything prefixed by @ and first letter uppercase
+ preg_match_all('/^\h+\*\h+@(?P<annotation>[A-Z]\w+)((?P<parameter>.*))?$/m', $docs, $matches);
+ foreach ($matches['annotation'] as $key => $annontation) {
+ $annotationValue = $matches['parameter'][$key];
+ if (isset($annotationValue[0]) && $annotationValue[0] === '(' && $annotationValue[\strlen($annotationValue) - 1] === ')') {
+ $cutString = substr($annotationValue, 1, -1);
+ $cutString = str_replace(' ', '', $cutString);
+ $splittedArray = explode(',', $cutString);
+ foreach ($splittedArray as $annotationValues) {
+ list($key, $value) = explode('=', $annotationValues);
+ $this->annotations[$annontation][$key] = $value;
+ }
+ continue;
}
- continue;
+
+ $this->annotations[$annontation] = [$annotationValue];
}
- $this->annotations[$annontation] = [$annotationValue];
+ // extract type parameter information
+ preg_match_all('/@param\h+(?P<type>\w+)\h+\$(?P<var>\w+)/', $docs, $matches);
+ $this->types = array_combine($matches['var'], $matches['type']);
}
- // extract type parameter information
- preg_match_all('/@param\h+(?P<type>\w+)\h+\$(?P<var>\w+)/', $docs, $matches);
- $this->types = array_combine($matches['var'], $matches['type']);
-
foreach ($reflection->getParameters() as $param) {
// extract type information from PHP 7 scalar types and prefer them
// over phpdoc annotations
@@ -78,10 +81,9 @@ class ControllerMethodReflector implements IControllerMethodReflector {
}
}
+ $default = null;
if($param->isOptional()) {
$default = $param->getDefaultValue();
- } else {
- $default = null;
}
$this->parameters[$param->name] = $default;
}
@@ -94,18 +96,18 @@ class ControllerMethodReflector implements IControllerMethodReflector {
* @return string|null type in the type parameters (@param int $something)
* would return int or null if not existing
*/
- public function getType($parameter) {
+ public function getType(string $parameter) {
if(array_key_exists($parameter, $this->types)) {
return $this->types[$parameter];
- } else {
- return null;
}
+
+ return null;
}
/**
* @return array the arguments of the method with key => default value
*/
- public function getParameters() {
+ public function getParameters(): array {
return $this->parameters;
}
@@ -114,7 +116,7 @@ class ControllerMethodReflector implements IControllerMethodReflector {
* @param string $name the name of the annotation
* @return bool true if the annotation is found
*/
- public function hasAnnotation($name) {
+ public function hasAnnotation(string $name): bool {
return array_key_exists($name, $this->annotations);
}
@@ -125,7 +127,7 @@ class ControllerMethodReflector implements IControllerMethodReflector {
* @param string $key the string of the annotation
* @return string
*/
- public function getAnnotationParameter($name, $key) {
+ public function getAnnotationParameter(string $name, string $key): string {
if(isset($this->annotations[$name][$key])) {
return $this->annotations[$name][$key];
}
diff --git a/lib/private/Avatar.php b/lib/private/Avatar.php
index 4cacc801689..14632075ca1 100644
--- a/lib/private/Avatar.php
+++ b/lib/private/Avatar.php
@@ -263,7 +263,7 @@ class Avatar implements IAvatar {
* @return string
*/
private function generateAvatar($userDisplayName, $size) {
- $text = strtoupper($userDisplayName[0]);
+ $text = mb_strtoupper(mb_substr($userDisplayName, 0, 1), 'UTF-8');
$backgroundColor = $this->avatarBackgroundColor($userDisplayName);
$im = imagecreatetruecolor($size, $size);
@@ -271,7 +271,7 @@ class Avatar implements IAvatar {
$white = imagecolorallocate($im, 255, 255, 255);
imagefilledrectangle($im, 0, 0, $size, $size, $background);
- $font = __DIR__ . '/../../core/fonts/OpenSans-Semibold.woff';
+ $font = __DIR__ . '/../../core/fonts/OpenSans-Semibold.ttf';
$fontSize = $size * 0.4;
$box = imagettfbbox($fontSize, 0, $font, $text);
diff --git a/lib/private/Collaboration/Collaborators/MailPlugin.php b/lib/private/Collaboration/Collaborators/MailPlugin.php
index 2d85ff334bc..b4964825182 100644
--- a/lib/private/Collaboration/Collaborators/MailPlugin.php
+++ b/lib/private/Collaboration/Collaborators/MailPlugin.php
@@ -175,6 +175,8 @@ class MailPlugin implements ISearchPlugin {
if (!$this->shareeEnumeration) {
$result['wide'] = [];
+ } else {
+ $result['wide'] = array_slice($result['wide'], $offset, $limit);
}
if (!$searchResult->hasExactIdMatch($emailType) && filter_var($search, FILTER_VALIDATE_EMAIL)) {
diff --git a/lib/private/Collaboration/Collaborators/RemotePlugin.php b/lib/private/Collaboration/Collaborators/RemotePlugin.php
index b17a64e4ff1..e0f5298f83b 100644
--- a/lib/private/Collaboration/Collaborators/RemotePlugin.php
+++ b/lib/private/Collaboration/Collaborators/RemotePlugin.php
@@ -102,6 +102,8 @@ class RemotePlugin implements ISearchPlugin {
if (!$this->shareeEnumeration) {
$result['wide'] = [];
+ } else {
+ $result['wide'] = array_slice($result['wide'], $offset, $limit);
}
if (!$searchResult->hasExactIdMatch($resultType) && $this->cloudIdManager->isValidCloudId($search) && $offset === 0) {
diff --git a/lib/private/Contacts/ContactsMenu/ContactsStore.php b/lib/private/Contacts/ContactsMenu/ContactsStore.php
index 43600470e1f..73319151d6e 100644
--- a/lib/private/Contacts/ContactsMenu/ContactsStore.php
+++ b/lib/private/Contacts/ContactsMenu/ContactsStore.php
@@ -27,14 +27,12 @@
namespace OC\Contacts\ContactsMenu;
-use OC\Share\Share;
use OCP\Contacts\ContactsMenu\IEntry;
use OCP\Contacts\IManager;
use OCP\IConfig;
use OCP\IGroupManager;
use OCP\IUser;
use OCP\IUserManager;
-use OCP\IUserSession;
use OCP\Contacts\ContactsMenu\IContactsStore;
class ContactsStore implements IContactsStore {
diff --git a/lib/private/DB/MigrationService.php b/lib/private/DB/MigrationService.php
index 29f717b886c..77ac23fe5d2 100644
--- a/lib/private/DB/MigrationService.php
+++ b/lib/private/DB/MigrationService.php
@@ -31,8 +31,6 @@ use OCP\AppFramework\QueryException;
use OCP\IDBConnection;
use OCP\Migration\IMigrationStep;
use OCP\Migration\IOutput;
-use Doctrine\DBAL\Schema\Column;
-use Doctrine\DBAL\Schema\Table;
use Doctrine\DBAL\Types\Type;
class MigrationService {
diff --git a/lib/private/DB/SchemaWrapper.php b/lib/private/DB/SchemaWrapper.php
index 4f05b7b00ef..35aae082699 100644
--- a/lib/private/DB/SchemaWrapper.php
+++ b/lib/private/DB/SchemaWrapper.php
@@ -23,7 +23,6 @@
namespace OC\DB;
-use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Schema\Schema;
use OCP\DB\ISchemaWrapper;
use OCP\IDBConnection;
diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php
index 384e6e5e457..cc655018f8d 100644
--- a/lib/private/Files/Config/UserMountCache.php
+++ b/lib/private/Files/Config/UserMountCache.php
@@ -25,7 +25,6 @@
namespace OC\Files\Config;
-use OC\DB\QueryBuilder\Literal;
use OCA\Files_Sharing\SharedMount;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\Files\Config\ICachedMountFileInfo;
diff --git a/lib/private/Files/ObjectStore/S3ObjectTrait.php b/lib/private/Files/ObjectStore/S3ObjectTrait.php
index defeda4c21a..280a8efa81c 100644
--- a/lib/private/Files/ObjectStore/S3ObjectTrait.php
+++ b/lib/private/Files/ObjectStore/S3ObjectTrait.php
@@ -23,10 +23,7 @@
namespace OC\Files\ObjectStore;
-use Aws\Exception\MultipartUploadException;
-use Aws\S3\MultipartUploader;
use Aws\S3\S3Client;
-use Psr\Http\Message\StreamInterface;
const S3_UPLOAD_PART_SIZE = 524288000; // 500MB
diff --git a/lib/private/Files/ObjectStore/Swift.php b/lib/private/Files/ObjectStore/Swift.php
index a3cba488f5f..4451fbcc750 100644
--- a/lib/private/Files/ObjectStore/Swift.php
+++ b/lib/private/Files/ObjectStore/Swift.php
@@ -25,223 +25,37 @@
namespace OC\Files\ObjectStore;
-use Guzzle\Http\Exception\ClientErrorResponseException;
-use Guzzle\Http\Exception\CurlException;
+use function GuzzleHttp\Psr7\stream_for;
use Icewind\Streams\RetryWrapper;
use OCP\Files\ObjectStore\IObjectStore;
use OCP\Files\StorageAuthException;
-use OCP\Files\StorageNotAvailableException;
-use OpenCloud\Common\Service\Catalog;
-use OpenCloud\Common\Service\CatalogItem;
-use OpenCloud\Identity\Resource\Token;
-use OpenCloud\ObjectStore\Service;
-use OpenCloud\OpenStack;
-use OpenCloud\Rackspace;
class Swift implements IObjectStore {
-
- /**
- * @var \OpenCloud\OpenStack
- */
- private $client;
-
/**
* @var array
*/
private $params;
/**
- * @var \OpenCloud\ObjectStore\Service
- */
- private $objectStoreService;
-
- /**
- * @var \OpenCloud\ObjectStore\Resource\Container
+ * @var \OpenStack\ObjectStore\v1\Models\Container|null
*/
- private $container;
-
- private $memcache;
-
- public function __construct($params) {
- if (isset($params['bucket'])) {
- $params['container'] = $params['bucket'];
- }
- if (!isset($params['container'])) {
- $params['container'] = 'owncloud';
- }
- if (!isset($params['autocreate'])) {
- // should only be true for tests
- $params['autocreate'] = false;
- }
-
- if (isset($params['apiKey'])) {
- $this->client = new Rackspace($params['url'], $params);
- $cacheKey = $params['username'] . '@' . $params['url'] . '/' . $params['bucket'];
- } else {
- $this->client = new OpenStack($params['url'], $params);
- $cacheKey = $params['username'] . '@' . $params['url'] . '/' . $params['bucket'];
- }
+ private $container = null;
- $cacheFactory = \OC::$server->getMemCacheFactory();
- $this->memcache = $cacheFactory->createDistributed('swift::' . $cacheKey);
+ /** @var SwiftFactory */
+ private $swiftFactory;
+ public function __construct($params, SwiftFactory $connectionFactory = null) {
+ $this->swiftFactory = $connectionFactory ?: new SwiftFactory(\OC::$server->getMemCacheFactory()->createDistributed('swift::'), $params);
$this->params = $params;
}
/**
- * @suppress PhanNonClassMethodCall
- */
- protected function init() {
- if ($this->container) {
- return;
- }
-
- $this->importToken();
-
- /** @var Token $token */
- $token = $this->client->getTokenObject();
-
- if (!$token || $token->hasExpired()) {
- try {
- $this->client->authenticate();
- $this->exportToken();
- } catch (ClientErrorResponseException $e) {
- $statusCode = $e->getResponse()->getStatusCode();
- if ($statusCode == 412) {
- throw new StorageAuthException('Precondition failed, verify the keystone url', $e);
- } else if ($statusCode === 401) {
- throw new StorageAuthException('Authentication failed, verify the username, password and possibly tenant', $e);
- } else {
- throw new StorageAuthException('Unknown error', $e);
- }
- }
- }
-
-
- /** @var Catalog $catalog */
- $catalog = $this->client->getCatalog();
-
- if (count($catalog->getItems()) === 0) {
- throw new StorageAuthException('Keystone did not provide a valid catalog, verify the credentials');
- }
-
- if (isset($this->params['serviceName'])) {
- $serviceName = $this->params['serviceName'];
- } else {
- $serviceName = Service::DEFAULT_NAME;
- }
-
- if (isset($this->params['urlType'])) {
- $urlType = $this->params['urlType'];
- if ($urlType !== 'internalURL' && $urlType !== 'publicURL') {
- throw new StorageNotAvailableException('Invalid url type');
- }
- } else {
- $urlType = Service::DEFAULT_URL_TYPE;
- }
-
- $catalogItem = $this->getCatalogForService($catalog, $serviceName);
- if (!$catalogItem) {
- $available = implode(', ', $this->getAvailableServiceNames($catalog));
- throw new StorageNotAvailableException(
- "Service $serviceName not found in service catalog, available services: $available"
- );
- } else if (isset($this->params['region'])) {
- $this->validateRegion($catalogItem, $this->params['region']);
- }
-
- $this->objectStoreService = $this->client->objectStoreService($serviceName, $this->params['region'], $urlType);
-
- try {
- $this->container = $this->objectStoreService->getContainer($this->params['container']);
- } catch (ClientErrorResponseException $ex) {
- // if the container does not exist and autocreate is true try to create the container on the fly
- if (isset($this->params['autocreate']) && $this->params['autocreate'] === true) {
- $this->container = $this->objectStoreService->createContainer($this->params['container']);
- } else {
- throw $ex;
- }
- } catch (CurlException $e) {
- if ($e->getErrorNo() === 7) {
- $host = $e->getCurlHandle()->getUrl()->getHost() . ':' . $e->getCurlHandle()->getUrl()->getPort();
- \OC::$server->getLogger()->error("Can't connect to object storage server at $host");
- throw new StorageNotAvailableException("Can't connect to object storage server at $host", StorageNotAvailableException::STATUS_ERROR, $e);
- }
- throw $e;
- }
- }
-
- private function exportToken() {
- $export = $this->client->exportCredentials();
- $export['catalog'] = array_map(function (CatalogItem $item) {
- return [
- 'name' => $item->getName(),
- 'endpoints' => $item->getEndpoints(),
- 'type' => $item->getType()
- ];
- }, $export['catalog']->getItems());
- $this->memcache->set('token', json_encode($export));
- }
-
- private function importToken() {
- $cachedTokenString = $this->memcache->get('token');
- if ($cachedTokenString) {
- $cachedToken = json_decode($cachedTokenString, true);
- $cachedToken['catalog'] = array_map(function (array $item) {
- $itemClass = new \stdClass();
- $itemClass->name = $item['name'];
- $itemClass->endpoints = array_map(function (array $endpoint) {
- return (object)$endpoint;
- }, $item['endpoints']);
- $itemClass->type = $item['type'];
-
- return $itemClass;
- }, $cachedToken['catalog']);
- try {
- $this->client->importCredentials($cachedToken);
- } catch (\Exception $e) {
- $this->client->setTokenObject(new Token());
- }
- }
- }
-
- /**
- * @param Catalog $catalog
- * @param $name
- * @return null|CatalogItem
+ * @return \OpenStack\ObjectStore\v1\Models\Container
+ * @throws StorageAuthException
+ * @throws \OCP\Files\StorageNotAvailableException
*/
- private function getCatalogForService(Catalog $catalog, $name) {
- foreach ($catalog->getItems() as $item) {
- /** @var CatalogItem $item */
- if ($item->hasType(Service::DEFAULT_TYPE) && $item->hasName($name)) {
- return $item;
- }
- }
-
- return null;
- }
-
- private function validateRegion(CatalogItem $item, $region) {
- $endPoints = $item->getEndpoints();
- foreach ($endPoints as $endPoint) {
- if ($endPoint->region === $region) {
- return;
- }
- }
-
- $availableRegions = implode(', ', array_map(function ($endpoint) {
- return $endpoint->region;
- }, $endPoints));
-
- throw new StorageNotAvailableException("Invalid region '$region', available regions: $availableRegions");
- }
-
- private function getAvailableServiceNames(Catalog $catalog) {
- return array_map(function (CatalogItem $item) {
- return $item->getName();
- }, array_filter($catalog->getItems(), function (CatalogItem $item) {
- return $item->hasType(Service::DEFAULT_TYPE);
- }));
+ private function getContainer() {
+ return $this->swiftFactory->getContainer();
}
/**
@@ -254,29 +68,29 @@ class Swift implements IObjectStore {
/**
* @param string $urn the unified resource name used to identify the object
* @param resource $stream stream with the data to write
- * @throws Exception from openstack lib when something goes wrong
+ * @throws \Exception from openstack lib when something goes wrong
*/
public function writeObject($urn, $stream) {
- $this->init();
- $this->container->uploadObject($urn, $stream);
+ $this->getContainer()->createObject([
+ 'name' => $urn,
+ 'stream' => stream_for($stream)
+ ]);
}
/**
* @param string $urn the unified resource name used to identify the object
* @return resource stream with the read data
- * @throws Exception from openstack lib when something goes wrong
+ * @throws \Exception from openstack lib when something goes wrong
*/
public function readObject($urn) {
- $this->init();
- $object = $this->container->getObject($urn);
+ $object = $this->getContainer()->getObject($urn);
// we need to keep a reference to objectContent or
// the stream will be closed before we can do anything with it
- /** @var $objectContent \Guzzle\Http\EntityBody * */
- $objectContent = $object->getContent();
+ $objectContent = $object->download();
$objectContent->rewind();
- $stream = $objectContent->getStream();
+ $stream = $objectContent->detach();
// save the object content in the context of the stream to prevent it being gc'd until the stream is closed
stream_context_set_option($stream, 'swift', 'content', $objectContent);
@@ -286,17 +100,18 @@ class Swift implements IObjectStore {
/**
* @param string $urn Unified Resource Name
* @return void
- * @throws Exception from openstack lib when something goes wrong
+ * @throws \Exception from openstack lib when something goes wrong
*/
public function deleteObject($urn) {
- $this->init();
- // see https://github.com/rackspace/php-opencloud/issues/243#issuecomment-30032242
- $this->container->dataObject()->setName($urn)->delete();
+ $this->getContainer()->getObject($urn)->delete();
}
- public function deleteContainer($recursive = false) {
- $this->init();
- $this->container->delete($recursive);
+ /**
+ * @return void
+ * @throws \Exception from openstack lib when something goes wrong
+ */
+ public function deleteContainer() {
+ $this->getContainer()->delete();
}
}
diff --git a/lib/private/Files/ObjectStore/SwiftFactory.php b/lib/private/Files/ObjectStore/SwiftFactory.php
new file mode 100644
index 00000000000..0df6fb6efcd
--- /dev/null
+++ b/lib/private/Files/ObjectStore/SwiftFactory.php
@@ -0,0 +1,174 @@
+<?php
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2018 Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Files\ObjectStore;
+
+use GuzzleHttp\Client;
+use GuzzleHttp\Exception\ClientException;
+use GuzzleHttp\Exception\ConnectException;
+use GuzzleHttp\Exception\RequestException;
+use GuzzleHttp\HandlerStack;
+use OCP\Files\StorageAuthException;
+use OCP\Files\StorageNotAvailableException;
+use OCP\ICache;
+use OpenStack\Common\Error\BadResponseError;
+use OpenStack\Identity\v2\Models\Token;
+use OpenStack\Identity\v2\Service;
+use OpenStack\OpenStack;
+use OpenStack\Common\Transport\Utils as TransportUtils;
+use Psr\Http\Message\RequestInterface;
+use OpenStack\ObjectStore\v1\Models\Container;
+
+class SwiftFactory {
+ private $cache;
+ private $params;
+ /** @var Container|null */
+ private $container = null;
+
+ public function __construct(ICache $cache, array $params) {
+ $this->cache = $cache;
+ $this->params = $params;
+ }
+
+ private function getCachedToken(string $cacheKey) {
+ $cachedTokenString = $this->cache->get($cacheKey . '/token');
+ if ($cachedTokenString) {
+ return json_decode($cachedTokenString);
+ } else {
+ return null;
+ }
+ }
+
+ private function cacheToken(Token $token, string $cacheKey) {
+ $this->cache->set($cacheKey . '/token', json_encode($token));
+ }
+
+ /**
+ * @return OpenStack
+ * @throws StorageAuthException
+ */
+ private function getClient() {
+ if (isset($this->params['bucket'])) {
+ $this->params['container'] = $this->params['bucket'];
+ }
+ if (!isset($this->params['container'])) {
+ $this->params['container'] = 'owncloud';
+ }
+ if (!isset($this->params['autocreate'])) {
+ // should only be true for tests
+ $this->params['autocreate'] = false;
+ }
+ if (!isset($this->params['username']) && isset($this->params['user'])) {
+ $this->params['username'] = $this->params['user'];
+ }
+ if (!isset($this->params['tenantName']) && isset($this->params['tenant'])) {
+ $this->params['tenantName'] = $this->params['tenant'];
+ }
+
+ $cacheKey = $this->params['username'] . '@' . $this->params['url'] . '/' . $this->params['bucket'];
+ $token = $this->getCachedToken($cacheKey);
+ $hasToken = is_array($token) && (new \DateTimeImmutable($token['expires_at'])) > (new \DateTimeImmutable('now'));
+ if ($hasToken) {
+ $this->params['cachedToken'] = $token;
+ }
+ $httpClient = new Client([
+ 'base_uri' => TransportUtils::normalizeUrl($this->params['url']),
+ 'handler' => HandlerStack::create()
+ ]);
+
+ $authService = Service::factory($httpClient);
+ $this->params['identityService'] = $authService;
+ $this->params['authUrl'] = $this->params['url'];
+ $client = new OpenStack($this->params);
+
+ if (!$hasToken) {
+ try {
+ $token = $authService->generateToken($this->params);
+ $this->cacheToken($token, $cacheKey);
+ } catch (ConnectException $e) {
+ throw new StorageAuthException('Failed to connect to keystone, verify the keystone url', $e);
+ } catch (ClientException $e) {
+ $statusCode = $e->getResponse()->getStatusCode();
+ if ($statusCode === 404) {
+ throw new StorageAuthException('Keystone not found, verify the keystone url', $e);
+ } else if ($statusCode === 412) {
+ throw new StorageAuthException('Precondition failed, verify the keystone url', $e);
+ } else if ($statusCode === 401) {
+ throw new StorageAuthException('Authentication failed, verify the username, password and possibly tenant', $e);
+ } else {
+ throw new StorageAuthException('Unknown error', $e);
+ }
+ } catch (RequestException $e) {
+ throw new StorageAuthException('Connection reset while connecting to keystone, verify the keystone url', $e);
+ }
+ }
+
+ return $client;
+ }
+
+ /**
+ * @return \OpenStack\ObjectStore\v1\Models\Container
+ * @throws StorageAuthException
+ * @throws StorageNotAvailableException
+ */
+ public function getContainer() {
+ if (is_null($this->container)) {
+ $this->container = $this->createContainer();
+ }
+
+ return $this->container;
+ }
+
+ /**
+ * @return \OpenStack\ObjectStore\v1\Models\Container
+ * @throws StorageAuthException
+ * @throws StorageNotAvailableException
+ */
+ private function createContainer() {
+ $client = $this->getClient();
+ $objectStoreService = $client->objectStoreV1();
+
+ $autoCreate = isset($this->params['autocreate']) && $this->params['autocreate'] === true;
+ try {
+ $container = $objectStoreService->getContainer($this->params['container']);
+ if ($autoCreate) {
+ $container->getMetadata();
+ }
+ return $container;
+ } catch (BadResponseError $ex) {
+ // if the container does not exist and autocreate is true try to create the container on the fly
+ if ($ex->getResponse()->getStatusCode() === 404 && $autoCreate) {
+ return $objectStoreService->createContainer([
+ 'name' => $this->params['container']
+ ]);
+ } else {
+ throw new StorageNotAvailableException('Invalid response while trying to get container info', StorageNotAvailableException::STATUS_ERROR, $e);
+ }
+ } catch (ConnectException $e) {
+ /** @var RequestInterface $request */
+ $request = $e->getRequest();
+ $host = $request->getUri()->getHost() . ':' . $request->getUri()->getPort();
+ \OC::$server->getLogger()->error("Can't connect to object storage server at $host");
+ throw new StorageNotAvailableException("Can't connect to object storage server at $host", StorageNotAvailableException::STATUS_ERROR, $e);
+ }
+ }
+}
diff --git a/lib/private/Files/Storage/DAV.php b/lib/private/Files/Storage/DAV.php
index f9c6175308c..1496fda5140 100644
--- a/lib/private/Files/Storage/DAV.php
+++ b/lib/private/Files/Storage/DAV.php
@@ -35,7 +35,7 @@ namespace OC\Files\Storage;
use Exception;
use GuzzleHttp\Exception\RequestException;
-use GuzzleHttp\Message\ResponseInterface;
+use Psr\Http\Message\ResponseInterface;
use Icewind\Streams\CallbackWrapper;
use OC\Files\Filesystem;
use Icewind\Streams\IteratorDirectory;
@@ -344,7 +344,7 @@ class DAV extends Common {
'auth' => [$this->user, $this->password],
'stream' => true
]);
- } catch (RequestException $e) {
+ } catch (\GuzzleHttp\Exception\ClientException $e) {
if ($e->getResponse() instanceof ResponseInterface
&& $e->getResponse()->getStatusCode() === 404) {
return false;
diff --git a/lib/private/Http/Client/Client.php b/lib/private/Http/Client/Client.php
index 4e6843d7b9f..0387fcabfaf 100644
--- a/lib/private/Http/Client/Client.php
+++ b/lib/private/Http/Client/Client.php
@@ -25,10 +25,13 @@ declare(strict_types=1);
namespace OC\Http\Client;
use GuzzleHttp\Client as GuzzleClient;
+use GuzzleHttp\HandlerStack;
+use GuzzleHttp\Middleware;
use OCP\Http\Client\IClient;
use OCP\Http\Client\IResponse;
use OCP\ICertificateManager;
use OCP\IConfig;
+use Psr\Http\Message\RequestInterface;
/**
* Class Client
@@ -43,17 +46,23 @@ class Client implements IClient {
/** @var ICertificateManager */
private $certificateManager;
private $configured = false;
+ /** @var HandlerStack */
+ private $stack;
/**
* @param IConfig $config
* @param ICertificateManager $certificateManager
* @param GuzzleClient $client
*/
- public function __construct(IConfig $config,
- ICertificateManager $certificateManager,
- GuzzleClient $client) {
+ public function __construct(
+ IConfig $config,
+ ICertificateManager $certificateManager,
+ GuzzleClient $client,
+ HandlerStack $stack
+ ) {
$this->config = $config;
$this->client = $client;
+ $this->stack = $stack;
$this->certificateManager = $certificateManager;
}
@@ -65,25 +74,37 @@ class Client implements IClient {
return;
}
$this->configured = true;
- // Either use user bundle or the system bundle if nothing is specified
+
+ $this->stack->push(Middleware::mapRequest(function (RequestInterface $request) {
+ return $request
+ ->withHeader('User-Agent', 'Nextcloud Server Crawler');
+ }));
+ }
+
+ private function getRequestOptions() {
+ $options = [
+ 'verify' => $this->getCertBundle(),
+ ];
+ $proxyUri = $this->getProxyUri();
+ if ($proxyUri !== '') {
+ $options['proxy'] = $proxyUri;
+ }
+ return $options;
+ }
+
+ private function getCertBundle() {
if ($this->certificateManager->listCertificates() !== []) {
- $this->client->setDefaultOption('verify', $this->certificateManager->getAbsoluteBundlePath());
+ return $this->certificateManager->getAbsoluteBundlePath();
} else {
// If the instance is not yet setup we need to use the static path as
// $this->certificateManager->getAbsoluteBundlePath() tries to instantiiate
// a view
if ($this->config->getSystemValue('installed', false)) {
- $this->client->setDefaultOption('verify', $this->certificateManager->getAbsoluteBundlePath(null));
+ return $this->certificateManager->getAbsoluteBundlePath(null);
} else {
- $this->client->setDefaultOption('verify', \OC::$SERVERROOT . '/resources/config/ca-bundle.crt');
+ return \OC::$SERVERROOT . '/resources/config/ca-bundle.crt';
}
}
-
- $this->client->setDefaultOption('headers/User-Agent', 'Nextcloud Server Crawler');
- $proxyUri = $this->getProxyUri();
- if ($proxyUri !== '') {
- $this->client->setDefaultOption('proxy', $proxyUri);
- }
}
/**
@@ -137,7 +158,7 @@ class Client implements IClient {
*/
public function get(string $uri, array $options = []): IResponse {
$this->setDefaultOptions();
- $response = $this->client->get($uri, $options);
+ $response = $this->client->request('get', $uri, array_merge($options, $this->getRequestOptions()));
$isStream = isset($options['stream']) && $options['stream'];
return new Response($response, $isStream);
}
@@ -168,7 +189,7 @@ class Client implements IClient {
*/
public function head(string $uri, array $options = []): IResponse {
$this->setDefaultOptions();
- $response = $this->client->head($uri, $options);
+ $response = $this->client->request('head', $uri, array_merge($options, $this->getRequestOptions()));
return new Response($response);
}
@@ -203,7 +224,11 @@ class Client implements IClient {
*/
public function post(string $uri, array $options = []): IResponse {
$this->setDefaultOptions();
- $response = $this->client->post($uri, $options);
+ if (isset($options['body']) && is_array($options['body'])) {
+ $options['form_params'] = $options['body'];
+ unset($options['body']);
+ }
+ $response = $this->client->request('post', $uri, array_merge($options, $this->getRequestOptions()));
return new Response($response);
}
@@ -238,7 +263,7 @@ class Client implements IClient {
*/
public function put(string $uri, array $options = []): IResponse {
$this->setDefaultOptions();
- $response = $this->client->put($uri, $options);
+ $response = $this->client->request('put', $uri, array_merge($options, $this->getRequestOptions()));
return new Response($response);
}
@@ -273,7 +298,7 @@ class Client implements IClient {
*/
public function delete(string $uri, array $options = []): IResponse {
$this->setDefaultOptions();
- $response = $this->client->delete($uri, $options);
+ $response = $this->client->request('delete', $uri, array_merge($options, $this->getRequestOptions()));
return new Response($response);
}
@@ -309,7 +334,7 @@ class Client implements IClient {
*/
public function options(string $uri, array $options = []): IResponse {
$this->setDefaultOptions();
- $response = $this->client->options($uri, $options);
+ $response = $this->client->request('options', $uri, array_merge($options, $this->getRequestOptions()));
return new Response($response);
}
}
diff --git a/lib/private/Http/Client/ClientService.php b/lib/private/Http/Client/ClientService.php
index 1df54010a2d..fa8544f07a5 100644
--- a/lib/private/Http/Client/ClientService.php
+++ b/lib/private/Http/Client/ClientService.php
@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace OC\Http\Client;
use GuzzleHttp\Client as GuzzleClient;
+use GuzzleHttp\HandlerStack;
use OCP\Http\Client\IClient;
use OCP\Http\Client\IClientService;
use OCP\ICertificateManager;
@@ -54,6 +55,6 @@ class ClientService implements IClientService {
* @return Client
*/
public function newClient(): IClient {
- return new Client($this->config, $this->certificateManager, new GuzzleClient());
+ return new Client($this->config, $this->certificateManager, new GuzzleClient(), HandlerStack::create());
}
}
diff --git a/lib/private/Http/Client/Response.php b/lib/private/Http/Client/Response.php
index 0ce6cc98e0d..73c14c2926d 100644
--- a/lib/private/Http/Client/Response.php
+++ b/lib/private/Http/Client/Response.php
@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace OC\Http\Client;
use OCP\Http\Client\IResponse;
-use GuzzleHttp\Message\ResponseInterface as GuzzleResponse;
+use Psr\Http\Message\ResponseInterface;
/**
* Class Response
@@ -33,7 +33,7 @@ use GuzzleHttp\Message\ResponseInterface as GuzzleResponse;
* @package OC\Http
*/
class Response implements IResponse {
- /** @var GuzzleResponse */
+ /** @var ResponseInterface */
private $response;
/**
@@ -42,10 +42,10 @@ class Response implements IResponse {
private $stream;
/**
- * @param GuzzleResponse $response
+ * @param ResponseInterface $response
* @param bool $stream
*/
- public function __construct(GuzzleResponse $response, $stream = false) {
+ public function __construct(ResponseInterface $response, $stream = false) {
$this->response = $response;
$this->stream = $stream;
}
@@ -71,7 +71,7 @@ class Response implements IResponse {
* @return string
*/
public function getHeader(string $key): string {
- return $this->response->getHeader($key);
+ return $this->response->getHeader($key)[0];
}
/**
diff --git a/lib/private/Installer.php b/lib/private/Installer.php
index ad2dcb60f20..ab0ef836fbb 100644
--- a/lib/private/Installer.php
+++ b/lib/private/Installer.php
@@ -36,17 +36,12 @@
namespace OC;
use Doctrine\DBAL\Exception\TableExistsException;
-use OC\App\AppManager;
use OC\App\AppStore\Bundles\Bundle;
use OC\App\AppStore\Fetcher\AppFetcher;
-use OC\App\CodeChecker\CodeChecker;
-use OC\App\CodeChecker\EmptyCheck;
-use OC\App\CodeChecker\PrivateCheck;
use OC\Archive\TAR;
use OC_App;
use OC_DB;
use OC_Helper;
-use OCP\App\IAppManager;
use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\ILogger;
@@ -112,12 +107,12 @@ class Installer {
if(!is_array($info)) {
throw new \Exception(
$l->t('App "%s" cannot be installed because appinfo file cannot be read.',
- [$info['name']]
+ [$appId]
)
);
}
- $version = \OCP\Util::getVersion();
+ $version = implode('.', \OCP\Util::getVersion());
if (!\OC_App::isAppCompatible($version, $info)) {
throw new \Exception(
// TODO $l
diff --git a/lib/private/IntegrityCheck/Checker.php b/lib/private/IntegrityCheck/Checker.php
index 771ac891ab4..44544b6770e 100644
--- a/lib/private/IntegrityCheck/Checker.php
+++ b/lib/private/IntegrityCheck/Checker.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -97,9 +98,9 @@ class Checker {
*
* @return bool
*/
- public function isCodeCheckEnforced() {
+ public function isCodeCheckEnforced(): bool {
$notSignedChannels = [ '', 'git'];
- if (in_array($this->environmentHelper->getChannel(), $notSignedChannels, true)) {
+ if (\in_array($this->environmentHelper->getChannel(), $notSignedChannels, true)) {
return false;
}
@@ -108,10 +109,9 @@ class Checker {
* applicable for very specific scenarios and we should not advertise it
* too prominent. So please do not add it to config.sample.php.
*/
+ $isIntegrityCheckDisabled = false;
if ($this->config !== null) {
$isIntegrityCheckDisabled = $this->config->getSystemValue('integrity.check.disabled', false);
- } else {
- $isIntegrityCheckDisabled = false;
}
if ($isIntegrityCheckDisabled === true) {
return false;
@@ -128,7 +128,7 @@ class Checker {
* @return \RecursiveIteratorIterator
* @throws \Exception
*/
- private function getFolderIterator($folderToIterate, $root = '') {
+ private function getFolderIterator(string $folderToIterate, string $root = ''): \RecursiveIteratorIterator {
$dirItr = new \RecursiveDirectoryIterator(
$folderToIterate,
\RecursiveDirectoryIterator::SKIP_DOTS
@@ -156,12 +156,12 @@ class Checker {
* @return array Array of hashes.
*/
private function generateHashes(\RecursiveIteratorIterator $iterator,
- $path) {
+ string $path): array {
$hashes = [];
$copiedWebserverSettingFiles = false;
$tmpFolder = '';
- $baseDirectoryLength = strlen($path);
+ $baseDirectoryLength = \strlen($path);
foreach($iterator as $filename => $data) {
/** @var \DirectoryIterator $data */
if($data->isDir()) {
@@ -220,7 +220,7 @@ class Checker {
if($filename === $this->environmentHelper->getServerRoot() . '/.htaccess') {
$fileContent = file_get_contents($tmpFolder . '/.htaccess');
$explodedArray = explode('#### DO NOT CHANGE ANYTHING ABOVE THIS LINE ####', $fileContent);
- if(count($explodedArray) === 2) {
+ if(\count($explodedArray) === 2) {
$hashes[$relativeFileName] = hash('sha512', $explodedArray[0]);
continue;
}
@@ -238,11 +238,11 @@ class Checker {
* @param array $hashes
* @param X509 $certificate
* @param RSA $privateKey
- * @return string
+ * @return array
*/
private function createSignatureData(array $hashes,
X509 $certificate,
- RSA $privateKey) {
+ RSA $privateKey): array {
ksort($hashes);
$privateKey->setSignatureMode(RSA::SIGNATURE_PSS);
@@ -328,13 +328,18 @@ class Checker {
* @throws InvalidSignatureException
* @throws \Exception
*/
- private function verify($signaturePath, $basePath, $certificateCN) {
+ private function verify(string $signaturePath, string $basePath, string $certificateCN): array {
if(!$this->isCodeCheckEnforced()) {
return [];
}
- $signatureData = json_decode($this->fileAccessHelper->file_get_contents($signaturePath), true);
- if(!is_array($signatureData)) {
+ $content = $this->fileAccessHelper->file_get_contents($signaturePath);
+ $signatureData = null;
+
+ if (\is_string($content)) {
+ $signatureData = json_decode($content, true);
+ }
+ if(!\is_array($signatureData)) {
throw new InvalidSignatureException('Signature data not found.');
}
@@ -422,7 +427,7 @@ class Checker {
*
* @return bool
*/
- public function hasPassedCheck() {
+ public function hasPassedCheck(): bool {
$results = $this->getResults();
if(empty($results)) {
return true;
@@ -434,9 +439,9 @@ class Checker {
/**
* @return array
*/
- public function getResults() {
+ public function getResults(): array {
$cachedResults = $this->cache->get(self::CACHE_KEY);
- if(!is_null($cachedResults)) {
+ if(!\is_null($cachedResults)) {
return json_decode($cachedResults, true);
}
@@ -452,7 +457,7 @@ class Checker {
* @param string $scope
* @param array $result
*/
- private function storeResults($scope, array $result) {
+ private function storeResults(string $scope, array $result) {
$resultArray = $this->getResults();
unset($resultArray[$scope]);
if(!empty($result)) {
@@ -505,7 +510,7 @@ class Checker {
* @param string $path Optional path. If none is given it will be guessed.
* @return array
*/
- public function verifyAppSignature($appId, $path = '') {
+ public function verifyAppSignature(string $appId, string $path = ''): array {
try {
if($path === '') {
$path = $this->appLocator->getAppPath($appId);
@@ -518,7 +523,7 @@ class Checker {
} catch (\Exception $e) {
$result = [
'EXCEPTION' => [
- 'class' => get_class($e),
+ 'class' => \get_class($e),
'message' => $e->getMessage(),
],
];
@@ -558,7 +563,7 @@ class Checker {
*
* @return array
*/
- public function verifyCoreSignature() {
+ public function verifyCoreSignature(): array {
try {
$result = $this->verify(
$this->environmentHelper->getServerRoot() . '/core/signature.json',
@@ -568,7 +573,7 @@ class Checker {
} catch (\Exception $e) {
$result = [
'EXCEPTION' => [
- 'class' => get_class($e),
+ 'class' => \get_class($e),
'message' => $e->getMessage(),
],
];
diff --git a/lib/private/IntegrityCheck/Helpers/AppLocator.php b/lib/private/IntegrityCheck/Helpers/AppLocator.php
index c8d4e1b9b27..9ec5361d9d5 100644
--- a/lib/private/IntegrityCheck/Helpers/AppLocator.php
+++ b/lib/private/IntegrityCheck/Helpers/AppLocator.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -37,7 +38,7 @@ class AppLocator {
* @return string
* @throws \Exception If the app cannot be found
*/
- public function getAppPath($appId) {
+ public function getAppPath(string $appId): string {
$path = \OC_App::getAppPath($appId);
if($path === false) {
@@ -51,7 +52,7 @@ class AppLocator {
*
* @return array
*/
- public function getAllApps() {
+ public function getAllApps(): array {
return \OC_App::getAllApps();
}
}
diff --git a/lib/private/IntegrityCheck/Helpers/EnvironmentHelper.php b/lib/private/IntegrityCheck/Helpers/EnvironmentHelper.php
index c5e91997130..b69af591bc2 100644
--- a/lib/private/IntegrityCheck/Helpers/EnvironmentHelper.php
+++ b/lib/private/IntegrityCheck/Helpers/EnvironmentHelper.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -34,7 +35,7 @@ class EnvironmentHelper {
*
* @return string
*/
- public function getServerRoot() {
+ public function getServerRoot(): string {
return rtrim(\OC::$SERVERROOT, '/');
}
@@ -43,7 +44,7 @@ class EnvironmentHelper {
*
* @return string
*/
- public function getChannel() {
+ public function getChannel(): string {
return \OC_Util::getChannel();
}
}
diff --git a/lib/private/IntegrityCheck/Helpers/FileAccessHelper.php b/lib/private/IntegrityCheck/Helpers/FileAccessHelper.php
index ef8e8b41b3f..e73b84b73c4 100644
--- a/lib/private/IntegrityCheck/Helpers/FileAccessHelper.php
+++ b/lib/private/IntegrityCheck/Helpers/FileAccessHelper.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -36,7 +37,7 @@ class FileAccessHelper {
* @param string $filename
* @return string|false
*/
- public function file_get_contents($filename) {
+ public function file_get_contents(string $filename) {
return file_get_contents($filename);
}
@@ -46,7 +47,7 @@ class FileAccessHelper {
* @param string $filename
* @return bool
*/
- public function file_exists($filename) {
+ public function file_exists(string $filename): bool {
return file_exists($filename);
}
@@ -58,9 +59,9 @@ class FileAccessHelper {
* @return int
* @throws \Exception
*/
- public function file_put_contents($filename, $data) {
+ public function file_put_contents(string $filename, string $data): int {
$bytesWritten = @file_put_contents($filename, $data);
- if ($bytesWritten === false || $bytesWritten !== strlen($data)){
+ if ($bytesWritten === false || $bytesWritten !== \strlen($data)){
throw new \Exception('Failed to write into ' . $filename);
}
return $bytesWritten;
@@ -70,7 +71,7 @@ class FileAccessHelper {
* @param string $path
* @return bool
*/
- public function is_writable($path) {
+ public function is_writable(string $path): bool {
return is_writable($path);
}
@@ -78,7 +79,7 @@ class FileAccessHelper {
* @param string $path
* @throws \Exception
*/
- public function assertDirectoryExists($path) {
+ public function assertDirectoryExists(string $path) {
if (!is_dir($path)) {
throw new \Exception('Directory ' . $path . ' does not exist.');
}
diff --git a/lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php b/lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php
index 4801d7bb748..e0ad6a550e5 100644
--- a/lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php
+++ b/lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -52,7 +53,7 @@ class ExcludeFileByNameFilterIterator extends \RecursiveFilterIterator {
return true;
}
- return !in_array(
+ return !\in_array(
$this->current()->getFilename(),
$this->excludedFilenames,
true
diff --git a/lib/private/IntegrityCheck/Iterator/ExcludeFoldersByPathFilterIterator.php b/lib/private/IntegrityCheck/Iterator/ExcludeFoldersByPathFilterIterator.php
index 31dd05ef312..56524abe6a0 100644
--- a/lib/private/IntegrityCheck/Iterator/ExcludeFoldersByPathFilterIterator.php
+++ b/lib/private/IntegrityCheck/Iterator/ExcludeFoldersByPathFilterIterator.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -24,7 +25,7 @@
namespace OC\IntegrityCheck\Iterator;
class ExcludeFoldersByPathFilterIterator extends \RecursiveFilterIterator {
- private $excludedFolders = [];
+ private $excludedFolders;
public function __construct(\RecursiveIterator $iterator, $root = '') {
parent::__construct($iterator);
@@ -59,7 +60,7 @@ class ExcludeFoldersByPathFilterIterator extends \RecursiveFilterIterator {
* @return bool
*/
public function accept() {
- return !in_array(
+ return !\in_array(
$this->current()->getPathName(),
$this->excludedFolders,
true
diff --git a/lib/private/L10N/L10N.php b/lib/private/L10N/L10N.php
index e9e720a3766..a9b1b7377aa 100644
--- a/lib/private/L10N/L10N.php
+++ b/lib/private/L10N/L10N.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -60,7 +61,6 @@ class L10N implements IL10N {
$this->app = $app;
$this->lang = $lang;
- $this->translations = [];
foreach ($files as $languageFile) {
$this->load($languageFile);
}
@@ -71,20 +71,24 @@ class L10N implements IL10N {
*
* @return string language
*/
- public function getLanguageCode() {
+ public function getLanguageCode(): string {
return $this->lang;
}
/**
* Translating
* @param string $text The text we need a translation for
- * @param array $parameters default:array() Parameters for sprintf
+ * @param array|string $parameters default:array() Parameters for sprintf
* @return string Translation or the same text
*
* Returns the translation. If no translation is found, $text will be
* returned.
*/
- public function t($text, $parameters = array()) {
+ public function t(string $text, $parameters = []): string {
+ if (!\is_array($parameters)) {
+ $parameters = [$parameters];
+ }
+
return (string) new L10NString($this, $text, $parameters);
}
@@ -103,17 +107,17 @@ class L10N implements IL10N {
* provided by the po file.
*
*/
- public function n($text_singular, $text_plural, $count, $parameters = array()) {
+ public function n(string $text_singular, string $text_plural, int $count, array $parameters = []): string {
$identifier = "_${text_singular}_::_${text_plural}_";
if (isset($this->translations[$identifier])) {
return (string) new L10NString($this, $identifier, $parameters, $count);
- } else {
- if ($count === 1) {
- return (string) new L10NString($this, $text_singular, $parameters, $count);
- } else {
- return (string) new L10NString($this, $text_plural, $parameters, $count);
- }
}
+
+ if ($count === 1) {
+ return (string) new L10NString($this, $text_singular, $parameters, $count);
+ }
+
+ return (string) new L10NString($this, $text_plural, $parameters, $count);
}
/**
@@ -138,7 +142,7 @@ class L10N implements IL10N {
* - firstday: Returns the first day of the week (0 sunday - 6 saturday)
* - jsdate: Returns the short JS date format
*/
- public function l($type, $data = null, $options = array()) {
+ public function l(string $type, $data = null, array $options = []) {
// Use the language of the instance
$locale = $this->getLanguageCode();
if ($locale === 'sr@latin') {
@@ -155,14 +159,15 @@ class L10N implements IL10N {
$value = new \DateTime();
if ($data instanceof \DateTime) {
$value = $data;
- } else if (is_string($data) && !is_numeric($data)) {
+ } else if (\is_string($data) && !is_numeric($data)) {
$data = strtotime($data);
$value->setTimestamp($data);
} else if ($data !== null) {
+ $data = (int)$data;
$value->setTimestamp($data);
}
- $options = array_merge(array('width' => 'long'), $options);
+ $options = array_merge(['width' => 'long'], $options);
$width = $options['width'];
switch ($type) {
case 'date':
@@ -184,7 +189,7 @@ class L10N implements IL10N {
* Called by \OC_L10N_String
* @return array
*/
- public function getTranslations() {
+ public function getTranslations(): array {
return $this->translations;
}
@@ -192,10 +197,10 @@ class L10N implements IL10N {
* Returnsed function accepts the argument $n
*
* Called by \OC_L10N_String
- * @return string the plural form function
+ * @return \Closure the plural form function
*/
- public function getPluralFormFunction() {
- if (is_null($this->pluralFormFunction)) {
+ public function getPluralFormFunction(): \Closure {
+ if (\is_null($this->pluralFormFunction)) {
$lang = $this->getLanguageCode();
$this->pluralFormFunction = function($n) use ($lang) {
return PluralizationRules::get($n, $lang);
@@ -206,12 +211,12 @@ class L10N implements IL10N {
}
/**
- * @param $translationFile
+ * @param string $translationFile
* @return bool
*/
- protected function load($translationFile) {
+ protected function load(string $translationFile): bool {
$json = json_decode(file_get_contents($translationFile), true);
- if (!is_array($json)) {
+ if (!\is_array($json)) {
$jsonError = json_last_error();
\OC::$server->getLogger()->warning("Failed to load $translationFile - json error code: $jsonError", ['app' => 'l10n']);
return false;
diff --git a/lib/private/Mail/EMailTemplate.php b/lib/private/Mail/EMailTemplate.php
index 0535dabc13e..38205af366e 100644
--- a/lib/private/Mail/EMailTemplate.php
+++ b/lib/private/Mail/EMailTemplate.php
@@ -420,7 +420,7 @@ EOF;
/**
* Adds a paragraph to the body of the email
*
- * @param string $text
+ * @param string $text Note: When $plainText falls back to this, HTML is automatically escaped in the HTML email
* @param string|bool $plainText Text that is used in the plain text email
* if empty the $text is used, if false none will be used
*/
@@ -430,11 +430,12 @@ EOF;
}
if ($plainText === '') {
$plainText = $text;
+ $text = htmlspecialchars($text);
}
$this->ensureBodyIsOpened();
- $this->htmlBody .= vsprintf($this->bodyText, [htmlspecialchars($text)]);
+ $this->htmlBody .= vsprintf($this->bodyText, [$text]);
if ($plainText !== false) {
$this->plainBody .= $plainText . PHP_EOL . PHP_EOL;
}
@@ -443,8 +444,8 @@ EOF;
/**
* Adds a list item to the body of the email
*
- * @param string $text
- * @param string $metaInfo
+ * @param string $text Note: When $plainText falls back to this, HTML is automatically escaped in the HTML email
+ * @param string $metaInfo Note: When $plainMetaInfo falls back to this, HTML is automatically escaped in the HTML email
* @param string $icon Absolute path, must be 16*16 pixels
* @param string $plainText Text that is used in the plain text email
* if empty the $text is used, if false none will be used
@@ -457,14 +458,16 @@ EOF;
if ($plainText === '') {
$plainText = $text;
+ $text = htmlspecialchars($text);
}
if ($plainMetaInfo === '') {
$plainMetaInfo = $metaInfo;
+ $metaInfo = htmlspecialchars($metaInfo);
}
- $htmlText = htmlspecialchars($text);
+ $htmlText = $text;
if ($metaInfo) {
- $htmlText = '<em style="color:#777;">' . htmlspecialchars($metaInfo) . '</em><br>' . $htmlText;
+ $htmlText = '<em style="color:#777;">' . $metaInfo . '</em><br>' . $htmlText;
}
if ($icon !== '') {
$icon = '<img src="' . htmlspecialchars($icon) . '" alt="&bull;">';
@@ -503,9 +506,9 @@ EOF;
/**
* Adds a button group of two buttons to the body of the email
*
- * @param string $textLeft Text of left button
+ * @param string $textLeft Text of left button; Note: When $plainTextLeft falls back to this, HTML is automatically escaped in the HTML email
* @param string $urlLeft URL of left button
- * @param string $textRight Text of right button
+ * @param string $textRight Text of right button; Note: When $plainTextRight falls back to this, HTML is automatically escaped in the HTML email
* @param string $urlRight URL of right button
* @param string $plainTextLeft Text of left button that is used in the plain text version - if unset the $textLeft is used
* @param string $plainTextRight Text of right button that is used in the plain text version - if unset the $textRight is used
@@ -521,10 +524,12 @@ EOF;
}
if ($plainTextLeft === '') {
$plainTextLeft = $textLeft;
+ $textLeft = htmlspecialchars($textLeft);
}
if ($plainTextRight === '') {
$plainTextRight = $textRight;
+ $textRight = htmlspecialchars($textRight);
}
$this->ensureBodyIsOpened();
@@ -533,7 +538,7 @@ EOF;
$color = $this->themingDefaults->getColorPrimary();
$textColor = $this->themingDefaults->getTextColorPrimary();
- $this->htmlBody .= vsprintf($this->buttonGroup, [$color, $color, $urlLeft, $color, $textColor, $textColor, htmlspecialchars($textLeft), $urlRight, htmlspecialchars($textRight)]);
+ $this->htmlBody .= vsprintf($this->buttonGroup, [$color, $color, $urlLeft, $color, $textColor, $textColor, $textLeft, $urlRight, $textRight]);
$this->plainBody .= $plainTextLeft . ': ' . $urlLeft . PHP_EOL;
$this->plainBody .= $plainTextRight . ': ' . $urlRight . PHP_EOL . PHP_EOL;
@@ -542,7 +547,7 @@ EOF;
/**
* Adds a button to the body of the email
*
- * @param string $text Text of button
+ * @param string $text Text of button; Note: When $plainText falls back to this, HTML is automatically escaped in the HTML email
* @param string $url URL of button
* @param string $plainText Text of button in plain text version
* if empty the $text is used, if false none will be used
@@ -559,11 +564,12 @@ EOF;
if ($plainText === '') {
$plainText = $text;
+ $text = htmlspecialchars($text);
}
$color = $this->themingDefaults->getColorPrimary();
$textColor = $this->themingDefaults->getTextColorPrimary();
- $this->htmlBody .= vsprintf($this->button, [$color, $color, $url, $color, $textColor, $textColor, htmlspecialchars($text)]);
+ $this->htmlBody .= vsprintf($this->button, [$color, $color, $url, $color, $textColor, $textColor, $text]);
if ($plainText !== false) {
$this->plainBody .= $plainText . ': ';
diff --git a/lib/private/NavigationManager.php b/lib/private/NavigationManager.php
index 31d147a3b80..279c899c5fa 100644
--- a/lib/private/NavigationManager.php
+++ b/lib/private/NavigationManager.php
@@ -104,26 +104,61 @@ class NavigationManager implements INavigationManager {
}
/**
- * returns all the added Menu entries
- * @param string $type
- * @return array an array of the added entries
+ * Get a list of navigation entries
+ *
+ * @param string $type type of the navigation entries
+ * @return array
*/
- public function getAll($type = 'link') {
+ public function getAll(string $type = 'link'): array {
$this->init();
foreach ($this->closureEntries as $c) {
$this->add($c());
}
$this->closureEntries = array();
- if ($type === 'all') {
- return $this->entries;
+ $result = $this->entries;
+ if ($type !== 'all') {
+ $result = array_filter($this->entries, function($entry) use ($type) {
+ return $entry['type'] === $type;
+ });
}
- return array_filter($this->entries, function($entry) use ($type) {
- return $entry['type'] === $type;
+ return $this->proceedNavigation($result);
+ }
+
+ /**
+ * Sort navigation entries by order, name and set active flag
+ *
+ * @param array $list
+ * @return array
+ */
+ private function proceedNavigation(array $list): array {
+ usort($list, function($a, $b) {
+ if (isset($a['order']) && isset($b['order'])) {
+ return ($a['order'] < $b['order']) ? -1 : 1;
+ } else if (isset($a['order']) || isset($b['order'])) {
+ return isset($a['order']) ? -1 : 1;
+ } else {
+ return ($a['name'] < $b['name']) ? -1 : 1;
+ }
});
+
+ $activeApp = $this->getActiveEntry();
+ if ($activeApp !== null) {
+ foreach ($list as $index => &$navEntry) {
+ if ($navEntry['id'] == $activeApp) {
+ $navEntry['active'] = true;
+ } else {
+ $navEntry['active'] = false;
+ }
+ }
+ unset($navEntry);
+ }
+
+ return $list;
}
+
/**
* removes all the entries
*/
diff --git a/lib/private/Repair.php b/lib/private/Repair.php
index d787a1c802b..a257ef061e7 100644
--- a/lib/private/Repair.php
+++ b/lib/private/Repair.php
@@ -30,8 +30,6 @@
namespace OC;
-use OC\App\AppStore\Bundles\BundleFetcher;
-use OC\Files\AppData\Factory;
use OC\Repair\CleanTags;
use OC\Repair\ClearFrontendCaches;
use OC\Repair\Collation;
diff --git a/lib/private/Repair/Collation.php b/lib/private/Repair/Collation.php
index 2642985371b..f2cc9373176 100644
--- a/lib/private/Repair/Collation.php
+++ b/lib/private/Repair/Collation.php
@@ -6,6 +6,7 @@
* @author Morris Jobke <hey@morrisjobke.de>
* @author Robin Appelman <robin@icewind.nl>
* @author Thomas Müller <thomas.mueller@tmit.eu>
+ * @author Robin Müller <robin.mueller@1und1.de>
*
* @license AGPL-3.0
*
@@ -124,7 +125,7 @@ class Collation implements IRepairStep {
" FROM INFORMATION_SCHEMA . COLUMNS" .
" WHERE TABLE_SCHEMA = ?" .
" AND (COLLATION_NAME <> '" . $characterSet . "_bin' OR CHARACTER_SET_NAME <> '" . $characterSet . "')" .
- " AND TABLE_NAME LIKE \"*PREFIX*%\"",
+ " AND TABLE_NAME LIKE '*PREFIX*%'",
array($dbName)
);
$rows = $statement->fetchAll();
@@ -139,7 +140,7 @@ class Collation implements IRepairStep {
" FROM INFORMATION_SCHEMA . TABLES" .
" WHERE TABLE_SCHEMA = ?" .
" AND TABLE_COLLATION <> '" . $characterSet . "_bin'" .
- " AND TABLE_NAME LIKE \"*PREFIX*%\"",
+ " AND TABLE_NAME LIKE '*PREFIX*%'",
[$dbName]
);
$rows = $statement->fetchAll();
diff --git a/lib/private/Server.php b/lib/private/Server.php
index 228f0ab5f97..d586bab15b9 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -814,7 +814,7 @@ class Server extends ServerContainer implements IServerContainer {
'cookies' => $_COOKIE,
'method' => (isset($_SERVER) && isset($_SERVER['REQUEST_METHOD']))
? $_SERVER['REQUEST_METHOD']
- : null,
+ : '',
'urlParams' => $urlParams,
],
$this->getSecureRandom(),
diff --git a/lib/private/Share/Share.php b/lib/private/Share/Share.php
index 1798969ca53..e6056679c1c 100644
--- a/lib/private/Share/Share.php
+++ b/lib/private/Share/Share.php
@@ -39,12 +39,7 @@
namespace OC\Share;
-use OC\Files\Filesystem;
use OCP\DB\QueryBuilder\IQueryBuilder;
-use OCP\ILogger;
-use OCP\IUserManager;
-use OCP\IUserSession;
-use OCP\IDBConnection;
use OCP\IConfig;
use OCP\Util;
diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php
index b9ab7a46873..3c56b24707c 100644
--- a/lib/private/Share20/DefaultShareProvider.php
+++ b/lib/private/Share20/DefaultShareProvider.php
@@ -30,7 +30,6 @@
namespace OC\Share20;
use OC\Files\Cache\Cache;
-use OCP\Files\File;
use OCP\Files\Folder;
use OCP\Share\IShareProvider;
use OC\Share20\Exception\InvalidShare;
diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php
index 0ae96f29ded..cddd8c8d92b 100644
--- a/lib/private/Share20/Manager.php
+++ b/lib/private/Share20/Manager.php
@@ -735,7 +735,7 @@ class Manager implements IManager {
$text = $l->t('%s shared »%s« with you.', [$initiatorDisplayName, $filename]);
$emailTemplate->addBodyText(
- $text . ' ' . $l->t('Click the button below to open it.'),
+ htmlspecialchars($text . ' ' . $l->t('Click the button below to open it.')),
$text
);
$emailTemplate->addBodyButton(
diff --git a/lib/private/SystemTag/ManagerFactory.php b/lib/private/SystemTag/ManagerFactory.php
index 12af2523f47..839a819a04a 100644
--- a/lib/private/SystemTag/ManagerFactory.php
+++ b/lib/private/SystemTag/ManagerFactory.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -57,7 +58,7 @@ class ManagerFactory implements ISystemTagManagerFactory {
* @return ISystemTagManager
* @since 9.0.0
*/
- public function getManager() {
+ public function getManager(): ISystemTagManager {
return new SystemTagManager(
$this->serverContainer->getDatabaseConnection(),
$this->serverContainer->getGroupManager(),
@@ -72,7 +73,7 @@ class ManagerFactory implements ISystemTagManagerFactory {
* @return ISystemTagObjectMapper
* @since 9.0.0
*/
- public function getObjectMapper() {
+ public function getObjectMapper(): ISystemTagObjectMapper {
return new SystemTagObjectMapper(
$this->serverContainer->getDatabaseConnection(),
$this->getManager(),
diff --git a/lib/private/SystemTag/SystemTag.php b/lib/private/SystemTag/SystemTag.php
index 15eb15efd9e..3b0cf23c9a8 100644
--- a/lib/private/SystemTag/SystemTag.php
+++ b/lib/private/SystemTag/SystemTag.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -55,7 +56,7 @@ class SystemTag implements ISystemTag {
* @param bool $userVisible whether the tag is user visible
* @param bool $userAssignable whether the tag is user assignable
*/
- public function __construct($id, $name, $userVisible, $userAssignable) {
+ public function __construct(string $id, string $name, bool $userVisible, bool $userAssignable) {
$this->id = $id;
$this->name = $name;
$this->userVisible = $userVisible;
@@ -65,28 +66,28 @@ class SystemTag implements ISystemTag {
/**
* {@inheritdoc}
*/
- public function getId() {
+ public function getId(): string {
return $this->id;
}
/**
* {@inheritdoc}
*/
- public function getName() {
+ public function getName(): string {
return $this->name;
}
/**
* {@inheritdoc}
*/
- public function isUserVisible() {
+ public function isUserVisible(): bool {
return $this->userVisible;
}
/**
* {@inheritdoc}
*/
- public function isUserAssignable() {
+ public function isUserAssignable(): bool {
return $this->userAssignable;
}
}
diff --git a/lib/private/SystemTag/SystemTagManager.php b/lib/private/SystemTag/SystemTagManager.php
index 642ce515801..055b744e5c3 100644
--- a/lib/private/SystemTag/SystemTagManager.php
+++ b/lib/private/SystemTag/SystemTagManager.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -65,6 +66,7 @@ class SystemTagManager implements ISystemTagManager {
* Constructor.
*
* @param IDBConnection $connection database connection
+ * @param IGroupManager $groupManager
* @param EventDispatcherInterface $dispatcher
*/
public function __construct(
@@ -87,8 +89,8 @@ class SystemTagManager implements ISystemTagManager {
/**
* {@inheritdoc}
*/
- public function getTagsByIds($tagIds) {
- if (!is_array($tagIds)) {
+ public function getTagsByIds($tagIds): array {
+ if (!\is_array($tagIds)) {
$tagIds = [$tagIds];
}
@@ -117,7 +119,7 @@ class SystemTagManager implements ISystemTagManager {
$result->closeCursor();
- if (count($tags) !== count($tagIds)) {
+ if (\count($tags) !== \count($tagIds)) {
throw new TagNotFoundException(
'Tag id(s) not found', 0, null, array_diff($tagIds, array_keys($tags))
);
@@ -129,14 +131,14 @@ class SystemTagManager implements ISystemTagManager {
/**
* {@inheritdoc}
*/
- public function getAllTags($visibilityFilter = null, $nameSearchPattern = null) {
+ public function getAllTags($visibilityFilter = null, $nameSearchPattern = null): array {
$tags = [];
$query = $this->connection->getQueryBuilder();
$query->select('*')
->from(self::TAG_TABLE);
- if (!is_null($visibilityFilter)) {
+ if (!\is_null($visibilityFilter)) {
$query->andWhere($query->expr()->eq('visibility', $query->createNamedParameter((int)$visibilityFilter)));
}
@@ -167,14 +169,11 @@ class SystemTagManager implements ISystemTagManager {
/**
* {@inheritdoc}
*/
- public function getTag($tagName, $userVisible, $userAssignable) {
- $userVisible = (int)$userVisible;
- $userAssignable = (int)$userAssignable;
-
+ public function getTag(string $tagName, bool $userVisible, bool $userAssignable): ISystemTag {
$result = $this->selectTagQuery
->setParameter('name', $tagName)
- ->setParameter('visibility', $userVisible)
- ->setParameter('editable', $userAssignable)
+ ->setParameter('visibility', $userVisible ? 1 : 0)
+ ->setParameter('editable', $userAssignable ? 1 : 0)
->execute();
$row = $result->fetch();
@@ -191,16 +190,13 @@ class SystemTagManager implements ISystemTagManager {
/**
* {@inheritdoc}
*/
- public function createTag($tagName, $userVisible, $userAssignable) {
- $userVisible = (int)$userVisible;
- $userAssignable = (int)$userAssignable;
-
+ public function createTag(string $tagName, bool $userVisible, bool $userAssignable): ISystemTag {
$query = $this->connection->getQueryBuilder();
$query->insert(self::TAG_TABLE)
->values([
'name' => $query->createNamedParameter($tagName),
- 'visibility' => $query->createNamedParameter($userVisible),
- 'editable' => $query->createNamedParameter($userAssignable),
+ 'visibility' => $query->createNamedParameter($userVisible ? 1 : 0),
+ 'editable' => $query->createNamedParameter($userAssignable ? 1 : 0),
]);
try {
@@ -216,10 +212,10 @@ class SystemTagManager implements ISystemTagManager {
$tagId = $query->getLastInsertId();
$tag = new SystemTag(
- (int)$tagId,
+ (string)$tagId,
$tagName,
- (bool)$userVisible,
- (bool)$userAssignable
+ $userVisible,
+ $userAssignable
);
$this->dispatcher->dispatch(ManagerEvent::EVENT_CREATE, new ManagerEvent(
@@ -232,10 +228,7 @@ class SystemTagManager implements ISystemTagManager {
/**
* {@inheritdoc}
*/
- public function updateTag($tagId, $tagName, $userVisible, $userAssignable) {
- $userVisible = (int)$userVisible;
- $userAssignable = (int)$userAssignable;
-
+ public function updateTag(string $tagId, string $tagName, bool $userVisible, bool $userAssignable) {
try {
$tags = $this->getTagsByIds($tagId);
} catch (TagNotFoundException $e) {
@@ -246,10 +239,10 @@ class SystemTagManager implements ISystemTagManager {
$beforeUpdate = array_shift($tags);
$afterUpdate = new SystemTag(
- (int) $tagId,
+ $tagId,
$tagName,
- (bool) $userVisible,
- (bool) $userAssignable
+ $userVisible,
+ $userAssignable
);
$query = $this->connection->getQueryBuilder();
@@ -259,8 +252,8 @@ class SystemTagManager implements ISystemTagManager {
->set('editable', $query->createParameter('editable'))
->where($query->expr()->eq('id', $query->createParameter('tagid')))
->setParameter('name', $tagName)
- ->setParameter('visibility', $userVisible)
- ->setParameter('editable', $userAssignable)
+ ->setParameter('visibility', $userVisible ? 1 : 0)
+ ->setParameter('editable', $userAssignable ? 1 : 0)
->setParameter('tagid', $tagId);
try {
@@ -286,7 +279,7 @@ class SystemTagManager implements ISystemTagManager {
* {@inheritdoc}
*/
public function deleteTags($tagIds) {
- if (!is_array($tagIds)) {
+ if (!\is_array($tagIds)) {
$tagIds = [$tagIds];
}
@@ -337,7 +330,7 @@ class SystemTagManager implements ISystemTagManager {
/**
* {@inheritdoc}
*/
- public function canUserAssignTag(ISystemTag $tag, IUser $user) {
+ public function canUserAssignTag(ISystemTag $tag, IUser $user): bool {
// early check to avoid unneeded group lookups
if ($tag->isUserAssignable() && $tag->isUserVisible()) {
return true;
@@ -365,7 +358,7 @@ class SystemTagManager implements ISystemTagManager {
/**
* {@inheritdoc}
*/
- public function canUserSeeTag(ISystemTag $tag, IUser $user) {
+ public function canUserSeeTag(ISystemTag $tag, IUser $user): bool {
if ($tag->isUserVisible()) {
return true;
}
@@ -378,13 +371,13 @@ class SystemTagManager implements ISystemTagManager {
}
private function createSystemTagFromRow($row) {
- return new SystemTag((int)$row['id'], $row['name'], (bool)$row['visibility'], (bool)$row['editable']);
+ return new SystemTag((string)$row['id'], $row['name'], (bool)$row['visibility'], (bool)$row['editable']);
}
/**
* {@inheritdoc}
*/
- public function setTagGroups(ISystemTag $tag, $groupIds) {
+ public function setTagGroups(ISystemTag $tag, array $groupIds) {
// delete relationships first
$this->connection->beginTransaction();
try {
@@ -418,7 +411,7 @@ class SystemTagManager implements ISystemTagManager {
/**
* {@inheritdoc}
*/
- public function getTagGroups(ISystemTag $tag) {
+ public function getTagGroups(ISystemTag $tag): array {
$groupIds = [];
$query = $this->connection->getQueryBuilder();
$query->select('gid')
diff --git a/lib/private/SystemTag/SystemTagObjectMapper.php b/lib/private/SystemTag/SystemTagObjectMapper.php
index 75bf37c652c..8ecc46b4357 100644
--- a/lib/private/SystemTag/SystemTagObjectMapper.php
+++ b/lib/private/SystemTag/SystemTagObjectMapper.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -63,8 +64,8 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
/**
* {@inheritdoc}
*/
- public function getTagIdsForObjects($objIds, $objectType) {
- if (!is_array($objIds)) {
+ public function getTagIdsForObjects($objIds, string $objectType): array {
+ if (!\is_array($objIds)) {
$objIds = [$objIds];
} else if (empty($objIds)) {
return [];
@@ -99,8 +100,8 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
/**
* {@inheritdoc}
*/
- public function getObjectIdsForTags($tagIds, $objectType, $limit = 0, $offset = '') {
- if (!is_array($tagIds)) {
+ public function getObjectIdsForTags($tagIds, string $objectType, int $limit = 0, string $offset = ''): array {
+ if (!\is_array($tagIds)) {
$tagIds = [$tagIds];
}
@@ -113,7 +114,7 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
->andWhere($query->expr()->eq('objecttype', $query->createNamedParameter($objectType)));
if ($limit) {
- if (count($tagIds) !== 1) {
+ if (\count($tagIds) !== 1) {
throw new \InvalidArgumentException('Limit is only allowed with a single tag');
}
@@ -138,8 +139,8 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
/**
* {@inheritdoc}
*/
- public function assignTags($objId, $objectType, $tagIds) {
- if (!is_array($tagIds)) {
+ public function assignTags(string $objId, string $objectType, $tagIds) {
+ if (!\is_array($tagIds)) {
$tagIds = [$tagIds];
}
@@ -173,8 +174,8 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
/**
* {@inheritdoc}
*/
- public function unassignTags($objId, $objectType, $tagIds) {
- if (!is_array($tagIds)) {
+ public function unassignTags(string $objId, string $objectType, $tagIds) {
+ if (!\is_array($tagIds)) {
$tagIds = [$tagIds];
}
@@ -201,10 +202,10 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
/**
* {@inheritdoc}
*/
- public function haveTag($objIds, $objectType, $tagId, $all = true) {
+ public function haveTag($objIds, string $objectType, string $tagId, bool $all = true): bool {
$this->assertTagsExist([$tagId]);
- if (!is_array($objIds)) {
+ if (!\is_array($objIds)) {
$objIds = [$objIds];
}
@@ -232,10 +233,10 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
$result->closeCursor();
if ($all) {
- return ((int)$row[0] === count($objIds));
- } else {
- return (bool) $row;
+ return ((int)$row[0] === \count($objIds));
}
+
+ return (bool) $row;
}
/**
@@ -247,7 +248,7 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
*/
private function assertTagsExist($tagIds) {
$tags = $this->tagManager->getTagsByIds($tagIds);
- if (count($tags) !== count($tagIds)) {
+ if (\count($tags) !== \count($tagIds)) {
// at least one tag missing, bail out
$foundTagIds = array_map(
function(ISystemTag $tag) {
diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php
index d37a8bbabbe..8cc235bf818 100644
--- a/lib/private/TemplateLayout.php
+++ b/lib/private/TemplateLayout.php
@@ -80,9 +80,9 @@ class TemplateLayout extends \OC_Template {
// Add navigation entry
$this->assign( 'application', '');
$this->assign( 'appid', $appId );
- $navigation = \OC_App::getNavigation();
+ $navigation = \OC::$server->getNavigationManager()->getAll();
$this->assign( 'navigation', $navigation);
- $settingsNavigation = \OC_App::getSettingsNavigation();
+ $settingsNavigation = \OC::$server->getNavigationManager()->getAll('settings');
$this->assign( 'settingsnavigation', $settingsNavigation);
foreach($navigation as $entry) {
if ($entry['active']) {
diff --git a/lib/private/Updater.php b/lib/private/Updater.php
index 43096e7c1f8..c70113e1c7d 100644
--- a/lib/private/Updater.php
+++ b/lib/private/Updater.php
@@ -250,7 +250,7 @@ class Updater extends BasicEmitter {
$this->upgradeAppStoreApps(\OC::$server->getAppManager()->getInstalledApps());
// install new shipped apps on upgrade
- OC_App::loadApps('authentication');
+ OC_App::loadApps(['authentication']);
$errors = Installer::installShippedApps(true);
foreach ($errors as $appId => $exception) {
/** @var \Exception $exception */
@@ -346,7 +346,7 @@ class Updater extends BasicEmitter {
if(!isset($stacks[$type])) {
$stacks[$type] = array();
}
- if (\OC_App::isType($appId, $type)) {
+ if (\OC_App::isType($appId, [$type])) {
$stacks[$type][] = $appId;
$priorityType = true;
break;
@@ -385,7 +385,7 @@ class Updater extends BasicEmitter {
private function checkAppsRequirements() {
$isCoreUpgrade = $this->isCodeUpgrade();
$apps = OC_App::getEnabledApps();
- $version = Util::getVersion();
+ $version = implode('.', Util::getVersion());
$disabledApps = [];
$appManager = \OC::$server->getAppManager();
foreach ($apps as $app) {
diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php
index c2b58c37cdb..4ac8888cee1 100644
--- a/lib/private/User/Session.php
+++ b/lib/private/User/Session.php
@@ -55,7 +55,6 @@ use OCP\ILogger;
use OCP\IRequest;
use OCP\ISession;
use OCP\IUser;
-use OCP\IUserManager;
use OCP\IUserSession;
use OCP\Lockdown\ILockdownManager;
use OCP\Security\ISecureRandom;
diff --git a/lib/private/legacy/app.php b/lib/private/legacy/app.php
index b19d63f560e..16e57d43ebc 100644
--- a/lib/private/legacy/app.php
+++ b/lib/private/legacy/app.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
* @copyright Copyright (c) 2016, Lukas Reschke <lukas@statuscode.ch>
@@ -62,21 +63,21 @@ use OCP\App\ManagerEvent;
* upgrading and removing apps.
*/
class OC_App {
- static private $adminForms = array();
- static private $personalForms = array();
- static private $appTypes = array();
- static private $loadedApps = array();
- static private $altLogin = array();
+ static private $adminForms = [];
+ static private $personalForms = [];
+ static private $appTypes = [];
+ static private $loadedApps = [];
+ static private $altLogin = [];
static private $alreadyRegistered = [];
const officialApp = 200;
/**
* clean the appId
*
- * @param string|boolean $app AppId that needs to be cleaned
+ * @param string $app AppId that needs to be cleaned
* @return string
*/
- public static function cleanAppId($app) {
+ public static function cleanAppId(string $app): string {
return str_replace(array('\0', '/', '\\', '..'), '', $app);
}
@@ -86,23 +87,23 @@ class OC_App {
* @param string $app
* @return bool
*/
- public static function isAppLoaded($app) {
+ public static function isAppLoaded(string $app): bool {
return in_array($app, self::$loadedApps, true);
}
/**
* loads all apps
*
- * @param string[] | string | null $types
+ * @param string[] $types
* @return bool
*
* This function walks through the ownCloud directory and loads all apps
* it can find. A directory contains an app if the file /appinfo/info.xml
* exists.
*
- * if $types is set, only apps of those types will be loaded
+ * if $types is set to non-empty array, only apps of those types will be loaded
*/
- public static function loadApps($types = null) {
+ public static function loadApps(array $types = []): bool {
if (\OC::$server->getSystemConfig()->getValue('maintenance', false)) {
return false;
}
@@ -120,7 +121,7 @@ class OC_App {
// prevent app.php from printing output
ob_start();
foreach ($apps as $app) {
- if ((is_null($types) or self::isType($app, $types)) && !in_array($app, self::$loadedApps)) {
+ if (($types === [] or self::isType($app, $types)) && !in_array($app, self::$loadedApps)) {
self::loadApp($app);
}
}
@@ -133,8 +134,9 @@ class OC_App {
* load a single app
*
* @param string $app
+ * @throws Exception
*/
- public static function loadApp($app) {
+ public static function loadApp(string $app) {
self::$loadedApps[] = $app;
$appPath = self::getAppPath($app);
if($appPath === false) {
@@ -146,13 +148,21 @@ class OC_App {
if (is_file($appPath . '/appinfo/app.php')) {
\OC::$server->getEventLogger()->start('load_app_' . $app, 'Load app: ' . $app);
- self::requireAppFile($app);
+ try {
+ self::requireAppFile($app);
+ } catch (Error $ex) {
+ \OC::$server->getLogger()->logException($ex);
+ if (!\OC::$server->getAppManager()->isShipped($app)) {
+ // Only disable apps which are not shipped
+ self::disable($app);
+ }
+ }
if (self::isType($app, array('authentication'))) {
// since authentication apps affect the "is app enabled for group" check,
// the enabled apps cache needs to be cleared to make sure that the
// next time getEnableApps() is called it will also include apps that were
// enabled for groups
- self::$enabledAppsCache = array();
+ self::$enabledAppsCache = [];
}
\OC::$server->getEventLogger()->end('load_app_' . $app);
}
@@ -218,7 +228,7 @@ class OC_App {
* @param string $app
* @param string $path
*/
- public static function registerAutoloading($app, $path) {
+ public static function registerAutoloading(string $app, string $path) {
$key = $app . '-' . $path;
if(isset(self::$alreadyRegistered[$key])) {
return;
@@ -248,31 +258,21 @@ class OC_App {
* Load app.php from the given app
*
* @param string $app app name
+ * @throws Error
*/
- private static function requireAppFile($app) {
- try {
- // encapsulated here to avoid variable scope conflicts
- require_once $app . '/appinfo/app.php';
- } catch (Error $ex) {
- \OC::$server->getLogger()->logException($ex);
- if (!\OC::$server->getAppManager()->isShipped($app)) {
- // Only disable apps which are not shipped
- self::disable($app);
- }
- }
+ private static function requireAppFile(string $app) {
+ // encapsulated here to avoid variable scope conflicts
+ require_once $app . '/appinfo/app.php';
}
/**
* check if an app is of a specific type
*
* @param string $app
- * @param string|array $types
+ * @param array $types
* @return bool
*/
- public static function isType($app, $types) {
- if (is_string($types)) {
- $types = array($types);
- }
+ public static function isType(string $app, array $types): bool {
$appTypes = self::getAppTypes($app);
foreach ($types as $type) {
if (array_search($type, $appTypes) !== false) {
@@ -288,7 +288,7 @@ class OC_App {
* @param string $app
* @return array
*/
- private static function getAppTypes($app) {
+ private static function getAppTypes(string $app): array {
//load the cache
if (count(self::$appTypes) == 0) {
self::$appTypes = \OC::$server->getAppConfig()->getValues(false, 'types');
@@ -296,16 +296,17 @@ class OC_App {
if (isset(self::$appTypes[$app])) {
return explode(',', self::$appTypes[$app]);
- } else {
- return array();
}
+
+ return [];
}
/**
* read app types from info.xml and cache them in the database
*/
- public static function setAppTypes($app) {
- $appData = self::getAppInfo($app);
+ public static function setAppTypes(string $app) {
+ $appManager = \OC::$server->getAppManager();
+ $appData = $appManager->getAppInfo($app);
if(!is_array($appData)) {
return;
}
@@ -317,12 +318,13 @@ class OC_App {
$appData['types'] = [];
}
- \OC::$server->getConfig()->setAppValue($app, 'types', $appTypes);
+ $config = \OC::$server->getConfig();
+ $config->setAppValue($app, 'types', $appTypes);
- if (\OC::$server->getAppManager()->hasProtectedAppType($appData['types'])) {
- $enabled = \OC::$server->getConfig()->getAppValue($app, 'enabled', 'yes');
+ if ($appManager->hasProtectedAppType($appData['types'])) {
+ $enabled = $config->getAppValue($app, 'enabled', 'yes');
if ($enabled !== 'yes' && $enabled !== 'no') {
- \OC::$server->getConfig()->setAppValue($app, 'enabled', 'yes');
+ $config->setAppValue($app, 'enabled', 'yes');
}
}
}
@@ -330,7 +332,7 @@ class OC_App {
/**
* get all enabled apps
*/
- protected static $enabledAppsCache = array();
+ protected static $enabledAppsCache = [];
/**
* Returns apps enabled for the current user.
@@ -340,9 +342,9 @@ class OC_App {
* currently logged in one
* @return string[]
*/
- public static function getEnabledApps($forceRefresh = false, $all = false) {
+ public static function getEnabledApps(bool $forceRefresh = false, bool $all = false): array {
if (!\OC::$server->getSystemConfig()->getValue('installed', false)) {
- return array();
+ return [];
}
// in incognito mode or when logged out, $user will be false,
// which is also the case during an upgrade
@@ -375,7 +377,7 @@ class OC_App {
*
* This function checks whether or not an app is enabled.
*/
- public static function isEnabled($app) {
+ public static function isEnabled(string $app): bool {
return \OC::$server->getAppManager()->isEnabledForUser($app);
}
@@ -389,8 +391,8 @@ class OC_App {
*
* This function set an app as enabled in appconfig.
*/
- public function enable($appId,
- $groups = null) {
+ public function enable(string $appId,
+ array $groups = []) {
self::$enabledAppsCache = []; // flush
// Check if app is already downloaded
@@ -404,7 +406,7 @@ class OC_App {
$installer->installApp($appId);
$appManager = \OC::$server->getAppManager();
- if (!is_null($groups)) {
+ if ($groups !== []) {
$groupManager = \OC::$server->getGroupManager();
$groupsList = [];
foreach ($groups as $group) {
@@ -425,9 +427,9 @@ class OC_App {
* @param string $app app
* @throws Exception
*/
- public static function disable($app) {
+ public static function disable(string $app) {
// flush
- self::$enabledAppsCache = array();
+ self::$enabledAppsCache = [];
// run uninstall steps
$appData = OC_App::getAppInfo($app);
@@ -443,31 +445,6 @@ class OC_App {
$appManager->disableApp($app);
}
- // This is private as well. It simply works, so don't ask for more details
- private static function proceedNavigation($list) {
- usort($list, function($a, $b) {
- if (isset($a['order']) && isset($b['order'])) {
- return ($a['order'] < $b['order']) ? -1 : 1;
- } else if (isset($a['order']) || isset($b['order'])) {
- return isset($a['order']) ? -1 : 1;
- } else {
- return ($a['name'] < $b['name']) ? -1 : 1;
- }
- });
-
- $activeApp = OC::$server->getNavigationManager()->getActiveEntry();
- foreach ($list as $index => &$navEntry) {
- if ($navEntry['id'] == $activeApp) {
- $navEntry['active'] = true;
- } else {
- $navEntry['active'] = false;
- }
- }
- unset($navEntry);
-
- return $list;
- }
-
/**
* Get the path where to install apps
*
@@ -495,18 +472,18 @@ class OC_App {
* @param string $appId
* @return false|string
*/
- public static function findAppInDirectories($appId) {
+ public static function findAppInDirectories(string $appId) {
$sanitizedAppId = self::cleanAppId($appId);
if($sanitizedAppId !== $appId) {
return false;
}
- static $app_dir = array();
+ static $app_dir = [];
if (isset($app_dir[$appId])) {
return $app_dir[$appId];
}
- $possibleApps = array();
+ $possibleApps = [];
foreach (OC::$APPSROOTS as $dir) {
if (file_exists($dir['path'] . '/' . $appId)) {
$possibleApps[] = $dir;
@@ -520,7 +497,7 @@ class OC_App {
$app_dir[$appId] = $dir;
return $dir;
} else {
- $versionToLoad = array();
+ $versionToLoad = [];
foreach ($possibleApps as $possibleApp) {
$version = self::getAppVersionByPath($possibleApp['path']);
if (empty($versionToLoad) || version_compare($version, $versionToLoad['version'], '>')) {
@@ -543,7 +520,7 @@ class OC_App {
* @param string $appId
* @return string|false
*/
- public static function getAppPath($appId) {
+ public static function getAppPath(string $appId) {
if ($appId === null || trim($appId) === '') {
return false;
}
@@ -561,7 +538,7 @@ class OC_App {
* @param string $appId
* @return string|false
*/
- public static function getAppWebPath($appId) {
+ public static function getAppWebPath(string $appId) {
if (($dir = self::findAppInDirectories($appId)) != false) {
return OC::$WEBROOT . $dir['url'] . '/' . $appId;
}
@@ -576,7 +553,7 @@ class OC_App {
* @return string
* @deprecated 14.0.0 use \OC::$server->getAppManager()->getAppVersion()
*/
- public static function getAppVersion($appId, $useCache = true) {
+ public static function getAppVersion(string $appId, bool $useCache = true): string {
return \OC::$server->getAppManager()->getAppVersion($appId, $useCache);
}
@@ -586,7 +563,7 @@ class OC_App {
* @param string $path
* @return string
*/
- public static function getAppVersionByPath($path) {
+ public static function getAppVersionByPath(string $path): string {
$infoFile = $path . '/appinfo/info.xml';
$appData = \OC::$server->getAppManager()->getAppInfo($infoFile, true);
return isset($appData['version']) ? $appData['version'] : '';
@@ -603,7 +580,7 @@ class OC_App {
* @note all data is read from info.xml, not just pre-defined fields
* @deprecated 14.0.0 use \OC::$server->getAppManager()->getAppInfo()
*/
- public static function getAppInfo($appId, $path = false, $lang = null) {
+ public static function getAppInfo(string $appId, bool $path = false, string $lang = null) {
return \OC::$server->getAppManager()->getAppInfo($appId, $path, $lang);
}
@@ -611,28 +588,28 @@ class OC_App {
* Returns the navigation
*
* @return array
+ * @deprecated 14.0.0 use \OC::$server->getNavigationManager()->getAll()
*
* This function returns an array containing all entries added. The
* entries are sorted by the key 'order' ascending. Additional to the keys
* given for each app the following keys exist:
* - active: boolean, signals if the user is on this navigation entry
*/
- public static function getNavigation() {
- $entries = OC::$server->getNavigationManager()->getAll();
- return self::proceedNavigation($entries);
+ public static function getNavigation(): array {
+ return OC::$server->getNavigationManager()->getAll();
}
/**
* Returns the Settings Navigation
*
* @return string[]
+ * @deprecated 14.0.0 use \OC::$server->getNavigationManager()->getAll('settings')
*
* This function returns an array containing all settings pages added. The
* entries are sorted by the key 'order' ascending.
*/
- public static function getSettingsNavigation() {
- $entries = OC::$server->getNavigationManager()->getAll('settings');
- return self::proceedNavigation($entries);
+ public static function getSettingsNavigation(): array {
+ return OC::$server->getNavigationManager()->getAll('settings');
}
/**
@@ -640,7 +617,7 @@ class OC_App {
*
* @return string
*/
- public static function getCurrentApp() {
+ public static function getCurrentApp(): string {
$request = \OC::$server->getRequest();
$script = substr($request->getScriptName(), strlen(OC::$WEBROOT) + 1);
$topFolder = substr($script, 0, strpos($script, '/') ?: 0);
@@ -652,7 +629,7 @@ class OC_App {
}
if ($topFolder == 'apps') {
$length = strlen($topFolder);
- return substr($script, $length + 1, strpos($script, '/', $length + 1) - $length - 1);
+ return substr($script, $length + 1, strpos($script, '/', $length + 1) - $length - 1) ?: '';
} else {
return $topFolder;
}
@@ -662,8 +639,8 @@ class OC_App {
* @param string $type
* @return array
*/
- public static function getForms($type) {
- $forms = array();
+ public static function getForms(string $type): array {
+ $forms = [];
switch ($type) {
case 'admin':
$source = self::$adminForms;
@@ -672,7 +649,7 @@ class OC_App {
$source = self::$personalForms;
break;
default:
- return array();
+ return [];
}
foreach ($source as $form) {
$forms[] = include $form;
@@ -686,7 +663,7 @@ class OC_App {
* @param string $app
* @param string $page
*/
- public static function registerAdmin($app, $page) {
+ public static function registerAdmin(string $app, string $page) {
self::$adminForms[] = $app . '/' . $page . '.php';
}
@@ -695,7 +672,7 @@ class OC_App {
* @param string $app
* @param string $page
*/
- public static function registerPersonal($app, $page) {
+ public static function registerPersonal(string $app, string $page) {
self::$personalForms[] = $app . '/' . $page . '.php';
}
@@ -709,7 +686,7 @@ class OC_App {
/**
* @return array
*/
- public static function getAlternativeLogIns() {
+ public static function getAlternativeLogIns(): array {
return self::$altLogin;
}
@@ -719,9 +696,9 @@ class OC_App {
* @return array an array of app names (string IDs)
* @todo: change the name of this method to getInstalledApps, which is more accurate
*/
- public static function getAllApps() {
+ public static function getAllApps(): array {
- $apps = array();
+ $apps = [];
foreach (OC::$APPSROOTS as $apps_dir) {
if (!is_readable($apps_dir['path'])) {
@@ -751,13 +728,13 @@ class OC_App {
*
* @return array
*/
- public function listAllApps() {
+ public function listAllApps(): array {
$installedApps = OC_App::getAllApps();
$appManager = \OC::$server->getAppManager();
//we don't want to show configuration for these
$blacklist = $appManager->getAlwaysEnabledApps();
- $appList = array();
+ $appList = [];
$langCode = \OC::$server->getL10N('core')->getLanguageCode();
$urlGenerator = \OC::$server->getURLGenerator();
@@ -832,7 +809,7 @@ class OC_App {
return $appList;
}
- public static function shouldUpgrade($app) {
+ public static function shouldUpgrade(string $app): bool {
$versions = self::getAppVersions();
$currentVersion = OC_App::getAppVersion($app);
if ($currentVersion && isset($versions[$app])) {
@@ -852,7 +829,7 @@ class OC_App {
* @param string $version2 version to take the number of parts from
* @return string shortened $version1
*/
- private static function adjustVersionParts($version1, $version2) {
+ private static function adjustVersionParts(string $version1, string $version2): string {
$version1 = explode('.', $version1);
$version2 = explode('.', $version2);
// reduce $version1 to match the number of parts in $version2
@@ -882,7 +859,7 @@ class OC_App {
*
* @return boolean true if compatible, otherwise false
*/
- public static function isAppCompatible($ocVersion, $appInfo) {
+ public static function isAppCompatible(string $ocVersion, array $appInfo): bool {
$requireMin = '';
$requireMax = '';
if (isset($appInfo['dependencies']['nextcloud']['@attributes']['min-version'])) {
@@ -903,10 +880,6 @@ class OC_App {
$requireMax = $appInfo['requiremax'];
}
- if (is_array($ocVersion)) {
- $ocVersion = implode('.', $ocVersion);
- }
-
if (!empty($requireMin)
&& version_compare(self::adjustVersionParts($ocVersion, $requireMin), $requireMin, '<')
) {
@@ -942,7 +915,7 @@ class OC_App {
* @param string $appId
* @return bool
*/
- public static function updateApp($appId) {
+ public static function updateApp(string $appId): bool {
$appPath = self::getAppPath($appId);
if($appPath === false) {
return false;
@@ -1001,7 +974,7 @@ class OC_App {
* @param string[] $steps
* @throws \OC\NeedsUpdateException
*/
- public static function executeRepairSteps($appId, array $steps) {
+ public static function executeRepairSteps(string $appId, array $steps) {
if (empty($steps)) {
return;
}
@@ -1035,7 +1008,7 @@ class OC_App {
* @param string $appId
* @param string[] $steps
*/
- private static function setupLiveMigrations($appId, array $steps) {
+ private static function setupLiveMigrations(string $appId, array $steps) {
$queue = \OC::$server->getJobList();
foreach ($steps as $step) {
$queue->add('OC\Migration\BackgroundRepair', [
@@ -1048,7 +1021,7 @@ class OC_App {
* @param string $appId
* @return \OC\Files\View|false
*/
- public static function getStorage($appId) {
+ public static function getStorage(string $appId) {
if (\OC::$server->getAppManager()->isEnabledForUser($appId)) { //sanity check
if (\OC::$server->getUserSession()->isLoggedIn()) {
$view = new \OC\Files\View('/' . OC_User::getUser());
@@ -1066,7 +1039,7 @@ class OC_App {
}
}
- protected static function findBestL10NOption($options, $lang) {
+ protected static function findBestL10NOption(array $options, string $lang): string {
$fallback = $similarLangFallback = $englishFallback = false;
$lang = strtolower($lang);
@@ -1118,7 +1091,7 @@ class OC_App {
* @param string $lang
* @return array improved app data
*/
- public static function parseAppInfo(array $data, $lang = null) {
+ public static function parseAppInfo(array $data, $lang = null): array {
if ($lang && isset($data['name']) && is_array($data['name'])) {
$data['name'] = self::findBestL10NOption($data['name'], $lang);
@@ -1143,7 +1116,7 @@ class OC_App {
* @param array $info
* @throws \Exception
*/
- public static function checkAppDependencies($config, $l, $info) {
+ public static function checkAppDependencies(\OCP\IConfig $config, \OCP\IL10N $l, array $info) {
$dependencyAnalyzer = new DependencyAnalyzer(new Platform($config), $l);
$missing = $dependencyAnalyzer->analyze($info);
if (!empty($missing)) {
diff --git a/lib/private/legacy/files.php b/lib/private/legacy/files.php
index 24324bca095..def9f82fab9 100644
--- a/lib/private/legacy/files.php
+++ b/lib/private/legacy/files.php
@@ -75,7 +75,9 @@ class OC_Files {
private static function sendHeaders($filename, $name, array $rangeArray) {
OC_Response::setContentDispositionHeader($name, 'attachment');
header('Content-Transfer-Encoding: binary', true);
- OC_Response::disableCaching();
+ header('Pragma: public');// enable caching in IE
+ header('Expires: 0');
+ header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
$fileSize = \OC\Files\Filesystem::filesize($filename);
$type = \OC::$server->getMimeTypeDetector()->getSecureMimeType(\OC\Files\Filesystem::getMimeType($filename));
if ($fileSize > -1) {
diff --git a/lib/private/legacy/response.php b/lib/private/legacy/response.php
index 975ff570485..1b0b01de972 100644
--- a/lib/private/legacy/response.php
+++ b/lib/private/legacy/response.php
@@ -55,7 +55,7 @@ class OC_Response {
header('Cache-Control: max-age='.$cache_time.', must-revalidate');
}
else {
- self::setExpiresHeader(0);
+ header('Expires: 0');
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
}
}
@@ -67,14 +67,6 @@ class OC_Response {
}
/**
- * disable browser caching
- * @see enableCaching with cache_time = 0
- */
- static public function disableCaching() {
- self::enableCaching(0);
- }
-
- /**
* Set response status
* @param int $status a HTTP status code, see also the STATUS constants
*/
diff --git a/lib/public/App/IAppManager.php b/lib/public/App/IAppManager.php
index 0c087b61515..f0f14061e35 100644
--- a/lib/public/App/IAppManager.php
+++ b/lib/public/App/IAppManager.php
@@ -51,10 +51,10 @@ interface IAppManager {
*
* @param string $appId
* @param bool $useCache
- * @return mixed
+ * @return string
* @since 14.0.0
*/
- public function getAppVersion(string $appId, bool $useCache = true);
+ public function getAppVersion(string $appId, bool $useCache = true): string;
/**
* Check if an app is enabled for user
diff --git a/lib/public/AppFramework/Http/Response.php b/lib/public/AppFramework/Http/Response.php
index e47e01349e7..512b312dae1 100644
--- a/lib/public/AppFramework/Http/Response.php
+++ b/lib/public/AppFramework/Http/Response.php
@@ -232,11 +232,11 @@ class Response {
/**
* By default renders no output
- * @return string|null
+ * @return string
* @since 6.0.0
*/
public function render() {
- return null;
+ return '';
}
diff --git a/lib/public/AppFramework/Utility/IControllerMethodReflector.php b/lib/public/AppFramework/Utility/IControllerMethodReflector.php
index e9fb4a5a969..e2074b9fe00 100644
--- a/lib/public/AppFramework/Utility/IControllerMethodReflector.php
+++ b/lib/public/AppFramework/Utility/IControllerMethodReflector.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -40,7 +41,7 @@ interface IControllerMethodReflector {
* @return void
* @since 8.0.0
*/
- public function reflect($object, $method);
+ public function reflect($object, string $method);
/**
* Inspects the PHPDoc parameters for types
@@ -51,13 +52,13 @@ interface IControllerMethodReflector {
* would return int or null if not existing
* @since 8.0.0
*/
- public function getType($parameter);
+ public function getType(string $parameter);
/**
* @return array the arguments of the method with key => default value
* @since 8.0.0
*/
- public function getParameters();
+ public function getParameters(): array;
/**
* Check if a method contains an annotation
@@ -66,6 +67,6 @@ interface IControllerMethodReflector {
* @return bool true if the annotation is found
* @since 8.0.0
*/
- public function hasAnnotation($name);
+ public function hasAnnotation(string $name): bool;
}
diff --git a/lib/public/IL10N.php b/lib/public/IL10N.php
index 7af5008b814..2e55c151f62 100644
--- a/lib/public/IL10N.php
+++ b/lib/public/IL10N.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -44,14 +45,14 @@ interface IL10N {
/**
* Translating
* @param string $text The text we need a translation for
- * @param array $parameters default:array() Parameters for sprintf
+ * @param array|string $parameters default:array() Parameters for sprintf
* @return string Translation or the same text
*
* Returns the translation. If no translation is found, $text will be
* returned.
* @since 6.0.0
*/
- public function t($text, $parameters = array());
+ public function t(string $text, $parameters = []): string;
/**
* Translating
@@ -69,7 +70,7 @@ interface IL10N {
* @since 6.0.0
*
*/
- public function n($text_singular, $text_plural, $count, $parameters = array());
+ public function n(string $text_singular, string $text_plural, int $count, array $parameters = []): string;
/**
* Localization
@@ -96,7 +97,7 @@ interface IL10N {
* - params: timestamp (int/string)
* @since 6.0.0 - parameter $options was added in 8.0.0
*/
- public function l($type, $data, $options = array());
+ public function l(string $type, $data, array $options = []);
/**
@@ -105,5 +106,5 @@ interface IL10N {
* @return string language
* @since 7.0.0
*/
- public function getLanguageCode();
+ public function getLanguageCode(): string ;
}
diff --git a/lib/public/INavigationManager.php b/lib/public/INavigationManager.php
index 216f8a897d8..77b881b8b15 100644
--- a/lib/public/INavigationManager.php
+++ b/lib/public/INavigationManager.php
@@ -57,4 +57,13 @@ interface INavigationManager {
* @since 6.0.0
*/
public function setActiveEntry($appId);
+
+ /**
+ * Get a list of navigation entries
+ *
+ * @param string $type type of the navigation entries
+ * @return array
+ * @since 14.0.0
+ */
+ public function getAll(string $type = 'link'): array;
}
diff --git a/lib/public/IRequest.php b/lib/public/IRequest.php
index a14b6b5f459..b3130207111 100644
--- a/lib/public/IRequest.php
+++ b/lib/public/IRequest.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -95,7 +96,7 @@ interface IRequest {
* @return string
* @since 6.0.0
*/
- public function getHeader($name);
+ public function getHeader(string $name): string;
/**
* Lets you access post and get parameters by the index
@@ -111,7 +112,7 @@ interface IRequest {
* @return mixed the content of the array
* @since 6.0.0
*/
- public function getParam($key, $default = null);
+ public function getParam(string $key, $default = null);
/**
@@ -122,7 +123,7 @@ interface IRequest {
* @return array the array with all parameters
* @since 6.0.0
*/
- public function getParams();
+ public function getParams(): array;
/**
* Returns the method of the request
@@ -130,7 +131,7 @@ interface IRequest {
* @return string the method of the request (POST, GET, etc)
* @since 6.0.0
*/
- public function getMethod();
+ public function getMethod(): string;
/**
* Shortcut for accessing an uploaded file through the $_FILES array
@@ -139,7 +140,7 @@ interface IRequest {
* @return array the file in the $_FILES element
* @since 6.0.0
*/
- public function getUploadedFile($key);
+ public function getUploadedFile(string $key);
/**
@@ -149,7 +150,7 @@ interface IRequest {
* @return array the value in the $_ENV element
* @since 6.0.0
*/
- public function getEnv($key);
+ public function getEnv(string $key);
/**
@@ -159,7 +160,7 @@ interface IRequest {
* @return string|null the value in the $_COOKIE element
* @since 6.0.0
*/
- public function getCookie($key);
+ public function getCookie(string $key);
/**
@@ -168,7 +169,7 @@ interface IRequest {
* @return bool true if CSRF check passed
* @since 6.0.0
*/
- public function passesCSRFCheck();
+ public function passesCSRFCheck(): bool;
/**
* Checks if the strict cookie has been sent with the request if the request
@@ -177,7 +178,7 @@ interface IRequest {
* @return bool
* @since 9.0.0
*/
- public function passesStrictCookieCheck();
+ public function passesStrictCookieCheck(): bool;
/**
* Checks if the lax cookie has been sent with the request if the request
@@ -186,7 +187,7 @@ interface IRequest {
* @return bool
* @since 9.0.0
*/
- public function passesLaxCookieCheck();
+ public function passesLaxCookieCheck(): bool;
/**
* Returns an ID for the request, value is not guaranteed to be unique and is mostly meant for logging
@@ -195,7 +196,7 @@ interface IRequest {
* @return string
* @since 8.1.0
*/
- public function getId();
+ public function getId(): string;
/**
* Returns the remote address, if the connection came from a trusted proxy
@@ -206,7 +207,7 @@ interface IRequest {
* @return string IP address
* @since 8.1.0
*/
- public function getRemoteAddress();
+ public function getRemoteAddress(): string;
/**
* Returns the server protocol. It respects reverse proxy servers and load
@@ -215,7 +216,7 @@ interface IRequest {
* @return string Server protocol (http or https)
* @since 8.1.0
*/
- public function getServerProtocol();
+ public function getServerProtocol(): string;
/**
* Returns the used HTTP protocol.
@@ -223,7 +224,7 @@ interface IRequest {
* @return string HTTP protocol. HTTP/2, HTTP/1.1 or HTTP/1.0.
* @since 8.2.0
*/
- public function getHttpProtocol();
+ public function getHttpProtocol(): string;
/**
* Returns the request uri, even if the website uses one or more
@@ -232,7 +233,7 @@ interface IRequest {
* @return string
* @since 8.1.0
*/
- public function getRequestUri();
+ public function getRequestUri(): string;
/**
* Get raw PathInfo from request (not urldecoded)
@@ -241,7 +242,7 @@ interface IRequest {
* @return string Path info
* @since 8.1.0
*/
- public function getRawPathInfo();
+ public function getRawPathInfo(): string;
/**
* Get PathInfo from request
@@ -259,7 +260,7 @@ interface IRequest {
* @return string the script name
* @since 8.1.0
*/
- public function getScriptName();
+ public function getScriptName(): string;
/**
* Checks whether the user agent matches a given regex
@@ -268,7 +269,7 @@ interface IRequest {
* @return bool true if at least one of the given agent matches, false otherwise
* @since 8.1.0
*/
- public function isUserAgent(array $agent);
+ public function isUserAgent(array $agent): bool;
/**
* Returns the unverified server host from the headers without checking
@@ -277,7 +278,7 @@ interface IRequest {
* @return string Server host
* @since 8.1.0
*/
- public function getInsecureServerHost();
+ public function getInsecureServerHost(): string;
/**
* Returns the server host from the headers, or the first configured
@@ -286,5 +287,5 @@ interface IRequest {
* @return string Server host
* @since 8.1.0
*/
- public function getServerHost();
+ public function getServerHost(): string;
}
diff --git a/lib/public/Mail/IEMailTemplate.php b/lib/public/Mail/IEMailTemplate.php
index 3248665a7da..6d37c21ada1 100644
--- a/lib/public/Mail/IEMailTemplate.php
+++ b/lib/public/Mail/IEMailTemplate.php
@@ -85,7 +85,7 @@ interface IEMailTemplate {
/**
* Adds a paragraph to the body of the email
*
- * @param string $text
+ * @param string $text; Note: When $plainText falls back to this, HTML is automatically escaped in the HTML email
* @param string|bool $plainText Text that is used in the plain text email
* if empty the $text is used, if false none will be used
*
@@ -96,8 +96,8 @@ interface IEMailTemplate {
/**
* Adds a list item to the body of the email
*
- * @param string $text
- * @param string $metaInfo
+ * @param string $text; Note: When $plainText falls back to this, HTML is automatically escaped in the HTML email
+ * @param string $metaInfo; Note: When $plainMetaInfo falls back to this, HTML is automatically escaped in the HTML email
* @param string $icon Absolute path, must be 16*16 pixels
* @param string $plainText Text that is used in the plain text email
* if empty the $text is used, if false none will be used
@@ -110,9 +110,9 @@ interface IEMailTemplate {
/**
* Adds a button group of two buttons to the body of the email
*
- * @param string $textLeft Text of left button
+ * @param string $textLeft Text of left button; Note: When $plainTextLeft falls back to this, HTML is automatically escaped in the HTML email
* @param string $urlLeft URL of left button
- * @param string $textRight Text of right button
+ * @param string $textRight Text of right button; Note: When $plainTextRight falls back to this, HTML is automatically escaped in the HTML email
* @param string $urlRight URL of right button
* @param string $plainTextLeft Text of left button that is used in the plain text version - if empty the $textLeft is used
* @param string $plainTextRight Text of right button that is used in the plain text version - if empty the $textRight is used
@@ -124,7 +124,7 @@ interface IEMailTemplate {
/**
* Adds a button to the body of the email
*
- * @param string $text Text of button
+ * @param string $text Text of button; Note: When $plainText falls back to this, HTML is automatically escaped in the HTML email
* @param string $url URL of button
* @param string $plainText Text of button in plain text version
* if empty the $text is used, if false none will be used
diff --git a/lib/public/Response.php b/lib/public/Response.php
index dd029e12dbf..dbd506d379d 100644
--- a/lib/public/Response.php
+++ b/lib/public/Response.php
@@ -89,9 +89,12 @@ class Response {
* Disable browser caching
* @see enableCaching with cache_time = 0
* @since 4.0.0
+ * @deprecated 14.0.0 just set the headers
*/
static public function disableCaching() {
- \OC_Response::disableCaching();
+ header('Pragma: public');// enable caching in IE
+ header('Expires: 0');
+ header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
}
/**
diff --git a/lib/public/SystemTag/ISystemTag.php b/lib/public/SystemTag/ISystemTag.php
index 539c7835fae..da434e8b5a0 100644
--- a/lib/public/SystemTag/ISystemTag.php
+++ b/lib/public/SystemTag/ISystemTag.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -36,7 +37,7 @@ interface ISystemTag {
*
* @since 9.0.0
*/
- public function getId();
+ public function getId(): string;
/**
* Returns the tag display name
@@ -45,7 +46,7 @@ interface ISystemTag {
*
* @since 9.0.0
*/
- public function getName();
+ public function getName(): string;
/**
* Returns whether the tag is visible for regular users
@@ -54,7 +55,7 @@ interface ISystemTag {
*
* @since 9.0.0
*/
- public function isUserVisible();
+ public function isUserVisible(): bool;
/**
* Returns whether the tag can be assigned to objects by regular users
@@ -63,7 +64,7 @@ interface ISystemTag {
*
* @since 9.0.0
*/
- public function isUserAssignable();
+ public function isUserAssignable(): bool;
}
diff --git a/lib/public/SystemTag/ISystemTagManager.php b/lib/public/SystemTag/ISystemTagManager.php
index fff0a439116..4cce106790a 100644
--- a/lib/public/SystemTag/ISystemTagManager.php
+++ b/lib/public/SystemTag/ISystemTagManager.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -37,15 +38,15 @@ interface ISystemTagManager {
*
* @param array|string $tagIds id or array of unique ids of the tag to retrieve
*
- * @return \OCP\SystemTag\ISystemTag[] array of system tags with tag id as key
+ * @return ISystemTag[] array of system tags with tag id as key
*
* @throws \InvalidArgumentException if at least one given tag ids is invalid (string instead of integer, etc.)
- * @throws \OCP\SystemTag\TagNotFoundException if at least one given tag ids did no exist
+ * @throws TagNotFoundException if at least one given tag ids did no exist
* The message contains a json_encoded array of the ids that could not be found
*
* @since 9.0.0
*/
- public function getTagsByIds($tagIds);
+ public function getTagsByIds($tagIds): array;
/**
* Returns the tag object matching the given attributes.
@@ -54,13 +55,13 @@ interface ISystemTagManager {
* @param bool $userVisible whether the tag is visible by users
* @param bool $userAssignable whether the tag is assignable by users
*
- * @return \OCP\SystemTag\ISystemTag system tag
+ * @return ISystemTag system tag
*
- * @throws \OCP\SystemTag\TagNotFoundException if tag does not exist
+ * @throws TagNotFoundException if tag does not exist
*
* @since 9.0.0
*/
- public function getTag($tagName, $userVisible, $userAssignable);
+ public function getTag(string $tagName, bool $userVisible, bool $userAssignable): ISystemTag;
/**
* Creates the tag object using the given attributes.
@@ -69,13 +70,13 @@ interface ISystemTagManager {
* @param bool $userVisible whether the tag is visible by users
* @param bool $userAssignable whether the tag is assignable by users
*
- * @return \OCP\SystemTag\ISystemTag system tag
+ * @return ISystemTag system tag
*
- * @throws \OCP\SystemTag\TagAlreadyExistsException if tag already exists
+ * @throws TagAlreadyExistsException if tag already exists
*
* @since 9.0.0
*/
- public function createTag($tagName, $userVisible, $userAssignable);
+ public function createTag(string $tagName, bool $userVisible, bool $userAssignable): ISystemTag;
/**
* Returns all known tags, optionally filtered by visibility.
@@ -83,11 +84,11 @@ interface ISystemTagManager {
* @param bool|null $visibilityFilter filter by visibility if non-null
* @param string $nameSearchPattern optional search pattern for the tag name
*
- * @return \OCP\SystemTag\ISystemTag[] array of system tags or empty array if none found
+ * @return ISystemTag[] array of system tags or empty array if none found
*
* @since 9.0.0
*/
- public function getAllTags($visibilityFilter = null, $nameSearchPattern = null);
+ public function getAllTags($visibilityFilter = null, $nameSearchPattern = null): array;
/**
* Updates the given tag
@@ -97,20 +98,20 @@ interface ISystemTagManager {
* @param bool $userVisible whether the tag is visible by users
* @param bool $userAssignable whether the tag is assignable by users
*
- * @throws \OCP\SystemTag\TagNotFoundException if tag with the given id does not exist
- * @throws \OCP\SystemTag\TagAlreadyExistsException if there is already another tag
+ * @throws TagNotFoundException if tag with the given id does not exist
+ * @throws TagAlreadyExistsException if there is already another tag
* with the same attributes
*
* @since 9.0.0
*/
- public function updateTag($tagId, $newName, $userVisible, $userAssignable);
+ public function updateTag(string $tagId, string $newName, bool $userVisible, bool $userAssignable);
/**
* Delete the given tags from the database and all their relationships.
*
* @param string|array $tagIds array of tag ids
*
- * @throws \OCP\SystemTag\TagNotFoundException if at least one tag did not exist
+ * @throws TagNotFoundException if at least one tag did not exist
*
* @since 9.0.0
*/
@@ -127,7 +128,7 @@ interface ISystemTagManager {
*
* @since 9.1.0
*/
- public function canUserAssignTag(ISystemTag $tag, IUser $user);
+ public function canUserAssignTag(ISystemTag $tag, IUser $user): bool;
/**
* Checks whether the given user is allowed to see the tag with the given id.
@@ -139,7 +140,7 @@ interface ISystemTagManager {
*
* @since 9.1.0
*/
- public function canUserSeeTag(ISystemTag $tag, IUser $userId);
+ public function canUserSeeTag(ISystemTag $tag, IUser $user): bool;
/**
* Set groups that can assign a given tag.
@@ -149,7 +150,7 @@ interface ISystemTagManager {
*
* @since 9.1.0
*/
- public function setTagGroups(ISystemTag $tag, $groupIds);
+ public function setTagGroups(ISystemTag $tag, array $groupIds);
/**
* Get groups that can assign a given tag.
@@ -160,5 +161,5 @@ interface ISystemTagManager {
*
* @since 9.1.0
*/
- public function getTagGroups(ISystemTag $tag);
+ public function getTagGroups(ISystemTag $tag): array;
}
diff --git a/lib/public/SystemTag/ISystemTagManagerFactory.php b/lib/public/SystemTag/ISystemTagManagerFactory.php
index 0d652697490..25956b41df4 100644
--- a/lib/public/SystemTag/ISystemTagManagerFactory.php
+++ b/lib/public/SystemTag/ISystemTagManagerFactory.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -47,7 +48,7 @@ interface ISystemTagManagerFactory {
* @return ISystemTagManager
* @since 9.0.0
*/
- public function getManager();
+ public function getManager(): ISystemTagManager;
/**
* creates and returns an instance of the system tag object
@@ -56,5 +57,5 @@ interface ISystemTagManagerFactory {
* @return ISystemTagObjectMapper
* @since 9.0.0
*/
- public function getObjectMapper();
+ public function getObjectMapper(): ISystemTagObjectMapper;
}
diff --git a/lib/public/SystemTag/ISystemTagObjectMapper.php b/lib/public/SystemTag/ISystemTagObjectMapper.php
index 3e28ab15773..1705bde23c5 100644
--- a/lib/public/SystemTag/ISystemTagObjectMapper.php
+++ b/lib/public/SystemTag/ISystemTagObjectMapper.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -51,7 +52,7 @@ interface ISystemTagObjectMapper {
*
* @since 9.0.0
*/
- public function getTagIdsForObjects($objIds, $objectType);
+ public function getTagIdsForObjects($objIds, string $objectType): array;
/**
* Get a list of objects tagged with $tagIds.
@@ -63,14 +64,14 @@ interface ISystemTagObjectMapper {
*
* @return string[] array of object ids or empty array if none found
*
- * @throws \OCP\SystemTag\TagNotFoundException if at least one of the
+ * @throws TagNotFoundException if at least one of the
* given tags does not exist
* @throws \InvalidArgumentException When a limit is specified together with
* multiple tag ids
*
* @since 9.0.0
*/
- public function getObjectIdsForTags($tagIds, $objectType, $limit = 0, $offset = '');
+ public function getObjectIdsForTags($tagIds, string $objectType, int $limit = 0, string $offset = ''): array;
/**
* Assign the given tags to the given object.
@@ -84,12 +85,12 @@ interface ISystemTagObjectMapper {
* @param string $objectType object type
* @param string|array $tagIds tag id or array of tag ids to assign
*
- * @throws \OCP\SystemTag\TagNotFoundException if at least one of the
+ * @throws TagNotFoundException if at least one of the
* given tags does not exist
*
* @since 9.0.0
*/
- public function assignTags($objId, $objectType, $tagIds);
+ public function assignTags(string $objId, string $objectType, $tagIds);
/**
* Unassign the given tags from the given object.
@@ -103,12 +104,12 @@ interface ISystemTagObjectMapper {
* @param string $objectType object type
* @param string|array $tagIds tag id or array of tag ids to unassign
*
- * @throws \OCP\SystemTag\TagNotFoundException if at least one of the
+ * @throws TagNotFoundException if at least one of the
* given tags does not exist
*
* @since 9.0.0
*/
- public function unassignTags($objId, $objectType, $tagIds);
+ public function unassignTags(string $objId, string $objectType, $tagIds);
/**
* Checks whether the given objects have the given tag.
@@ -122,10 +123,10 @@ interface ISystemTagObjectMapper {
* @return bool true if the condition set by $all is matched, false
* otherwise
*
- * @throws \OCP\SystemTag\TagNotFoundException if the tag does not exist
+ * @throws TagNotFoundException if the tag does not exist
*
* @since 9.0.0
*/
- public function haveTag($objIds, $objectType, $tagId, $all = true);
+ public function haveTag($objIds, string $objectType, string $tagId, bool $all = true): bool;
}
diff --git a/lib/public/SystemTag/ManagerEvent.php b/lib/public/SystemTag/ManagerEvent.php
index bb9fcc01f83..452c0d5da8f 100644
--- a/lib/public/SystemTag/ManagerEvent.php
+++ b/lib/public/SystemTag/ManagerEvent.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -52,7 +53,7 @@ class ManagerEvent extends Event {
* @param ISystemTag|null $beforeTag
* @since 9.0.0
*/
- public function __construct($event, ISystemTag $tag, ISystemTag $beforeTag = null) {
+ public function __construct(string $event, ISystemTag $tag, ISystemTag $beforeTag = null) {
$this->event = $event;
$this->tag = $tag;
$this->beforeTag = $beforeTag;
@@ -62,7 +63,7 @@ class ManagerEvent extends Event {
* @return string
* @since 9.0.0
*/
- public function getEvent() {
+ public function getEvent(): string {
return $this->event;
}
@@ -70,15 +71,16 @@ class ManagerEvent extends Event {
* @return ISystemTag
* @since 9.0.0
*/
- public function getTag() {
+ public function getTag(): ISystemTag {
return $this->tag;
}
/**
* @return ISystemTag
* @since 9.0.0
+ * @throws \BadMethodCallException
*/
- public function getTagBefore() {
+ public function getTagBefore(): ISystemTag {
if ($this->event !== self::EVENT_UPDATE) {
throw new \BadMethodCallException('getTagBefore is only available on the update Event');
}
diff --git a/lib/public/SystemTag/MapperEvent.php b/lib/public/SystemTag/MapperEvent.php
index a86497c8440..d98caf1317b 100644
--- a/lib/public/SystemTag/MapperEvent.php
+++ b/lib/public/SystemTag/MapperEvent.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -53,7 +54,7 @@ class MapperEvent extends Event {
* @param int[] $tags
* @since 9.0.0
*/
- public function __construct($event, $objectType, $objectId, array $tags) {
+ public function __construct(string $event, string $objectType, string $objectId, array $tags) {
$this->event = $event;
$this->objectType = $objectType;
$this->objectId = $objectId;
@@ -64,7 +65,7 @@ class MapperEvent extends Event {
* @return string
* @since 9.0.0
*/
- public function getEvent() {
+ public function getEvent(): string {
return $this->event;
}
@@ -72,7 +73,7 @@ class MapperEvent extends Event {
* @return string
* @since 9.0.0
*/
- public function getObjectType() {
+ public function getObjectType(): string {
return $this->objectType;
}
@@ -80,7 +81,7 @@ class MapperEvent extends Event {
* @return string
* @since 9.0.0
*/
- public function getObjectId() {
+ public function getObjectId(): string {
return $this->objectId;
}
@@ -88,7 +89,7 @@ class MapperEvent extends Event {
* @return int[]
* @since 9.0.0
*/
- public function getTags() {
+ public function getTags(): array {
return $this->tags;
}
}
diff --git a/lib/public/SystemTag/SystemTagsEntityEvent.php b/lib/public/SystemTag/SystemTagsEntityEvent.php
index 15ae4439986..e439c16d9c6 100644
--- a/lib/public/SystemTag/SystemTagsEntityEvent.php
+++ b/lib/public/SystemTag/SystemTagsEntityEvent.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -45,7 +46,7 @@ class SystemTagsEntityEvent extends Event {
* @param string $event
* @since 9.1.0
*/
- public function __construct($event) {
+ public function __construct(string $event) {
$this->event = $event;
$this->collections = [];
}
@@ -59,7 +60,7 @@ class SystemTagsEntityEvent extends Event {
* @throws \OutOfBoundsException when the entity name is already taken
* @since 9.1.0
*/
- public function addEntityCollection($name, \Closure $entityExistsFunction) {
+ public function addEntityCollection(string $name, \Closure $entityExistsFunction) {
if (isset($this->collections[$name])) {
throw new \OutOfBoundsException('Duplicate entity name "' . $name . '"');
}
@@ -71,7 +72,7 @@ class SystemTagsEntityEvent extends Event {
* @return \Closure[]
* @since 9.1.0
*/
- public function getEntityCollections() {
+ public function getEntityCollections(): array {
return $this->collections;
}
}
diff --git a/lib/public/SystemTag/TagAlreadyExistsException.php b/lib/public/SystemTag/TagAlreadyExistsException.php
index caf0d9f08bc..fbe8234d281 100644
--- a/lib/public/SystemTag/TagAlreadyExistsException.php
+++ b/lib/public/SystemTag/TagAlreadyExistsException.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
diff --git a/lib/public/SystemTag/TagNotFoundException.php b/lib/public/SystemTag/TagNotFoundException.php
index 9b06259807f..9f83c20e6c5 100644
--- a/lib/public/SystemTag/TagNotFoundException.php
+++ b/lib/public/SystemTag/TagNotFoundException.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -43,7 +44,7 @@ class TagNotFoundException extends \RuntimeException {
* @param string[] $tags
* @since 9.0.0
*/
- public function __construct($message = '', $code = 0, \Exception $previous = null, array $tags = []) {
+ public function __construct(string $message = '', int $code = 0, \Exception $previous = null, array $tags = []) {
parent::__construct($message, $code, $previous);
$this->tags = $tags;
}
@@ -52,7 +53,7 @@ class TagNotFoundException extends \RuntimeException {
* @return string[]
* @since 9.0.0
*/
- public function getMissingTags() {
+ public function getMissingTags(): array {
return $this->tags;
}
}
diff --git a/lib/public/Util.php b/lib/public/Util.php
index 2fb6bdf491d..106107591c3 100644
--- a/lib/public/Util.php
+++ b/lib/public/Util.php
@@ -51,7 +51,6 @@
// use OCP namespace for all classes that are considered public.
// This means that they should be used by apps instead of the internal ownCloud classes
namespace OCP;
-use DateTimeZone;
/**
* This class provides different helper functions to make the life of a developer easier
diff --git a/resources/app-info-shipped.xsd b/resources/app-info-shipped.xsd
new file mode 100644
index 00000000000..97221d1fb9c
--- /dev/null
+++ b/resources/app-info-shipped.xsd
@@ -0,0 +1,671 @@
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+
+ <xs:element name="info">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="id" type="id" minOccurs="1" maxOccurs="1"/>
+ <xs:element name="name" type="l10n-string" minOccurs="1"
+ maxOccurs="unbounded"/>
+ <xs:element name="summary" type="l10n-string" minOccurs="1"
+ maxOccurs="unbounded"/>
+ <xs:element name="description" type="l10n-text" minOccurs="1"
+ maxOccurs="unbounded"/>
+ <xs:element name="version" type="semver"
+ minOccurs="1" maxOccurs="1"/>
+ <xs:element name="licence" type="licence" minOccurs="1"
+ maxOccurs="unbounded"/>
+ <xs:element name="author" type="author" minOccurs="1"
+ maxOccurs="unbounded"/>
+ <xs:element name="namespace" type="limited-string"
+ minOccurs="0" maxOccurs="1"/>
+ <xs:element name="default_enable" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="types" type="types" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="documentation" type="documentation"
+ minOccurs="0" maxOccurs="1"/>
+ <xs:element name="category" type="category" minOccurs="1"
+ maxOccurs="unbounded"/>
+ <xs:element name="website" type="url" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="discussion" type="url" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="bugs" type="url" minOccurs="1"
+ maxOccurs="1"/>
+ <xs:element name="repository" type="repository" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="screenshot" type="screenshot" minOccurs="0"
+ maxOccurs="10"/>
+ <xs:element name="dependencies" type="dependencies"
+ minOccurs="1" maxOccurs="1"/>
+ <xs:element name="background-jobs" type="jobs"
+ minOccurs="0" maxOccurs="1"/>
+ <xs:element name="repair-steps" type="repair-steps"
+ minOccurs="0" maxOccurs="1"/>
+ <xs:element name="two-factor-providers"
+ type="two-factor-providers"
+ minOccurs="0" maxOccurs="1"/>
+ <xs:element name="commands" type="commands"
+ minOccurs="0" maxOccurs="1"/>
+ <xs:element name="settings" type="settings" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="activity" type="activity" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="navigations" type="navigations" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="contactsmenu" type="contactsmenu" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="collaboration" type="collaboration" minOccurs="0"
+ maxOccurs="1" />
+ <xs:element name="sabre" type="sabre" minOccurs="0"
+ maxOccurs="1" />
+ <xs:element name="public" type="public" minOccurs="0"
+ maxOccurs="1" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:unique name="uniqueNameL10n">
+ <xs:selector xpath="name"/>
+ <xs:field xpath="@lang"/>
+ </xs:unique>
+ <xs:unique name="uniqueSummaryL10n">
+ <xs:selector xpath="summary"/>
+ <xs:field xpath="@lang"/>
+ </xs:unique>
+ <xs:unique name="uniqueDescriptionL10n">
+ <xs:selector xpath="description"/>
+ <xs:field xpath="@lang"/>
+ </xs:unique>
+ <xs:unique name="uniqueLicense">
+ <xs:selector xpath="licence"/>
+ <xs:field xpath="."/>
+ </xs:unique>
+ <xs:unique name="uniqueTypes">
+ <xs:selector xpath="types/type"/>
+ <xs:field xpath="."/>
+ </xs:unique>
+ <xs:unique name="uniqueCategory">
+ <xs:selector xpath="category"/>
+ <xs:field xpath="."/>
+ </xs:unique>
+ <xs:unique name="uniqueDatabase">
+ <xs:selector xpath="dependencies/database"/>
+ <xs:field xpath="."/>
+ </xs:unique>
+ <xs:unique name="uniqueLib">
+ <xs:selector xpath="dependencies/lib"/>
+ <xs:field xpath="."/>
+ </xs:unique>
+ <xs:unique name="uniqueCommand">
+ <xs:selector xpath="dependencies/command"/>
+ <xs:field xpath="."/>
+ </xs:unique>
+ </xs:element>
+
+ <!-- basic types -->
+ <xs:simpleType name="empty-string">
+ <xs:restriction base="xs:string">
+ <xs:maxLength value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="non-empty-string">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="limited-string">
+ <xs:restriction base="non-empty-string">
+ <xs:maxLength value="256"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="l10n-text">
+ <xs:simpleContent>
+ <xs:extension base="non-empty-string">
+ <xs:attribute name="lang" type="l10n-code" default="en"
+ use="optional"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="l10n-string">
+ <xs:simpleContent>
+ <xs:restriction base="l10n-text">
+ <xs:maxLength value="128"/>
+ </xs:restriction>
+ </xs:simpleContent>
+ </xs:complexType>
+
+
+ <xs:simpleType name="l10n-code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="af"/>
+ <xs:enumeration value="ar"/>
+ <xs:enumeration value="ast"/>
+ <xs:enumeration value="az"/>
+ <xs:enumeration value="bg"/>
+ <xs:enumeration value="be"/>
+ <xs:enumeration value="bn"/>
+ <xs:enumeration value="br"/>
+ <xs:enumeration value="bs"/>
+ <xs:enumeration value="ca"/>
+ <xs:enumeration value="cs"/>
+ <xs:enumeration value="cy"/>
+ <xs:enumeration value="da"/>
+ <xs:enumeration value="de"/>
+ <xs:enumeration value="el"/>
+ <xs:enumeration value="en"/>
+ <xs:enumeration value="eo"/>
+ <xs:enumeration value="es"/>
+ <xs:enumeration value="es-ar"/>
+ <xs:enumeration value="es-co"/>
+ <xs:enumeration value="es-mx"/>
+ <xs:enumeration value="es-ni"/>
+ <xs:enumeration value="es-ve"/>
+ <xs:enumeration value="et"/>
+ <xs:enumeration value="eu"/>
+ <xs:enumeration value="fa"/>
+ <xs:enumeration value="fi"/>
+ <xs:enumeration value="fr"/>
+ <xs:enumeration value="fy"/>
+ <xs:enumeration value="ga"/>
+ <xs:enumeration value="gd"/>
+ <xs:enumeration value="gl"/>
+ <xs:enumeration value="he"/>
+ <xs:enumeration value="hi"/>
+ <xs:enumeration value="hr"/>
+ <xs:enumeration value="hu"/>
+ <xs:enumeration value="ia"/>
+ <xs:enumeration value="id"/>
+ <xs:enumeration value="io"/>
+ <xs:enumeration value="is"/>
+ <xs:enumeration value="it"/>
+ <xs:enumeration value="ja"/>
+ <xs:enumeration value="ka"/>
+ <xs:enumeration value="kk"/>
+ <xs:enumeration value="km"/>
+ <xs:enumeration value="kn"/>
+ <xs:enumeration value="ko"/>
+ <xs:enumeration value="lb"/>
+ <xs:enumeration value="lt"/>
+ <xs:enumeration value="lv"/>
+ <xs:enumeration value="mk"/>
+ <xs:enumeration value="ml"/>
+ <xs:enumeration value="mn"/>
+ <xs:enumeration value="mr"/>
+ <xs:enumeration value="my"/>
+ <xs:enumeration value="nb"/>
+ <xs:enumeration value="ne"/>
+ <xs:enumeration value="nl"/>
+ <xs:enumeration value="nn"/>
+ <xs:enumeration value="os"/>
+ <xs:enumeration value="pa"/>
+ <xs:enumeration value="pl"/>
+ <xs:enumeration value="pt"/>
+ <xs:enumeration value="pt-br"/>
+ <xs:enumeration value="ro"/>
+ <xs:enumeration value="ru"/>
+ <xs:enumeration value="sk"/>
+ <xs:enumeration value="sl"/>
+ <xs:enumeration value="sq"/>
+ <xs:enumeration value="sr"/>
+ <xs:enumeration value="sr-latn"/>
+ <xs:enumeration value="sv"/>
+ <xs:enumeration value="sw"/>
+ <xs:enumeration value="ta"/>
+ <xs:enumeration value="te"/>
+ <xs:enumeration value="th"/>
+ <xs:enumeration value="tr"/>
+ <xs:enumeration value="tt"/>
+ <xs:enumeration value="udm"/>
+ <xs:enumeration value="uk"/>
+ <xs:enumeration value="ur"/>
+ <xs:enumeration value="vi"/>
+ <xs:enumeration value="zh-hans"/>
+ <xs:enumeration value="zh-hant"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="semver">
+ <xs:restriction base="limited-string">
+ <xs:pattern
+ value="(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(\-([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="version">
+ <xs:restriction base="limited-string">
+ <xs:pattern value="[0-9]+(\.[0-9]+){0,2}"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="url">
+ <xs:restriction base="xs:anyURI">
+ <xs:pattern value="https?://.+"/>
+ <xs:maxLength value="256"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="doc-user-url">
+ <xs:restriction base="non-empty-string">
+ <xs:pattern value="https://.+|user-[a-z]+[\-a-z]*[a-z]+"/>
+ <xs:maxLength value="256"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="doc-admin-url">
+ <xs:restriction base="non-empty-string">
+ <xs:pattern value="https://.+|admin-[a-z]+[\-a-z]*[a-z]+"/>
+ <xs:maxLength value="256"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="doc-developer-url">
+ <xs:restriction base="non-empty-string">
+ <xs:pattern value="https://.+|developer-[a-z]+[\-a-z]*[a-z]+"/>
+ <xs:maxLength value="256"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="secure-url">
+ <xs:restriction base="xs:anyURI">
+ <xs:pattern value="https://.+"/>
+ <xs:maxLength value="256"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="email">
+ <xs:restriction base="limited-string">
+ <xs:pattern value="[^@]+@[^\.]+\..+"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- first level elements -->
+ <xs:complexType name="screenshot">
+ <xs:simpleContent>
+ <xs:extension base="secure-url">
+ <xs:attribute name="small-thumbnail" use="optional"
+ type="secure-url"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:simpleType name="id">
+ <xs:restriction base="limited-string">
+ <xs:pattern value="[a-z]+[a-z0-9_]*[a-z0-9]+"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="author">
+ <xs:simpleContent>
+ <xs:extension base="limited-string">
+ <xs:attribute name="mail" type="email" use="optional"/>
+ <xs:attribute name="homepage" type="url" use="optional"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="repository">
+ <xs:simpleContent>
+ <xs:extension base="url">
+ <xs:attribute name="type" type="vcs" use="optional"
+ default="git"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:simpleType name="vcs">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="git"/>
+ <xs:enumeration value="mercurial"/>
+ <xs:enumeration value="subversion"/>
+ <xs:enumeration value="bzr"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="types">
+ <xs:sequence>
+ <xs:element name="prelogin" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="filesystem" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="authentication" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="logging" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="dav" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="prevent_group_restriction" minOccurs="0"
+ maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:simpleType name="category">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="security"/>
+ <xs:enumeration value="customization"/>
+ <xs:enumeration value="files"/>
+ <xs:enumeration value="integration"/>
+ <xs:enumeration value="monitoring"/>
+ <xs:enumeration value="multimedia"/>
+ <xs:enumeration value="office"/>
+ <xs:enumeration value="organization"/>
+ <xs:enumeration value="social"/>
+ <xs:enumeration value="tools"/>
+ <xs:enumeration value="games"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="licence">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="agpl"/>
+ <xs:enumeration value="mpl"/>
+ <xs:enumeration value="apache"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="databases">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="sqlite"/>
+ <xs:enumeration value="mysql"/>
+ <xs:enumeration value="pgsql"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="documentation">
+ <xs:sequence>
+ <xs:element name="user" type="doc-user-url" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="admin" type="doc-admin-url" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="developer" type="doc-developer-url" minOccurs="0"
+ maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="settings">
+ <xs:sequence>
+ <xs:element name="admin" type="php-class" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:element name="admin-section" type="php-class" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:element name="personal" type="php-class" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:element name="personal-section" type="php-class" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="activity">
+ <xs:sequence>
+ <xs:element name="settings" type="activity-settings" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="filters" type="activity-filters" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="providers" type="activity-providers" minOccurs="0"
+ maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="activity-settings">
+ <xs:sequence>
+ <xs:element name="setting" type="php-class" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="activity-filters">
+ <xs:sequence>
+ <xs:element name="filter" type="php-class" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="activity-providers">
+ <xs:sequence>
+ <xs:element name="provider" type="php-class" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="navigations">
+ <xs:sequence>
+ <xs:element name="navigation" type="navigation" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="navigation">
+ <xs:sequence>
+ <xs:element name="id" type="id" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="name" type="non-empty-string" minOccurs="1" maxOccurs="1"/>
+ <xs:element name="route" type="route" minOccurs="1" maxOccurs="1"/>
+ <xs:element name="icon" type="xs:anyURI" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="order" type="xs:int" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="type" type="navigation-type" minOccurs="0" maxOccurs="1"/>
+ </xs:sequence>
+ <xs:attribute name="role" type="navigation-role" default="all" use="optional"/>
+ </xs:complexType>
+
+ <xs:simpleType name="navigation-role">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="all"/>
+ <xs:enumeration value="admin"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="navigation-type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="link"/>
+ <xs:enumeration value="settings"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="route">
+ <xs:restriction base="non-empty-string">
+ <xs:pattern value="[0-9a-zA-Z_]+(\.[0-9a-zA-Z_]+){2}"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="contactsmenu">
+ <xs:sequence>
+ <xs:element name="provider" type="php-class" minOccurs="1"
+ maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="collaboration">
+ <xs:sequence>
+ <xs:element name="plugins" type="collaboration-plugins" minOccurs="0" maxOccurs="1">
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="collaboration-plugins">
+ <xs:sequence>
+ <xs:element name="plugin" type="collaboration-plugins-plugin" minOccurs="1" maxOccurs="unbounded">
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="collaboration-plugins-plugin">
+ <xs:simpleContent>
+ <xs:extension base="php-class">
+ <xs:attribute name="type" type="collaboration-plugin-type" use="required"/>
+ <xs:attribute name="share-type" type="share-type" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:simpleType name="collaboration-plugin-type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="collaborator-search"/>
+ <xs:enumeration value="autocomplete-sort"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="sabre">
+ <xs:sequence>
+ <xs:element name="collections" type="sabre-collections" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="plugins" type="sabre-plugins" minOccurs="0" maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="sabre-collections">
+ <xs:sequence>
+ <xs:element name="collection" type="php-class" minOccurs="1" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="sabre-plugins">
+ <xs:sequence>
+ <xs:element name="plugin" type="php-class" minOccurs="1" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:simpleType name="share-type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="SHARE_TYPE_USER"/>
+ <xs:enumeration value="SHARE_TYPE_GROUP"/>
+ <xs:enumeration value="SHARE_TYPE_LINK"/>
+ <xs:enumeration value="SHARE_TYPE_EMAIL"/>
+ <xs:enumeration value="SHARE_TYPE_CONTACT"/>
+ <xs:enumeration value="SHARE_TYPE_REMOTE"/>
+ <xs:enumeration value="SHARE_TYPE_CIRCLE"/>
+ <xs:enumeration value="SHARE_TYPE_GUEST"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+
+ <xs:complexType name="public">
+ <xs:sequence>
+ <xs:element name="webdav" type="path" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="files" type="path" minOccurs="0" maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <!-- dependencies -->
+ <xs:complexType name="dependencies">
+ <xs:sequence>
+ <xs:element name="php" type="php" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="database" type="database" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:element name="command" type="shell-command" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:element name="lib" type="min-max-version" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:element name="owncloud" type="owncloud" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="nextcloud" type="nextcloud" minOccurs="1"
+ maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="owncloud">
+ <xs:attribute name="min-version" type="version" use="required"/>
+ <xs:attribute name="max-version" type="version" use="optional"/>
+ </xs:complexType>
+
+ <xs:complexType name="nextcloud">
+ <xs:attribute name="min-version" type="version" use="required"/>
+ <xs:attribute name="max-version" type="version" use="required"/>
+ </xs:complexType>
+
+ <xs:simpleType name="shell-command">
+ <xs:restriction base="limited-string">
+ <xs:pattern value="[a-zA-Z\-_]+"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="min-max-version">
+ <xs:simpleContent>
+ <xs:extension base="limited-string">
+ <xs:attribute name="min-version" type="version"
+ use="optional"/>
+ <xs:attribute name="max-version" type="version"
+ use="optional"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="database">
+ <xs:simpleContent>
+ <xs:extension base="databases">
+ <xs:attribute name="min-version" type="version"
+ use="optional"/>
+ <xs:attribute name="max-version" type="version"
+ use="optional"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="php">
+ <xs:simpleContent>
+ <xs:extension base="empty-string">
+ <xs:attribute name="min-int-size" type="bits" use="optional"
+ default="32"/>
+ <xs:attribute name="min-version" type="version"
+ use="optional"/>
+ <xs:attribute name="max-version" type="version"
+ use="optional"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:simpleType name="bits">
+ <xs:restriction base="xs:int">
+ <xs:enumeration value="32"/>
+ <xs:enumeration value="64"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="repair-steps">
+ <xs:sequence>
+ <xs:element name="pre-migration" type="steps" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="post-migration" type="steps" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="live-migration" type="steps" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="install" type="steps" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="uninstall" type="steps" minOccurs="0"
+ maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="jobs">
+ <xs:sequence>
+ <xs:element name="job" type="php-class" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="steps">
+ <xs:sequence>
+ <xs:element name="step" type="php-class" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="two-factor-providers">
+ <xs:sequence>
+ <xs:element name="provider" type="php-class" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="commands">
+ <xs:sequence>
+ <xs:element name="command" type="php-class" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:simpleType name="php-class">
+ <xs:restriction base="xs:string">
+ <xs:pattern
+ value="[a-zA-Z_][0-9a-zA-Z_]*(\\[a-zA-Z_][0-9a-zA-Z_]*)*"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="path">
+ <xs:restriction base="xs:string">
+ <xs:pattern
+ value="[a-zA-Z_][0-9a-zA-Z_]*(/[a-zA-Z_][0-9a-zA-Z_]*)*\.php"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+</xs:schema>
diff --git a/resources/app-info.xsd b/resources/app-info.xsd
new file mode 100644
index 00000000000..4460b0f63b9
--- /dev/null
+++ b/resources/app-info.xsd
@@ -0,0 +1,652 @@
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+
+ <xs:element name="info">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="id" type="id" minOccurs="1" maxOccurs="1"/>
+ <xs:element name="name" type="l10n-string" minOccurs="1"
+ maxOccurs="unbounded"/>
+ <xs:element name="summary" type="l10n-string" minOccurs="1"
+ maxOccurs="unbounded"/>
+ <xs:element name="description" type="l10n-text" minOccurs="1"
+ maxOccurs="unbounded"/>
+ <xs:element name="version" type="semver"
+ minOccurs="1" maxOccurs="1"/>
+ <xs:element name="licence" type="licence" minOccurs="1"
+ maxOccurs="unbounded"/>
+ <xs:element name="author" type="author" minOccurs="1"
+ maxOccurs="unbounded"/>
+ <xs:element name="namespace" type="limited-string"
+ minOccurs="0" maxOccurs="1"/>
+ <xs:element name="types" type="types" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="documentation" type="documentation"
+ minOccurs="0" maxOccurs="1"/>
+ <xs:element name="category" type="category" minOccurs="1"
+ maxOccurs="unbounded"/>
+ <xs:element name="website" type="url" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="discussion" type="url" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="bugs" type="url" minOccurs="1"
+ maxOccurs="1"/>
+ <xs:element name="repository" type="repository" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="screenshot" type="screenshot" minOccurs="0"
+ maxOccurs="10"/>
+ <xs:element name="dependencies" type="dependencies"
+ minOccurs="1" maxOccurs="1"/>
+ <xs:element name="background-jobs" type="jobs"
+ minOccurs="0" maxOccurs="1"/>
+ <xs:element name="repair-steps" type="repair-steps"
+ minOccurs="0" maxOccurs="1"/>
+ <xs:element name="two-factor-providers"
+ type="two-factor-providers"
+ minOccurs="0" maxOccurs="1"/>
+ <xs:element name="commands" type="commands"
+ minOccurs="0" maxOccurs="1"/>
+ <xs:element name="settings" type="settings" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="activity" type="activity" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="navigations" type="navigations" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="contactsmenu" type="contactsmenu" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="collaboration" type="collaboration" minOccurs="0"
+ maxOccurs="1" />
+ <xs:element name="sabre" type="sabre" minOccurs="0"
+ maxOccurs="1" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:unique name="uniqueNameL10n">
+ <xs:selector xpath="name"/>
+ <xs:field xpath="@lang"/>
+ </xs:unique>
+ <xs:unique name="uniqueSummaryL10n">
+ <xs:selector xpath="summary"/>
+ <xs:field xpath="@lang"/>
+ </xs:unique>
+ <xs:unique name="uniqueDescriptionL10n">
+ <xs:selector xpath="description"/>
+ <xs:field xpath="@lang"/>
+ </xs:unique>
+ <xs:unique name="uniqueLicense">
+ <xs:selector xpath="licence"/>
+ <xs:field xpath="."/>
+ </xs:unique>
+ <xs:unique name="uniqueTypes">
+ <xs:selector xpath="types/type"/>
+ <xs:field xpath="."/>
+ </xs:unique>
+ <xs:unique name="uniqueCategory">
+ <xs:selector xpath="category"/>
+ <xs:field xpath="."/>
+ </xs:unique>
+ <xs:unique name="uniqueDatabase">
+ <xs:selector xpath="dependencies/database"/>
+ <xs:field xpath="."/>
+ </xs:unique>
+ <xs:unique name="uniqueLib">
+ <xs:selector xpath="dependencies/lib"/>
+ <xs:field xpath="."/>
+ </xs:unique>
+ <xs:unique name="uniqueCommand">
+ <xs:selector xpath="dependencies/command"/>
+ <xs:field xpath="."/>
+ </xs:unique>
+ </xs:element>
+
+ <!-- basic types -->
+ <xs:simpleType name="empty-string">
+ <xs:restriction base="xs:string">
+ <xs:maxLength value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="non-empty-string">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="limited-string">
+ <xs:restriction base="non-empty-string">
+ <xs:maxLength value="256"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="l10n-text">
+ <xs:simpleContent>
+ <xs:extension base="non-empty-string">
+ <xs:attribute name="lang" type="l10n-code" default="en"
+ use="optional"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="l10n-string">
+ <xs:simpleContent>
+ <xs:restriction base="l10n-text">
+ <xs:maxLength value="128"/>
+ </xs:restriction>
+ </xs:simpleContent>
+ </xs:complexType>
+
+
+ <xs:simpleType name="l10n-code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="af"/>
+ <xs:enumeration value="ar"/>
+ <xs:enumeration value="ast"/>
+ <xs:enumeration value="az"/>
+ <xs:enumeration value="bg"/>
+ <xs:enumeration value="be"/>
+ <xs:enumeration value="bn"/>
+ <xs:enumeration value="br"/>
+ <xs:enumeration value="bs"/>
+ <xs:enumeration value="ca"/>
+ <xs:enumeration value="cs"/>
+ <xs:enumeration value="cy"/>
+ <xs:enumeration value="da"/>
+ <xs:enumeration value="de"/>
+ <xs:enumeration value="el"/>
+ <xs:enumeration value="en"/>
+ <xs:enumeration value="eo"/>
+ <xs:enumeration value="es"/>
+ <xs:enumeration value="es-ar"/>
+ <xs:enumeration value="es-co"/>
+ <xs:enumeration value="es-mx"/>
+ <xs:enumeration value="es-ni"/>
+ <xs:enumeration value="es-ve"/>
+ <xs:enumeration value="et"/>
+ <xs:enumeration value="eu"/>
+ <xs:enumeration value="fa"/>
+ <xs:enumeration value="fi"/>
+ <xs:enumeration value="fr"/>
+ <xs:enumeration value="fy"/>
+ <xs:enumeration value="ga"/>
+ <xs:enumeration value="gd"/>
+ <xs:enumeration value="gl"/>
+ <xs:enumeration value="he"/>
+ <xs:enumeration value="hi"/>
+ <xs:enumeration value="hr"/>
+ <xs:enumeration value="hu"/>
+ <xs:enumeration value="ia"/>
+ <xs:enumeration value="id"/>
+ <xs:enumeration value="io"/>
+ <xs:enumeration value="is"/>
+ <xs:enumeration value="it"/>
+ <xs:enumeration value="ja"/>
+ <xs:enumeration value="ka"/>
+ <xs:enumeration value="kk"/>
+ <xs:enumeration value="km"/>
+ <xs:enumeration value="kn"/>
+ <xs:enumeration value="ko"/>
+ <xs:enumeration value="lb"/>
+ <xs:enumeration value="lt"/>
+ <xs:enumeration value="lv"/>
+ <xs:enumeration value="mk"/>
+ <xs:enumeration value="ml"/>
+ <xs:enumeration value="mn"/>
+ <xs:enumeration value="mr"/>
+ <xs:enumeration value="my"/>
+ <xs:enumeration value="nb"/>
+ <xs:enumeration value="ne"/>
+ <xs:enumeration value="nl"/>
+ <xs:enumeration value="nn"/>
+ <xs:enumeration value="os"/>
+ <xs:enumeration value="pa"/>
+ <xs:enumeration value="pl"/>
+ <xs:enumeration value="pt"/>
+ <xs:enumeration value="pt-br"/>
+ <xs:enumeration value="ro"/>
+ <xs:enumeration value="ru"/>
+ <xs:enumeration value="sk"/>
+ <xs:enumeration value="sl"/>
+ <xs:enumeration value="sq"/>
+ <xs:enumeration value="sr"/>
+ <xs:enumeration value="sr-latn"/>
+ <xs:enumeration value="sv"/>
+ <xs:enumeration value="sw"/>
+ <xs:enumeration value="ta"/>
+ <xs:enumeration value="te"/>
+ <xs:enumeration value="th"/>
+ <xs:enumeration value="tr"/>
+ <xs:enumeration value="tt"/>
+ <xs:enumeration value="udm"/>
+ <xs:enumeration value="uk"/>
+ <xs:enumeration value="ur"/>
+ <xs:enumeration value="vi"/>
+ <xs:enumeration value="zh-hans"/>
+ <xs:enumeration value="zh-hant"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="semver">
+ <xs:restriction base="limited-string">
+ <xs:pattern
+ value="(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(\-([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="version">
+ <xs:restriction base="limited-string">
+ <xs:pattern value="[0-9]+(\.[0-9]+){0,2}"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="url">
+ <xs:restriction base="xs:anyURI">
+ <xs:pattern value="https?://.+"/>
+ <xs:maxLength value="256"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="doc-user-url">
+ <xs:restriction base="non-empty-string">
+ <xs:pattern value="https://.+|user-[a-z]+[\-a-z]*[a-z]+"/>
+ <xs:maxLength value="256"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="doc-admin-url">
+ <xs:restriction base="non-empty-string">
+ <xs:pattern value="https://.+|admin-[a-z]+[\-a-z]*[a-z]+"/>
+ <xs:maxLength value="256"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="doc-developer-url">
+ <xs:restriction base="non-empty-string">
+ <xs:pattern value="https://.+|developer-[a-z]+[\-a-z]*[a-z]+"/>
+ <xs:maxLength value="256"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="secure-url">
+ <xs:restriction base="xs:anyURI">
+ <xs:pattern value="https://.+"/>
+ <xs:maxLength value="256"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="email">
+ <xs:restriction base="limited-string">
+ <xs:pattern value="[^@]+@[^\.]+\..+"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- first level elements -->
+ <xs:complexType name="screenshot">
+ <xs:simpleContent>
+ <xs:extension base="secure-url">
+ <xs:attribute name="small-thumbnail" use="optional"
+ type="secure-url"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:simpleType name="id">
+ <xs:restriction base="limited-string">
+ <xs:pattern value="[a-z]+[a-z0-9_]*[a-z0-9]+"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="author">
+ <xs:simpleContent>
+ <xs:extension base="limited-string">
+ <xs:attribute name="mail" type="email" use="optional"/>
+ <xs:attribute name="homepage" type="url" use="optional"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="repository">
+ <xs:simpleContent>
+ <xs:extension base="url">
+ <xs:attribute name="type" type="vcs" use="optional"
+ default="git"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:simpleType name="vcs">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="git"/>
+ <xs:enumeration value="mercurial"/>
+ <xs:enumeration value="subversion"/>
+ <xs:enumeration value="bzr"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="types">
+ <xs:sequence>
+ <xs:element name="prelogin" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="filesystem" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="authentication" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="logging" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="dav" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="prevent_group_restriction" minOccurs="0"
+ maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:simpleType name="category">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="security"/>
+ <xs:enumeration value="customization"/>
+ <xs:enumeration value="files"/>
+ <xs:enumeration value="integration"/>
+ <xs:enumeration value="monitoring"/>
+ <xs:enumeration value="multimedia"/>
+ <xs:enumeration value="office"/>
+ <xs:enumeration value="organization"/>
+ <xs:enumeration value="social"/>
+ <xs:enumeration value="tools"/>
+ <xs:enumeration value="games"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="licence">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="agpl"/>
+ <xs:enumeration value="mpl"/>
+ <xs:enumeration value="apache"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="databases">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="sqlite"/>
+ <xs:enumeration value="mysql"/>
+ <xs:enumeration value="pgsql"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="documentation">
+ <xs:sequence>
+ <xs:element name="user" type="doc-user-url" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="admin" type="doc-admin-url" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="developer" type="doc-developer-url" minOccurs="0"
+ maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="settings">
+ <xs:sequence>
+ <xs:element name="admin" type="php-class" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:element name="admin-section" type="php-class" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:element name="personal" type="php-class" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:element name="personal-section" type="php-class" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="activity">
+ <xs:sequence>
+ <xs:element name="settings" type="activity-settings" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="filters" type="activity-filters" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="providers" type="activity-providers" minOccurs="0"
+ maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="activity-settings">
+ <xs:sequence>
+ <xs:element name="setting" type="php-class" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="activity-filters">
+ <xs:sequence>
+ <xs:element name="filter" type="php-class" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="activity-providers">
+ <xs:sequence>
+ <xs:element name="provider" type="php-class" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="navigations">
+ <xs:sequence>
+ <xs:element name="navigation" type="navigation" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="navigation">
+ <xs:sequence>
+ <xs:element name="id" type="id" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="name" type="non-empty-string" minOccurs="1" maxOccurs="1"/>
+ <xs:element name="route" type="route" minOccurs="1" maxOccurs="1"/>
+ <xs:element name="icon" type="xs:anyURI" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="order" type="xs:int" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="type" type="navigation-type" minOccurs="0" maxOccurs="1"/>
+ </xs:sequence>
+ <xs:attribute name="role" type="navigation-role" default="all" use="optional"/>
+ </xs:complexType>
+
+ <xs:simpleType name="navigation-role">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="all"/>
+ <xs:enumeration value="admin"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="navigation-type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="link"/>
+ <xs:enumeration value="settings"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="route">
+ <xs:restriction base="non-empty-string">
+ <xs:pattern value="[0-9a-zA-Z_]+(\.[0-9a-zA-Z_]+){2}"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="contactsmenu">
+ <xs:sequence>
+ <xs:element name="provider" type="php-class" minOccurs="1"
+ maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="collaboration">
+ <xs:sequence>
+ <xs:element name="plugins" type="collaboration-plugins" minOccurs="0" maxOccurs="1">
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="collaboration-plugins">
+ <xs:sequence>
+ <xs:element name="plugin" type="collaboration-plugins-plugin" minOccurs="1" maxOccurs="unbounded">
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="collaboration-plugins-plugin">
+ <xs:simpleContent>
+ <xs:extension base="php-class">
+ <xs:attribute name="type" type="collaboration-plugin-type" use="required"/>
+ <xs:attribute name="share-type" type="share-type" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:simpleType name="collaboration-plugin-type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="collaborator-search"/>
+ <xs:enumeration value="autocomplete-sort"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="sabre">
+ <xs:sequence>
+ <xs:element name="collections" type="sabre-collections" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="plugins" type="sabre-plugins" minOccurs="0" maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="sabre-collections">
+ <xs:sequence>
+ <xs:element name="collection" type="php-class" minOccurs="1" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="sabre-plugins">
+ <xs:sequence>
+ <xs:element name="plugin" type="php-class" minOccurs="1" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:simpleType name="share-type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="SHARE_TYPE_USER"/>
+ <xs:enumeration value="SHARE_TYPE_GROUP"/>
+ <xs:enumeration value="SHARE_TYPE_LINK"/>
+ <xs:enumeration value="SHARE_TYPE_EMAIL"/>
+ <xs:enumeration value="SHARE_TYPE_CONTACT"/>
+ <xs:enumeration value="SHARE_TYPE_REMOTE"/>
+ <xs:enumeration value="SHARE_TYPE_CIRCLE"/>
+ <xs:enumeration value="SHARE_TYPE_GUEST"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- dependencies -->
+ <xs:complexType name="dependencies">
+ <xs:sequence>
+ <xs:element name="php" type="php" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="database" type="database" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:element name="command" type="shell-command" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:element name="lib" type="min-max-version" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:element name="owncloud" type="owncloud" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="nextcloud" type="nextcloud" minOccurs="1"
+ maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="owncloud">
+ <xs:attribute name="min-version" type="version" use="required"/>
+ <xs:attribute name="max-version" type="version" use="optional"/>
+ </xs:complexType>
+
+ <xs:complexType name="nextcloud">
+ <xs:attribute name="min-version" type="version" use="required"/>
+ <xs:attribute name="max-version" type="version" use="required"/>
+ </xs:complexType>
+
+ <xs:simpleType name="shell-command">
+ <xs:restriction base="limited-string">
+ <xs:pattern value="[a-zA-Z\-_]+"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="min-max-version">
+ <xs:simpleContent>
+ <xs:extension base="limited-string">
+ <xs:attribute name="min-version" type="version"
+ use="optional"/>
+ <xs:attribute name="max-version" type="version"
+ use="optional"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="database">
+ <xs:simpleContent>
+ <xs:extension base="databases">
+ <xs:attribute name="min-version" type="version"
+ use="optional"/>
+ <xs:attribute name="max-version" type="version"
+ use="optional"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="php">
+ <xs:simpleContent>
+ <xs:extension base="empty-string">
+ <xs:attribute name="min-int-size" type="bits" use="optional"
+ default="32"/>
+ <xs:attribute name="min-version" type="version"
+ use="optional"/>
+ <xs:attribute name="max-version" type="version"
+ use="optional"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:simpleType name="bits">
+ <xs:restriction base="xs:int">
+ <xs:enumeration value="32"/>
+ <xs:enumeration value="64"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="repair-steps">
+ <xs:sequence>
+ <xs:element name="pre-migration" type="steps" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="post-migration" type="steps" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="live-migration" type="steps" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="install" type="steps" minOccurs="0"
+ maxOccurs="1"/>
+ <xs:element name="uninstall" type="steps" minOccurs="0"
+ maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="jobs">
+ <xs:sequence>
+ <xs:element name="job" type="php-class" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="steps">
+ <xs:sequence>
+ <xs:element name="step" type="php-class" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="two-factor-providers">
+ <xs:sequence>
+ <xs:element name="provider" type="php-class" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="commands">
+ <xs:sequence>
+ <xs:element name="command" type="php-class" minOccurs="1"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:simpleType name="php-class">
+ <xs:restriction base="xs:string">
+ <xs:pattern
+ value="[a-zA-Z_][0-9a-zA-Z_]*(\\[a-zA-Z_][0-9a-zA-Z_]*)*"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+</xs:schema>
diff --git a/settings/Controller/CheckSetupController.php b/settings/Controller/CheckSetupController.php
index 06b9e80294b..0e7e881645d 100644
--- a/settings/Controller/CheckSetupController.php
+++ b/settings/Controller/CheckSetupController.php
@@ -43,7 +43,6 @@ use OCP\IConfig;
use OCP\IL10N;
use OCP\ILogger;
use OCP\IRequest;
-use OC_Util;
use OCP\IURLGenerator;
/**
@@ -96,7 +95,7 @@ class CheckSetupController extends Controller {
}
/**
- * Checks if the ownCloud server can connect to the internet using HTTPS and HTTP
+ * Checks if the server can connect to the internet using HTTPS and HTTP
* @return bool
*/
private function isInternetConnectionWorking() {
diff --git a/settings/Controller/LogSettingsController.php b/settings/Controller/LogSettingsController.php
index ae9e7f4072f..6405ff9ec73 100644
--- a/settings/Controller/LogSettingsController.php
+++ b/settings/Controller/LogSettingsController.php
@@ -27,12 +27,7 @@
namespace OC\Settings\Controller;
use OCP\AppFramework\Controller;
-use OCP\AppFramework\Http;
-use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\StreamResponse;
-use OCP\IL10N;
-use OCP\IRequest;
-use OCP\IConfig;
/**
* Class LogSettingsController
diff --git a/settings/Controller/MailSettingsController.php b/settings/Controller/MailSettingsController.php
index 22e2662a216..d1ceb14a63c 100644
--- a/settings/Controller/MailSettingsController.php
+++ b/settings/Controller/MailSettingsController.php
@@ -47,8 +47,6 @@ class MailSettingsController extends Controller {
private $userSession;
/** @var IMailer */
private $mailer;
- /** @var string */
- private $defaultMailAddress;
/**
* @param string $appName
@@ -57,21 +55,18 @@ class MailSettingsController extends Controller {
* @param IConfig $config
* @param IUserSession $userSession
* @param IMailer $mailer
- * @param string $fromMailAddress
*/
public function __construct($appName,
IRequest $request,
IL10N $l10n,
IConfig $config,
IUserSession $userSession,
- IMailer $mailer,
- $fromMailAddress) {
+ IMailer $mailer) {
parent::__construct($appName, $request);
$this->l10n = $l10n;
$this->config = $config;
$this->userSession = $userSession;
$this->mailer = $mailer;
- $this->defaultMailAddress = $fromMailAddress;
}
/**
diff --git a/settings/Controller/UsersController.php b/settings/Controller/UsersController.php
index f92f073e879..d311b9dcb80 100644
--- a/settings/Controller/UsersController.php
+++ b/settings/Controller/UsersController.php
@@ -45,7 +45,6 @@ use OC\Security\IdentityProof\Manager;
use OCP\App\IAppManager;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\DataResponse;
-use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\IJobList;
use OCP\Files\Config\IUserMountCache;
use OCP\Encryption\IEncryptionModule;
@@ -61,7 +60,6 @@ use OCP\IUserManager;
use OCP\IUserSession;
use OCP\Mail\IMailer;
use OCP\IAvatarManager;
-use OCP\Security\ICrypto;
use OCP\Security\ISecureRandom;
use OCP\Util;
use OC\Settings\BackgroundJobs\VerifyUserData;
@@ -100,10 +98,6 @@ class UsersController extends Controller {
private $secureRandom;
/** @var NewUserMailHelper */
private $newUserMailHelper;
- /** @var ITimeFactory */
- private $timeFactory;
- /** @var ICrypto */
- private $crypto;
/** @var Manager */
private $keyManager;
/** @var IJobList */
@@ -133,8 +127,6 @@ class UsersController extends Controller {
* @param AccountManager $accountManager
* @param ISecureRandom $secureRandom
* @param NewUserMailHelper $newUserMailHelper
- * @param ITimeFactory $timeFactory
- * @param ICrypto $crypto
* @param Manager $keyManager
* @param IJobList $jobList
* @param IUserMountCache $userMountCache
@@ -156,8 +148,6 @@ class UsersController extends Controller {
AccountManager $accountManager,
ISecureRandom $secureRandom,
NewUserMailHelper $newUserMailHelper,
- ITimeFactory $timeFactory,
- ICrypto $crypto,
Manager $keyManager,
IJobList $jobList,
IUserMountCache $userMountCache,
@@ -176,8 +166,6 @@ class UsersController extends Controller {
$this->accountManager = $accountManager;
$this->secureRandom = $secureRandom;
$this->newUserMailHelper = $newUserMailHelper;
- $this->timeFactory = $timeFactory;
- $this->crypto = $crypto;
$this->keyManager = $keyManager;
$this->jobList = $jobList;
$this->userMountCache = $userMountCache;
diff --git a/settings/ajax/enableapp.php b/settings/ajax/enableapp.php
index 4014664481a..edcccf9b0b9 100644
--- a/settings/ajax/enableapp.php
+++ b/settings/ajax/enableapp.php
@@ -34,7 +34,7 @@ if ($lastConfirm < (time() - 30 * 60 + 15)) { // allow 15 seconds delay
exit();
}
-$groups = isset($_POST['groups']) ? (array)$_POST['groups'] : null;
+$groups = isset($_POST['groups']) ? (array)$_POST['groups'] : [];
$appIds = isset($_POST['appIds']) ? (array)$_POST['appIds'] : [];
try {
diff --git a/settings/ajax/navigationdetect.php b/settings/ajax/navigationdetect.php
index 167f819f91e..043e10da559 100644
--- a/settings/ajax/navigationdetect.php
+++ b/settings/ajax/navigationdetect.php
@@ -23,6 +23,6 @@
OC_Util::checkAdminUser();
OCP\JSON::callCheck();
-$navigation = \OC_App::getNavigation();
+$navigation = \OC::$server->getNavigationManager()->getAll();
OCP\JSON::success(['nav_entries' => $navigation]);
diff --git a/settings/css/settings.scss b/settings/css/settings.scss
index 59f32cc7131..05d62423d17 100644
--- a/settings/css/settings.scss
+++ b/settings/css/settings.scss
@@ -329,11 +329,23 @@ table.nostyle {
}
}
.token-list td {
- &.more {
+ &%icon {
overflow: visible;
position: relative;
width: 16px;
}
+ &.more {
+ @extend %icon;
+ }
+ &.client {
+ @extend %icon;
+
+ div {
+ opacity: 0.57;
+ width: inherit;
+ padding-top: 5px;
+ }
+ }
border-top: 1px solid #DDD;
text-overflow: ellipsis;
max-width: 200px;
@@ -342,7 +354,7 @@ table.nostyle {
vertical-align: top;
position: relative;
}
- tr > *:nth-child(2) {
+ tr > *:nth-child(3) {
text-align: right;
}
.token-list {
diff --git a/settings/img/change.svg b/settings/img/change.svg
index b3404d2ef84..12071422b7f 100644
--- a/settings/img/change.svg
+++ b/settings/img/change.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1"><path d="m8 0c-2.8557-3.771e-8 -5.4999 1.5269-6.9277 4l2.5976 1.5c0.8944-1.5491 2.5413-2.5 4.3301-2.5 1.5874 0 3.0628 0.74877 4 2l-2 2h6v-6l-1.875 1.875c-1.505-1.797-3.736-2.875-6.125-2.875z"/><path d="m0 9v6l1.877-1.877c1.4882 1.778 3.7559 2.857 6.123 2.877 2.8797 0.02436 5.4878-1.506 6.9277-4l-2.598-1.5c-0.902 1.562-2.5261 2.515-4.33 2.5-1.5737-0.013-3.0729-0.762-4-2l2-2z"/></svg>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" version="1.1" height="16"><path d="m8 2c-2.142 0-4.125 1.145-5.196 3l1.948 1.125c0.671-1.162 1.906-1.875 3.2476-1.875 1.1906 0 2.297 0.56157 3 1.5l-1.5 1.5h4.5v-4.5l-1.406 1.406c-1.129-1.348-2.802-2.1563-4.594-2.1563z"/><path d="m2 8.75v4.5l1.408-1.41c1.116 1.334 2.817 2.145 4.592 2.16 2.16 0.01827 4.116-1.132 5.196-3.002l-1.948-1.125c-0.677 1.171-1.9005 1.886-3.248 1.875-1.18-0.01-2.3047-0.572-3-1.5l1.5-1.5z"/></svg>
diff --git a/settings/js/authtoken_view.js b/settings/js/authtoken_view.js
index a20434be872..b8645e4cc85 100644
--- a/settings/js/authtoken_view.js
+++ b/settings/js/authtoken_view.js
@@ -27,6 +27,9 @@
var TEMPLATE_TOKEN =
'<tr data-id="{{id}}">'
+ + '<td class="client">'
+ + '<div class="{{icon}}" />'
+ + '</td>'
+ '<td class="has-tooltip" title="{{title}}">'
+ '<span class="token-name">{{name}}</span>'
+ '</td>'
@@ -146,6 +149,22 @@
sailfishBrowser: 'SailfishBrowser'
};
+ var iconMap = {
+ ie: 'icon-desktop',
+ edge: 'icon-desktop',
+ firefox: 'icon-desktop',
+ chrome: 'icon-desktop',
+ safari: 'icon-desktop',
+ androidChrome: 'icon-phone',
+ iphone: 'icon-phone',
+ ipad: 'icon-tablet',
+ iosClient: 'icon-phone',
+ androidClient: 'icon-phone',
+ davDroid: 'icon-phone',
+ webPirate: 'icon-link',
+ sailfishBrowser: 'icon-link'
+ };
+
if (matches) {
viewData.name = t('settings', 'Sync client - {os}', {
os: matches[1],
@@ -161,6 +180,11 @@
} else {
viewData.name = nameMap[client];
}
+
+ // update title - for easier view
+ viewData.title = viewData.name;
+
+ viewData.icon = iconMap[client];
}
}
if (viewData.current) {
diff --git a/settings/js/users/users.js b/settings/js/users/users.js
index 5a337c38556..0b94401941b 100644
--- a/settings/js/users/users.js
+++ b/settings/js/users/users.js
@@ -940,7 +940,7 @@ $(document).ready(function () {
UserList._triggerGroupEdit($td, isSubadminSelect);
});
- $userListBody.on('click', '.toggleUserActions', function (event) {
+ $userListBody.on('click', '.toggleUserActions > .action', function (event) {
event.stopPropagation();
var $td = $(this).closest('td');
var $tr = $($td).closest('tr');
@@ -963,9 +963,11 @@ $(document).ready(function () {
$tr.addClass('active');
});
- $(document).on('mouseup', function () {
- $('#userlist tr.active').removeClass('active');
- $('#userlist .popovermenu.open').removeClass('open');
+ $(document).on('mouseup', function (event) {
+ if (!$(event.target).closest('.toggleUserActions').length) {
+ $('#userlist tr.active').removeClass('active');
+ $('#userlist .popovermenu.open').removeClass('open');
+ }
});
$userListBody.on('click', '.action-togglestate', function (event) {
diff --git a/settings/l10n/ar.js b/settings/l10n/ar.js
index 9534130ed6a..81b6c4a490f 100644
--- a/settings/l10n/ar.js
+++ b/settings/l10n/ar.js
@@ -1,28 +1,101 @@
OC.L10N.register(
"settings",
{
+ "{actor} changed your password" : "{actor} قام بتغيير كلمتك السرية",
+ "You changed your password" : "لقد قمت بتعديل كلمة مرورك",
+ "Your password was reset by an administrator" : "قام أحد المدراء بإعادة تعيين كلمة مرورك",
+ "{actor} changed your email address" : "{actor} قام بتغيير عنوان بريدك الإلكتروني",
+ "You changed your email address" : "لقد قمت بتعديل عنوان بريدك الإلكتروني",
+ "Your email address was changed by an administrator" : "قام أحد المدراء بتغيير عنوان بريدك الإلكتروني",
+ "Security" : "الأمان",
"Your apps" : "تطبيقاتك",
"Updates" : "التحديثات",
+ "Enabled apps" : "التطبيقات المفعّلة",
+ "Disabled apps" : "التطبيقات المعطلة",
+ "App bundles" : "حُزَم التطبيقات",
"Wrong password" : "كلمة مرور خاطئة",
"Saved" : "حفظ",
"No user supplied" : "لم يتم توفير مستخدم ",
"Unable to change password" : "لا يمكن تغيير كلمة المرور",
"Authentication error" : "لم يتم التأكد من الشخصية بنجاح",
"Wrong admin recovery password. Please check the password and try again." : "خطا في كلمة مرور المسؤول المستردة, يرجى التاكد من كلمة المرور والمحاولة مرة اخرى.",
+ "Federated Cloud Sharing" : "المشاركة السحابية الموحّدة",
+ "Migration Completed" : "إكتملت عملية الترحيل",
+ "Invalid SMTP password." : "كلمة مرور SMTP خاطئة.",
+ "Email setting test" : "تجريب إعدادات البريد الإلكتروني",
+ "Well done, %s!" : "حسنًا فعلت، %s !",
+ "Invalid mail address" : "عنوان البريد الإلكتروني خاطئ",
+ "Unable to create user." : "لا يمكن إنشاء المستخدم",
+ "Unable to delete user." : "لا يمكن حذف المستخدم.",
+ "Error while enabling user." : "طرأ خطأ أثناء تنشيط المستخدم.",
+ "Error while disabling user." : "طرأ خطأ أثناء تعطيل المستخدم.",
+ "Settings saved" : "تم حفظ الإعدادات",
"Unable to change full name" : "لم يتم التمكن من تغيير اسمك الكامل",
"Your full name has been changed." : "اسمك الكامل تم تغييره.",
+ "Forbidden" : "ممنوعع",
+ "Invalid user" : "مستخدم غير صالح",
+ "Unable to change mail address" : "لم نتمكّن مِن تغيير عنوان بريدك الإلكتروني",
"Email saved" : "تم حفظ البريد الإلكتروني",
+ "Password changed for %s" : "تم تعديل كلمة سر %s",
+ "Welcome aboard" : "مرحبًا بكم على متن ناكست كلاود",
+ "Welcome aboard %s" : "مرحبًا بكم على متن ناكست كلاود يا %s",
+ "Your username is: %s" : "إسم المستخدم الخاص بك هو : %s",
+ "Set your password" : "قم بإدخال كلمتك السرية",
+ "Go to %s" : "الإنتقال إلى %s",
+ "Install Client" : "تنصيب العميل",
+ "Password confirmation is required" : "مِن الواجب تأكيد كلمة السر",
+ "Couldn't remove app." : "لم نتمكّن مِن حذف التطبيق.",
"Couldn't update app." : "تعذر تحديث التطبيق.",
"Add trusted domain" : "أضافة نطاق موثوق فيه",
+ "Migration in progress. Please wait until the migration is finished" : "عملية الترحيل جارية. الرجاء الإنتظار حتى تكتمل العملية",
+ "Migration started …" : "بدأت عملية الترحيل …",
+ "Not saved" : "لم يتم حفظه",
+ "Sending…" : "جارٍ الإرسال …",
"Email sent" : "تم ارسال البريد الالكتروني",
+ "Official" : "الرسمي",
"All" : "الكل",
+ "Update to %s" : "التحديث إلى %s",
+ "Disabling app …" : "جارٍ تعطيل التطبيق …",
"Error while disabling app" : "خطا عند تعطيل البرنامج",
"Disable" : "إيقاف",
"Enable" : "تفعيل",
+ "Enabling app …" : "جارٍ تنشيط التطبيق …",
"Error while enabling app" : "خطا عند تفعيل البرنامج ",
+ "App up to date" : "التطبيق مُحدّث",
+ "Upgrading …" : "الترقية جارية …",
+ "Could not upgrade app" : "لم نتمكّن مِن ترقية التطبيق",
"Updated" : "تم التحديث بنجاح",
+ "Removing …" : "عملية الحذف جارية …",
+ "Could not remove app" : "لم نتمكّن مِن حذف التطبيق",
+ "Remove" : "حذف",
+ "App upgrade" : "ترقية التطبيق",
+ "Approved" : "تم قبوله",
+ "Experimental" : "تجريبي",
+ "Enable all" : "تنشيط الكل",
+ "Allow filesystem access" : "السماح بالنفاذ إلى نظام الملفات",
+ "Disconnect" : "قطع الإتصال",
+ "Revoke" : "إلغاء",
+ "Internet Explorer" : "إنترنت إكسبلورر",
+ "Edge" : "آدج",
+ "Firefox" : "فايرفوكس",
+ "Google Chrome" : "غوغل كروم",
+ "Safari" : "سفاري",
+ "Google Chrome for Android" : "غوغل كروم لنظام الأندرويد",
+ "iPhone iOS" : "نظام الآيفون iOS",
+ "iOS Client" : "عميل iOS",
+ "Android Client" : "عميل أندرويد",
+ "This session" : "هذه الجلسة",
"Copy" : "نسخ",
+ "Copied!" : "تم نسخه !",
+ "Not supported!" : "غير مدعوم !",
+ "Press ⌘-C to copy." : "إضغط ⌘-C للنسخ",
+ "Press Ctrl-C to copy." : "إضغط Ctrl-C للنسخ.",
"Delete" : "إلغاء",
+ "Local" : "المحلي",
+ "Contacts" : "جهات الإتصال",
+ "Public" : "عمومي",
+ "Verify" : "تحقق",
+ "Verifying …" : "عملية التحقق جارية …",
"Select a profile picture" : "اختر صورة الملف الشخصي ",
"Very weak password" : "كلمة السر ضعيفة جدا",
"Weak password" : "كلمة السر ضعيفة",
@@ -31,54 +104,128 @@ OC.L10N.register(
"Groups" : "مجموعات",
"undo" : "تراجع",
"never" : "بتاتا",
+ "Add group" : "إضافة فريق",
+ "Password successfully changed" : "تم تغيير كلمة السر بنجاح",
"A valid username must be provided" : "يجب ادخال اسم مستخدم صحيح",
"A valid password must be provided" : "يجب ادخال كلمة مرور صحيحة",
+ "A valid email must be provided" : "مِن اللازم إدخال عنوان بريد إلكتروني صحيح",
+ "Developer documentation" : "دليل المُطوّر",
+ "View in store" : "العرض على المتجر",
+ "by %s" : "مِن %s",
"Documentation:" : "التوثيق",
+ "User documentation" : "دليل المستخدم",
+ "Admin documentation" : "دليل المدير",
+ "Visit website" : "زر الموقع",
+ "Report a bug" : "الإبلاغ عن عِلّة",
+ "Show description …" : "إظهار الوصف …",
+ "Hide description …" : "إخفاء الوصف …",
+ "SSL Root Certificates" : "شهادات أمان الـ SSL الجذرية",
+ "Common Name" : "الإسم الشائع",
"Valid until" : "صالح حتى",
+ "Issued By" : "سُلّمت مِن طرف",
+ "Valid until %s" : "صالحة إلى غاية %s",
+ "Import root certificate" : "إستيراد شهادة جذرية",
+ "Administrator documentation" : "دليل المدير",
+ "Online documentation" : "التعليمات على الإنترنت",
"Forum" : "منتدى",
+ "Getting help" : "طلب المساعدة",
+ "Commercial support" : "الدعم التجاري",
"None" : "لا شيء",
"Login" : "تسجيل الدخول",
+ "NT LAN Manager" : "مدير الشبكة المحلية LAN NT",
+ "SSL/TLS" : "SSL/TLS",
+ "STARTTLS" : "STARTTLS",
+ "Email server" : "خادوم البريد",
"Send mode" : "وضعية الإرسال",
"Encryption" : "التشفير",
+ "mail" : "البريد",
"Authentication method" : "أسلوب التطابق",
+ "Authentication required" : "المصادقة لازمة",
"Server address" : "عنوان الخادم",
"Port" : "المنفذ",
+ "SMTP Username" : "إسم مستخدم الـ SMTP",
+ "SMTP Password" : "كلمة مرور الـ SMTP",
"Test email settings" : "فحص إعدادات البريد الإلكتروني",
+ "Send email" : "إرسال بريد إلكتروني",
+ "Enable encryption" : "تنشيط التعمية",
+ "Start migration" : "إبدأ الترحيل",
+ "Security & setup warnings" : "تحذيرات الإعداد و الأمان",
"System locale can not be set to a one which supports UTF-8." : "لا يمكن تعيين لغة النظام الى احد اللغات التي تدعم UTF-8.",
+ "Background jobs" : "الأنشطة في الخلفية",
"Execute one task with each page loaded" : "قم بتنفيذ مهمة واحدة مع كل صفحة تم تحميلها",
"Version" : "إصدار",
"Sharing" : "مشاركة",
"Allow apps to use the Share API" : "السماح للتطبيقات بالمشاركة عن طريق الAPI",
"Allow users to share via link" : "السماح للمستخدم بمشاركة الملف عن طريق رابط",
"Allow public uploads" : "السماح بالرفع للعامة ",
+ "Always ask for a password" : "أطلب دائما كلمة السر",
+ "Set default expiration date" : "تعيين تاريخ إنتهاء الصلاحية الإفتراضية",
"Expire after " : "ينتهي بعد",
"days" : "أيام",
"Allow resharing" : "السماح بإعادة المشاركة ",
+ "Tips & tricks" : "نصائح و تلميحات",
+ "How to do backups" : "كيف يمكنكم إنشاء نسخ إحتياطية",
+ "Theming" : "المظهر",
+ "Personal" : "شخصي",
+ "Administration" : "الإدارة",
"Profile picture" : "صورة الملف الشخصي",
"Upload new" : "رفع الان",
+ "Select from Files" : "إختر مِن بين الملفات",
"Remove image" : "إزالة الصورة",
"Cancel" : "الغاء",
+ "Choose as profile picture" : "اختر صورة للملف الشخصي ",
+ "Full name" : "الإسم الكامل",
+ "No display name set" : "لم يتم إدخال أي إسم",
"Email" : "البريد الإلكترونى",
"Your email address" : "عنوانك البريدي",
+ "No email address set" : "لم يتم إدخال أي عنوان للبريد الإلكتروني",
+ "For password reset and notifications" : "لإعادة تعيين كلمة السر و تلقي الإشعارات",
+ "Phone number" : "رقم الهاتف",
+ "Your phone number" : "رقم هاتفك",
+ "Address" : "العنوان",
+ "Your postal address" : "عنوان البريد العادي",
+ "Website" : "موقع الويب",
+ "Link https://…" : "الرابط https://…",
+ "Twitter" : "تويتر",
"Language" : "اللغة",
"Help translate" : "ساعد في الترجمه",
"Password" : "كلمة المرور",
"Current password" : "كلمات السر الحالية",
"New password" : "كلمات سر جديدة",
"Change password" : "عدل كلمة السر",
+ "Device" : "الجهاز",
+ "Last activity" : "آخر نشاط",
+ "App name" : "إسم التطبيق",
+ "Create new app password" : "إنشاء كلمة سرية جديدة للتطبيق",
"Username" : "إسم المستخدم",
+ "Done" : "تم",
+ "Follow us on Google+" : "تابعنا على Google+",
+ "Like our Facebook page" : "قم بالإعجاب بصفحتنا على الفايسبوك",
"Settings" : "الإعدادات",
"E-Mail" : "بريد إلكتروني",
"Create" : "انشئ",
"Admin Recovery Password" : "استعادة كلمة المرور للمسؤول",
"Enter the recovery password in order to recover the users files during password change" : "ادخل كلمة المرور المستعادة من اجل استرداد ملفات المستخدمين اثناء تغيير كلمة المرور",
"Everyone" : "الجميع",
+ "Admins" : "المدراء",
+ "Disabled" : "معطّل",
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "يرجى ادخال تخزين quota (مثل:\"512 MB\" او \"12 GB\")",
"Unlimited" : "غير محدود",
"Other" : "شيء آخر",
"Quota" : "حصه",
"change full name" : "تغيير اسمك الكامل",
"set new password" : "اعداد كلمة مرور جديدة",
- "Default" : "افتراضي"
+ "Default" : "افتراضي",
+ "Updating...." : "جاري التحديث ...",
+ "__language_name__" : "__language_name__",
+ "Verifying" : "التحقق",
+ "Personal info" : "المعلومات الشخصية",
+ "Sync clients" : "مزامنة العملاء",
+ "Android app" : "تطبيق الأندرويد",
+ "Follow us on Google+!" : "تابعنا على Google+ !",
+ "Like our facebook page!" : "قم بالإعجاب بصفحتنا على الفايسبوك !",
+ "Follow us on Twitter!" : "تابعنا على تويتر !",
+ "Check out our blog!" : "إلقي نظرة على مدوّنتنا !",
+ "Group name" : "إسم الفريق"
},
"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/settings/l10n/ar.json b/settings/l10n/ar.json
index c0bac3abd49..92d7a10e887 100644
--- a/settings/l10n/ar.json
+++ b/settings/l10n/ar.json
@@ -1,26 +1,99 @@
{ "translations": {
+ "{actor} changed your password" : "{actor} قام بتغيير كلمتك السرية",
+ "You changed your password" : "لقد قمت بتعديل كلمة مرورك",
+ "Your password was reset by an administrator" : "قام أحد المدراء بإعادة تعيين كلمة مرورك",
+ "{actor} changed your email address" : "{actor} قام بتغيير عنوان بريدك الإلكتروني",
+ "You changed your email address" : "لقد قمت بتعديل عنوان بريدك الإلكتروني",
+ "Your email address was changed by an administrator" : "قام أحد المدراء بتغيير عنوان بريدك الإلكتروني",
+ "Security" : "الأمان",
"Your apps" : "تطبيقاتك",
"Updates" : "التحديثات",
+ "Enabled apps" : "التطبيقات المفعّلة",
+ "Disabled apps" : "التطبيقات المعطلة",
+ "App bundles" : "حُزَم التطبيقات",
"Wrong password" : "كلمة مرور خاطئة",
"Saved" : "حفظ",
"No user supplied" : "لم يتم توفير مستخدم ",
"Unable to change password" : "لا يمكن تغيير كلمة المرور",
"Authentication error" : "لم يتم التأكد من الشخصية بنجاح",
"Wrong admin recovery password. Please check the password and try again." : "خطا في كلمة مرور المسؤول المستردة, يرجى التاكد من كلمة المرور والمحاولة مرة اخرى.",
+ "Federated Cloud Sharing" : "المشاركة السحابية الموحّدة",
+ "Migration Completed" : "إكتملت عملية الترحيل",
+ "Invalid SMTP password." : "كلمة مرور SMTP خاطئة.",
+ "Email setting test" : "تجريب إعدادات البريد الإلكتروني",
+ "Well done, %s!" : "حسنًا فعلت، %s !",
+ "Invalid mail address" : "عنوان البريد الإلكتروني خاطئ",
+ "Unable to create user." : "لا يمكن إنشاء المستخدم",
+ "Unable to delete user." : "لا يمكن حذف المستخدم.",
+ "Error while enabling user." : "طرأ خطأ أثناء تنشيط المستخدم.",
+ "Error while disabling user." : "طرأ خطأ أثناء تعطيل المستخدم.",
+ "Settings saved" : "تم حفظ الإعدادات",
"Unable to change full name" : "لم يتم التمكن من تغيير اسمك الكامل",
"Your full name has been changed." : "اسمك الكامل تم تغييره.",
+ "Forbidden" : "ممنوعع",
+ "Invalid user" : "مستخدم غير صالح",
+ "Unable to change mail address" : "لم نتمكّن مِن تغيير عنوان بريدك الإلكتروني",
"Email saved" : "تم حفظ البريد الإلكتروني",
+ "Password changed for %s" : "تم تعديل كلمة سر %s",
+ "Welcome aboard" : "مرحبًا بكم على متن ناكست كلاود",
+ "Welcome aboard %s" : "مرحبًا بكم على متن ناكست كلاود يا %s",
+ "Your username is: %s" : "إسم المستخدم الخاص بك هو : %s",
+ "Set your password" : "قم بإدخال كلمتك السرية",
+ "Go to %s" : "الإنتقال إلى %s",
+ "Install Client" : "تنصيب العميل",
+ "Password confirmation is required" : "مِن الواجب تأكيد كلمة السر",
+ "Couldn't remove app." : "لم نتمكّن مِن حذف التطبيق.",
"Couldn't update app." : "تعذر تحديث التطبيق.",
"Add trusted domain" : "أضافة نطاق موثوق فيه",
+ "Migration in progress. Please wait until the migration is finished" : "عملية الترحيل جارية. الرجاء الإنتظار حتى تكتمل العملية",
+ "Migration started …" : "بدأت عملية الترحيل …",
+ "Not saved" : "لم يتم حفظه",
+ "Sending…" : "جارٍ الإرسال …",
"Email sent" : "تم ارسال البريد الالكتروني",
+ "Official" : "الرسمي",
"All" : "الكل",
+ "Update to %s" : "التحديث إلى %s",
+ "Disabling app …" : "جارٍ تعطيل التطبيق …",
"Error while disabling app" : "خطا عند تعطيل البرنامج",
"Disable" : "إيقاف",
"Enable" : "تفعيل",
+ "Enabling app …" : "جارٍ تنشيط التطبيق …",
"Error while enabling app" : "خطا عند تفعيل البرنامج ",
+ "App up to date" : "التطبيق مُحدّث",
+ "Upgrading …" : "الترقية جارية …",
+ "Could not upgrade app" : "لم نتمكّن مِن ترقية التطبيق",
"Updated" : "تم التحديث بنجاح",
+ "Removing …" : "عملية الحذف جارية …",
+ "Could not remove app" : "لم نتمكّن مِن حذف التطبيق",
+ "Remove" : "حذف",
+ "App upgrade" : "ترقية التطبيق",
+ "Approved" : "تم قبوله",
+ "Experimental" : "تجريبي",
+ "Enable all" : "تنشيط الكل",
+ "Allow filesystem access" : "السماح بالنفاذ إلى نظام الملفات",
+ "Disconnect" : "قطع الإتصال",
+ "Revoke" : "إلغاء",
+ "Internet Explorer" : "إنترنت إكسبلورر",
+ "Edge" : "آدج",
+ "Firefox" : "فايرفوكس",
+ "Google Chrome" : "غوغل كروم",
+ "Safari" : "سفاري",
+ "Google Chrome for Android" : "غوغل كروم لنظام الأندرويد",
+ "iPhone iOS" : "نظام الآيفون iOS",
+ "iOS Client" : "عميل iOS",
+ "Android Client" : "عميل أندرويد",
+ "This session" : "هذه الجلسة",
"Copy" : "نسخ",
+ "Copied!" : "تم نسخه !",
+ "Not supported!" : "غير مدعوم !",
+ "Press ⌘-C to copy." : "إضغط ⌘-C للنسخ",
+ "Press Ctrl-C to copy." : "إضغط Ctrl-C للنسخ.",
"Delete" : "إلغاء",
+ "Local" : "المحلي",
+ "Contacts" : "جهات الإتصال",
+ "Public" : "عمومي",
+ "Verify" : "تحقق",
+ "Verifying …" : "عملية التحقق جارية …",
"Select a profile picture" : "اختر صورة الملف الشخصي ",
"Very weak password" : "كلمة السر ضعيفة جدا",
"Weak password" : "كلمة السر ضعيفة",
@@ -29,54 +102,128 @@
"Groups" : "مجموعات",
"undo" : "تراجع",
"never" : "بتاتا",
+ "Add group" : "إضافة فريق",
+ "Password successfully changed" : "تم تغيير كلمة السر بنجاح",
"A valid username must be provided" : "يجب ادخال اسم مستخدم صحيح",
"A valid password must be provided" : "يجب ادخال كلمة مرور صحيحة",
+ "A valid email must be provided" : "مِن اللازم إدخال عنوان بريد إلكتروني صحيح",
+ "Developer documentation" : "دليل المُطوّر",
+ "View in store" : "العرض على المتجر",
+ "by %s" : "مِن %s",
"Documentation:" : "التوثيق",
+ "User documentation" : "دليل المستخدم",
+ "Admin documentation" : "دليل المدير",
+ "Visit website" : "زر الموقع",
+ "Report a bug" : "الإبلاغ عن عِلّة",
+ "Show description …" : "إظهار الوصف …",
+ "Hide description …" : "إخفاء الوصف …",
+ "SSL Root Certificates" : "شهادات أمان الـ SSL الجذرية",
+ "Common Name" : "الإسم الشائع",
"Valid until" : "صالح حتى",
+ "Issued By" : "سُلّمت مِن طرف",
+ "Valid until %s" : "صالحة إلى غاية %s",
+ "Import root certificate" : "إستيراد شهادة جذرية",
+ "Administrator documentation" : "دليل المدير",
+ "Online documentation" : "التعليمات على الإنترنت",
"Forum" : "منتدى",
+ "Getting help" : "طلب المساعدة",
+ "Commercial support" : "الدعم التجاري",
"None" : "لا شيء",
"Login" : "تسجيل الدخول",
+ "NT LAN Manager" : "مدير الشبكة المحلية LAN NT",
+ "SSL/TLS" : "SSL/TLS",
+ "STARTTLS" : "STARTTLS",
+ "Email server" : "خادوم البريد",
"Send mode" : "وضعية الإرسال",
"Encryption" : "التشفير",
+ "mail" : "البريد",
"Authentication method" : "أسلوب التطابق",
+ "Authentication required" : "المصادقة لازمة",
"Server address" : "عنوان الخادم",
"Port" : "المنفذ",
+ "SMTP Username" : "إسم مستخدم الـ SMTP",
+ "SMTP Password" : "كلمة مرور الـ SMTP",
"Test email settings" : "فحص إعدادات البريد الإلكتروني",
+ "Send email" : "إرسال بريد إلكتروني",
+ "Enable encryption" : "تنشيط التعمية",
+ "Start migration" : "إبدأ الترحيل",
+ "Security & setup warnings" : "تحذيرات الإعداد و الأمان",
"System locale can not be set to a one which supports UTF-8." : "لا يمكن تعيين لغة النظام الى احد اللغات التي تدعم UTF-8.",
+ "Background jobs" : "الأنشطة في الخلفية",
"Execute one task with each page loaded" : "قم بتنفيذ مهمة واحدة مع كل صفحة تم تحميلها",
"Version" : "إصدار",
"Sharing" : "مشاركة",
"Allow apps to use the Share API" : "السماح للتطبيقات بالمشاركة عن طريق الAPI",
"Allow users to share via link" : "السماح للمستخدم بمشاركة الملف عن طريق رابط",
"Allow public uploads" : "السماح بالرفع للعامة ",
+ "Always ask for a password" : "أطلب دائما كلمة السر",
+ "Set default expiration date" : "تعيين تاريخ إنتهاء الصلاحية الإفتراضية",
"Expire after " : "ينتهي بعد",
"days" : "أيام",
"Allow resharing" : "السماح بإعادة المشاركة ",
+ "Tips & tricks" : "نصائح و تلميحات",
+ "How to do backups" : "كيف يمكنكم إنشاء نسخ إحتياطية",
+ "Theming" : "المظهر",
+ "Personal" : "شخصي",
+ "Administration" : "الإدارة",
"Profile picture" : "صورة الملف الشخصي",
"Upload new" : "رفع الان",
+ "Select from Files" : "إختر مِن بين الملفات",
"Remove image" : "إزالة الصورة",
"Cancel" : "الغاء",
+ "Choose as profile picture" : "اختر صورة للملف الشخصي ",
+ "Full name" : "الإسم الكامل",
+ "No display name set" : "لم يتم إدخال أي إسم",
"Email" : "البريد الإلكترونى",
"Your email address" : "عنوانك البريدي",
+ "No email address set" : "لم يتم إدخال أي عنوان للبريد الإلكتروني",
+ "For password reset and notifications" : "لإعادة تعيين كلمة السر و تلقي الإشعارات",
+ "Phone number" : "رقم الهاتف",
+ "Your phone number" : "رقم هاتفك",
+ "Address" : "العنوان",
+ "Your postal address" : "عنوان البريد العادي",
+ "Website" : "موقع الويب",
+ "Link https://…" : "الرابط https://…",
+ "Twitter" : "تويتر",
"Language" : "اللغة",
"Help translate" : "ساعد في الترجمه",
"Password" : "كلمة المرور",
"Current password" : "كلمات السر الحالية",
"New password" : "كلمات سر جديدة",
"Change password" : "عدل كلمة السر",
+ "Device" : "الجهاز",
+ "Last activity" : "آخر نشاط",
+ "App name" : "إسم التطبيق",
+ "Create new app password" : "إنشاء كلمة سرية جديدة للتطبيق",
"Username" : "إسم المستخدم",
+ "Done" : "تم",
+ "Follow us on Google+" : "تابعنا على Google+",
+ "Like our Facebook page" : "قم بالإعجاب بصفحتنا على الفايسبوك",
"Settings" : "الإعدادات",
"E-Mail" : "بريد إلكتروني",
"Create" : "انشئ",
"Admin Recovery Password" : "استعادة كلمة المرور للمسؤول",
"Enter the recovery password in order to recover the users files during password change" : "ادخل كلمة المرور المستعادة من اجل استرداد ملفات المستخدمين اثناء تغيير كلمة المرور",
"Everyone" : "الجميع",
+ "Admins" : "المدراء",
+ "Disabled" : "معطّل",
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "يرجى ادخال تخزين quota (مثل:\"512 MB\" او \"12 GB\")",
"Unlimited" : "غير محدود",
"Other" : "شيء آخر",
"Quota" : "حصه",
"change full name" : "تغيير اسمك الكامل",
"set new password" : "اعداد كلمة مرور جديدة",
- "Default" : "افتراضي"
+ "Default" : "افتراضي",
+ "Updating...." : "جاري التحديث ...",
+ "__language_name__" : "__language_name__",
+ "Verifying" : "التحقق",
+ "Personal info" : "المعلومات الشخصية",
+ "Sync clients" : "مزامنة العملاء",
+ "Android app" : "تطبيق الأندرويد",
+ "Follow us on Google+!" : "تابعنا على Google+ !",
+ "Like our facebook page!" : "قم بالإعجاب بصفحتنا على الفايسبوك !",
+ "Follow us on Twitter!" : "تابعنا على تويتر !",
+ "Check out our blog!" : "إلقي نظرة على مدوّنتنا !",
+ "Group name" : "إسم الفريق"
},"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/settings/l10n/ast.js b/settings/l10n/ast.js
index 47eabf58c09..8c8dfd7545b 100644
--- a/settings/l10n/ast.js
+++ b/settings/l10n/ast.js
@@ -12,6 +12,7 @@ OC.L10N.register(
"A login attempt using two-factor authentication failed (%1$s)" : "Falló un intentu d'aniciu de sesión usando l'autenticación en dos pasos (%1$s)",
"Your <strong>password</strong> or <strong>email</strong> was modified" : "Modificóse la to <strong>contraseña</strong> o <strong>corréu</strong>",
"Your apps" : "Les tos aplicaciones",
+ "Updates" : "Anovamientos",
"Enabled apps" : "Aplicaciones habilitaes",
"Disabled apps" : "Aplicaciones deshabilitaes",
"App bundles" : "Llotes d'aplicaciones",
diff --git a/settings/l10n/ast.json b/settings/l10n/ast.json
index b04bb5a8053..618c05bb193 100644
--- a/settings/l10n/ast.json
+++ b/settings/l10n/ast.json
@@ -10,6 +10,7 @@
"A login attempt using two-factor authentication failed (%1$s)" : "Falló un intentu d'aniciu de sesión usando l'autenticación en dos pasos (%1$s)",
"Your <strong>password</strong> or <strong>email</strong> was modified" : "Modificóse la to <strong>contraseña</strong> o <strong>corréu</strong>",
"Your apps" : "Les tos aplicaciones",
+ "Updates" : "Anovamientos",
"Enabled apps" : "Aplicaciones habilitaes",
"Disabled apps" : "Aplicaciones deshabilitaes",
"App bundles" : "Llotes d'aplicaciones",
diff --git a/settings/l10n/de.js b/settings/l10n/de.js
index 6b3947395b8..88e9ac3b63a 100644
--- a/settings/l10n/de.js
+++ b/settings/l10n/de.js
@@ -74,7 +74,7 @@ OC.L10N.register(
"Welcome aboard %s" : "Willkommen an Bord %s",
"Welcome to your %s account, you can add, protect, and share your data." : "Willkommen zu Deinem %s-Konto. Du kannst Deine Daten hinzufügen, schützen und teilen.",
"Your username is: %s" : "Dein Benutzername lautet: %s",
- "Set your password" : "Vergebe Dein Passwort",
+ "Set your password" : "Setze Dein Kennwort",
"Go to %s" : "Gehe zu %s",
"Install Client" : "Installiere den Client",
"Password confirmation is required" : "Passwortbestätigung erforderlich",
diff --git a/settings/l10n/de.json b/settings/l10n/de.json
index 5210bfa4261..d57fc88815e 100644
--- a/settings/l10n/de.json
+++ b/settings/l10n/de.json
@@ -72,7 +72,7 @@
"Welcome aboard %s" : "Willkommen an Bord %s",
"Welcome to your %s account, you can add, protect, and share your data." : "Willkommen zu Deinem %s-Konto. Du kannst Deine Daten hinzufügen, schützen und teilen.",
"Your username is: %s" : "Dein Benutzername lautet: %s",
- "Set your password" : "Vergebe Dein Passwort",
+ "Set your password" : "Setze Dein Kennwort",
"Go to %s" : "Gehe zu %s",
"Install Client" : "Installiere den Client",
"Password confirmation is required" : "Passwortbestätigung erforderlich",
diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js
index 860797a10ec..00b99873e25 100644
--- a/settings/l10n/de_DE.js
+++ b/settings/l10n/de_DE.js
@@ -74,7 +74,7 @@ OC.L10N.register(
"Welcome aboard %s" : "Willkommen an Bord %s",
"Welcome to your %s account, you can add, protect, and share your data." : "Willkommen zu Ihrem %s-Konto. Sie können Ihre Daten hinzufügen, schützen und teilen.",
"Your username is: %s" : "Ihr Benutzername lautet: %s",
- "Set your password" : "Vergeben Sie Ihr Passwort",
+ "Set your password" : "Setzen Sie Ihr Passwort",
"Go to %s" : "Gehe zu %s",
"Install Client" : "Installiere den Client",
"Password confirmation is required" : "Passwortbestätigung erforderlich",
diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json
index 28a6d98437a..0435e13404f 100644
--- a/settings/l10n/de_DE.json
+++ b/settings/l10n/de_DE.json
@@ -72,7 +72,7 @@
"Welcome aboard %s" : "Willkommen an Bord %s",
"Welcome to your %s account, you can add, protect, and share your data." : "Willkommen zu Ihrem %s-Konto. Sie können Ihre Daten hinzufügen, schützen und teilen.",
"Your username is: %s" : "Ihr Benutzername lautet: %s",
- "Set your password" : "Vergeben Sie Ihr Passwort",
+ "Set your password" : "Setzen Sie Ihr Passwort",
"Go to %s" : "Gehe zu %s",
"Install Client" : "Installiere den Client",
"Password confirmation is required" : "Passwortbestätigung erforderlich",
diff --git a/settings/l10n/es.js b/settings/l10n/es.js
index 4b170df5cf2..a86b15517fc 100644
--- a/settings/l10n/es.js
+++ b/settings/l10n/es.js
@@ -153,7 +153,7 @@ OC.L10N.register(
"Will be synced to a global and public address book" : "Se sincronizará a una libreta de direcciones pública y global",
"Verify" : "Verificar",
"Verifying …" : "Verificando...",
- "An error occured while changing your language. Please reload the page and try again." : "Ocurrió un error al cambiar el lenguaje. Por favor, vuelve a cargar la página y vuelve a intentarlo.",
+ "An error occured while changing your language. Please reload the page and try again." : "Se ha producido un fallo al cambiar el idioma. Por favor, vuelve a cargar la página y vuelve a intentarlo.",
"Select a profile picture" : "Seleccionar una imagen de perfil",
"Very weak password" : "Contraseña muy débil",
"Weak password" : "Contraseña débil",
@@ -283,10 +283,10 @@ OC.L10N.register(
"Allow apps to use the Share API" : "Permitir a las aplicaciones utilizar la API de Compartición",
"Allow users to share via link" : "Permite a los usuarios compartir por medio de enlaces",
"Allow public uploads" : "Permitir subidas públicas",
- "Always ask for a password" : "Siempre pedir por contraseña",
+ "Always ask for a password" : "Siempre pedir la contraseña",
"Enforce password protection" : "Forzar la protección por contraseña.",
"Set default expiration date" : "Establecer fecha de caducidad predeterminada",
- "Expire after " : "Caduca luego de",
+ "Expire after " : "Caduca después de",
"days" : "días",
"Enforce expiration date" : "Imponer fecha de caducidad",
"Allow resharing" : "Permitir recompartición",
@@ -295,7 +295,7 @@ OC.L10N.register(
"Exclude groups from sharing" : "Excluye grupos de compartir",
"These groups will still be able to receive shares, but not to initiate them." : "Estos grupos aún podrán recibir contenidos compartidos, pero no podrán, pero no podrán iniciarlos.",
"Allow username autocompletion in share dialog. If this is disabled the full username or email address needs to be entered." : "Permitir autocompletado del nombre de usuario en el diálogo de compartir. Si se desactiva, se necesita introducir el nombre de usuario completo o la dirección de correo electrónico",
- "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Mostrar texto de renuncia de responsabilidad en la páigina de subida de enlace público. (Solo se muestra cuando se la lista de archivos está oculta.)",
+ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Mostrar texto de renuncia de responsabilidad en la página de subida con el enlace público. (Sólo se muestra cuando la lista de archivos está oculta.)",
"This text will be shown on the public link upload page when the file list is hidden." : "Este texto se mostrará en la pagina de subida de enlace público cuando la lista de archivos está oculta.",
"Tips & tricks" : "Sugerencias y trucos",
"There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Hay muchas características y cambios de configuración disponibles para personalizar y usar esta instancia. Aquí hay alugnas indicaciones para más información.",
@@ -363,7 +363,7 @@ OC.L10N.register(
"Show last login" : "Mostrar último inicio de sesión",
"Show email address" : "Mostrar dirección de correo electrónico",
"Send email to new user" : "Enviar correo al usuario nuevo",
- "When the password of a new user is left empty, an activation email with a link to set the password is sent." : "Cuando la contraseña de un nuevo usuario esta vacía, un mensaje de activación a través de correo electrónico es enviado.",
+ "When the password of a new user is left empty, an activation email with a link to set the password is sent." : "Cuando la contraseña de un usuario nuevo está vacía, se le envía un un correo de activación para poner una contraseña",
"E-Mail" : "Correo electrónico",
"Create" : "Crear",
"Admin Recovery Password" : "Recuperación de la contraseña de administración",
@@ -390,7 +390,7 @@ OC.L10N.register(
"Error while removing app" : "Error al eliminar la app",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "La app ha sido activada pero tiene que actualizarse. Serás redirigido a la página de actualización en 5 segundos.",
"App update" : "Actualización de la aplicación",
- "__language_name__" : "Español",
+ "__language_name__" : "Castellano",
"Verifying" : "Verificando",
"Personal info" : "Información personal",
"Sync clients" : "Clientes de sincronización",
diff --git a/settings/l10n/es.json b/settings/l10n/es.json
index c332cb78713..d8d754f0418 100644
--- a/settings/l10n/es.json
+++ b/settings/l10n/es.json
@@ -151,7 +151,7 @@
"Will be synced to a global and public address book" : "Se sincronizará a una libreta de direcciones pública y global",
"Verify" : "Verificar",
"Verifying …" : "Verificando...",
- "An error occured while changing your language. Please reload the page and try again." : "Ocurrió un error al cambiar el lenguaje. Por favor, vuelve a cargar la página y vuelve a intentarlo.",
+ "An error occured while changing your language. Please reload the page and try again." : "Se ha producido un fallo al cambiar el idioma. Por favor, vuelve a cargar la página y vuelve a intentarlo.",
"Select a profile picture" : "Seleccionar una imagen de perfil",
"Very weak password" : "Contraseña muy débil",
"Weak password" : "Contraseña débil",
@@ -281,10 +281,10 @@
"Allow apps to use the Share API" : "Permitir a las aplicaciones utilizar la API de Compartición",
"Allow users to share via link" : "Permite a los usuarios compartir por medio de enlaces",
"Allow public uploads" : "Permitir subidas públicas",
- "Always ask for a password" : "Siempre pedir por contraseña",
+ "Always ask for a password" : "Siempre pedir la contraseña",
"Enforce password protection" : "Forzar la protección por contraseña.",
"Set default expiration date" : "Establecer fecha de caducidad predeterminada",
- "Expire after " : "Caduca luego de",
+ "Expire after " : "Caduca después de",
"days" : "días",
"Enforce expiration date" : "Imponer fecha de caducidad",
"Allow resharing" : "Permitir recompartición",
@@ -293,7 +293,7 @@
"Exclude groups from sharing" : "Excluye grupos de compartir",
"These groups will still be able to receive shares, but not to initiate them." : "Estos grupos aún podrán recibir contenidos compartidos, pero no podrán, pero no podrán iniciarlos.",
"Allow username autocompletion in share dialog. If this is disabled the full username or email address needs to be entered." : "Permitir autocompletado del nombre de usuario en el diálogo de compartir. Si se desactiva, se necesita introducir el nombre de usuario completo o la dirección de correo electrónico",
- "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Mostrar texto de renuncia de responsabilidad en la páigina de subida de enlace público. (Solo se muestra cuando se la lista de archivos está oculta.)",
+ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Mostrar texto de renuncia de responsabilidad en la página de subida con el enlace público. (Sólo se muestra cuando la lista de archivos está oculta.)",
"This text will be shown on the public link upload page when the file list is hidden." : "Este texto se mostrará en la pagina de subida de enlace público cuando la lista de archivos está oculta.",
"Tips & tricks" : "Sugerencias y trucos",
"There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Hay muchas características y cambios de configuración disponibles para personalizar y usar esta instancia. Aquí hay alugnas indicaciones para más información.",
@@ -361,7 +361,7 @@
"Show last login" : "Mostrar último inicio de sesión",
"Show email address" : "Mostrar dirección de correo electrónico",
"Send email to new user" : "Enviar correo al usuario nuevo",
- "When the password of a new user is left empty, an activation email with a link to set the password is sent." : "Cuando la contraseña de un nuevo usuario esta vacía, un mensaje de activación a través de correo electrónico es enviado.",
+ "When the password of a new user is left empty, an activation email with a link to set the password is sent." : "Cuando la contraseña de un usuario nuevo está vacía, se le envía un un correo de activación para poner una contraseña",
"E-Mail" : "Correo electrónico",
"Create" : "Crear",
"Admin Recovery Password" : "Recuperación de la contraseña de administración",
@@ -388,7 +388,7 @@
"Error while removing app" : "Error al eliminar la app",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "La app ha sido activada pero tiene que actualizarse. Serás redirigido a la página de actualización en 5 segundos.",
"App update" : "Actualización de la aplicación",
- "__language_name__" : "Español",
+ "__language_name__" : "Castellano",
"Verifying" : "Verificando",
"Personal info" : "Información personal",
"Sync clients" : "Clientes de sincronización",
diff --git a/settings/l10n/es_MX.js b/settings/l10n/es_MX.js
index de56935d938..fefa8c69bce 100644
--- a/settings/l10n/es_MX.js
+++ b/settings/l10n/es_MX.js
@@ -66,7 +66,7 @@ OC.L10N.register(
"%1$s changed your email address on %2$s." : "%1$s cambió tu dirección de correo electrónico el %2$s.",
"Your email address on %s was changed." : "Tu dirección de correo electrónico en %s fue cambiada. ",
"Your email address on %s was changed by an administrator." : "Tu dirección de correo electrónico en %s fue cambiada por un adminsitrador. ",
- "Email address for %1$s changed on %2$s" : "La dirección de correo electrónico para %1$s fue cambiada el %2$s",
+ "Email address for %1$s changed on %2$s" : "La dirección de correo %1$s en %2$s ha cambiado",
"Email address changed for %s" : "La dirección de correo electrónico fue cambiada para %s",
"The new email address is %s" : "La nueva dirección de correo electrónico es %s",
"Your %s account was created" : "Tu cuenta %s ha sido creada",
diff --git a/settings/l10n/es_MX.json b/settings/l10n/es_MX.json
index ab2bbbb556b..987b6ca5e71 100644
--- a/settings/l10n/es_MX.json
+++ b/settings/l10n/es_MX.json
@@ -64,7 +64,7 @@
"%1$s changed your email address on %2$s." : "%1$s cambió tu dirección de correo electrónico el %2$s.",
"Your email address on %s was changed." : "Tu dirección de correo electrónico en %s fue cambiada. ",
"Your email address on %s was changed by an administrator." : "Tu dirección de correo electrónico en %s fue cambiada por un adminsitrador. ",
- "Email address for %1$s changed on %2$s" : "La dirección de correo electrónico para %1$s fue cambiada el %2$s",
+ "Email address for %1$s changed on %2$s" : "La dirección de correo %1$s en %2$s ha cambiado",
"Email address changed for %s" : "La dirección de correo electrónico fue cambiada para %s",
"The new email address is %s" : "La nueva dirección de correo electrónico es %s",
"Your %s account was created" : "Tu cuenta %s ha sido creada",
diff --git a/settings/l10n/fi.js b/settings/l10n/fi.js
index ceaca538bba..a5573819556 100644
--- a/settings/l10n/fi.js
+++ b/settings/l10n/fi.js
@@ -109,6 +109,8 @@ OC.L10N.register(
"Removing …" : "Poistetaan…",
"Could not remove app" : "Sovellusta ei voitu poistaa",
"Remove" : "Poista",
+ "The app has been enabled but needs to be upgraded. You will be redirected to the upgrade page in 5 seconds." : "Sovellus on käytössä, mutta se tulee päivittää. Sinut ohjataan sovelluksen versiopäivityssivulle viiden sekunnin kuluttua.",
+ "App upgrade" : "Sovelluksen versiopäivitys",
"Approved" : "Hyväksytty",
"Experimental" : "Kokeellinen",
"No apps found for {query}" : "Haulla {query} ei löytynyt sovelluksia",
@@ -276,6 +278,7 @@ OC.L10N.register(
"Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Näytä vastuuvapauslauseke julkisen linkin lähetyssivulla. (Näytetään vain, kun tiedostolista on piilotettu.)",
"This text will be shown on the public link upload page when the file list is hidden." : "Tämä teksti näytetään julkisen linkin lähetyssivulla, kun tiedostolista on piilotettu.",
"Tips & tricks" : "Vinkit",
+ "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLitea käytetään tällä hetkellä taustaosan tietokantana. Laajoja asennuksia varten on suositeltavaa käyttää jotain muuta tietokantaa.",
"This is particularly recommended when using the desktop client for file synchronisation." : "Tämä on suositeltavaa erityisesti silloin, kun työpöytäsovellusta käytetään tiedostojen synkronointiin.",
"How to do backups" : "Kuinka tehdä varmuuskopioita",
"Performance tuning" : "Suorituskyvyn hienosäätö",
@@ -359,11 +362,25 @@ OC.L10N.register(
"set new password" : "aseta uusi salasana",
"change email address" : "vaihda sähköpostiosoite",
"Default" : "Oletus",
+ "_You have %n app update pending_::_You have %n app updates pending_" : ["%n odottava sovelluspäivitys","%n odottavaa sovelluspäivitystä"],
"Updating...." : "Päivitetään....",
+ "Error while updating app" : "Virhe sovellusta päivittäessä",
+ "Error while removing app" : "Virhe sovellusta poistaessa",
+ "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Sovellus on käytössä, mutta se tulee päivittää. Sinut ohjataan sovelluksen päivityssivulle viiden sekunnin kuluttua.",
+ "App update" : "Sovelluspäivitys",
+ "Verifying" : "Vahvistetaan",
+ "Personal info" : "Henkilökohtaiset tiedot",
+ "Sync clients" : "Synkronointiasiakkaat",
+ "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with MIME type detection." : "PHP-moduuli 'fileinfo' puuttuu. Suosittelemme sen ottamista käyttöön, jotta MIME-tyypit on mahdollista havaita parhain tuloksin.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Siirtyäksesi toiseen tietokantaan, käytä komentorivityökalua: 'occ db:convert-type', tai lue <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentaatio ↗</a>.",
+ "Get the apps to sync your files" : "Laita sovellukset synkronoimaan tiedostosi",
"Desktop client" : "Työpöytäsovellus",
"Android app" : "Android-sovellus",
"iOS app" : "iOS-sovellus",
+ "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Jos haluat tukea projektia, {contributeopen}liity mukaan kehitystoimintaan{linkclose} tai {contributeopen}levitä sanaa{linkclose}!",
+ "Web, desktop, mobile clients and app specific passwords that currently have access to your account." : "Verkko-, työpöytä-, mobiilisovellukset ja sovellusten yksittäiset salasanat, joilla on käyttöoikeus tiliisi.",
"App passwords" : "Sovellussalasanat",
+ "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Täällä voit luoda yksittäisiä salasanoja sovelluksille, jolloin sinun ei tarvitse antaa varsinaista salasanaa niille. Voit kumota yksittäisten sovellusten salasanoja.",
"Follow us on Google+!" : "Seuraa meitä Google+:ssa!",
"Like our facebook page!" : "Tykkää Facebook-sivustamme!",
"Follow us on Twitter!" : "Seuraa meitä Twitterissä!",
diff --git a/settings/l10n/fi.json b/settings/l10n/fi.json
index f7e2e1497fe..63d3b4ae2f8 100644
--- a/settings/l10n/fi.json
+++ b/settings/l10n/fi.json
@@ -107,6 +107,8 @@
"Removing …" : "Poistetaan…",
"Could not remove app" : "Sovellusta ei voitu poistaa",
"Remove" : "Poista",
+ "The app has been enabled but needs to be upgraded. You will be redirected to the upgrade page in 5 seconds." : "Sovellus on käytössä, mutta se tulee päivittää. Sinut ohjataan sovelluksen versiopäivityssivulle viiden sekunnin kuluttua.",
+ "App upgrade" : "Sovelluksen versiopäivitys",
"Approved" : "Hyväksytty",
"Experimental" : "Kokeellinen",
"No apps found for {query}" : "Haulla {query} ei löytynyt sovelluksia",
@@ -274,6 +276,7 @@
"Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Näytä vastuuvapauslauseke julkisen linkin lähetyssivulla. (Näytetään vain, kun tiedostolista on piilotettu.)",
"This text will be shown on the public link upload page when the file list is hidden." : "Tämä teksti näytetään julkisen linkin lähetyssivulla, kun tiedostolista on piilotettu.",
"Tips & tricks" : "Vinkit",
+ "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLitea käytetään tällä hetkellä taustaosan tietokantana. Laajoja asennuksia varten on suositeltavaa käyttää jotain muuta tietokantaa.",
"This is particularly recommended when using the desktop client for file synchronisation." : "Tämä on suositeltavaa erityisesti silloin, kun työpöytäsovellusta käytetään tiedostojen synkronointiin.",
"How to do backups" : "Kuinka tehdä varmuuskopioita",
"Performance tuning" : "Suorituskyvyn hienosäätö",
@@ -357,11 +360,25 @@
"set new password" : "aseta uusi salasana",
"change email address" : "vaihda sähköpostiosoite",
"Default" : "Oletus",
+ "_You have %n app update pending_::_You have %n app updates pending_" : ["%n odottava sovelluspäivitys","%n odottavaa sovelluspäivitystä"],
"Updating...." : "Päivitetään....",
+ "Error while updating app" : "Virhe sovellusta päivittäessä",
+ "Error while removing app" : "Virhe sovellusta poistaessa",
+ "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Sovellus on käytössä, mutta se tulee päivittää. Sinut ohjataan sovelluksen päivityssivulle viiden sekunnin kuluttua.",
+ "App update" : "Sovelluspäivitys",
+ "Verifying" : "Vahvistetaan",
+ "Personal info" : "Henkilökohtaiset tiedot",
+ "Sync clients" : "Synkronointiasiakkaat",
+ "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with MIME type detection." : "PHP-moduuli 'fileinfo' puuttuu. Suosittelemme sen ottamista käyttöön, jotta MIME-tyypit on mahdollista havaita parhain tuloksin.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Siirtyäksesi toiseen tietokantaan, käytä komentorivityökalua: 'occ db:convert-type', tai lue <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentaatio ↗</a>.",
+ "Get the apps to sync your files" : "Laita sovellukset synkronoimaan tiedostosi",
"Desktop client" : "Työpöytäsovellus",
"Android app" : "Android-sovellus",
"iOS app" : "iOS-sovellus",
+ "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Jos haluat tukea projektia, {contributeopen}liity mukaan kehitystoimintaan{linkclose} tai {contributeopen}levitä sanaa{linkclose}!",
+ "Web, desktop, mobile clients and app specific passwords that currently have access to your account." : "Verkko-, työpöytä-, mobiilisovellukset ja sovellusten yksittäiset salasanat, joilla on käyttöoikeus tiliisi.",
"App passwords" : "Sovellussalasanat",
+ "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Täällä voit luoda yksittäisiä salasanoja sovelluksille, jolloin sinun ei tarvitse antaa varsinaista salasanaa niille. Voit kumota yksittäisten sovellusten salasanoja.",
"Follow us on Google+!" : "Seuraa meitä Google+:ssa!",
"Like our facebook page!" : "Tykkää Facebook-sivustamme!",
"Follow us on Twitter!" : "Seuraa meitä Twitterissä!",
diff --git a/settings/l10n/lt_LT.js b/settings/l10n/lt_LT.js
index 3c7d6dbf093..3ace0da7e48 100644
--- a/settings/l10n/lt_LT.js
+++ b/settings/l10n/lt_LT.js
@@ -71,12 +71,14 @@ OC.L10N.register(
"Enable" : "Įjungti",
"Enabling app …" : "Programėlė įjungiama",
"Error while enabling app" : "Klaida, įjungiant programėlę",
+ "Upgrading …" : "Naujinama …",
"Updated" : "Atnaujinta",
"Removing …" : "Šalinama …",
"Remove" : "Šalinti",
"Approved" : "Patvirtinta",
"Experimental" : "Eksperimentinė",
"Disconnect" : "Atjungti",
+ "Revoke" : "Panaikinti",
"Internet Explorer" : "Internet Explorer",
"Edge" : "Edge",
"Firefox" : "Firefox",
@@ -112,9 +114,11 @@ OC.L10N.register(
"undo" : "anuliuoti",
"never" : "niekada",
"Add group" : "Pridėti grupę",
+ "Invalid quota value \"{val}\"" : "Neteisinga leidžiamo duomenų kiekio reikšmė \"{val}\"",
"Password successfully changed" : "Slaptažodis sėkmingai pakeistas",
"Changing the password will result in data loss, because data recovery is not available for this user" : "Slaptažodžio pakeitimas sąlygos duomenų praradimą, kadangi šiam naudotojui nėra prieinamas duomenų atkūrimas",
"A valid username must be provided" : "Privalo būti pateiktas tinkamas naudotojo vardas",
+ "Error creating user: {message}" : "Klaida kuriant naudotoją: {message}",
"A valid password must be provided" : "Slaptažodis turi būti tinkamas",
"Documentation:" : "Dokumentacija:",
"User documentation" : "Naudotojo dokumentacija",
@@ -146,6 +150,10 @@ OC.L10N.register(
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Jūs turite perkelti savo šifravimo raktus iš senojo šifravimo (ownCloud <= 8.0) į naująjį.",
"Start migration" : "Pradėti perkėlimą",
"Security & setup warnings" : "Saugos ir diegimo perspėjimai",
+ "Background jobs" : "Foninės užduotys",
+ "Last job ran %s." : "Paskutinė užduotis buvo vykdyta %s.",
+ "Last job execution ran %s. Something seems wrong." : "Paskutinės užduoties vykdymas vyko %s. Atrodo, kad kažkas nutiko.",
+ "Background job didn’t run yet!" : "Foninės užduotys kol kas nebuvo vykdomos!",
"Execute one task with each page loaded" : "Įvykdyti vieną užduotį su kiekvieno puslapio įkėlimu",
"Version" : "Versija",
"Sharing" : "Dalijimasis",
@@ -155,6 +163,7 @@ OC.L10N.register(
"Allow resharing" : "Leisti dalintis",
"Tips & tricks" : "Patarimai ir gudrybės",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">documentation ↗</a>." : "Norėdami persikelti į kitą duomenų bazę, naudokite komandų eilutės įrankį: \"occ db:convert-type\" arba žiūrėkite <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">dokumentaciją ↗</a>.",
+ "How to do backups" : "Kaip daryti atsargines kopijas",
"You are using <strong>%s</strong> of <strong>%s</strong>" : "Jūs naudojate <strong>%s</strong> iš <strong>%s</strong>",
"Profile picture" : "Profilio paveikslas",
"Upload new" : "Įkelti naują",
@@ -186,15 +195,27 @@ OC.L10N.register(
"Done" : "Atlikta",
"Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Sukurta {communityopen}Nextcloud bendruomenės{linkclose}, {githubopen}pirminis kodas{linkclose} yra licencijuotas pagal {licenseopen}AGPL{linkclose}.",
"Settings" : "Nustatymai",
+ "Show last login" : "Rodyti paskutinį prisijungimą",
+ "Show email address" : "Rodyti el. pašto adresą",
"Create" : "Sukurti",
"Admin Recovery Password" : "Administracinis atkūrimo slaptažodis",
"Enter the recovery password in order to recover the users files during password change" : "Įveskite atkūrimo slaptažodį, kad atkurtumėte naudotojo failus keičiant slaptažodį",
+ "Disabled" : "Išjungta",
+ "Default quota" : "Numatytasis leidžiamas duomenų kiekis",
+ "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Įveskite saugyklos leidžiamą duomenų kiekį (pvz.: \"512 MB\" ar \"12 GB\")",
"Unlimited" : "Neribotai",
"Other" : "Kita",
"Quota" : "Limitas",
"change full name" : "keisti pilną vardą",
"set new password" : "nustatyti naują slaptažodį",
"Default" : "Numatytasis",
- "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Norėdami persikelti į kitą duomenų bazę, naudokite komandų eilutės įrankį: \"occ db:convert-type\" arba žiūrėkite <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentaciją ↗</a>."
+ "Updating...." : "Atnaujinama...",
+ "__language_name__" : "Lietuvių",
+ "Personal info" : "Asmeninė informacija",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Norėdami persikelti į kitą duomenų bazę, naudokite komandų eilutės įrankį: \"occ db:convert-type\" arba žiūrėkite <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentaciją ↗</a>.",
+ "Show First Run Wizard again" : "Dar kartą rodyti pirmojo paleidimo vediklį",
+ "Follow us on Google+!" : "Sekite mus Google+!",
+ "Follow us on Twitter!" : "Sekite mus Twitter!",
+ "Subscribe to our newsletter!" : "Prenumeruokite mūsų naujienlaiškį!"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/settings/l10n/lt_LT.json b/settings/l10n/lt_LT.json
index e070ff944a9..59dd7489608 100644
--- a/settings/l10n/lt_LT.json
+++ b/settings/l10n/lt_LT.json
@@ -69,12 +69,14 @@
"Enable" : "Įjungti",
"Enabling app …" : "Programėlė įjungiama",
"Error while enabling app" : "Klaida, įjungiant programėlę",
+ "Upgrading …" : "Naujinama …",
"Updated" : "Atnaujinta",
"Removing …" : "Šalinama …",
"Remove" : "Šalinti",
"Approved" : "Patvirtinta",
"Experimental" : "Eksperimentinė",
"Disconnect" : "Atjungti",
+ "Revoke" : "Panaikinti",
"Internet Explorer" : "Internet Explorer",
"Edge" : "Edge",
"Firefox" : "Firefox",
@@ -110,9 +112,11 @@
"undo" : "anuliuoti",
"never" : "niekada",
"Add group" : "Pridėti grupę",
+ "Invalid quota value \"{val}\"" : "Neteisinga leidžiamo duomenų kiekio reikšmė \"{val}\"",
"Password successfully changed" : "Slaptažodis sėkmingai pakeistas",
"Changing the password will result in data loss, because data recovery is not available for this user" : "Slaptažodžio pakeitimas sąlygos duomenų praradimą, kadangi šiam naudotojui nėra prieinamas duomenų atkūrimas",
"A valid username must be provided" : "Privalo būti pateiktas tinkamas naudotojo vardas",
+ "Error creating user: {message}" : "Klaida kuriant naudotoją: {message}",
"A valid password must be provided" : "Slaptažodis turi būti tinkamas",
"Documentation:" : "Dokumentacija:",
"User documentation" : "Naudotojo dokumentacija",
@@ -144,6 +148,10 @@
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Jūs turite perkelti savo šifravimo raktus iš senojo šifravimo (ownCloud <= 8.0) į naująjį.",
"Start migration" : "Pradėti perkėlimą",
"Security & setup warnings" : "Saugos ir diegimo perspėjimai",
+ "Background jobs" : "Foninės užduotys",
+ "Last job ran %s." : "Paskutinė užduotis buvo vykdyta %s.",
+ "Last job execution ran %s. Something seems wrong." : "Paskutinės užduoties vykdymas vyko %s. Atrodo, kad kažkas nutiko.",
+ "Background job didn’t run yet!" : "Foninės užduotys kol kas nebuvo vykdomos!",
"Execute one task with each page loaded" : "Įvykdyti vieną užduotį su kiekvieno puslapio įkėlimu",
"Version" : "Versija",
"Sharing" : "Dalijimasis",
@@ -153,6 +161,7 @@
"Allow resharing" : "Leisti dalintis",
"Tips & tricks" : "Patarimai ir gudrybės",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">documentation ↗</a>." : "Norėdami persikelti į kitą duomenų bazę, naudokite komandų eilutės įrankį: \"occ db:convert-type\" arba žiūrėkite <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">dokumentaciją ↗</a>.",
+ "How to do backups" : "Kaip daryti atsargines kopijas",
"You are using <strong>%s</strong> of <strong>%s</strong>" : "Jūs naudojate <strong>%s</strong> iš <strong>%s</strong>",
"Profile picture" : "Profilio paveikslas",
"Upload new" : "Įkelti naują",
@@ -184,15 +193,27 @@
"Done" : "Atlikta",
"Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Sukurta {communityopen}Nextcloud bendruomenės{linkclose}, {githubopen}pirminis kodas{linkclose} yra licencijuotas pagal {licenseopen}AGPL{linkclose}.",
"Settings" : "Nustatymai",
+ "Show last login" : "Rodyti paskutinį prisijungimą",
+ "Show email address" : "Rodyti el. pašto adresą",
"Create" : "Sukurti",
"Admin Recovery Password" : "Administracinis atkūrimo slaptažodis",
"Enter the recovery password in order to recover the users files during password change" : "Įveskite atkūrimo slaptažodį, kad atkurtumėte naudotojo failus keičiant slaptažodį",
+ "Disabled" : "Išjungta",
+ "Default quota" : "Numatytasis leidžiamas duomenų kiekis",
+ "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Įveskite saugyklos leidžiamą duomenų kiekį (pvz.: \"512 MB\" ar \"12 GB\")",
"Unlimited" : "Neribotai",
"Other" : "Kita",
"Quota" : "Limitas",
"change full name" : "keisti pilną vardą",
"set new password" : "nustatyti naują slaptažodį",
"Default" : "Numatytasis",
- "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Norėdami persikelti į kitą duomenų bazę, naudokite komandų eilutės įrankį: \"occ db:convert-type\" arba žiūrėkite <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentaciją ↗</a>."
+ "Updating...." : "Atnaujinama...",
+ "__language_name__" : "Lietuvių",
+ "Personal info" : "Asmeninė informacija",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Norėdami persikelti į kitą duomenų bazę, naudokite komandų eilutės įrankį: \"occ db:convert-type\" arba žiūrėkite <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentaciją ↗</a>.",
+ "Show First Run Wizard again" : "Dar kartą rodyti pirmojo paleidimo vediklį",
+ "Follow us on Google+!" : "Sekite mus Google+!",
+ "Follow us on Twitter!" : "Sekite mus Twitter!",
+ "Subscribe to our newsletter!" : "Prenumeruokite mūsų naujienlaiškį!"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/settings/l10n/nb.js b/settings/l10n/nb.js
index cc420499673..3cc20187166 100644
--- a/settings/l10n/nb.js
+++ b/settings/l10n/nb.js
@@ -396,6 +396,12 @@ OC.L10N.register(
"Sync clients" : "Synkroniser klienter",
"It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Det er viktig for sikkerheten og ytelsen på din installasjon at alt er satt opp rett. For å hjelpe deg er det satt i verk noen automatiske sjekker. Se \"Tips og triks\"-delen og i dokumentasjonen for mer informasjon",
"php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP ser ikke ut til å være satt opp riktig for å lese systemets miljøvariabler. Testen med getenv(\"PATH\") returnerer bare et tomt svar.",
+ "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Sjekk <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installasjonsdokumentasjonen ↗</a> etter php-oppsettssnotater og oppsett av PHP på tjeneren din, særlig om du bruker php-fpm.",
+ "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Det ser ut for at PHP er satt opp til å fjerne innebygde doc-blokker. Dette gjør at flere av kjerneprogrammene blir utilgjengelige.",
+ "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with MIME type detection." : "PHP-modulen 'fileinfo' mangler. Vi anbefaler at du aktiverer denne modulen for å kunne detektere MIME-typen korrekt.",
+ "This means that there might be problems with certain characters in file names." : "Dette betyr at det kan forekomme problemer med visse tegn i filnavn.",
+ "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "For å kjøre denne trenger du «PHP posix extension». Se {linkstart}PHP dokumentasjonen{linkend} for flere detaljer.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "For å migrere til en annen database, bruk kommandolinjeverktøyet: 'occ db:convert-type', eller les i <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentasjonen ↗</a>.",
"Get the apps to sync your files" : "Hent programmer som synkroniserer filene dine",
"Desktop client" : "Skrivebordsklient",
"Android app" : "Android-program",
diff --git a/settings/l10n/nb.json b/settings/l10n/nb.json
index 2faeda67d36..24af47be501 100644
--- a/settings/l10n/nb.json
+++ b/settings/l10n/nb.json
@@ -394,6 +394,12 @@
"Sync clients" : "Synkroniser klienter",
"It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Det er viktig for sikkerheten og ytelsen på din installasjon at alt er satt opp rett. For å hjelpe deg er det satt i verk noen automatiske sjekker. Se \"Tips og triks\"-delen og i dokumentasjonen for mer informasjon",
"php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP ser ikke ut til å være satt opp riktig for å lese systemets miljøvariabler. Testen med getenv(\"PATH\") returnerer bare et tomt svar.",
+ "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Sjekk <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installasjonsdokumentasjonen ↗</a> etter php-oppsettssnotater og oppsett av PHP på tjeneren din, særlig om du bruker php-fpm.",
+ "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Det ser ut for at PHP er satt opp til å fjerne innebygde doc-blokker. Dette gjør at flere av kjerneprogrammene blir utilgjengelige.",
+ "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with MIME type detection." : "PHP-modulen 'fileinfo' mangler. Vi anbefaler at du aktiverer denne modulen for å kunne detektere MIME-typen korrekt.",
+ "This means that there might be problems with certain characters in file names." : "Dette betyr at det kan forekomme problemer med visse tegn i filnavn.",
+ "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "For å kjøre denne trenger du «PHP posix extension». Se {linkstart}PHP dokumentasjonen{linkend} for flere detaljer.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "For å migrere til en annen database, bruk kommandolinjeverktøyet: 'occ db:convert-type', eller les i <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentasjonen ↗</a>.",
"Get the apps to sync your files" : "Hent programmer som synkroniserer filene dine",
"Desktop client" : "Skrivebordsklient",
"Android app" : "Android-program",
diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js
index 8489a9112ec..c1ef15004a3 100644
--- a/settings/l10n/nl.js
+++ b/settings/l10n/nl.js
@@ -89,7 +89,7 @@ OC.L10N.register(
"Email sent" : "E-mail verzonden",
"Official" : "Officieel",
"All" : "Alle",
- "Update to %s" : "Werk bij naar %s",
+ "Update to %s" : "Updaten naar %s",
"No apps found for your version" : "Geen apps gevonden voor jouw versie",
"The app will be downloaded from the app store" : "De app zal worden gedownload van de app store",
"Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Officiële apps worden ontwikkeld door en binnen de community. Ze bieden centrale functionaliteit en zijn klaar voor productie.",
@@ -267,10 +267,10 @@ OC.L10N.register(
"It was not possible to execute the cron job via CLI. The following technical errors have appeared:" : "Het was niet mogelijk om de systeem cron via CLI uit te voeren. De volgende technische problemen traden op:",
"Please double check the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%s\">log</a>." : "Lees de <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">installatie-handleiding ↗</a> goed door en controleer <a href=\"%s\">de logs</a> op fouten en waarschuwingen.",
"All checks passed." : "Alle checks geslaagd",
- "Background jobs" : "Achtergrond jobs",
- "Last job ran %s." : "Laatste job liep %s.",
+ "Background jobs" : "Achtergrondtaken",
+ "Last job ran %s." : "Laatste taak %s uitgevoerd.",
"Last job execution ran %s. Something seems wrong." : "Laatst uitgevoerde job: %s. Er lijkt iets fout gegaan.",
- "Background job didn’t run yet!" : "Achtergrondjob nog niet gelopen!",
+ "Background job didn’t run yet!" : "Achtergrondtaak nog niet uitgevoerd!",
"For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Voor optimale prestaties is het belangrijk om de achtergrondtaken goed te configureren. Voor grotere installaties is \"Cron' de aanbevolen instelling. Bekijk de documentatie voor meer informatie.",
"Execute one task with each page loaded" : "Bij laden van elke pagina één taak uitvoeren",
"cron.php is registered at a webcron service to call cron.php every 15 minutes over HTTP." : "cron.php is geregistreerd bij een webcron service om elke 15 minuten cron.php over http aan te roepen.",
@@ -305,7 +305,7 @@ OC.L10N.register(
"How to do backups" : "Hoe maak je back-ups",
"Performance tuning" : "Prestatie afstelling",
"Improving the config.php" : "config.php verbeteren",
- "Theming" : "Thema's",
+ "Theming" : "Uiterlijk",
"Check the security of your Nextcloud over our security scan" : "Controleer de beveiliging van je Nextcloud met onze securityscan",
"Hardening and security guidance" : "Hardening en security advies",
"Personal" : "Persoonlijk",
@@ -388,7 +388,7 @@ OC.L10N.register(
"Updating...." : "Bijwerken....",
"Error while updating app" : "Fout bij het bijwerken van de app",
"Error while removing app" : "Fout tijdens het verwijderen van de app",
- "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "De app is ingeschakeld maar moet worden bijgewerkt. Je wordt over 5 seconden doorgeleid naar de bijwerkpagina.",
+ "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "De app is ingeschakeld maar moet worden geüpdate. Je wordt over 5 seconden doorgeleid naar de updatepagina.",
"App update" : "App update",
"__language_name__" : "Nederlands",
"Verifying" : "Verifiëren",
diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json
index f4b431c5aee..f9be2248e4c 100644
--- a/settings/l10n/nl.json
+++ b/settings/l10n/nl.json
@@ -87,7 +87,7 @@
"Email sent" : "E-mail verzonden",
"Official" : "Officieel",
"All" : "Alle",
- "Update to %s" : "Werk bij naar %s",
+ "Update to %s" : "Updaten naar %s",
"No apps found for your version" : "Geen apps gevonden voor jouw versie",
"The app will be downloaded from the app store" : "De app zal worden gedownload van de app store",
"Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Officiële apps worden ontwikkeld door en binnen de community. Ze bieden centrale functionaliteit en zijn klaar voor productie.",
@@ -265,10 +265,10 @@
"It was not possible to execute the cron job via CLI. The following technical errors have appeared:" : "Het was niet mogelijk om de systeem cron via CLI uit te voeren. De volgende technische problemen traden op:",
"Please double check the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%s\">log</a>." : "Lees de <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">installatie-handleiding ↗</a> goed door en controleer <a href=\"%s\">de logs</a> op fouten en waarschuwingen.",
"All checks passed." : "Alle checks geslaagd",
- "Background jobs" : "Achtergrond jobs",
- "Last job ran %s." : "Laatste job liep %s.",
+ "Background jobs" : "Achtergrondtaken",
+ "Last job ran %s." : "Laatste taak %s uitgevoerd.",
"Last job execution ran %s. Something seems wrong." : "Laatst uitgevoerde job: %s. Er lijkt iets fout gegaan.",
- "Background job didn’t run yet!" : "Achtergrondjob nog niet gelopen!",
+ "Background job didn’t run yet!" : "Achtergrondtaak nog niet uitgevoerd!",
"For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Voor optimale prestaties is het belangrijk om de achtergrondtaken goed te configureren. Voor grotere installaties is \"Cron' de aanbevolen instelling. Bekijk de documentatie voor meer informatie.",
"Execute one task with each page loaded" : "Bij laden van elke pagina één taak uitvoeren",
"cron.php is registered at a webcron service to call cron.php every 15 minutes over HTTP." : "cron.php is geregistreerd bij een webcron service om elke 15 minuten cron.php over http aan te roepen.",
@@ -303,7 +303,7 @@
"How to do backups" : "Hoe maak je back-ups",
"Performance tuning" : "Prestatie afstelling",
"Improving the config.php" : "config.php verbeteren",
- "Theming" : "Thema's",
+ "Theming" : "Uiterlijk",
"Check the security of your Nextcloud over our security scan" : "Controleer de beveiliging van je Nextcloud met onze securityscan",
"Hardening and security guidance" : "Hardening en security advies",
"Personal" : "Persoonlijk",
@@ -386,7 +386,7 @@
"Updating...." : "Bijwerken....",
"Error while updating app" : "Fout bij het bijwerken van de app",
"Error while removing app" : "Fout tijdens het verwijderen van de app",
- "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "De app is ingeschakeld maar moet worden bijgewerkt. Je wordt over 5 seconden doorgeleid naar de bijwerkpagina.",
+ "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "De app is ingeschakeld maar moet worden geüpdate. Je wordt over 5 seconden doorgeleid naar de updatepagina.",
"App update" : "App update",
"__language_name__" : "Nederlands",
"Verifying" : "Verifiëren",
diff --git a/settings/l10n/pt_PT.js b/settings/l10n/pt_PT.js
index 506408ddd33..5dc5933f566 100644
--- a/settings/l10n/pt_PT.js
+++ b/settings/l10n/pt_PT.js
@@ -120,8 +120,17 @@ OC.L10N.register(
"Allow filesystem access" : "Permitir acesso ao sistema de ficheiros",
"Disconnect" : "Desligado",
"Revoke" : "Revogar",
+ "Internet Explorer" : "Internet Explorer",
+ "Edge" : "Microsoft Edge",
+ "Firefox" : "Mozilla Firefox",
+ "Google Chrome" : "Google Chrome",
+ "Safari" : "Safari",
+ "Google Chrome for Android" : "Google Chrome para Android",
+ "iPhone iOS" : "iPhone iOS",
+ "iPad iOS" : "iPad iOS",
"iOS Client" : "Cliente iOS",
"Android Client" : "Cliente Android",
+ "Sync client - {os}" : "Sincronizar cliente - {so}",
"This session" : "Esta sessão",
"Copy" : "Copiar",
"Copied!" : "Copiado!",
@@ -244,10 +253,23 @@ 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." : "A configuração Só-de-Leitura foi ativada. Isto evita definir algumas configurações através da interface da Web. Além disso, o ficheiro precisa de ser definido gravável manualmente para cada atualização.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Isto é provavelmente causado por uma cache/acelerador como o Zend OPcache or eAcelerador.",
"System locale can not be set to a one which supports UTF-8." : "Não é possível definir a internacionalização do sistema para um que suporte o UTF-8.",
+ "This means that there might be problems with certain characters in filenames." : "Isto significa que podem haver problemas com alguns caracteres no nome dos ficheiros.",
+ "It is strongly proposed to install the required packages on your system to support one of the following locales: %s." : "É vivamente aconselhável que instale os pacotes necessários no seu sistema para suportar um dos nossos locais: %s.",
+ "It was not possible to execute the cron job via CLI. The following technical errors have appeared:" : "Não foi possível executar a tarefa agendada via CLI. Os seguintes erros técnicos surgiram:",
"All checks passed." : "Todas as verificações passaram.",
+ "Background jobs" : "Tarefas de segundo plano",
+ "Last job ran %s." : "Última tarefa executada: %s.",
+ "Last job execution ran %s. Something seems wrong." : "Última execução da tarefa: %s. Houve algum problema. ",
+ "Background job didn’t run yet!" : "Tarefa de segundo plano ainda não foi executada!",
+ "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Para desempenho óptimo é importante que configura as tarefas de segundo plano correctamente. Para maiores instâncias a definição recomendada é 'Cron'. Por favor veja a documentação para mais informações.",
"Execute one task with each page loaded" : "Executar uma tarefa com cada página carregada",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over HTTP." : "cron.php está registada num serviço webcron para chamar cron.php a cada 15 minutos através de HTTP.",
+ "Use system cron service to call the cron.php file every 15 minutes." : "Use o serviço de tarefas automáticas para chamar o ficheiro cron.php a cada 15 minutos.",
+ "The cron.php needs to be executed by the system user \"%s\"." : "O cron.php precisa de ser executado pelo utilizador do sistema \"%s\".",
+ "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "Para esta execução precisa da extensão PHP POSIX. Veja {iniciodaligação}documentação PHP{fimdaligação} para mais mais detalhes.",
"Version" : "Versão",
"Sharing" : "Partilha",
+ "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Como administrador pode afinar o comportamento de partilha. Por favor veja a documentação para mais informação.",
"Allow apps to use the Share API" : "Permitir que os utilizadores usem a API de partilha",
"Allow users to share via link" : "Permitir que os utilizadores partilhem através do link",
"Allow public uploads" : "Permitir Envios Públicos",
@@ -262,15 +284,21 @@ OC.L10N.register(
"Restrict users to only share with users in their groups" : "Restringe os utilizadores só a partilhar com utilizadores do seu grupo",
"Exclude groups from sharing" : "Excluir grupos das partilhas",
"These groups will still be able to receive shares, but not to initiate them." : "Estes grupos poderão receber partilhas, mas não poderão iniciá-las.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username or email address needs to be entered." : "permitir completar automáticamente nome do utilizador no diálogo de partilha. Se isto estiver inactivo é necessário introduzir o nome do utilizador ou o endereço de e-mail completo. ",
+ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Mostrar aviso legal na página de carregamento de ligações públicas. (Mostrar apenas quando a lista de ficheiros estiver oculta.)",
+ "This text will be shown on the public link upload page when the file list is hidden." : "Este texto será exibido na página de carregamento de ligações públicas quando a lista de ficheiros estiver oculta. ",
"Tips & tricks" : "Dicas e truques",
+ "This is particularly recommended when using the desktop client for file synchronisation." : "Isto é particularmente recomendado quando estiver a usar um cliente de desktop para sincronização de ficheiros.",
"How to do backups" : "Como fazer cópias de segurança",
"Performance tuning" : "Ajuste de desempenho",
"Improving the config.php" : "Melhorar o config.php",
"Theming" : "Temas",
+ "Check the security of your Nextcloud over our security scan" : "Verifique a segurança da sua Nextcloud através da nossa verificação de segurança",
"Hardening and security guidance" : "Orientações de proteção e segurança",
"Personal" : "Pessoal",
"Administration" : "Administração",
"You are using <strong>%s</strong> of <strong>%s</strong>" : "Está a usar <strong>%s</strong> de <strong>%s</strong>",
+ "You are using <strong>%s</strong> of <strong>%s</strong> (<strong>%s %%</strong>)" : "Está a usar <strong>%s</strong> de <strong>%s</strong> (<strong>%s%%</strong>)",
"Profile picture" : "Foto do perfil",
"Upload new" : "Carregar novo",
"Select from Files" : "Seleccione dos Ficheiros",
@@ -289,7 +317,11 @@ OC.L10N.register(
"Your phone number" : "O seu número de telefone",
"Address" : "Morada",
"Your postal address" : "A sua morada",
+ "Website" : "Website",
"It can take up to 24 hours before the account is displayed as verified." : "Pode levar até 24 horas para que a conta seja mostrada como verificada.",
+ "Link https://…" : "Ligação https:// ...",
+ "Twitter" : "Twitter",
+ "Twitter handle @…" : "Identificador do Twitter @...",
"You are member of the following groups:" : "Você é membro dos seguintes grupos:",
"Language" : "Idioma",
"Help translate" : "Ajude a traduzir",
@@ -306,11 +338,18 @@ OC.L10N.register(
"For security reasons this password will only be shown once." : "Por motivos de segurança a sua password só será mostrada uma vez.",
"Username" : "Nome de utilizador",
"Done" : "Concluído",
+ "Follow us on Google+" : "Siga-nos no Google+",
+ "Like our Facebook page" : "Deixe um Gosto na nossa página do Facebook",
+ "Follow us on Twitter" : "Siga-nos no Twitter",
+ "Check out our blog" : "Veja o nosso blog",
+ "Subscribe to our newsletter" : "Subscreva as nossas notícias",
"Settings" : "Definições",
"Show storage location" : "Mostrar a localização do armazenamento",
"Show user backend" : "Mostrar interface do utilizador",
+ "Show last login" : "Mostrar último login",
"Show email address" : "Mostrar endereço de email",
"Send email to new user" : "Enviar email ao novo utilizador",
+ "When the password of a new user is left empty, an activation email with a link to set the password is sent." : "Quando a palavra-passe de um novo utilizador é deixada em branco, é-lhe enviado um e-mail com uma ligação para definir a nova palavra-passe.",
"E-Mail" : "Correio Eletrónico",
"Create" : "Criar",
"Admin Recovery Password" : "Recuperação da Palavra-passe de Administrador",
@@ -318,11 +357,14 @@ OC.L10N.register(
"Everyone" : "Para todos",
"Admins" : "Administrador",
"Disabled" : "Desactivado",
+ "Default quota" : "Quota padrão",
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Insira a quota de armazenamento (ex: \"512 MB\" ou \"12 GB\")",
"Unlimited" : "Ilimitado",
"Other" : "Outro",
"Group admin for" : "Administrador de grupo para",
"Quota" : "Quota",
+ "Storage location" : "Localização do armazenamento",
+ "User backend" : "Backend do utilizador",
"Last login" : "Último início de sessão",
"change full name" : "alterar nome completo",
"set new password" : "definir nova palavra-passe",
@@ -333,10 +375,33 @@ OC.L10N.register(
"Error while removing app" : "Erro ao remover a app",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "A app foi activada mas necessita ser actualizada. Irá ser redireccionado para a página de actualização em 5 segundos.",
"App update" : "Actualização de app",
+ "__language_name__" : "__nome_da_linguagem__",
"Verifying" : "A verificar",
"Personal info" : "Informação pessoal",
"Sync clients" : "Sincronizar clientes",
+ "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "A versão de %1$s instalada é inferior a %2$s, por motivos de estabilidade e desempenho recomendamos que actualize %1$s para uma versão mais recente.",
+ "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with MIME type detection." : "O módulo PHP 'fileinfo' está ausente. Recomendamos vivamente que active este módulo para obter melhores resultados com detecção de tipo MIME.",
+ "This means that there might be problems with certain characters in file names." : "Isto significa que podem haver problemas com alguns caracteres nos nomes dos ficheiros.",
+ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Recomendamos vivamente que instale os pacotes necessários no seu sistema para suportar um dos seguintes locais: %s.",
+ "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Não foi possível executar a tarefa automática via CLI. Ocorreram os seguintes erros técnicos:",
+ "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%s\">log</a>." : "Por favor confira os <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">guias de instalação ↗</a>, e procure por algum erro ou aviso nos <a href=\"%s\">logs</a>.",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registada num serviço webcron para chamar cron-php a cada 15 minutos através de http.",
+ "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Para esta execução é necessária a extensão PHP posix. Veja {iniciodaligação}documentação PHP{fimdaligação} para mais detalhes.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Para migrar para outra base de dados use a ferramenta da linha de comandos: 'occ db:convert-type', ou veja a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentação ↗</a>.",
+ "Get the apps to sync your files" : "Tenha as aplicações a sincronizar os seus ficheiros",
"Desktop client" : "Cliente desktop",
+ "Android app" : "Aplicação Android",
+ "iOS app" : "Aplicação iOS",
+ "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Se quiser das suporte ao nosso projecto {contributoaberto} junte-se ao desenvolvimento {linkfechado} ou {contributoaberto} espalhe a mensagem {linkfechado}!",
+ "Show First Run Wizard again" : "Mostrar Configurador de Primeira Execução novamente",
+ "Web, desktop, mobile clients and app specific passwords that currently have access to your account." : "Clientes Web, desktop e móveis, e palavras-passe específicas de aplicação que actualmente têm acesso à sua conta.",
+ "App passwords" : "Palavras-passe de aplicação",
+ "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Aqui pode gerar palavras-passe individuais para as suas aplicações para não tenha de usar a sua palavra-passe. Também as pode revogar individualmente.",
+ "Follow us on Google+!" : "Siga-nos no Google+!",
+ "Like our facebook page!" : "Deixe um Gosto na nossa página do Facebook!",
+ "Follow us on Twitter!" : "Siga-nos no Twitter!",
+ "Check out our blog!" : "Veja o nosso blog!",
+ "Subscribe to our newsletter!" : "Subscreva as nossas notícias!",
"Group name" : "Nome do grupo"
},
"nplurals=2; plural=(n != 1);");
diff --git a/settings/l10n/pt_PT.json b/settings/l10n/pt_PT.json
index c82e604e6c5..2ce0958045d 100644
--- a/settings/l10n/pt_PT.json
+++ b/settings/l10n/pt_PT.json
@@ -118,8 +118,17 @@
"Allow filesystem access" : "Permitir acesso ao sistema de ficheiros",
"Disconnect" : "Desligado",
"Revoke" : "Revogar",
+ "Internet Explorer" : "Internet Explorer",
+ "Edge" : "Microsoft Edge",
+ "Firefox" : "Mozilla Firefox",
+ "Google Chrome" : "Google Chrome",
+ "Safari" : "Safari",
+ "Google Chrome for Android" : "Google Chrome para Android",
+ "iPhone iOS" : "iPhone iOS",
+ "iPad iOS" : "iPad iOS",
"iOS Client" : "Cliente iOS",
"Android Client" : "Cliente Android",
+ "Sync client - {os}" : "Sincronizar cliente - {so}",
"This session" : "Esta sessão",
"Copy" : "Copiar",
"Copied!" : "Copiado!",
@@ -242,10 +251,23 @@
"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." : "A configuração Só-de-Leitura foi ativada. Isto evita definir algumas configurações através da interface da Web. Além disso, o ficheiro precisa de ser definido gravável manualmente para cada atualização.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Isto é provavelmente causado por uma cache/acelerador como o Zend OPcache or eAcelerador.",
"System locale can not be set to a one which supports UTF-8." : "Não é possível definir a internacionalização do sistema para um que suporte o UTF-8.",
+ "This means that there might be problems with certain characters in filenames." : "Isto significa que podem haver problemas com alguns caracteres no nome dos ficheiros.",
+ "It is strongly proposed to install the required packages on your system to support one of the following locales: %s." : "É vivamente aconselhável que instale os pacotes necessários no seu sistema para suportar um dos nossos locais: %s.",
+ "It was not possible to execute the cron job via CLI. The following technical errors have appeared:" : "Não foi possível executar a tarefa agendada via CLI. Os seguintes erros técnicos surgiram:",
"All checks passed." : "Todas as verificações passaram.",
+ "Background jobs" : "Tarefas de segundo plano",
+ "Last job ran %s." : "Última tarefa executada: %s.",
+ "Last job execution ran %s. Something seems wrong." : "Última execução da tarefa: %s. Houve algum problema. ",
+ "Background job didn’t run yet!" : "Tarefa de segundo plano ainda não foi executada!",
+ "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Para desempenho óptimo é importante que configura as tarefas de segundo plano correctamente. Para maiores instâncias a definição recomendada é 'Cron'. Por favor veja a documentação para mais informações.",
"Execute one task with each page loaded" : "Executar uma tarefa com cada página carregada",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over HTTP." : "cron.php está registada num serviço webcron para chamar cron.php a cada 15 minutos através de HTTP.",
+ "Use system cron service to call the cron.php file every 15 minutes." : "Use o serviço de tarefas automáticas para chamar o ficheiro cron.php a cada 15 minutos.",
+ "The cron.php needs to be executed by the system user \"%s\"." : "O cron.php precisa de ser executado pelo utilizador do sistema \"%s\".",
+ "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "Para esta execução precisa da extensão PHP POSIX. Veja {iniciodaligação}documentação PHP{fimdaligação} para mais mais detalhes.",
"Version" : "Versão",
"Sharing" : "Partilha",
+ "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Como administrador pode afinar o comportamento de partilha. Por favor veja a documentação para mais informação.",
"Allow apps to use the Share API" : "Permitir que os utilizadores usem a API de partilha",
"Allow users to share via link" : "Permitir que os utilizadores partilhem através do link",
"Allow public uploads" : "Permitir Envios Públicos",
@@ -260,15 +282,21 @@
"Restrict users to only share with users in their groups" : "Restringe os utilizadores só a partilhar com utilizadores do seu grupo",
"Exclude groups from sharing" : "Excluir grupos das partilhas",
"These groups will still be able to receive shares, but not to initiate them." : "Estes grupos poderão receber partilhas, mas não poderão iniciá-las.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username or email address needs to be entered." : "permitir completar automáticamente nome do utilizador no diálogo de partilha. Se isto estiver inactivo é necessário introduzir o nome do utilizador ou o endereço de e-mail completo. ",
+ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Mostrar aviso legal na página de carregamento de ligações públicas. (Mostrar apenas quando a lista de ficheiros estiver oculta.)",
+ "This text will be shown on the public link upload page when the file list is hidden." : "Este texto será exibido na página de carregamento de ligações públicas quando a lista de ficheiros estiver oculta. ",
"Tips & tricks" : "Dicas e truques",
+ "This is particularly recommended when using the desktop client for file synchronisation." : "Isto é particularmente recomendado quando estiver a usar um cliente de desktop para sincronização de ficheiros.",
"How to do backups" : "Como fazer cópias de segurança",
"Performance tuning" : "Ajuste de desempenho",
"Improving the config.php" : "Melhorar o config.php",
"Theming" : "Temas",
+ "Check the security of your Nextcloud over our security scan" : "Verifique a segurança da sua Nextcloud através da nossa verificação de segurança",
"Hardening and security guidance" : "Orientações de proteção e segurança",
"Personal" : "Pessoal",
"Administration" : "Administração",
"You are using <strong>%s</strong> of <strong>%s</strong>" : "Está a usar <strong>%s</strong> de <strong>%s</strong>",
+ "You are using <strong>%s</strong> of <strong>%s</strong> (<strong>%s %%</strong>)" : "Está a usar <strong>%s</strong> de <strong>%s</strong> (<strong>%s%%</strong>)",
"Profile picture" : "Foto do perfil",
"Upload new" : "Carregar novo",
"Select from Files" : "Seleccione dos Ficheiros",
@@ -287,7 +315,11 @@
"Your phone number" : "O seu número de telefone",
"Address" : "Morada",
"Your postal address" : "A sua morada",
+ "Website" : "Website",
"It can take up to 24 hours before the account is displayed as verified." : "Pode levar até 24 horas para que a conta seja mostrada como verificada.",
+ "Link https://…" : "Ligação https:// ...",
+ "Twitter" : "Twitter",
+ "Twitter handle @…" : "Identificador do Twitter @...",
"You are member of the following groups:" : "Você é membro dos seguintes grupos:",
"Language" : "Idioma",
"Help translate" : "Ajude a traduzir",
@@ -304,11 +336,18 @@
"For security reasons this password will only be shown once." : "Por motivos de segurança a sua password só será mostrada uma vez.",
"Username" : "Nome de utilizador",
"Done" : "Concluído",
+ "Follow us on Google+" : "Siga-nos no Google+",
+ "Like our Facebook page" : "Deixe um Gosto na nossa página do Facebook",
+ "Follow us on Twitter" : "Siga-nos no Twitter",
+ "Check out our blog" : "Veja o nosso blog",
+ "Subscribe to our newsletter" : "Subscreva as nossas notícias",
"Settings" : "Definições",
"Show storage location" : "Mostrar a localização do armazenamento",
"Show user backend" : "Mostrar interface do utilizador",
+ "Show last login" : "Mostrar último login",
"Show email address" : "Mostrar endereço de email",
"Send email to new user" : "Enviar email ao novo utilizador",
+ "When the password of a new user is left empty, an activation email with a link to set the password is sent." : "Quando a palavra-passe de um novo utilizador é deixada em branco, é-lhe enviado um e-mail com uma ligação para definir a nova palavra-passe.",
"E-Mail" : "Correio Eletrónico",
"Create" : "Criar",
"Admin Recovery Password" : "Recuperação da Palavra-passe de Administrador",
@@ -316,11 +355,14 @@
"Everyone" : "Para todos",
"Admins" : "Administrador",
"Disabled" : "Desactivado",
+ "Default quota" : "Quota padrão",
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Insira a quota de armazenamento (ex: \"512 MB\" ou \"12 GB\")",
"Unlimited" : "Ilimitado",
"Other" : "Outro",
"Group admin for" : "Administrador de grupo para",
"Quota" : "Quota",
+ "Storage location" : "Localização do armazenamento",
+ "User backend" : "Backend do utilizador",
"Last login" : "Último início de sessão",
"change full name" : "alterar nome completo",
"set new password" : "definir nova palavra-passe",
@@ -331,10 +373,33 @@
"Error while removing app" : "Erro ao remover a app",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "A app foi activada mas necessita ser actualizada. Irá ser redireccionado para a página de actualização em 5 segundos.",
"App update" : "Actualização de app",
+ "__language_name__" : "__nome_da_linguagem__",
"Verifying" : "A verificar",
"Personal info" : "Informação pessoal",
"Sync clients" : "Sincronizar clientes",
+ "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "A versão de %1$s instalada é inferior a %2$s, por motivos de estabilidade e desempenho recomendamos que actualize %1$s para uma versão mais recente.",
+ "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with MIME type detection." : "O módulo PHP 'fileinfo' está ausente. Recomendamos vivamente que active este módulo para obter melhores resultados com detecção de tipo MIME.",
+ "This means that there might be problems with certain characters in file names." : "Isto significa que podem haver problemas com alguns caracteres nos nomes dos ficheiros.",
+ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Recomendamos vivamente que instale os pacotes necessários no seu sistema para suportar um dos seguintes locais: %s.",
+ "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Não foi possível executar a tarefa automática via CLI. Ocorreram os seguintes erros técnicos:",
+ "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%s\">log</a>." : "Por favor confira os <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">guias de instalação ↗</a>, e procure por algum erro ou aviso nos <a href=\"%s\">logs</a>.",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registada num serviço webcron para chamar cron-php a cada 15 minutos através de http.",
+ "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Para esta execução é necessária a extensão PHP posix. Veja {iniciodaligação}documentação PHP{fimdaligação} para mais detalhes.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Para migrar para outra base de dados use a ferramenta da linha de comandos: 'occ db:convert-type', ou veja a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentação ↗</a>.",
+ "Get the apps to sync your files" : "Tenha as aplicações a sincronizar os seus ficheiros",
"Desktop client" : "Cliente desktop",
+ "Android app" : "Aplicação Android",
+ "iOS app" : "Aplicação iOS",
+ "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Se quiser das suporte ao nosso projecto {contributoaberto} junte-se ao desenvolvimento {linkfechado} ou {contributoaberto} espalhe a mensagem {linkfechado}!",
+ "Show First Run Wizard again" : "Mostrar Configurador de Primeira Execução novamente",
+ "Web, desktop, mobile clients and app specific passwords that currently have access to your account." : "Clientes Web, desktop e móveis, e palavras-passe específicas de aplicação que actualmente têm acesso à sua conta.",
+ "App passwords" : "Palavras-passe de aplicação",
+ "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Aqui pode gerar palavras-passe individuais para as suas aplicações para não tenha de usar a sua palavra-passe. Também as pode revogar individualmente.",
+ "Follow us on Google+!" : "Siga-nos no Google+!",
+ "Like our facebook page!" : "Deixe um Gosto na nossa página do Facebook!",
+ "Follow us on Twitter!" : "Siga-nos no Twitter!",
+ "Check out our blog!" : "Veja o nosso blog!",
+ "Subscribe to our newsletter!" : "Subscreva as nossas notícias!",
"Group name" : "Nome do grupo"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js
index 8c63f5385e7..904ad7b950d 100644
--- a/settings/l10n/ru.js
+++ b/settings/l10n/ru.js
@@ -389,17 +389,23 @@ OC.L10N.register(
"Error while updating app" : "Ошибка обновления приложения",
"Error while removing app" : "Ошибка удаления приложения",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Приложение было включено, но нуждается в обновлении. В течении 5 секунд будет выполнено перенаправление на страницу обновления.",
+ "App update" : "Обновить приложение",
"__language_name__" : "Русский язык",
"Verifying" : "Проверка",
"Personal info" : "Личная информация",
"Sync clients" : "Приложения для синхронизации",
"It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Для обеспечения безопасности и производительности важно, чтобы всё было настроено правильно. Чтобы убедиться в этом, мы выполняем некоторые автоматические проверки. Дополнительная информация содержится в разделе «Советы и рекомендации» и в документации.",
+ "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "Запрос PHP getenv(\"PATH\") возвращает пустые результаты, вероятно, PHP настроен неверно.",
+ "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Обратитесь к <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">документации по установке ↗</a> для получения информации по правильной настройке PHP, что особенно важно в случае использования php-fpm.",
+ "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP настроен на вычищение блоков встроенной документации, что приведёт к невозможности использовать несколько основных приложений.",
+ "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "Установленная версия %1$s меньше чем %2$s. По причинам стабильности и производительности рекомендуется обновить используемую версию %1$s.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with MIME type detection." : "Отсутствует модуль PHP «fileinfo». Настоятельно рекомендуется включить этот модуль для улучшения определения типов (MIME-type) файлов.",
"Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a> for more information." : "Отключена блокировка передаваемых файлов, что может привести к состоянию гонки. Для предупреждения возможных проблем включите параметр «filelocking.enabled» в файле «config.php». Обратитесь к <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">документации ↗ </a> для получения дополнительной информации.",
"This means that there might be problems with certain characters in file names." : "Это означает, что возможны проблемы с некоторыми символами в именах файлов.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Настоятельно рекомендуется установить требуемые системные пакеты для поддержки одного из следующих региональных стандартов: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "При установке сервера не в корневой каталог домена и использовании системного планировщика сron возможны проблемы, связанные с формированием неверных URL. Решением является присвоение параметру «overwrite.cli.url» в файле «config.php» значения, равного полному интернет-адресу установки сервера (Предположительно: «%s».)",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Ошибка запуска задачи планировщика с использованием интерфейса командной строки. Подробное сообщение об ошибке:",
+ "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%s\">log</a>." : "Ещё раз внимательно прочитайте <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">руководство по установке ↗</a> и проверьте <a href=\"%s\">журнал</a> на наличие ошибок.",
"cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "«cron.php» зарегистрирован в службе webcron и будет вызываться каждые 15 минут по HTTP.",
"To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Для запуска требуется расширение POSIX для PHP. Дополнительные сведения содержатся в {linkstart}документации по PHP{linkend}.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Для перехода на другую базу данных используйте команду: «occ db:convert-type» или обратитесь к <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">документации ↗</a>. ",
diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json
index 6399dbaacca..c1c4ff6fcfa 100644
--- a/settings/l10n/ru.json
+++ b/settings/l10n/ru.json
@@ -387,17 +387,23 @@
"Error while updating app" : "Ошибка обновления приложения",
"Error while removing app" : "Ошибка удаления приложения",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Приложение было включено, но нуждается в обновлении. В течении 5 секунд будет выполнено перенаправление на страницу обновления.",
+ "App update" : "Обновить приложение",
"__language_name__" : "Русский язык",
"Verifying" : "Проверка",
"Personal info" : "Личная информация",
"Sync clients" : "Приложения для синхронизации",
"It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Для обеспечения безопасности и производительности важно, чтобы всё было настроено правильно. Чтобы убедиться в этом, мы выполняем некоторые автоматические проверки. Дополнительная информация содержится в разделе «Советы и рекомендации» и в документации.",
+ "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "Запрос PHP getenv(\"PATH\") возвращает пустые результаты, вероятно, PHP настроен неверно.",
+ "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Обратитесь к <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">документации по установке ↗</a> для получения информации по правильной настройке PHP, что особенно важно в случае использования php-fpm.",
+ "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP настроен на вычищение блоков встроенной документации, что приведёт к невозможности использовать несколько основных приложений.",
+ "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "Установленная версия %1$s меньше чем %2$s. По причинам стабильности и производительности рекомендуется обновить используемую версию %1$s.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with MIME type detection." : "Отсутствует модуль PHP «fileinfo». Настоятельно рекомендуется включить этот модуль для улучшения определения типов (MIME-type) файлов.",
"Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a> for more information." : "Отключена блокировка передаваемых файлов, что может привести к состоянию гонки. Для предупреждения возможных проблем включите параметр «filelocking.enabled» в файле «config.php». Обратитесь к <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">документации ↗ </a> для получения дополнительной информации.",
"This means that there might be problems with certain characters in file names." : "Это означает, что возможны проблемы с некоторыми символами в именах файлов.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Настоятельно рекомендуется установить требуемые системные пакеты для поддержки одного из следующих региональных стандартов: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "При установке сервера не в корневой каталог домена и использовании системного планировщика сron возможны проблемы, связанные с формированием неверных URL. Решением является присвоение параметру «overwrite.cli.url» в файле «config.php» значения, равного полному интернет-адресу установки сервера (Предположительно: «%s».)",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Ошибка запуска задачи планировщика с использованием интерфейса командной строки. Подробное сообщение об ошибке:",
+ "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%s\">log</a>." : "Ещё раз внимательно прочитайте <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">руководство по установке ↗</a> и проверьте <a href=\"%s\">журнал</a> на наличие ошибок.",
"cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "«cron.php» зарегистрирован в службе webcron и будет вызываться каждые 15 минут по HTTP.",
"To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Для запуска требуется расширение POSIX для PHP. Дополнительные сведения содержатся в {linkstart}документации по PHP{linkend}.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Для перехода на другую базу данных используйте команду: «occ db:convert-type» или обратитесь к <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">документации ↗</a>. ",
diff --git a/settings/l10n/sk.js b/settings/l10n/sk.js
index 909d2ef322f..b3037f133a1 100644
--- a/settings/l10n/sk.js
+++ b/settings/l10n/sk.js
@@ -104,9 +104,14 @@ OC.L10N.register(
"Error: This app can not be enabled because it makes the server unstable" : "Chyba: aplikáciu nie je možné povoliť, lebo naruší stabilitu servera",
"Error: Could not disable broken app" : "Chyba: nebolo možné zakázať poškodenú aplikáciu",
"Error while disabling broken app" : "Nastala chyba počas zakazovania poškodenej aplikácie",
+ "App up to date" : "Aplikácia je aktuálna",
+ "Upgrading …" : "Aktualizuje sa...",
+ "Could not upgrade app" : "Aplikáciu nie je možné aktualizovať",
"Updated" : "Aktualizované",
"Removing …" : "Odstraňujem ...",
+ "Could not remove app" : "Aplikáciu nie je možné zmazať",
"Remove" : "Odstrániť",
+ "The app has been enabled but needs to be upgraded. You will be redirected to the upgrade page in 5 seconds." : "Aplikácia bola povolená, ale vyžaduje sa jej aktualizácia. Presmerovanie na stránku aktualizácie o 5 sekúnd.",
"Approved" : "Schválené",
"Experimental" : "Experimentálny",
"No apps found for {query}" : "Žiadna aplikácia nebola nájdená pre {query}",
@@ -247,6 +252,7 @@ OC.L10N.register(
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "To je pravdepodobne spôsobené cache/akcelerátorom ako napr. Zend OPcache alebo eAccelerator.",
"The PHP module 'fileinfo' is missing. It is strongly recommended to enable this module to get the best results with MIME type detection." : "Chýba PHP modul 'fileinfo'. Dôrazne doporučujeme ho povoliť pre dosiahnutie najlepších výsledkov zisťovania MIME-typu.",
"System locale can not be set to a one which supports UTF-8." : "Nie je možné nastaviť znakovú sadu, ktorá podporuje UTF-8.",
+ "This means that there might be problems with certain characters in filenames." : "To znamená, že problémom môžu byť niektoré znaky v názvoch súborov.",
"It is strongly proposed to install the required packages on your system to support one of the following locales: %s." : "Dôrazne doporučujeme nainštalovať na váš systém požadované balíčky podporujúce jednu z nasledovných znakových sád: %s.",
"If your installation is not installed at the root of the domain and uses system Cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Inštalácia mimo koreňový priečinok domény a používanie systémového príkazu cron môže spôsobiť problém s generovaním správnej URL. Pre zabránenie týmto chybám nastavte prosím správnu cestu v svojom config.php súbore pre hodnotu \"overwrite.cli.url\" (Doporučujeme: \"%s\")",
"It was not possible to execute the cron job via CLI. The following technical errors have appeared:" : "Nebolo možné spustiť úlohu na pozadí pomocou CLI. Toto sú chyby:",
@@ -362,6 +368,21 @@ OC.L10N.register(
"change full name" : "zmeniť meno a priezvisko",
"set new password" : "nastaviť nové heslo",
"change email address" : "zmeniť emailovú adresu",
- "Default" : "Predvolené"
+ "Default" : "Predvolené",
+ "Updating...." : "Aktualizuje sa...",
+ "Error while updating app" : "Chyba pri aktualizácii aplikácie",
+ "Error while removing app" : "Chyba pri odstraňovaní aplikácie",
+ "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikácia bola povolená, ale vyžaduje sa aktualizácia. Presmerovanie na stránku aktualizácie o 5 sekúnd.",
+ "App update" : "Aktualizácia aplikácie",
+ "Verifying" : "Overovanie",
+ "Personal info" : "Osobné informácie",
+ "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Z hľadiska bezpečnosti a výkonu Vašej inštalácie je dôležité, že všetko je správne nastavené. Robíme automatickú kontrolu, ktorá Vám s tým pomáha. Pre ďalšie informácie nahliadnite do sekcie Tipy a triky a do dokumentácie.",
+ "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP nie je správne nastavené pre zobrazovanie systémových premenných. Príkaz getenv(\"PATH\") vracia iba prázdnu odpoveď.",
+ "Android app" : "Android aplikácia",
+ "iOS app" : "iOS aplikácia",
+ "Show First Run Wizard again" : "Znova zobraz Sprievodcu prvým spustením",
+ "App passwords" : "Heslá aplikácie",
+ "Follow us on Google+!" : "Sledujte nás na Google+!",
+ "Follow us on Twitter!" : "Sledujte nás na Twitteri!"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/settings/l10n/sk.json b/settings/l10n/sk.json
index 25b902d9ac3..f9b15bdfd7d 100644
--- a/settings/l10n/sk.json
+++ b/settings/l10n/sk.json
@@ -102,9 +102,14 @@
"Error: This app can not be enabled because it makes the server unstable" : "Chyba: aplikáciu nie je možné povoliť, lebo naruší stabilitu servera",
"Error: Could not disable broken app" : "Chyba: nebolo možné zakázať poškodenú aplikáciu",
"Error while disabling broken app" : "Nastala chyba počas zakazovania poškodenej aplikácie",
+ "App up to date" : "Aplikácia je aktuálna",
+ "Upgrading …" : "Aktualizuje sa...",
+ "Could not upgrade app" : "Aplikáciu nie je možné aktualizovať",
"Updated" : "Aktualizované",
"Removing …" : "Odstraňujem ...",
+ "Could not remove app" : "Aplikáciu nie je možné zmazať",
"Remove" : "Odstrániť",
+ "The app has been enabled but needs to be upgraded. You will be redirected to the upgrade page in 5 seconds." : "Aplikácia bola povolená, ale vyžaduje sa jej aktualizácia. Presmerovanie na stránku aktualizácie o 5 sekúnd.",
"Approved" : "Schválené",
"Experimental" : "Experimentálny",
"No apps found for {query}" : "Žiadna aplikácia nebola nájdená pre {query}",
@@ -245,6 +250,7 @@
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "To je pravdepodobne spôsobené cache/akcelerátorom ako napr. Zend OPcache alebo eAccelerator.",
"The PHP module 'fileinfo' is missing. It is strongly recommended to enable this module to get the best results with MIME type detection." : "Chýba PHP modul 'fileinfo'. Dôrazne doporučujeme ho povoliť pre dosiahnutie najlepších výsledkov zisťovania MIME-typu.",
"System locale can not be set to a one which supports UTF-8." : "Nie je možné nastaviť znakovú sadu, ktorá podporuje UTF-8.",
+ "This means that there might be problems with certain characters in filenames." : "To znamená, že problémom môžu byť niektoré znaky v názvoch súborov.",
"It is strongly proposed to install the required packages on your system to support one of the following locales: %s." : "Dôrazne doporučujeme nainštalovať na váš systém požadované balíčky podporujúce jednu z nasledovných znakových sád: %s.",
"If your installation is not installed at the root of the domain and uses system Cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Inštalácia mimo koreňový priečinok domény a používanie systémového príkazu cron môže spôsobiť problém s generovaním správnej URL. Pre zabránenie týmto chybám nastavte prosím správnu cestu v svojom config.php súbore pre hodnotu \"overwrite.cli.url\" (Doporučujeme: \"%s\")",
"It was not possible to execute the cron job via CLI. The following technical errors have appeared:" : "Nebolo možné spustiť úlohu na pozadí pomocou CLI. Toto sú chyby:",
@@ -360,6 +366,21 @@
"change full name" : "zmeniť meno a priezvisko",
"set new password" : "nastaviť nové heslo",
"change email address" : "zmeniť emailovú adresu",
- "Default" : "Predvolené"
+ "Default" : "Predvolené",
+ "Updating...." : "Aktualizuje sa...",
+ "Error while updating app" : "Chyba pri aktualizácii aplikácie",
+ "Error while removing app" : "Chyba pri odstraňovaní aplikácie",
+ "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikácia bola povolená, ale vyžaduje sa aktualizácia. Presmerovanie na stránku aktualizácie o 5 sekúnd.",
+ "App update" : "Aktualizácia aplikácie",
+ "Verifying" : "Overovanie",
+ "Personal info" : "Osobné informácie",
+ "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Z hľadiska bezpečnosti a výkonu Vašej inštalácie je dôležité, že všetko je správne nastavené. Robíme automatickú kontrolu, ktorá Vám s tým pomáha. Pre ďalšie informácie nahliadnite do sekcie Tipy a triky a do dokumentácie.",
+ "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP nie je správne nastavené pre zobrazovanie systémových premenných. Príkaz getenv(\"PATH\") vracia iba prázdnu odpoveď.",
+ "Android app" : "Android aplikácia",
+ "iOS app" : "iOS aplikácia",
+ "Show First Run Wizard again" : "Znova zobraz Sprievodcu prvým spustením",
+ "App passwords" : "Heslá aplikácie",
+ "Follow us on Google+!" : "Sledujte nás na Google+!",
+ "Follow us on Twitter!" : "Sledujte nás na Twitteri!"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/settings/l10n/sv.js b/settings/l10n/sv.js
index 0f46d4eeb79..34168abf9ea 100644
--- a/settings/l10n/sv.js
+++ b/settings/l10n/sv.js
@@ -103,8 +103,11 @@ OC.L10N.register(
"Error: This app can not be enabled because it makes the server unstable" : "Fel: Denna app kan inte aktiveras eftersom det gör servern instabil",
"Error: Could not disable broken app" : "Fel: Kunde inte inaktivera trasig app",
"Error while disabling broken app" : "Fel under inaktivering av trasig applikation.",
+ "App up to date" : "Appen är uppdaterad",
+ "Upgrading …" : "Uppgraderar ...",
"Updated" : "Uppdaterad",
"Removing …" : "Tar bort ...",
+ "Could not remove app" : "Kunde inte ta bort app",
"Remove" : "Ta bort",
"Approved" : "Godkänd",
"Experimental" : "Experimentell",
diff --git a/settings/l10n/sv.json b/settings/l10n/sv.json
index 97b30f2224c..f9274a80202 100644
--- a/settings/l10n/sv.json
+++ b/settings/l10n/sv.json
@@ -101,8 +101,11 @@
"Error: This app can not be enabled because it makes the server unstable" : "Fel: Denna app kan inte aktiveras eftersom det gör servern instabil",
"Error: Could not disable broken app" : "Fel: Kunde inte inaktivera trasig app",
"Error while disabling broken app" : "Fel under inaktivering av trasig applikation.",
+ "App up to date" : "Appen är uppdaterad",
+ "Upgrading …" : "Uppgraderar ...",
"Updated" : "Uppdaterad",
"Removing …" : "Tar bort ...",
+ "Could not remove app" : "Kunde inte ta bort app",
"Remove" : "Ta bort",
"Approved" : "Godkänd",
"Experimental" : "Experimentell",
diff --git a/settings/l10n/zh_CN.js b/settings/l10n/zh_CN.js
index 436a5bc756a..83f6b9a02f9 100644
--- a/settings/l10n/zh_CN.js
+++ b/settings/l10n/zh_CN.js
@@ -104,7 +104,7 @@ OC.L10N.register(
"Error: Could not disable broken app" : "错误: 无法禁用损坏的应用",
"Error while disabling broken app" : "禁用损坏的应用时出错",
"App up to date" : "已是最新应用",
- "Upgrading …" : "正在更新。。。",
+ "Upgrading …" : "正在更新...",
"Could not upgrade app" : "无法更新应用",
"Updated" : "已更新",
"Removing …" : "正在移除...",
diff --git a/settings/l10n/zh_CN.json b/settings/l10n/zh_CN.json
index 8537d8bc46c..d077ef1f715 100644
--- a/settings/l10n/zh_CN.json
+++ b/settings/l10n/zh_CN.json
@@ -102,7 +102,7 @@
"Error: Could not disable broken app" : "错误: 无法禁用损坏的应用",
"Error while disabling broken app" : "禁用损坏的应用时出错",
"App up to date" : "已是最新应用",
- "Upgrading …" : "正在更新。。。",
+ "Upgrading …" : "正在更新...",
"Could not upgrade app" : "无法更新应用",
"Updated" : "已更新",
"Removing …" : "正在移除...",
diff --git a/settings/templates/settings/personal/security.php b/settings/templates/settings/personal/security.php
index 3a324bf8d21..cf52315ff04 100644
--- a/settings/templates/settings/personal/security.php
+++ b/settings/templates/settings/personal/security.php
@@ -37,6 +37,7 @@ script('settings', [
<table class="icon-loading">
<thead class="token-list-header">
<tr>
+ <th></th>
<th><?php p($l->t('Device'));?></th>
<th><?php p($l->t('Last activity'));?></th>
<th></th>
diff --git a/settings/templates/users/part.createuser.php b/settings/templates/users/part.createuser.php
index ca36b196ea8..6a388fc0d88 100644
--- a/settings/templates/users/part.createuser.php
+++ b/settings/templates/users/part.createuser.php
@@ -7,7 +7,7 @@
type="password" id="newuserpassword"
placeholder="<?php p($l->t('Password'))?>"
autocomplete="off" autocapitalize="none" autocorrect="off" />
- <input id="newemail" type="text" style="display:none"
+ <input id="newemail" type="email" style="display:none"
placeholder="<?php p($l->t('E-Mail'))?>"
autocomplete="off" autocapitalize="none" autocorrect="off" />
<div class="groups"><div class="groupsListContainer multiselect button" data-placeholder="<?php p($l->t('Groups'))?>"><span class="title groupsList"></span><span class="icon-triangle-s"></span></div></div>
diff --git a/settings/templates/users/part.userlist.php b/settings/templates/users/part.userlist.php
index aaf20b6eaef..2506dba7fc3 100644
--- a/settings/templates/users/part.userlist.php
+++ b/settings/templates/users/part.userlist.php
@@ -67,7 +67,7 @@
<td class="userActions">
<div class="toggleUserActions">
<a class="action"><span class="icon-more"></span></a>
- <div class="popovermenu bubble menu">
+ <div class="popovermenu">
<ul class="userActionsMenu">
<li>
<a href="#" class="menuitem action-togglestate permanent" data-action="togglestate"></a>
diff --git a/tests/Core/Controller/AutoCompleteControllerTest.php b/tests/Core/Controller/AutoCompleteControllerTest.php
index 6279ba3283e..b1e9e6ba304 100644
--- a/tests/Core/Controller/AutoCompleteControllerTest.php
+++ b/tests/Core/Controller/AutoCompleteControllerTest.php
@@ -23,11 +23,9 @@
namespace Tests\Core\Controller;
-
use OC\Core\Controller\AutoCompleteController;
use OCP\Collaboration\AutoComplete\IManager;
use OCP\Collaboration\Collaborators\ISearch;
-use OCP\IConfig;
use OCP\IRequest;
use Test\TestCase;
@@ -36,8 +34,6 @@ class AutoCompleteControllerTest extends TestCase {
protected $collaboratorSearch;
/** @var IManager|\PHPUnit_Framework_MockObject_MockObject */
protected $autoCompleteManager;
- /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */
- protected $config;
/** @var AutoCompleteController */
protected $controller;
@@ -48,14 +44,12 @@ class AutoCompleteControllerTest extends TestCase {
$request = $this->createMock(IRequest::class);
$this->collaboratorSearch = $this->createMock(ISearch::class);
$this->autoCompleteManager = $this->createMock(IManager::class);
- $this->config = $this->createMock(IConfig::class);
$this->controller = new AutoCompleteController(
'core',
$request,
$this->collaboratorSearch,
- $this->autoCompleteManager,
- $this->config
+ $this->autoCompleteManager
);
}
diff --git a/tests/Core/Controller/NavigationControllerTest.php b/tests/Core/Controller/NavigationControllerTest.php
new file mode 100644
index 00000000000..1143ed003f0
--- /dev/null
+++ b/tests/Core/Controller/NavigationControllerTest.php
@@ -0,0 +1,129 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Härtl <jus@bitgrid.net>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+namespace Tests\Core\Controller;
+
+use OC\Core\Controller\NavigationController;
+use OCP\AppFramework\Http\DataResponse;
+use OCP\INavigationManager;
+use OCP\IRequest;
+use OCP\IURLGenerator;
+use Test\TestCase;
+
+class NavigationControllerTest extends TestCase {
+
+ /** @var IRequest|\PHPUnit_Framework_MockObject_MockObject */
+ private $request;
+
+ /** @var INavigationManager|\PHPUnit_Framework_MockObject_MockObject */
+ private $navigationManager;
+
+ /** @var IURLGenerator|\PHPUnit_Framework_MockObject_MockObject */
+ private $urlGenerator;
+
+ /** @var NavigationController */
+ private $controller;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->request = $this->createMock(IRequest::class);
+ $this->navigationManager = $this->createMock(INavigationManager::class);
+ $this->urlGenerator = $this->createMock(IURLGenerator::class);
+
+ $this->controller = new NavigationController(
+ 'core',
+ $this->request,
+ $this->navigationManager,
+ $this->urlGenerator
+ );
+ }
+
+ public function dataGetNavigation() {
+ return [
+ [false], [true]
+ ];
+ }
+ /** @dataProvider dataGetNavigation */
+ public function testGetAppNavigation($absolute) {
+ $this->navigationManager->expects($this->once())
+ ->method('getAll')
+ ->with('link')
+ ->willReturn([ ['id' => 'files', 'href' => '/index.php/apps/files', 'icon' => 'icon' ] ]);
+ if ($absolute) {
+ $this->urlGenerator->expects($this->any())
+ ->method('getBaseURL')
+ ->willReturn('http://localhost/');
+ $this->urlGenerator->expects($this->at(1))
+ ->method('getAbsoluteURL')
+ ->with('/index.php/apps/files')
+ ->willReturn('http://localhost/index.php/apps/files');
+ $this->urlGenerator->expects($this->at(3))
+ ->method('getAbsoluteURL')
+ ->with('icon')
+ ->willReturn('http://localhost/icon');
+ $actual = $this->controller->getAppsNavigation($absolute);
+ $this->assertInstanceOf(DataResponse::class, $actual);
+ $this->assertEquals('http://localhost/index.php/apps/files', $actual->getData()[0]['href']);
+ $this->assertEquals('http://localhost/icon', $actual->getData()[0]['icon']);
+
+
+ } else {
+ $actual = $this->controller->getAppsNavigation($absolute);
+ $this->assertInstanceOf(DataResponse::class, $actual);
+ $this->assertEquals('/index.php/apps/files', $actual->getData()[0]['href']);
+ $this->assertEquals('icon', $actual->getData()[0]['icon']);
+
+ }
+ }
+
+ /** @dataProvider dataGetNavigation */
+ public function testGetSettingsNavigation($absolute) {
+ $this->navigationManager->expects($this->once())
+ ->method('getAll')
+ ->with('settings')
+ ->willReturn([ ['id' => 'settings', 'href' => '/index.php/settings/user', 'icon' => '/core/img/settings.svg'] ]);
+ if ($absolute) {
+ $this->urlGenerator->expects($this->any())
+ ->method('getBaseURL')
+ ->willReturn('http://localhost/');
+ $this->urlGenerator->expects($this->at(1))
+ ->method('getAbsoluteURL')
+ ->with('/index.php/settings/user')
+ ->willReturn('http://localhost/index.php/settings/user');
+ $this->urlGenerator->expects($this->at(3))
+ ->method('getAbsoluteURL')
+ ->with('/core/img/settings.svg')
+ ->willReturn('http://localhost/core/img/settings.svg');
+ $actual = $this->controller->getSettingsNavigation($absolute);
+ $this->assertInstanceOf(DataResponse::class, $actual);
+ $this->assertEquals('http://localhost/index.php/settings/user', $actual->getData()[0]['href']);
+ $this->assertEquals('http://localhost/core/img/settings.svg', $actual->getData()[0]['icon']);
+ } else {
+ $actual = $this->controller->getSettingsNavigation($absolute);
+ $this->assertInstanceOf(DataResponse::class, $actual);
+ $this->assertEquals('/index.php/settings/user', $actual->getData()[0]['href']);
+ $this->assertEquals('/core/img/settings.svg', $actual->getData()[0]['icon']);
+ }
+ }
+
+}
diff --git a/tests/Settings/Controller/CheckSetupControllerTest.php b/tests/Settings/Controller/CheckSetupControllerTest.php
index 3f47819bcbd..a616cc3e70b 100644
--- a/tests/Settings/Controller/CheckSetupControllerTest.php
+++ b/tests/Settings/Controller/CheckSetupControllerTest.php
@@ -33,6 +33,7 @@ use OCP\ILogger;
use OCP\IRequest;
use OCP\IURLGenerator;
use OC_Util;
+use Psr\Http\Message\ResponseInterface;
use Test\TestCase;
use OC\IntegrityCheck\Checker;
@@ -460,7 +461,7 @@ class CheckSetupControllerTest extends TestCase {
->disableOriginalConstructor()->getMock();
$exception = $this->getMockBuilder('\GuzzleHttp\Exception\ClientException')
->disableOriginalConstructor()->getMock();
- $response = $this->getMockBuilder('\GuzzleHttp\Message\ResponseInterface')
+ $response = $this->getMockBuilder(ResponseInterface::class)
->disableOriginalConstructor()->getMock();
$response->expects($this->once())
->method('getStatusCode')
@@ -494,7 +495,7 @@ class CheckSetupControllerTest extends TestCase {
->disableOriginalConstructor()->getMock();
$exception = $this->getMockBuilder('\GuzzleHttp\Exception\ClientException')
->disableOriginalConstructor()->getMock();
- $response = $this->getMockBuilder('\GuzzleHttp\Message\ResponseInterface')
+ $response = $this->getMockBuilder(ResponseInterface::class)
->disableOriginalConstructor()->getMock();
$response->expects($this->once())
->method('getStatusCode')
diff --git a/tests/Settings/Controller/UsersControllerTest.php b/tests/Settings/Controller/UsersControllerTest.php
index 15c18fb7f08..1b59f15efb0 100644
--- a/tests/Settings/Controller/UsersControllerTest.php
+++ b/tests/Settings/Controller/UsersControllerTest.php
@@ -19,7 +19,6 @@ use OC\SubAdmin;
use OCP\App\IAppManager;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
-use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\IJobList;
use OCP\Files\Config\IUserMountCache;
use OCP\Encryption\IEncryptionModule;
@@ -38,7 +37,6 @@ use OCP\IUserManager;
use OCP\IUserSession;
use OCP\Mail\IEMailTemplate;
use OCP\Mail\IMailer;
-use OCP\Security\ICrypto;
use OCP\Security\ISecureRandom;
use OC\User\User;
use Test\Util\User\Dummy;
@@ -74,12 +72,8 @@ class UsersControllerTest extends \Test\TestCase {
private $accountManager;
/** @var ISecureRandom | \PHPUnit_Framework_MockObject_MockObject */
private $secureRandom;
- /** @var ITimeFactory | \PHPUnit_Framework_MockObject_MockObject */
- private $timeFactory;
/** @var NewUserMailHelper|\PHPUnit_Framework_MockObject_MockObject */
private $newUserMailHelper;
- /** @var ICrypto | \PHPUnit_Framework_MockObject_MockObject */
- private $crypto;
/** @var IJobList | \PHPUnit_Framework_MockObject_MockObject */
private $jobList;
/** @var \OC\Security\IdentityProof\Manager |\PHPUnit_Framework_MockObject_MockObject */
@@ -105,11 +99,7 @@ class UsersControllerTest extends \Test\TestCase {
$this->avatarManager = $this->createMock(IAvatarManager::class);
$this->accountManager = $this->createMock(AccountManager::class);
$this->secureRandom = $this->createMock(ISecureRandom::class);
- $this->timeFactory = $this->createMock(ITimeFactory::class);
- $this->crypto = $this->createMock(ICrypto::class);
$this->newUserMailHelper = $this->createMock(NewUserMailHelper::class);
- $this->timeFactory = $this->createMock(ITimeFactory::class);
- $this->crypto = $this->createMock(ICrypto::class);
$this->securityManager = $this->getMockBuilder(\OC\Security\IdentityProof\Manager::class)->disableOriginalConstructor()->getMock();
$this->jobList = $this->createMock(IJobList::class);
$this->encryptionManager = $this->createMock(IManager::class);
@@ -163,8 +153,6 @@ class UsersControllerTest extends \Test\TestCase {
$this->accountManager,
$this->secureRandom,
$this->newUserMailHelper,
- $this->timeFactory,
- $this->crypto,
$this->securityManager,
$this->jobList,
$this->userMountCache,
@@ -190,8 +178,6 @@ class UsersControllerTest extends \Test\TestCase {
$this->accountManager,
$this->secureRandom,
$this->newUserMailHelper,
- $this->timeFactory,
- $this->crypto,
$this->securityManager,
$this->jobList,
$this->userMountCache,
diff --git a/tests/acceptance/features/app-comments.feature b/tests/acceptance/features/app-comments.feature
index 81fc6f89ad1..a5bdb0aa745 100644
--- a/tests/acceptance/features/app-comments.feature
+++ b/tests/acceptance/features/app-comments.feature
@@ -5,4 +5,4 @@ Feature: app-comments
And I open the details view for "welcome.txt"
And I open the "Comments" tab in the details view
When I create a new comment with "Hello world" as message
- Then I see that a comment was added
+ Then I see a comment with "Hello world" as message
diff --git a/tests/acceptance/features/bootstrap/CommentsAppContext.php b/tests/acceptance/features/bootstrap/CommentsAppContext.php
index 64d1dc69bc4..7e804cfac23 100644
--- a/tests/acceptance/features/bootstrap/CommentsAppContext.php
+++ b/tests/acceptance/features/bootstrap/CommentsAppContext.php
@@ -26,57 +26,55 @@ use Behat\Behat\Context\Context;
class CommentsAppContext implements Context, ActorAwareInterface {
use ActorAware;
-
/**
- * @When /^I create a new comment with "([^"]*)" as message$/
+ * @return Locator
*/
- public function iCreateANewCommentWithAsMessage($commentText) {
- $this->actor->find(self::newCommentField(), 2)->setValue($commentText);
- $this->actor->find(self::submitNewCommentButton(), 2)->click();
+ public static function newCommentField() {
+ return Locator::forThe()->css("div.newCommentRow .message")->
+ descendantOf(FilesAppContext::currentSectionDetailsView())->
+ describedAs("New comment field in current section details view in Files app");
}
/**
- * @Then /^I see that a comment was added$/
+ * @return Locator
*/
- public function iSeeThatACommentWasAdded() {
- $self = $this;
-
- $result = Utils::waitFor(function () use ($self) {
- return $self->isCommentAdded();
- }, 5, 0.5);
-
- PHPUnit_Framework_Assert::assertTrue($result);
+ public static function submitNewCommentButton() {
+ return Locator::forThe()->css("div.newCommentRow .submit")->
+ descendantOf(FilesAppContext::currentSectionDetailsView())->
+ describedAs("Submit new comment button in current section details view in Files app");
}
- public function isCommentAdded() {
- try {
- $locator = self::commentFields();
- $comments = $this->actor->getSession()->getPage()->findAll($locator->getSelector(), $locator->getLocator());
- PHPUnit_Framework_Assert::assertSame(1, count($comments));
- } catch (PHPUnit_Framework_ExpectationFailedException $e) {
- return false;
- }
- return true;
+ /**
+ * @return Locator
+ */
+ public static function commentList() {
+ return Locator::forThe()->css("ul.comments")->
+ descendantOf(FilesAppContext::currentSectionDetailsView())->
+ describedAs("Comment list in current section details view in Files app");
}
/**
* @return Locator
*/
- public static function newCommentField() {
- return Locator::forThe()->css("div.newCommentRow .message")->descendantOf(FilesAppContext::currentSectionDetailsView())->
- describedAs("New comment field in the details view in Files app");
+ public static function commentWithText($text) {
+ return Locator::forThe()->xpath("//div[normalize-space() = '$text']/ancestor::li")->
+ descendantOf(self::commentList())->
+ describedAs("Comment with text \"$text\" in current section details view in Files app");
}
- public static function commentFields() {
- return Locator::forThe()->css(".comments .comment .message")->descendantOf(FilesAppContext::currentSectionDetailsView())->
- describedAs("Comment fields in the details view in Files app");
+ /**
+ * @When /^I create a new comment with "([^"]*)" as message$/
+ */
+ public function iCreateANewCommentWithAsMessage($commentText) {
+ $this->actor->find(self::newCommentField(), 10)->setValue($commentText);
+ $this->actor->find(self::submitNewCommentButton())->click();
}
/**
- * @return Locator
+ * @Then /^I see a comment with "([^"]*)" as message$/
*/
- public static function submitNewCommentButton() {
- return Locator::forThe()->css("div.newCommentRow .submit")->descendantOf(FilesAppContext::currentSectionDetailsView())->
- describedAs("Submit new comment button in the details view in Files app");
+ public function iSeeACommentWithAsMessage($commentText) {
+ PHPUnit_Framework_Assert::assertTrue(
+ $this->actor->find(self::commentWithText($commentText), 10)->isVisible());
}
}
diff --git a/tests/apps/testapp-dependency-missing/appinfo/info.xml b/tests/apps/testapp-dependency-missing/appinfo/info.xml
deleted file mode 100644
index c765400a76f..00000000000
--- a/tests/apps/testapp-dependency-missing/appinfo/info.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0"?>
-<info>
- <id>testapp-infoxml-version</id>
- <version>1.2.3</version>
- <author>Jane</author>
- <description>A b c</description>
- <licence>Abc</licence>
- <name>Test app</name>
-</info>
diff --git a/tests/apps/testapp-infoxml/appinfo/info.xml b/tests/apps/testapp-infoxml/appinfo/info.xml
deleted file mode 100644
index d4df1c3cd3f..00000000000
--- a/tests/apps/testapp-infoxml/appinfo/info.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0"?>
-<info>
- <id>testapp-infoxml</id>
- <version>1.2.3</version>
- <author>Jane</author>
- <description>A b c</description>
- <licence>Abc</licence>
- <name>Test app</name>
- <dependencies>
- <nextcloud min-version="12.0" max-version="12.0"/>
- </dependencies>
-</info>
diff --git a/tests/apps/testapp-name-missing/appinfo/info.xml b/tests/apps/testapp-name-missing/appinfo/info.xml
deleted file mode 100644
index 591c4361899..00000000000
--- a/tests/apps/testapp-name-missing/appinfo/info.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0"?>
-<info>
- <id>testapp-version</id>
- <version>1.1.1</version>
- <author>Jane</author>
- <description>A b c</description>
- <licence>Abc</licence>
- <dependencies>
- <nextcloud min-version="12.0" max-version="12.0"/>
- </dependencies>
-</info>
diff --git a/tests/apps/testapp-version/appinfo/info.xml b/tests/apps/testapp-version/appinfo/info.xml
deleted file mode 100644
index 28e2475800f..00000000000
--- a/tests/apps/testapp-version/appinfo/info.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0"?>
-<info>
- <id>testapp-version</id>
- <author>Jane</author>
- <description>A b c</description>
- <licence>Abc</licence>
- <name>Test app</name>
- <dependencies>
- <nextcloud min-version="12.0" max-version="12.0"/>
- </dependencies>
-</info>
diff --git a/tests/apps/testapp-version/appinfo/version b/tests/apps/testapp-version/appinfo/version
deleted file mode 100644
index 0495c4a88ca..00000000000
--- a/tests/apps/testapp-version/appinfo/version
+++ /dev/null
@@ -1 +0,0 @@
-1.2.3
diff --git a/tests/apps/testapp_dependency_missing/appinfo/info.xml b/tests/apps/testapp_dependency_missing/appinfo/info.xml
new file mode 100644
index 00000000000..b0ca188aefc
--- /dev/null
+++ b/tests/apps/testapp_dependency_missing/appinfo/info.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
+ <id>testapp_infoxml</id>
+ <name>Test app</name>
+ <summary>A b c</summary>
+ <description>A b c</description>
+ <version>1.2.3</version>
+ <licence>agpl</licence>
+ <author>Jane</author>
+ <category>games</category>
+ <bugs>https://example.org</bugs>
+</info>
diff --git a/tests/apps/testapp_infoxml/appinfo/info.xml b/tests/apps/testapp_infoxml/appinfo/info.xml
new file mode 100644
index 00000000000..b7575687fe5
--- /dev/null
+++ b/tests/apps/testapp_infoxml/appinfo/info.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
+ <id>testapp_infoxml</id>
+ <name>Test app</name>
+ <summary>A b c</summary>
+ <description>A b c</description>
+ <version>1.2.3</version>
+ <licence>agpl</licence>
+ <author>Jane</author>
+ <category>games</category>
+ <bugs>https://example.org</bugs>
+ <dependencies>
+ <nextcloud min-version="12.0" max-version="12.0"/>
+ </dependencies>
+</info>
diff --git a/tests/apps/testapp_name_missing/appinfo/info.xml b/tests/apps/testapp_name_missing/appinfo/info.xml
new file mode 100644
index 00000000000..872c8752c75
--- /dev/null
+++ b/tests/apps/testapp_name_missing/appinfo/info.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
+ <id>testapp_name_missing</id>
+ <summary>A b c</summary>
+ <description>A b c</description>
+ <version>1.2.3</version>
+ <licence>agpl</licence>
+ <author>Jane</author>
+ <category>games</category>
+ <bugs>https://example.org</bugs>
+ <dependencies>
+ <nextcloud min-version="12.0" max-version="12.0"/>
+ </dependencies>
+</info>
diff --git a/tests/apps/testapp_version/appinfo/info.xml b/tests/apps/testapp_version/appinfo/info.xml
new file mode 100644
index 00000000000..3a48fccd45f
--- /dev/null
+++ b/tests/apps/testapp_version/appinfo/info.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
+ <id>testapp_version</id>
+ <name>Test app</name>
+ <summary>A b c</summary>
+ <description>A b c</description>
+ <licence>agpl</licence>
+ <author>Jane</author>
+ <category>games</category>
+ <bugs>https://example.org</bugs>
+ <dependencies>
+ <nextcloud min-version="12.0" max-version="12.0"/>
+ </dependencies>
+</info>
diff --git a/tests/drone-wait-objectstore.sh b/tests/drone-wait-objectstore.sh
index 14d0b6f1f67..228accc3da9 100755
--- a/tests/drone-wait-objectstore.sh
+++ b/tests/drone-wait-objectstore.sh
@@ -1,10 +1,61 @@
#!/bin/bash
+function get_swift_token() {
+ KEYSTONE_OUT=$(curl -s 'http://dockswift:5000/v2.0/tokens' -H 'Content-Type: application/json' -d '{"auth":{"passwordCredentials":{"username":"swift","password":"swift"},"tenantName":"service"}}')
+ if (echo "$KEYSTONE_OUT" | grep -q 'object-store')
+ then
+ SWIFT_ENDPOINT=$(echo "$KEYSTONE_OUT" | php -r "echo array_values(array_filter(json_decode(file_get_contents('php://stdin'),true)['access']['serviceCatalog'], function(\$endpoint){return \$endpoint['type']==='object-store';}))[0]['endpoints'][0]['publicURL'];")
+ SWIFT_TOKEN=$(echo "$KEYSTONE_OUT" | php -r "echo json_decode(file_get_contents('php://stdin'),true)['access']['token']['id'];")
+ return 0
+ else
+ return -1
+ fi
+}
+
if [ "$OBJECT_STORE" == "swift" ]; then
- echo "waiting for swift"
- until curl -I http://dockswift:5000/v3
+ echo "waiting for keystone"
+ until get_swift_token
+ do
+ sleep 2
+ done
+
+ echo "waiting for object store at $SWIFT_ENDPOINT"
+
+ until curl -s -H "X-Auth-Token: $SWIFT_TOKEN" "$SWIFT_ENDPOINT"
+ do
+ sleep 2
+ done
+
+ echo "creating container"
+
+ sleep 2
+
+ while [ 1 ]
do
sleep 2
+
+ respCode=$(curl -s -o /dev/null -w "%{http_code}" -X PUT -H "X-Auth-Token: $SWIFT_TOKEN" "$SWIFT_ENDPOINT/nextcloud")
+
+ if [ "$respCode" == "201" ]
+ then
+ break
+ fi
done
- sleep 60
+
+ echo "creating test file"
+
+ while [ 1 ]
+ do
+ sleep 2
+
+ respCode=$(curl -s -o /dev/null -w "%{http_code}" -X PUT -H "X-Auth-Token: $SWIFT_TOKEN" -H "Content-Type: text/html; charset=UTF-8" -d "Hello world" "$SWIFT_ENDPOINT/nextcloud/helloworld.txt")
+
+ if [ "$respCode" == "201" ]
+ then
+ break
+ fi
+ done
+
+ echo "deleting test file"
+ curl -s -o /dev/null -w "%{http_code}\n" -X DELETE -H "X-Auth-Token: $SWIFT_TOKEN" "$SWIFT_ENDPOINT/nextcloud/helloworld.txt"
fi
diff --git a/tests/lib/App/CodeChecker/InfoCheckerTest.php b/tests/lib/App/CodeChecker/InfoCheckerTest.php
index 760d9880739..3128f902f47 100644
--- a/tests/lib/App/CodeChecker/InfoCheckerTest.php
+++ b/tests/lib/App/CodeChecker/InfoCheckerTest.php
@@ -44,19 +44,21 @@ class InfoCheckerTest extends TestCase {
protected function setUp() {
parent::setUp();
- $this->infoChecker = new InfoChecker(new InfoParser());
+ $this->infoChecker = new InfoChecker();
}
public function appInfoData() {
return [
- ['testapp-infoxml', []],
- ['testapp-version', [['type' => 'mandatoryFieldMissing', 'field' => 'version']]],
- ['testapp-dependency-missing', [
- ['type' => 'missingRequirement', 'field' => 'min'],
- ['type' => 'missingRequirement', 'field' => 'max'],
- ['type' => 'mandatoryFieldMissing', 'field' => 'dependencies'],
+ ['testapp_infoxml', []],
+ ['testapp_version', [
+ ['type' => 'parseError', 'field' => 'Element \'licence\': This element is not expected. Expected is one of ( description, version ).' . "\n"],
+ ]],
+ ['testapp_dependency_missing', [
+ ['type' => 'parseError', 'field' => 'Element \'info\': Missing child element(s). Expected is one of ( repository, screenshot, dependencies ).' . "\n"],
+ ]],
+ ['testapp_name_missing', [
+ ['type' => 'parseError', 'field' => 'Element \'summary\': This element is not expected. Expected is ( name ).' . "\n"],
]],
- ['testapp-name-missing', [['type' => 'mandatoryFieldMissing', 'field' => 'name']]],
];
}
@@ -68,6 +70,7 @@ class InfoCheckerTest extends TestCase {
*/
public function testApps($appId, $expectedErrors) {
$errors = $this->infoChecker->analyse($appId);
+ libxml_clear_errors();
$this->assertEquals($expectedErrors, $errors);
}
diff --git a/tests/lib/AppFramework/Http/DispatcherTest.php b/tests/lib/AppFramework/Http/DispatcherTest.php
index 95fa3c2a047..221e27e3b68 100644
--- a/tests/lib/AppFramework/Http/DispatcherTest.php
+++ b/tests/lib/AppFramework/Http/DispatcherTest.php
@@ -26,10 +26,12 @@ namespace Test\AppFramework\Http;
use OC\AppFramework\Http\Dispatcher;
use OC\AppFramework\Http\Request;
+use OC\AppFramework\Middleware\MiddlewareDispatcher;
use OC\AppFramework\Utility\ControllerMethodReflector;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\DataResponse;
+use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Controller;
use OCP\IConfig;
@@ -75,7 +77,9 @@ class TestController extends Controller {
class DispatcherTest extends \Test\TestCase {
+ /** @var MiddlewareDispatcher */
private $middlewareDispatcher;
+ /** @var Dispatcher */
private $dispatcher;
private $controllerMethod;
private $response;
@@ -120,14 +124,13 @@ class DispatcherTest extends \Test\TestCase {
$this->reflector = new ControllerMethodReflector();
$this->dispatcher = new Dispatcher(
- $this->http, $this->middlewareDispatcher, $this->reflector,
+ $this->http,
+ $this->middlewareDispatcher,
+ $this->reflector,
$this->request
);
- $this->response = $this->getMockBuilder(
- '\OCP\AppFramework\Http\Response')
- ->disableOriginalConstructor()
- ->getMock();
+ $this->response = $this->createMock(Response::class);
$this->lastModified = new \DateTime(null, new \DateTimeZone('GMT'));
$this->etag = 'hi';
@@ -162,7 +165,7 @@ class DispatcherTest extends \Test\TestCase {
->with($this->equalTo($this->controller),
$this->equalTo($this->controllerMethod),
$this->equalTo($exception))
- ->will($this->returnValue(null));
+ ->willThrowException($exception);
return;
}
} else {
@@ -221,10 +224,9 @@ class DispatcherTest extends \Test\TestCase {
public function testDispatcherReturnsArrayWith2Entries() {
- $this->setMiddlewareExpectations();
+ $this->setMiddlewareExpectations('');
- $response = $this->dispatcher->dispatch($this->controller,
- $this->controllerMethod);
+ $response = $this->dispatcher->dispatch($this->controller, $this->controllerMethod);
$this->assertNull($response[0]);
$this->assertEquals(array(), $response[1]);
$this->assertNull($response[2]);
@@ -264,12 +266,14 @@ class DispatcherTest extends \Test\TestCase {
public function testExceptionThrowsIfCanNotBeHandledByAfterException() {
$out = 'yo';
$httpHeaders = 'Http';
- $responseHeaders = array('hell' => 'yeah');
+ $responseHeaders = ['hell' => 'yeah'];
$this->setMiddlewareExpectations($out, $httpHeaders, $responseHeaders, true, false);
$this->expectException(\Exception::class);
- $response = $this->dispatcher->dispatch($this->controller,
- $this->controllerMethod);
+ $this->dispatcher->dispatch(
+ $this->controller,
+ $this->controllerMethod
+ );
}
diff --git a/tests/lib/AppFramework/Http/RequestTest.php b/tests/lib/AppFramework/Http/RequestTest.php
index cc55e33f354..c6b9719b32a 100644
--- a/tests/lib/AppFramework/Http/RequestTest.php
+++ b/tests/lib/AppFramework/Http/RequestTest.php
@@ -307,7 +307,7 @@ class RequestTest extends \Test\TestCase {
'method' => 'PUT',
'server' => [
'CONTENT_TYPE' => 'image/png',
- 'CONTENT_LENGTH' => strlen($data)
+ 'CONTENT_LENGTH' => (string)strlen($data)
],
);
diff --git a/tests/lib/AppFramework/Middleware/MiddlewareDispatcherTest.php b/tests/lib/AppFramework/Middleware/MiddlewareDispatcherTest.php
index b2f78c17fe6..e6c2c1b4f53 100644
--- a/tests/lib/AppFramework/Middleware/MiddlewareDispatcherTest.php
+++ b/tests/lib/AppFramework/Middleware/MiddlewareDispatcherTest.php
@@ -283,6 +283,8 @@ class MiddlewareDispatcherTest extends \Test\TestCase {
->method('beforeController');
$m3->expects($this->never())
->method('afterController');
+ $m3->method('beforeOutput')
+ ->will($this->returnArgument(2));
$this->dispatcher->registerMiddleware($m3);
diff --git a/tests/lib/AppTest.php b/tests/lib/AppTest.php
index d10ad387599..04729303847 100644
--- a/tests/lib/AppTest.php
+++ b/tests/lib/AppTest.php
@@ -310,19 +310,6 @@ class AppTest extends \Test\TestCase {
}
/**
- * Test that the isAppCompatible method also supports passing an array
- * as $ocVersion
- */
- public function testIsAppCompatibleWithArray() {
- $ocVersion = array(6);
- $appInfo = array(
- 'requiremin' => '6',
- 'requiremax' => '6',
- );
- $this->assertTrue(\OC_App::isAppCompatible($ocVersion, $appInfo));
- }
-
- /**
* Tests that the app order is correct
*/
public function testGetEnabledAppsIsSorted() {
diff --git a/tests/lib/Collaboration/Collaborators/MailPluginTest.php b/tests/lib/Collaboration/Collaborators/MailPluginTest.php
index b728ae521e2..9c4836c2eb3 100644
--- a/tests/lib/Collaboration/Collaborators/MailPluginTest.php
+++ b/tests/lib/Collaboration/Collaborators/MailPluginTest.php
@@ -103,7 +103,7 @@ class MailPluginTest extends TestCase {
->with($searchTerm, ['EMAIL', 'FN'])
->willReturn($contacts);
- $moreResults = $this->plugin->search($searchTerm, 0, 0, $this->searchResult);
+ $moreResults = $this->plugin->search($searchTerm, 2, 0, $this->searchResult);
$result = $this->searchResult->asArray();
$this->assertSame($exactIdMatch, $this->searchResult->hasExactIdMatch(new SearchResultType('emails')));
@@ -398,7 +398,7 @@ class MailPluginTest extends TestCase {
return in_array($group, $userToGroupMapping[$userId]);
});
- $moreResults = $this->plugin->search($searchTerm, 0, 0, $this->searchResult);
+ $moreResults = $this->plugin->search($searchTerm, 2, 0, $this->searchResult);
$result = $this->searchResult->asArray();
$this->assertSame($exactIdMatch, $this->searchResult->hasExactIdMatch(new SearchResultType('emails')));
diff --git a/tests/lib/Collaboration/Collaborators/RemotePluginTest.php b/tests/lib/Collaboration/Collaborators/RemotePluginTest.php
index 5c4b3af5e70..aa009a7134b 100644
--- a/tests/lib/Collaboration/Collaborators/RemotePluginTest.php
+++ b/tests/lib/Collaboration/Collaborators/RemotePluginTest.php
@@ -94,7 +94,7 @@ class RemotePluginTest extends TestCase {
->with($searchTerm, ['CLOUD', 'FN'])
->willReturn($contacts);
- $moreResults = $this->plugin->search($searchTerm, 0, 0, $this->searchResult);
+ $moreResults = $this->plugin->search($searchTerm, 2, 0, $this->searchResult);
$result = $this->searchResult->asArray();
$this->assertSame($exactIdMatch, $this->searchResult->hasExactIdMatch(new SearchResultType('remotes')));
diff --git a/tests/lib/Http/Client/ClientServiceTest.php b/tests/lib/Http/Client/ClientServiceTest.php
index 48330dc33c0..1bfaf050355 100644
--- a/tests/lib/Http/Client/ClientServiceTest.php
+++ b/tests/lib/Http/Client/ClientServiceTest.php
@@ -9,6 +9,7 @@
namespace Test\Http\Client;
use GuzzleHttp\Client as GuzzleClient;
+use GuzzleHttp\HandlerStack;
use OC\Http\Client\Client;
use OC\Http\Client\ClientService;
use OCP\ICertificateManager;
@@ -22,7 +23,7 @@ class ClientServiceTest extends \Test\TestCase {
$config = $this->createMock(IConfig::class);
$certificateManager = $this->createMock(ICertificateManager::class);
- $expected = new Client($config, $certificateManager, new GuzzleClient());
+ $expected = new Client($config, $certificateManager, new GuzzleClient(), HandlerStack::create());
$clientService = new ClientService($config, $certificateManager);
$this->assertEquals($expected, $clientService->newClient());
}
diff --git a/tests/lib/Http/Client/ClientTest.php b/tests/lib/Http/Client/ClientTest.php
index 1b0a51b7395..ec4ca6ec90c 100644
--- a/tests/lib/Http/Client/ClientTest.php
+++ b/tests/lib/Http/Client/ClientTest.php
@@ -8,7 +8,8 @@
namespace Test\Http\Client;
-use GuzzleHttp\Message\Response;
+use GuzzleHttp\HandlerStack;
+use GuzzleHttp\Psr7\Response;
use OC\Http\Client\Client;
use OC\Security\CertificateManager;
use OCP\ICertificateManager;
@@ -37,7 +38,8 @@ class ClientTest extends \Test\TestCase {
$this->client = new Client(
$this->config,
$this->certificateManager,
- $this->guzzleClient
+ $this->guzzleClient,
+ HandlerStack::create()
);
}
@@ -84,37 +86,37 @@ class ClientTest extends \Test\TestCase {
}
public function testGet() {
- $this->guzzleClient->method('get')
+ $this->guzzleClient->method('request')
->willReturn(new Response(1337));
$this->assertEquals(1337, $this->client->get('http://localhost/', [])->getStatusCode());
}
public function testPost() {
- $this->guzzleClient->method('post')
+ $this->guzzleClient->method('request')
->willReturn(new Response(1337));
$this->assertEquals(1337, $this->client->post('http://localhost/', [])->getStatusCode());
}
public function testPut() {
- $this->guzzleClient->method('put')
+ $this->guzzleClient->method('request')
->willReturn(new Response(1337));
$this->assertEquals(1337, $this->client->put('http://localhost/', [])->getStatusCode());
}
public function testDelete() {
- $this->guzzleClient->method('delete')
+ $this->guzzleClient->method('request')
->willReturn(new Response(1337));
$this->assertEquals(1337, $this->client->delete('http://localhost/', [])->getStatusCode());
}
public function testOptions() {
- $this->guzzleClient->method('options')
+ $this->guzzleClient->method('request')
->willReturn(new Response(1337));
$this->assertEquals(1337, $this->client->options('http://localhost/', [])->getStatusCode());
}
public function testHead() {
- $this->guzzleClient->method('head')
+ $this->guzzleClient->method('request')
->willReturn(new Response(1337));
$this->assertEquals(1337, $this->client->head('http://localhost/', [])->getStatusCode());
}
@@ -129,16 +131,10 @@ class ClientTest extends \Test\TestCase {
->expects($this->once())
->method('listCertificates')
->willReturn([]);
- $this->guzzleClient
- ->expects($this->at(0))
- ->method('setDefaultOption')
- ->with('verify', \OC::$SERVERROOT . '/resources/config/ca-bundle.crt');
- $this->guzzleClient
- ->expects($this->at(1))
- ->method('setDefaultOption')
- ->with('headers/User-Agent', 'Nextcloud Server Crawler');
- self::invokePrivate($this->client, 'setDefaultOptions');
+ $this->assertEquals([
+ 'verify' => \OC::$SERVERROOT . '/resources/config/ca-bundle.crt'
+ ], self::invokePrivate($this->client, 'getRequestOptions'));
}
public function testSetDefaultOptionsWithProxy() {
@@ -157,19 +153,10 @@ class ClientTest extends \Test\TestCase {
->method('getAbsoluteBundlePath')
->with(null)
->willReturn('/my/path.crt');
- $this->guzzleClient
- ->expects($this->at(0))
- ->method('setDefaultOption')
- ->with('verify', '/my/path.crt');
- $this->guzzleClient
- ->expects($this->at(1))
- ->method('setDefaultOption')
- ->with('headers/User-Agent', 'Nextcloud Server Crawler');
- $this->guzzleClient
- ->expects($this->at(2))
- ->method('setDefaultOption')
- ->with('proxy', 'foo');
-
- self::invokePrivate($this->client, 'setDefaultOptions');
+
+ $this->assertEquals([
+ 'verify' => '/my/path.crt',
+ 'proxy' => 'foo'
+ ], self::invokePrivate($this->client, 'getRequestOptions'));
}
}
diff --git a/tests/lib/Http/Client/ResponseTest.php b/tests/lib/Http/Client/ResponseTest.php
index 2e5a47b7f4a..d50f9a717d5 100644
--- a/tests/lib/Http/Client/ResponseTest.php
+++ b/tests/lib/Http/Client/ResponseTest.php
@@ -8,42 +8,42 @@
namespace Test\Http\Client;
-use GuzzleHttp\Stream\Stream;
-use GuzzleHttp\Message\Response as GuzzleResponse;
+use function GuzzleHttp\Psr7\stream_for;
+use GuzzleHttp\Psr7\Response as GuzzleResponse;
use OC\Http\Client\Response;
/**
* Class ResponseTest
*/
class ResponseTest extends \Test\TestCase {
- /** @var Response */
- private $response;
/** @var GuzzleResponse */
private $guzzleResponse;
public function setUp() {
parent::setUp();
$this->guzzleResponse = new GuzzleResponse(1337);
- $this->response = new Response($this->guzzleResponse);
}
public function testGetBody() {
- $this->guzzleResponse->setBody(Stream::factory('MyResponse'));
- $this->assertSame('MyResponse', $this->response->getBody());
+ $response = new Response($this->guzzleResponse->withBody(stream_for('MyResponse')));
+ $this->assertSame('MyResponse', $response->getBody());
}
public function testGetStatusCode() {
- $this->assertSame(1337, $this->response->getStatusCode());
+ $response = new Response($this->guzzleResponse);
+ $this->assertSame(1337, $response->getStatusCode());
}
public function testGetHeader() {
- $this->guzzleResponse->setHeader('bar', 'foo');
- $this->assertSame('foo', $this->response->getHeader('bar'));
+ $response = new Response($this->guzzleResponse->withHeader('bar', 'foo'));
+ $this->assertSame('foo', $response->getHeader('bar'));
}
public function testGetHeaders() {
- $this->guzzleResponse->setHeader('bar', 'foo');
- $this->guzzleResponse->setHeader('x-awesome', 'yes');
+ $response = new Response($this->guzzleResponse
+ ->withHeader('bar', 'foo')
+ ->withHeader('x-awesome', 'yes')
+ );
$expected = [
'bar' => [
@@ -53,7 +53,7 @@ class ResponseTest extends \Test\TestCase {
0 => 'yes',
],
];
- $this->assertSame($expected, $this->response->getHeaders());
- $this->assertSame('yes', $this->response->getHeader('x-awesome'));
+ $this->assertSame($expected, $response->getHeaders());
+ $this->assertSame('yes', $response->getHeader('x-awesome'));
}
}
diff --git a/tests/lib/IntegrityCheck/CheckerTest.php b/tests/lib/IntegrityCheck/CheckerTest.php
index 09e6990a0f3..71a9935008b 100644
--- a/tests/lib/IntegrityCheck/CheckerTest.php
+++ b/tests/lib/IntegrityCheck/CheckerTest.php
@@ -58,6 +58,9 @@ class CheckerTest extends TestCase {
$this->cacheFactory = $this->createMock(ICacheFactory::class);
$this->appManager = $this->createMock(IAppManager::class);
+ $this->config->method('getAppValue')
+ ->will($this->returnArgument(2));
+
$this->cacheFactory
->expects($this->any())
->method('createDistributed')
diff --git a/tests/lib/NavigationManagerTest.php b/tests/lib/NavigationManagerTest.php
index 585161c887b..b34ecca9469 100644
--- a/tests/lib/NavigationManagerTest.php
+++ b/tests/lib/NavigationManagerTest.php
@@ -284,7 +284,7 @@ class NavigationManagerTest extends TestCase {
],
];
return [
- 'minimalistic' => [array_merge($defaults, [[
+ 'minimalistic' => [array_merge([$defaults[0]], [[
'id' => 'test',
'order' => 100,
'href' => '/apps/test/',
@@ -293,8 +293,8 @@ class NavigationManagerTest extends TestCase {
'active' => false,
'type' => 'link',
'classes' => '',
- ]]), ['navigations' => [['route' => 'test.page.index', 'name' => 'Test']]]],
- 'minimalistic-settings' => [array_merge($defaults, [[
+ ]], [$defaults[1]]), ['navigations' => [['route' => 'test.page.index', 'name' => 'Test']]]],
+ 'minimalistic-settings' => [array_merge([$defaults[0]], [[
'id' => 'test',
'order' => 100,
'href' => '/apps/test/',
@@ -303,8 +303,8 @@ class NavigationManagerTest extends TestCase {
'active' => false,
'type' => 'settings',
'classes' => '',
- ]]), ['navigations' => [['route' => 'test.page.index', 'name' => 'Test', 'type' => 'settings']]]],
- 'admin' => [array_merge($apps, $defaults, [[
+ ]], [$defaults[1]]), ['navigations' => [['route' => 'test.page.index', 'name' => 'Test', 'type' => 'settings']]]],
+ 'admin' => [array_merge([$defaults[0]], $apps, [[
'id' => 'test',
'order' => 100,
'href' => '/apps/test/',
@@ -313,8 +313,8 @@ class NavigationManagerTest extends TestCase {
'active' => false,
'type' => 'link',
'classes' => '',
- ]]), ['navigations' => [['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index', 'name' => 'Test']]], true],
- 'no name' => [array_merge($apps, $defaults), ['navigations' => [['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index']]], true],
+ ]], [$defaults[1]]), ['navigations' => [['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index', 'name' => 'Test']]], true],
+ 'no name' => [array_merge([$defaults[0]], $apps, [$defaults[1]]), ['navigations' => [['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index']]], true],
'no admin' => [$defaults, ['navigations' => [['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index', 'name' => 'Test']]]]
];
}