aboutsummaryrefslogtreecommitdiffstats
path: root/apps/oauth2
diff options
context:
space:
mode:
Diffstat (limited to 'apps/oauth2')
-rw-r--r--apps/oauth2/.l10nignore2
-rw-r--r--apps/oauth2/appinfo/info.xml16
-rw-r--r--apps/oauth2/appinfo/routes.php23
-rw-r--r--apps/oauth2/composer/composer/ClassLoader.php108
-rw-r--r--apps/oauth2/composer/composer/InstalledVersions.php17
-rw-r--r--apps/oauth2/composer/composer/autoload_classmap.php6
-rw-r--r--apps/oauth2/composer/composer/autoload_static.php6
-rw-r--r--apps/oauth2/composer/composer/installed.php4
-rw-r--r--apps/oauth2/l10n/af.js14
-rw-r--r--apps/oauth2/l10n/af.json12
-rw-r--r--apps/oauth2/l10n/ar.js18
-rw-r--r--apps/oauth2/l10n/ar.json18
-rw-r--r--apps/oauth2/l10n/ast.js14
-rw-r--r--apps/oauth2/l10n/ast.json14
-rw-r--r--apps/oauth2/l10n/bg.js6
-rw-r--r--apps/oauth2/l10n/bg.json6
-rw-r--r--apps/oauth2/l10n/br.js6
-rw-r--r--apps/oauth2/l10n/br.json6
-rw-r--r--apps/oauth2/l10n/ca.js9
-rw-r--r--apps/oauth2/l10n/ca.json9
-rw-r--r--apps/oauth2/l10n/cs.js9
-rw-r--r--apps/oauth2/l10n/cs.json9
-rw-r--r--apps/oauth2/l10n/da.js15
-rw-r--r--apps/oauth2/l10n/da.json15
-rw-r--r--apps/oauth2/l10n/de.js11
-rw-r--r--apps/oauth2/l10n/de.json11
-rw-r--r--apps/oauth2/l10n/de_DE.js11
-rw-r--r--apps/oauth2/l10n/de_DE.json11
-rw-r--r--apps/oauth2/l10n/el.js6
-rw-r--r--apps/oauth2/l10n/el.json6
-rw-r--r--apps/oauth2/l10n/en_GB.js9
-rw-r--r--apps/oauth2/l10n/en_GB.json9
-rw-r--r--apps/oauth2/l10n/es.js9
-rw-r--r--apps/oauth2/l10n/es.json9
-rw-r--r--apps/oauth2/l10n/es_419.js13
-rw-r--r--apps/oauth2/l10n/es_419.json11
-rw-r--r--apps/oauth2/l10n/es_AR.js6
-rw-r--r--apps/oauth2/l10n/es_AR.json6
-rw-r--r--apps/oauth2/l10n/es_CL.js6
-rw-r--r--apps/oauth2/l10n/es_CL.json6
-rw-r--r--apps/oauth2/l10n/es_CO.js6
-rw-r--r--apps/oauth2/l10n/es_CO.json6
-rw-r--r--apps/oauth2/l10n/es_CR.js6
-rw-r--r--apps/oauth2/l10n/es_CR.json6
-rw-r--r--apps/oauth2/l10n/es_DO.js6
-rw-r--r--apps/oauth2/l10n/es_DO.json6
-rw-r--r--apps/oauth2/l10n/es_EC.js12
-rw-r--r--apps/oauth2/l10n/es_EC.json12
-rw-r--r--apps/oauth2/l10n/es_GT.js12
-rw-r--r--apps/oauth2/l10n/es_GT.json12
-rw-r--r--apps/oauth2/l10n/es_HN.js13
-rw-r--r--apps/oauth2/l10n/es_HN.json11
-rw-r--r--apps/oauth2/l10n/es_MX.js12
-rw-r--r--apps/oauth2/l10n/es_MX.json12
-rw-r--r--apps/oauth2/l10n/es_NI.js13
-rw-r--r--apps/oauth2/l10n/es_NI.json11
-rw-r--r--apps/oauth2/l10n/es_PA.js13
-rw-r--r--apps/oauth2/l10n/es_PA.json11
-rw-r--r--apps/oauth2/l10n/es_PE.js13
-rw-r--r--apps/oauth2/l10n/es_PE.json11
-rw-r--r--apps/oauth2/l10n/es_PR.js13
-rw-r--r--apps/oauth2/l10n/es_PR.json11
-rw-r--r--apps/oauth2/l10n/es_PY.js13
-rw-r--r--apps/oauth2/l10n/es_PY.json11
-rw-r--r--apps/oauth2/l10n/es_SV.js6
-rw-r--r--apps/oauth2/l10n/es_SV.json6
-rw-r--r--apps/oauth2/l10n/es_UY.js13
-rw-r--r--apps/oauth2/l10n/es_UY.json11
-rw-r--r--apps/oauth2/l10n/et_EE.js16
-rw-r--r--apps/oauth2/l10n/et_EE.json16
-rw-r--r--apps/oauth2/l10n/eu.js13
-rw-r--r--apps/oauth2/l10n/eu.json13
-rw-r--r--apps/oauth2/l10n/fa.js6
-rw-r--r--apps/oauth2/l10n/fa.json6
-rw-r--r--apps/oauth2/l10n/fi.js8
-rw-r--r--apps/oauth2/l10n/fi.json8
-rw-r--r--apps/oauth2/l10n/fr.js15
-rw-r--r--apps/oauth2/l10n/fr.json15
-rw-r--r--apps/oauth2/l10n/ga.js23
-rw-r--r--apps/oauth2/l10n/ga.json21
-rw-r--r--apps/oauth2/l10n/gl.js15
-rw-r--r--apps/oauth2/l10n/gl.json15
-rw-r--r--apps/oauth2/l10n/he.js8
-rw-r--r--apps/oauth2/l10n/he.json8
-rw-r--r--apps/oauth2/l10n/hr.js6
-rw-r--r--apps/oauth2/l10n/hr.json6
-rw-r--r--apps/oauth2/l10n/hu.js13
-rw-r--r--apps/oauth2/l10n/hu.json13
-rw-r--r--apps/oauth2/l10n/id.js13
-rw-r--r--apps/oauth2/l10n/id.json11
-rw-r--r--apps/oauth2/l10n/is.js9
-rw-r--r--apps/oauth2/l10n/is.json9
-rw-r--r--apps/oauth2/l10n/it.js9
-rw-r--r--apps/oauth2/l10n/it.json9
-rw-r--r--apps/oauth2/l10n/ja.js9
-rw-r--r--apps/oauth2/l10n/ja.json9
-rw-r--r--apps/oauth2/l10n/ka.js22
-rw-r--r--apps/oauth2/l10n/ka.json20
-rw-r--r--apps/oauth2/l10n/ka_GE.js6
-rw-r--r--apps/oauth2/l10n/ka_GE.json6
-rw-r--r--apps/oauth2/l10n/ko.js6
-rw-r--r--apps/oauth2/l10n/ko.json6
-rw-r--r--apps/oauth2/l10n/lt_LT.js7
-rw-r--r--apps/oauth2/l10n/lt_LT.json7
-rw-r--r--apps/oauth2/l10n/lv.js10
-rw-r--r--apps/oauth2/l10n/lv.json10
-rw-r--r--apps/oauth2/l10n/mk.js6
-rw-r--r--apps/oauth2/l10n/mk.json6
-rw-r--r--apps/oauth2/l10n/nb.js9
-rw-r--r--apps/oauth2/l10n/nb.json9
-rw-r--r--apps/oauth2/l10n/nl.js11
-rw-r--r--apps/oauth2/l10n/nl.json11
-rw-r--r--apps/oauth2/l10n/oc.js5
-rw-r--r--apps/oauth2/l10n/oc.json5
-rw-r--r--apps/oauth2/l10n/pl.js9
-rw-r--r--apps/oauth2/l10n/pl.json9
-rw-r--r--apps/oauth2/l10n/pt_BR.js9
-rw-r--r--apps/oauth2/l10n/pt_BR.json9
-rw-r--r--apps/oauth2/l10n/pt_PT.js6
-rw-r--r--apps/oauth2/l10n/pt_PT.json6
-rw-r--r--apps/oauth2/l10n/ru.js9
-rw-r--r--apps/oauth2/l10n/ru.json9
-rw-r--r--apps/oauth2/l10n/sc.js6
-rw-r--r--apps/oauth2/l10n/sc.json6
-rw-r--r--apps/oauth2/l10n/si.js6
-rw-r--r--apps/oauth2/l10n/si.json6
-rw-r--r--apps/oauth2/l10n/sk.js11
-rw-r--r--apps/oauth2/l10n/sk.json11
-rw-r--r--apps/oauth2/l10n/sl.js6
-rw-r--r--apps/oauth2/l10n/sl.json6
-rw-r--r--apps/oauth2/l10n/sq.js6
-rw-r--r--apps/oauth2/l10n/sq.json6
-rw-r--r--apps/oauth2/l10n/sr.js9
-rw-r--r--apps/oauth2/l10n/sr.json9
-rw-r--r--apps/oauth2/l10n/sv.js9
-rw-r--r--apps/oauth2/l10n/sv.json9
-rw-r--r--apps/oauth2/l10n/sw.js23
-rw-r--r--apps/oauth2/l10n/sw.json21
-rw-r--r--apps/oauth2/l10n/tr.js15
-rw-r--r--apps/oauth2/l10n/tr.json15
-rw-r--r--apps/oauth2/l10n/ug.js23
-rw-r--r--apps/oauth2/l10n/ug.json21
-rw-r--r--apps/oauth2/l10n/uk.js15
-rw-r--r--apps/oauth2/l10n/uk.json15
-rw-r--r--apps/oauth2/l10n/vi.js5
-rw-r--r--apps/oauth2/l10n/vi.json5
-rw-r--r--apps/oauth2/l10n/zh_CN.js11
-rw-r--r--apps/oauth2/l10n/zh_CN.json11
-rw-r--r--apps/oauth2/l10n/zh_HK.js9
-rw-r--r--apps/oauth2/l10n/zh_HK.json9
-rw-r--r--apps/oauth2/l10n/zh_TW.js17
-rw-r--r--apps/oauth2/l10n/zh_TW.json17
-rw-r--r--apps/oauth2/lib/BackgroundJob/CleanupExpiredAuthorizationCode.php43
-rw-r--r--apps/oauth2/lib/Command/ImportLegacyOcClient.php76
-rw-r--r--apps/oauth2/lib/Controller/LoginRedirectorController.php125
-rw-r--r--apps/oauth2/lib/Controller/OauthApiController.php174
-rw-r--r--apps/oauth2/lib/Controller/SettingsController.php71
-rw-r--r--apps/oauth2/lib/Db/AccessToken.php40
-rw-r--r--apps/oauth2/lib/Db/AccessTokenMapper.php55
-rw-r--r--apps/oauth2/lib/Db/Client.php25
-rw-r--r--apps/oauth2/lib/Db/ClientMapper.php27
-rw-r--r--apps/oauth2/lib/Exceptions/AccessTokenNotFoundException.php22
-rw-r--r--apps/oauth2/lib/Exceptions/ClientNotFoundException.php22
-rw-r--r--apps/oauth2/lib/Migration/SetTokenExpiration.php46
-rw-r--r--apps/oauth2/lib/Migration/Version010401Date20181207190718.php21
-rw-r--r--apps/oauth2/lib/Migration/Version010402Date20190107124745.php21
-rw-r--r--apps/oauth2/lib/Migration/Version011601Date20230522143227.php65
-rw-r--r--apps/oauth2/lib/Migration/Version011602Date20230613160650.php39
-rw-r--r--apps/oauth2/lib/Migration/Version011603Date20230620111039.php69
-rw-r--r--apps/oauth2/lib/Migration/Version011901Date20240829164356.php49
-rw-r--r--apps/oauth2/lib/Settings/Admin.php56
-rw-r--r--apps/oauth2/openapi.json227
-rw-r--r--apps/oauth2/openapi.json.license2
-rw-r--r--apps/oauth2/src/App.vue90
-rw-r--r--apps/oauth2/src/components/OAuthItem.vue89
-rw-r--r--apps/oauth2/src/main.js23
-rw-r--r--apps/oauth2/templates/admin.php21
-rw-r--r--apps/oauth2/tests/Controller/LoginRedirectorControllerTest.php193
-rw-r--r--apps/oauth2/tests/Controller/OauthApiControllerTest.php248
-rw-r--r--apps/oauth2/tests/Controller/SettingsControllerTest.php116
-rw-r--r--apps/oauth2/tests/Db/AccessTokenMapperTest.php37
-rw-r--r--apps/oauth2/tests/Db/ClientMapperTest.php55
-rw-r--r--apps/oauth2/tests/Settings/AdminTest.php39
183 files changed, 2371 insertions, 1493 deletions
diff --git a/apps/oauth2/.l10nignore b/apps/oauth2/.l10nignore
index 0844b0dde59..4b3060dbc2c 100644
--- a/apps/oauth2/.l10nignore
+++ b/apps/oauth2/.l10nignore
@@ -1,2 +1,4 @@
+# SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
# compiled vue templates
js/
diff --git a/apps/oauth2/appinfo/info.xml b/apps/oauth2/appinfo/info.xml
index c9a2d460450..6ab30292ab0 100644
--- a/apps/oauth2/appinfo/info.xml
+++ b/apps/oauth2/appinfo/info.xml
@@ -1,11 +1,15 @@
<?xml version="1.0"?>
+<!--
+ - SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
<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.14.0</version>
+ <version>1.20.0</version>
<licence>agpl</licence>
<author>Lukas Reschke</author>
<namespace>OAuth2</namespace>
@@ -16,15 +20,23 @@
<category>integration</category>
<bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
- <nextcloud min-version="26" max-version="26"/>
+ <nextcloud min-version="32" max-version="32"/>
</dependencies>
+ <background-jobs>
+ <job>OCA\OAuth2\BackgroundJob\CleanupExpiredAuthorizationCode</job>
+ </background-jobs>
+
<repair-steps>
<post-migration>
<step>OCA\OAuth2\Migration\SetTokenExpiration</step>
</post-migration>
</repair-steps>
+ <commands>
+ <command>OCA\OAuth2\Command\ImportLegacyOcClient</command>
+ </commands>
+
<settings>
<admin>OCA\OAuth2\Settings\Admin</admin>
</settings>
diff --git a/apps/oauth2/appinfo/routes.php b/apps/oauth2/appinfo/routes.php
index 4ba398e1343..b34aff05552 100644
--- a/apps/oauth2/appinfo/routes.php
+++ b/apps/oauth2/appinfo/routes.php
@@ -1,25 +1,8 @@
<?php
+
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
return [
'routes' => [
diff --git a/apps/oauth2/composer/composer/ClassLoader.php b/apps/oauth2/composer/composer/ClassLoader.php
index fd56bd7d840..7824d8f7eaf 100644
--- a/apps/oauth2/composer/composer/ClassLoader.php
+++ b/apps/oauth2/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -429,7 +423,8 @@ class ClassLoader
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
- (self::$includeFile)($file);
+ $includeFile = self::$includeFile;
+ $includeFile($file);
return true;
}
@@ -480,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
@@ -560,7 +555,10 @@ class ClassLoader
return false;
}
- private static function initializeIncludeClosure(): void
+ /**
+ * @return void
+ */
+ private static function initializeIncludeClosure()
{
if (self::$includeFile !== null) {
return;
@@ -574,8 +572,8 @@ class ClassLoader
* @param string $file
* @return void
*/
- self::$includeFile = static function($file) {
+ self::$includeFile = \Closure::bind(static function($file) {
include $file;
- };
+ }, null, null);
}
}
diff --git a/apps/oauth2/composer/composer/InstalledVersions.php b/apps/oauth2/composer/composer/InstalledVersions.php
index c6b54af7ba2..51e734a774b 100644
--- a/apps/oauth2/composer/composer/InstalledVersions.php
+++ b/apps/oauth2/composer/composer/InstalledVersions.php
@@ -98,7 +98,7 @@ class InstalledVersions
{
foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) {
- return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
+ return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
}
}
@@ -119,7 +119,7 @@ class InstalledVersions
*/
public static function satisfies(VersionParser $parser, $packageName, $constraint)
{
- $constraint = $parser->parseConstraints($constraint);
+ $constraint = $parser->parseConstraints((string) $constraint);
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
return $provided->matches($constraint);
@@ -328,7 +328,9 @@ class InstalledVersions
if (isset(self::$installedByVendor[$vendorDir])) {
$installed[] = self::$installedByVendor[$vendorDir];
} elseif (is_file($vendorDir.'/composer/installed.php')) {
- $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
+ /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
+ $required = require $vendorDir.'/composer/installed.php';
+ $installed[] = self::$installedByVendor[$vendorDir] = $required;
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
self::$installed = $installed[count($installed) - 1];
}
@@ -340,12 +342,17 @@ class InstalledVersions
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
- self::$installed = require __DIR__ . '/installed.php';
+ /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
+ $required = require __DIR__ . '/installed.php';
+ self::$installed = $required;
} else {
self::$installed = array();
}
}
- $installed[] = self::$installed;
+
+ if (self::$installed !== array()) {
+ $installed[] = self::$installed;
+ }
return $installed;
}
diff --git a/apps/oauth2/composer/composer/autoload_classmap.php b/apps/oauth2/composer/composer/autoload_classmap.php
index d760d7cd579..f5fc5bfe251 100644
--- a/apps/oauth2/composer/composer/autoload_classmap.php
+++ b/apps/oauth2/composer/composer/autoload_classmap.php
@@ -7,6 +7,8 @@ $baseDir = $vendorDir;
return array(
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
+ 'OCA\\OAuth2\\BackgroundJob\\CleanupExpiredAuthorizationCode' => $baseDir . '/../lib/BackgroundJob/CleanupExpiredAuthorizationCode.php',
+ 'OCA\\OAuth2\\Command\\ImportLegacyOcClient' => $baseDir . '/../lib/Command/ImportLegacyOcClient.php',
'OCA\\OAuth2\\Controller\\LoginRedirectorController' => $baseDir . '/../lib/Controller/LoginRedirectorController.php',
'OCA\\OAuth2\\Controller\\OauthApiController' => $baseDir . '/../lib/Controller/OauthApiController.php',
'OCA\\OAuth2\\Controller\\SettingsController' => $baseDir . '/../lib/Controller/SettingsController.php',
@@ -19,5 +21,9 @@ return array(
'OCA\\OAuth2\\Migration\\SetTokenExpiration' => $baseDir . '/../lib/Migration/SetTokenExpiration.php',
'OCA\\OAuth2\\Migration\\Version010401Date20181207190718' => $baseDir . '/../lib/Migration/Version010401Date20181207190718.php',
'OCA\\OAuth2\\Migration\\Version010402Date20190107124745' => $baseDir . '/../lib/Migration/Version010402Date20190107124745.php',
+ 'OCA\\OAuth2\\Migration\\Version011601Date20230522143227' => $baseDir . '/../lib/Migration/Version011601Date20230522143227.php',
+ 'OCA\\OAuth2\\Migration\\Version011602Date20230613160650' => $baseDir . '/../lib/Migration/Version011602Date20230613160650.php',
+ 'OCA\\OAuth2\\Migration\\Version011603Date20230620111039' => $baseDir . '/../lib/Migration/Version011603Date20230620111039.php',
+ 'OCA\\OAuth2\\Migration\\Version011901Date20240829164356' => $baseDir . '/../lib/Migration/Version011901Date20240829164356.php',
'OCA\\OAuth2\\Settings\\Admin' => $baseDir . '/../lib/Settings/Admin.php',
);
diff --git a/apps/oauth2/composer/composer/autoload_static.php b/apps/oauth2/composer/composer/autoload_static.php
index c8f3a388c78..c4843fa1990 100644
--- a/apps/oauth2/composer/composer/autoload_static.php
+++ b/apps/oauth2/composer/composer/autoload_static.php
@@ -22,6 +22,8 @@ class ComposerStaticInitOAuth2
public static $classMap = array (
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
+ 'OCA\\OAuth2\\BackgroundJob\\CleanupExpiredAuthorizationCode' => __DIR__ . '/..' . '/../lib/BackgroundJob/CleanupExpiredAuthorizationCode.php',
+ 'OCA\\OAuth2\\Command\\ImportLegacyOcClient' => __DIR__ . '/..' . '/../lib/Command/ImportLegacyOcClient.php',
'OCA\\OAuth2\\Controller\\LoginRedirectorController' => __DIR__ . '/..' . '/../lib/Controller/LoginRedirectorController.php',
'OCA\\OAuth2\\Controller\\OauthApiController' => __DIR__ . '/..' . '/../lib/Controller/OauthApiController.php',
'OCA\\OAuth2\\Controller\\SettingsController' => __DIR__ . '/..' . '/../lib/Controller/SettingsController.php',
@@ -34,6 +36,10 @@ class ComposerStaticInitOAuth2
'OCA\\OAuth2\\Migration\\SetTokenExpiration' => __DIR__ . '/..' . '/../lib/Migration/SetTokenExpiration.php',
'OCA\\OAuth2\\Migration\\Version010401Date20181207190718' => __DIR__ . '/..' . '/../lib/Migration/Version010401Date20181207190718.php',
'OCA\\OAuth2\\Migration\\Version010402Date20190107124745' => __DIR__ . '/..' . '/../lib/Migration/Version010402Date20190107124745.php',
+ 'OCA\\OAuth2\\Migration\\Version011601Date20230522143227' => __DIR__ . '/..' . '/../lib/Migration/Version011601Date20230522143227.php',
+ 'OCA\\OAuth2\\Migration\\Version011602Date20230613160650' => __DIR__ . '/..' . '/../lib/Migration/Version011602Date20230613160650.php',
+ 'OCA\\OAuth2\\Migration\\Version011603Date20230620111039' => __DIR__ . '/..' . '/../lib/Migration/Version011603Date20230620111039.php',
+ 'OCA\\OAuth2\\Migration\\Version011901Date20240829164356' => __DIR__ . '/..' . '/../lib/Migration/Version011901Date20240829164356.php',
'OCA\\OAuth2\\Settings\\Admin' => __DIR__ . '/..' . '/../lib/Settings/Admin.php',
);
diff --git a/apps/oauth2/composer/composer/installed.php b/apps/oauth2/composer/composer/installed.php
index a1f6a8636b4..1a66c7f2416 100644
--- a/apps/oauth2/composer/composer/installed.php
+++ b/apps/oauth2/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'd51429a47232bbf46a2be832ecfa711f102da802',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'd51429a47232bbf46a2be832ecfa711f102da802',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/oauth2/l10n/af.js b/apps/oauth2/l10n/af.js
deleted file mode 100644
index cf981459f20..00000000000
--- a/apps/oauth2/l10n/af.js
+++ /dev/null
@@ -1,14 +0,0 @@
-OC.L10N.register(
- "oauth2",
- {
- "OAuth 2.0" : "OAuth 2.0",
- "OAuth 2.0 clients" : "OAuth 2.0-kliënte",
- "Add client" : "Voeg kliënt toe",
- "Name" : "Naam",
- "Redirection URI" : "Herverwysings-URI",
- "Add" : "Voeg toe",
- "Client Identifier" : "Kliëntidentifiseerder",
- "Secret" : "Geheim",
- "Delete" : "Skrap"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/af.json b/apps/oauth2/l10n/af.json
deleted file mode 100644
index c60dc073b9e..00000000000
--- a/apps/oauth2/l10n/af.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{ "translations": {
- "OAuth 2.0" : "OAuth 2.0",
- "OAuth 2.0 clients" : "OAuth 2.0-kliënte",
- "Add client" : "Voeg kliënt toe",
- "Name" : "Naam",
- "Redirection URI" : "Herverwysings-URI",
- "Add" : "Voeg toe",
- "Client Identifier" : "Kliëntidentifiseerder",
- "Secret" : "Geheim",
- "Delete" : "Skrap"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/oauth2/l10n/ar.js b/apps/oauth2/l10n/ar.js
index 9771d514540..0ccccefa3b1 100644
--- a/apps/oauth2/l10n/ar.js
+++ b/apps/oauth2/l10n/ar.js
@@ -1,11 +1,23 @@
OC.L10N.register(
"oauth2",
{
- "Name" : "الإسم",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "عميلك ليس مُخوّلاً بالربط. رجاءً، أبلغ مسؤول النظام.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "عنوان URL المُعاد توجيهه يجب أن يكون عنواناً كاملاً كما في المثال التالي: https://yourdomain.com/path",
+ "OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "يسمح بالتحقّق من الهويّة عن طريق تطبيقات وب أخرى متوافقة مع OAuth2.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "التطبيق OAuth2 يسمح لمسؤولي النظام بتهيئة الإجراء الأساسي للتحقّق من الهويّةبحيث يسمح بالتحقّق من الهويّة عن طريق تطبيقات ويب أخرى متوافقة مع OAuth2.",
+ "OAuth 2.0 clients" : "عملاء OAuth2.0",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "يسمح OAuth2.0 لخدمات خارجية بطلب الوصول إلى {instanceName}",
+ "Name" : "الاسم",
"Redirection URI" : "رابط إعادة التوجيه",
"Client Identifier" : "مُعرِّف العميل",
- "Secret" : "السر",
+ "Secret key" : "المفتاح السّرّي",
+ "Delete client" : "حذف عميل ",
+ "Make sure you store the secret key, it cannot be recovered." : "تأكد من تخزين المفتاح السري، إذ أنه لا يمكن استعادته.",
"Add client" : "إضافة عميل",
- "Add" : "إضافة"
+ "Add" : "إضافة",
+ "Show client secret" : "عرض كلمة سر العميل",
+ "Hide client secret" : "إخْفِ سِرَّ العميل",
+ "Delete" : "حذف"
},
"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
diff --git a/apps/oauth2/l10n/ar.json b/apps/oauth2/l10n/ar.json
index bfa7e0487ea..a7ea13b979f 100644
--- a/apps/oauth2/l10n/ar.json
+++ b/apps/oauth2/l10n/ar.json
@@ -1,9 +1,21 @@
{ "translations": {
- "Name" : "الإسم",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "عميلك ليس مُخوّلاً بالربط. رجاءً، أبلغ مسؤول النظام.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "عنوان URL المُعاد توجيهه يجب أن يكون عنواناً كاملاً كما في المثال التالي: https://yourdomain.com/path",
+ "OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "يسمح بالتحقّق من الهويّة عن طريق تطبيقات وب أخرى متوافقة مع OAuth2.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "التطبيق OAuth2 يسمح لمسؤولي النظام بتهيئة الإجراء الأساسي للتحقّق من الهويّةبحيث يسمح بالتحقّق من الهويّة عن طريق تطبيقات ويب أخرى متوافقة مع OAuth2.",
+ "OAuth 2.0 clients" : "عملاء OAuth2.0",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "يسمح OAuth2.0 لخدمات خارجية بطلب الوصول إلى {instanceName}",
+ "Name" : "الاسم",
"Redirection URI" : "رابط إعادة التوجيه",
"Client Identifier" : "مُعرِّف العميل",
- "Secret" : "السر",
+ "Secret key" : "المفتاح السّرّي",
+ "Delete client" : "حذف عميل ",
+ "Make sure you store the secret key, it cannot be recovered." : "تأكد من تخزين المفتاح السري، إذ أنه لا يمكن استعادته.",
"Add client" : "إضافة عميل",
- "Add" : "إضافة"
+ "Add" : "إضافة",
+ "Show client secret" : "عرض كلمة سر العميل",
+ "Hide client secret" : "إخْفِ سِرَّ العميل",
+ "Delete" : "حذف"
},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/ast.js b/apps/oauth2/l10n/ast.js
index 055ebe101f3..5a71f29b226 100644
--- a/apps/oauth2/l10n/ast.js
+++ b/apps/oauth2/l10n/ast.js
@@ -1,14 +1,22 @@
OC.L10N.register(
"oauth2",
{
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "El veceru nun tien autorización pa conectase. Informa al alministrador de l'aplicación.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "La URL de redireición tien de ser una URL completa, por exemplu: https://dominiu.com/camin",
"OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Permite l'autenticación compatible con OAuth2 dende otres aplicaciones web.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "L'aplicación OAuth2 permite a l'alministración configurar el fluxu de trabayu d'autenticación integráu pa que tamién permita l'autenticación compatible con OAuth2 dende otres aplicaciones web.",
"OAuth 2.0 clients" : "Veceros d'OAuth 2.0",
- "Add client" : "Amestar veceru",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permite que los servicios esternos soliciten l'accesu a «{instanceName}».",
"Name" : "Nome",
"Redirection URI" : "URI de redireición",
- "Add" : "Amestar",
"Client Identifier" : "Identificador del veceru",
- "Secret" : "Secretu",
+ "Secret key" : "Clave del secretu",
+ "Delete client" : "Desaniciar el veceru",
+ "Add client" : "Amestar el veceru",
+ "Add" : "Amestar",
+ "Show client secret" : "Amosar el secretu del veceru",
+ "Hide client secret" : "Anubrir el secretu del veceru",
"Delete" : "Desaniciar"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/ast.json b/apps/oauth2/l10n/ast.json
index a07a2b71f74..07995fc9268 100644
--- a/apps/oauth2/l10n/ast.json
+++ b/apps/oauth2/l10n/ast.json
@@ -1,12 +1,20 @@
{ "translations": {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "El veceru nun tien autorización pa conectase. Informa al alministrador de l'aplicación.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "La URL de redireición tien de ser una URL completa, por exemplu: https://dominiu.com/camin",
"OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Permite l'autenticación compatible con OAuth2 dende otres aplicaciones web.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "L'aplicación OAuth2 permite a l'alministración configurar el fluxu de trabayu d'autenticación integráu pa que tamién permita l'autenticación compatible con OAuth2 dende otres aplicaciones web.",
"OAuth 2.0 clients" : "Veceros d'OAuth 2.0",
- "Add client" : "Amestar veceru",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permite que los servicios esternos soliciten l'accesu a «{instanceName}».",
"Name" : "Nome",
"Redirection URI" : "URI de redireición",
- "Add" : "Amestar",
"Client Identifier" : "Identificador del veceru",
- "Secret" : "Secretu",
+ "Secret key" : "Clave del secretu",
+ "Delete client" : "Desaniciar el veceru",
+ "Add client" : "Amestar el veceru",
+ "Add" : "Amestar",
+ "Show client secret" : "Amosar el secretu del veceru",
+ "Hide client secret" : "Anubrir el secretu del veceru",
"Delete" : "Desaniciar"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/bg.js b/apps/oauth2/l10n/bg.js
index b7b292624ba..c5bdfa109f5 100644
--- a/apps/oauth2/l10n/bg.js
+++ b/apps/oauth2/l10n/bg.js
@@ -8,12 +8,12 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Приложението OAuth2 позволява на администраторите да конфигурират вградения работен поток за удостоверяване, за да позволят и удостоверяване от други уеб приложения, съвместими с OAuth2 .",
"OAuth 2.0 clients" : "OAuth 2.0 клиенти",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 позволява на външни услуги да изискват достъп до {instanceName}.",
- "Add client" : "Добавяне на клиент",
"Name" : "Име",
"Redirection URI" : "URI за пренасочване",
- "Add" : "Добавяне",
"Client Identifier" : "Идентификатор на клиента",
- "Secret" : "Тайна",
+ "Secret key" : "Секретен ключ",
+ "Add client" : "Добавяне на клиент",
+ "Add" : "Добавяне",
"Show client secret" : "Покажете тайната на клиента",
"Delete" : "Изтриване"
},
diff --git a/apps/oauth2/l10n/bg.json b/apps/oauth2/l10n/bg.json
index 5ea0383e42b..5a11b54b85b 100644
--- a/apps/oauth2/l10n/bg.json
+++ b/apps/oauth2/l10n/bg.json
@@ -6,12 +6,12 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Приложението OAuth2 позволява на администраторите да конфигурират вградения работен поток за удостоверяване, за да позволят и удостоверяване от други уеб приложения, съвместими с OAuth2 .",
"OAuth 2.0 clients" : "OAuth 2.0 клиенти",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 позволява на външни услуги да изискват достъп до {instanceName}.",
- "Add client" : "Добавяне на клиент",
"Name" : "Име",
"Redirection URI" : "URI за пренасочване",
- "Add" : "Добавяне",
"Client Identifier" : "Идентификатор на клиента",
- "Secret" : "Тайна",
+ "Secret key" : "Секретен ключ",
+ "Add client" : "Добавяне на клиент",
+ "Add" : "Добавяне",
"Show client secret" : "Покажете тайната на клиента",
"Delete" : "Изтриване"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/oauth2/l10n/br.js b/apps/oauth2/l10n/br.js
index c15795cf851..d04244a3353 100644
--- a/apps/oauth2/l10n/br.js
+++ b/apps/oauth2/l10n/br.js
@@ -8,12 +8,12 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Aotreant a raio ar meziant OAuth 2.0 ar merour da arventennoù evit an dilesa red-labour e-barzh evit aotreañ an dilesa a glot gant OAuth 2.0 eus meziantoù web all.",
"OAuth 2.0 clients" : "Kliant OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "Aotreañ a ra OAuth 2.0 ar servijourienn diavaez da goulenn tizhout {instanceName}.",
- "Add client" : "Ouzhoennañ kliant",
"Name" : "Anv",
"Redirection URI" : "Adhent URL",
- "Add" : "Ouzhpennañ",
"Client Identifier" : "Anavezer Kliant",
- "Secret" : "Sekret",
+ "Secret key" : "Alc'hwez sekred",
+ "Add client" : "Ouzhoennañ kliant",
+ "Add" : "Ouzhpennañ",
"Show client secret" : "Diskouez sekret ar kliant",
"Delete" : "Dilemel"
},
diff --git a/apps/oauth2/l10n/br.json b/apps/oauth2/l10n/br.json
index e346ee2917d..f55e5b3f1ac 100644
--- a/apps/oauth2/l10n/br.json
+++ b/apps/oauth2/l10n/br.json
@@ -6,12 +6,12 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Aotreant a raio ar meziant OAuth 2.0 ar merour da arventennoù evit an dilesa red-labour e-barzh evit aotreañ an dilesa a glot gant OAuth 2.0 eus meziantoù web all.",
"OAuth 2.0 clients" : "Kliant OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "Aotreañ a ra OAuth 2.0 ar servijourienn diavaez da goulenn tizhout {instanceName}.",
- "Add client" : "Ouzhoennañ kliant",
"Name" : "Anv",
"Redirection URI" : "Adhent URL",
- "Add" : "Ouzhpennañ",
"Client Identifier" : "Anavezer Kliant",
- "Secret" : "Sekret",
+ "Secret key" : "Alc'hwez sekred",
+ "Add client" : "Ouzhoennañ kliant",
+ "Add" : "Ouzhpennañ",
"Show client secret" : "Diskouez sekret ar kliant",
"Delete" : "Dilemel"
},"pluralForm" :"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);"
diff --git a/apps/oauth2/l10n/ca.js b/apps/oauth2/l10n/ca.js
index b81317eb684..cb74993c9fd 100644
--- a/apps/oauth2/l10n/ca.js
+++ b/apps/oauth2/l10n/ca.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "L'aplicació OAuth2 permet als administradors configurar el flux de treball d'autenticació integrat perquè també permeti l'autenticació compatible amb OAuth2 des d'altres aplicacions web.",
"OAuth 2.0 clients" : "Clients OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permet que serveis externs sol·licitin accés a {instanceName}.",
- "Add client" : "Afegeix un client",
"Name" : "Nom",
"Redirection URI" : "URI de redirecció",
- "Add" : "Afegeix",
"Client Identifier" : "Identificador del client",
- "Secret" : "Secret",
+ "Secret key" : "Clau secreta",
+ "Delete client" : "Suprimeix el client",
+ "Make sure you store the secret key, it cannot be recovered." : "Assegureu-vos d'emmagatzemar la clau secreta, no es pot recuperar.",
+ "Add client" : "Afegeix un client",
+ "Add" : "Afegeix",
"Show client secret" : "Mostra el secret del client",
+ "Hide client secret" : "Amaga el secret del client",
"Delete" : "Suprimeix"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/ca.json b/apps/oauth2/l10n/ca.json
index f8398a39d23..3a064e3639e 100644
--- a/apps/oauth2/l10n/ca.json
+++ b/apps/oauth2/l10n/ca.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "L'aplicació OAuth2 permet als administradors configurar el flux de treball d'autenticació integrat perquè també permeti l'autenticació compatible amb OAuth2 des d'altres aplicacions web.",
"OAuth 2.0 clients" : "Clients OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permet que serveis externs sol·licitin accés a {instanceName}.",
- "Add client" : "Afegeix un client",
"Name" : "Nom",
"Redirection URI" : "URI de redirecció",
- "Add" : "Afegeix",
"Client Identifier" : "Identificador del client",
- "Secret" : "Secret",
+ "Secret key" : "Clau secreta",
+ "Delete client" : "Suprimeix el client",
+ "Make sure you store the secret key, it cannot be recovered." : "Assegureu-vos d'emmagatzemar la clau secreta, no es pot recuperar.",
+ "Add client" : "Afegeix un client",
+ "Add" : "Afegeix",
"Show client secret" : "Mostra el secret del client",
+ "Hide client secret" : "Amaga el secret del client",
"Delete" : "Suprimeix"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/cs.js b/apps/oauth2/l10n/cs.js
index 0a80e3afb40..008e1627780 100644
--- a/apps/oauth2/l10n/cs.js
+++ b/apps/oauth2/l10n/cs.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Aplikace OAuth2 umožňuje správcům nastavit vestavěný postup ověřování tak, aby podporoval také OAuth2 kompatibilní ověřování z ostatních webových aplikací.",
"OAuth 2.0 clients" : "OAuth 2.0 klienti",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 umožňuje externím službám vyžádat si přístup k {instanceName}.",
- "Add client" : "Přidat klienta",
"Name" : "Název",
"Redirection URI" : "URL pro přesměrování",
- "Add" : "Přidat",
"Client Identifier" : "Identifikátor klienta",
- "Secret" : "Tajemství",
+ "Secret key" : "Tajný klíč",
+ "Delete client" : "Smazat klienta",
+ "Make sure you store the secret key, it cannot be recovered." : "Nezapomeňte si uložit tajný klíč – není možné ho obnovit.",
+ "Add client" : "Přidat klienta",
+ "Add" : "Přidat",
"Show client secret" : "Zobrazit klientské tajemství",
+ "Hide client secret" : "Skrýt tajemství klienta",
"Delete" : "Smazat"
},
"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;");
diff --git a/apps/oauth2/l10n/cs.json b/apps/oauth2/l10n/cs.json
index 657bf4abcfe..75f5586ca80 100644
--- a/apps/oauth2/l10n/cs.json
+++ b/apps/oauth2/l10n/cs.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Aplikace OAuth2 umožňuje správcům nastavit vestavěný postup ověřování tak, aby podporoval také OAuth2 kompatibilní ověřování z ostatních webových aplikací.",
"OAuth 2.0 clients" : "OAuth 2.0 klienti",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 umožňuje externím službám vyžádat si přístup k {instanceName}.",
- "Add client" : "Přidat klienta",
"Name" : "Název",
"Redirection URI" : "URL pro přesměrování",
- "Add" : "Přidat",
"Client Identifier" : "Identifikátor klienta",
- "Secret" : "Tajemství",
+ "Secret key" : "Tajný klíč",
+ "Delete client" : "Smazat klienta",
+ "Make sure you store the secret key, it cannot be recovered." : "Nezapomeňte si uložit tajný klíč – není možné ho obnovit.",
+ "Add client" : "Přidat klienta",
+ "Add" : "Přidat",
"Show client secret" : "Zobrazit klientské tajemství",
+ "Hide client secret" : "Skrýt tajemství klienta",
"Delete" : "Smazat"
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/da.js b/apps/oauth2/l10n/da.js
index d51f01bed87..981fd99ab1c 100644
--- a/apps/oauth2/l10n/da.js
+++ b/apps/oauth2/l10n/da.js
@@ -1,14 +1,23 @@
OC.L10N.register(
"oauth2",
{
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Din klient er ikke autoriseret til at oprette forbindelse. Informer venligst din klients administrator.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Din omdirigerings-URL skal være en fuld URL, for eksempel: https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Tillader OAuth2-kompatibel godkendelse fra andre webapplikationer.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2-appen tillader administratorer mulighed for at konfigurere den indbyggede godkendelsesworkflow til også at tillade OAuth2-kompatibel godkendelse fra andre webapplikationer.",
"OAuth 2.0 clients" : "OAuth 2.0 klienter",
- "Add client" : "Tilføj klient",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 tillader eksterne tjenester at anmode om adgang til {instanceName}.",
"Name" : "Navn",
"Redirection URI" : "Viderestilling URI",
- "Add" : "Tilføj",
"Client Identifier" : "Klient ID",
- "Secret" : "Hemmelighed",
+ "Secret key" : "Hemmelig nøgle",
+ "Delete client" : "Slet klient",
+ "Make sure you store the secret key, it cannot be recovered." : "Sørg for at gemme den hemmelige nøgle, den kan ikke gendannes.",
+ "Add client" : "Tilføj klient",
+ "Add" : "Tilføj",
+ "Show client secret" : "Vis klient hemmelighed",
+ "Hide client secret" : "Skjul klient hemmelighed",
"Delete" : "Slet"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/da.json b/apps/oauth2/l10n/da.json
index 1a987ba153d..289737290fe 100644
--- a/apps/oauth2/l10n/da.json
+++ b/apps/oauth2/l10n/da.json
@@ -1,12 +1,21 @@
{ "translations": {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Din klient er ikke autoriseret til at oprette forbindelse. Informer venligst din klients administrator.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Din omdirigerings-URL skal være en fuld URL, for eksempel: https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Tillader OAuth2-kompatibel godkendelse fra andre webapplikationer.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2-appen tillader administratorer mulighed for at konfigurere den indbyggede godkendelsesworkflow til også at tillade OAuth2-kompatibel godkendelse fra andre webapplikationer.",
"OAuth 2.0 clients" : "OAuth 2.0 klienter",
- "Add client" : "Tilføj klient",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 tillader eksterne tjenester at anmode om adgang til {instanceName}.",
"Name" : "Navn",
"Redirection URI" : "Viderestilling URI",
- "Add" : "Tilføj",
"Client Identifier" : "Klient ID",
- "Secret" : "Hemmelighed",
+ "Secret key" : "Hemmelig nøgle",
+ "Delete client" : "Slet klient",
+ "Make sure you store the secret key, it cannot be recovered." : "Sørg for at gemme den hemmelige nøgle, den kan ikke gendannes.",
+ "Add client" : "Tilføj klient",
+ "Add" : "Tilføj",
+ "Show client secret" : "Vis klient hemmelighed",
+ "Hide client secret" : "Skjul klient hemmelighed",
"Delete" : "Slet"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/de.js b/apps/oauth2/l10n/de.js
index c7f12b53b45..20d0e79912a 100644
--- a/apps/oauth2/l10n/de.js
+++ b/apps/oauth2/l10n/de.js
@@ -1,20 +1,23 @@
OC.L10N.register(
"oauth2",
{
- "Your client is not authorized to connect. Please inform the administrator of your client." : "Dein Client ist nicht berechtigt, eine Verbindung herzustellen. Bitte informiere den Administrator deines Clients.",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Dein Client ist nicht berechtigt, eine Verbindung herzustellen. Bitte informiere die Administration deines Clients.",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Die Weiterleitungs-URL muss eine vollständige URL sein. Beispiel: https://deinedomain.com/pfad",
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Ermöglicht OAuth2 komplatible Authentifizierung durch andere Web-Anwendungen.",
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Die OAuth2-App ermöglicht es Administratoren den eingebauten Authenztifizierungsablauf dahingehend zu konfigurieren, das auch ein OAuth2 komplatible Authentifizierung von anderen Web-Anwendungen aus möglich ist. ",
"OAuth 2.0 clients" : "OAuth 2.0-Clients",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 ermöglicht es externen Diensten, Zugriff auf {instanceName} anzufordern.",
- "Add client" : "Client hinzufügen",
"Name" : "Name",
"Redirection URI" : "Weiterleitungs-URI",
- "Add" : "Hinzufügen",
"Client Identifier" : "Client-Identifikationsmerkmal",
- "Secret" : "Geheimnis",
+ "Secret key" : "Geheimer Schlüssel",
+ "Delete client" : "Client löschen",
+ "Make sure you store the secret key, it cannot be recovered." : "Bewahre den geheimen Schlüssel unbedingt auf, er kann nicht wiederhergestellt werden.",
+ "Add client" : "Client hinzufügen",
+ "Add" : "Hinzufügen",
"Show client secret" : "Geheime Zeichenkette des Clients anzeigen",
+ "Hide client secret" : "Geheime Zeichenkette des Clients ausblenden",
"Delete" : " Löschen"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/de.json b/apps/oauth2/l10n/de.json
index 4a19ba47ef8..60c835a800f 100644
--- a/apps/oauth2/l10n/de.json
+++ b/apps/oauth2/l10n/de.json
@@ -1,18 +1,21 @@
{ "translations": {
- "Your client is not authorized to connect. Please inform the administrator of your client." : "Dein Client ist nicht berechtigt, eine Verbindung herzustellen. Bitte informiere den Administrator deines Clients.",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Dein Client ist nicht berechtigt, eine Verbindung herzustellen. Bitte informiere die Administration deines Clients.",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Die Weiterleitungs-URL muss eine vollständige URL sein. Beispiel: https://deinedomain.com/pfad",
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Ermöglicht OAuth2 komplatible Authentifizierung durch andere Web-Anwendungen.",
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Die OAuth2-App ermöglicht es Administratoren den eingebauten Authenztifizierungsablauf dahingehend zu konfigurieren, das auch ein OAuth2 komplatible Authentifizierung von anderen Web-Anwendungen aus möglich ist. ",
"OAuth 2.0 clients" : "OAuth 2.0-Clients",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 ermöglicht es externen Diensten, Zugriff auf {instanceName} anzufordern.",
- "Add client" : "Client hinzufügen",
"Name" : "Name",
"Redirection URI" : "Weiterleitungs-URI",
- "Add" : "Hinzufügen",
"Client Identifier" : "Client-Identifikationsmerkmal",
- "Secret" : "Geheimnis",
+ "Secret key" : "Geheimer Schlüssel",
+ "Delete client" : "Client löschen",
+ "Make sure you store the secret key, it cannot be recovered." : "Bewahre den geheimen Schlüssel unbedingt auf, er kann nicht wiederhergestellt werden.",
+ "Add client" : "Client hinzufügen",
+ "Add" : "Hinzufügen",
"Show client secret" : "Geheime Zeichenkette des Clients anzeigen",
+ "Hide client secret" : "Geheime Zeichenkette des Clients ausblenden",
"Delete" : " Löschen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/de_DE.js b/apps/oauth2/l10n/de_DE.js
index ef60b8c3dd3..941b430bcb4 100644
--- a/apps/oauth2/l10n/de_DE.js
+++ b/apps/oauth2/l10n/de_DE.js
@@ -1,20 +1,23 @@
OC.L10N.register(
"oauth2",
{
- "Your client is not authorized to connect. Please inform the administrator of your client." : "Ihr Client ist nicht berechtigt, eine Verbindung herzustellen. Bitte informieren Sie den Administrator Ihres Clients.",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Ihr Client ist nicht berechtigt, eine Verbindung herzustellen. Bitte informieren Sie die Administration Ihres Clients.",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Die Weiterleitungs-URL muss eine vollständige URL sein. Beispiel: https://ihredomain.com/pfad",
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Ermöglicht OAuth2-kompatible Authentifizierung durch andere Web-Anwendungen.",
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Die OAuth2-App ermöglicht es Administratoren, den eingebauten Authentifizierungsablauf dahingehend zu konfigurieren, dass auch eine OAuth2-kompatible Authentifizierung durch andere Web-Anwendungen möglich ist. ",
"OAuth 2.0 clients" : "OAuth 2.0-Clients",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 ermöglicht es externen Diensten, Zugriff auf {instanceName} anzufordern.",
- "Add client" : "Client hinzufügen",
"Name" : "Name",
"Redirection URI" : "Weiterleitungs-URI",
- "Add" : "Hinzufügen",
"Client Identifier" : "Client-Identifikationsmerkmal",
- "Secret" : "Geheimnis",
+ "Secret key" : "Geheimer Schlüssel",
+ "Delete client" : "Client löschen",
+ "Make sure you store the secret key, it cannot be recovered." : "Bewahren Sie den geheimen Schlüssel unbedingt auf, er kann nicht wiederhergestellt werden.",
+ "Add client" : "Client hinzufügen",
+ "Add" : "Hinzufügen",
"Show client secret" : "Geheime Zeichenkette des Clients anzeigen",
+ "Hide client secret" : "Geheime Zeichenkette des Clients ausblenden",
"Delete" : "Löschen"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/de_DE.json b/apps/oauth2/l10n/de_DE.json
index d9fe6677e48..b2be0a4dfb4 100644
--- a/apps/oauth2/l10n/de_DE.json
+++ b/apps/oauth2/l10n/de_DE.json
@@ -1,18 +1,21 @@
{ "translations": {
- "Your client is not authorized to connect. Please inform the administrator of your client." : "Ihr Client ist nicht berechtigt, eine Verbindung herzustellen. Bitte informieren Sie den Administrator Ihres Clients.",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Ihr Client ist nicht berechtigt, eine Verbindung herzustellen. Bitte informieren Sie die Administration Ihres Clients.",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Die Weiterleitungs-URL muss eine vollständige URL sein. Beispiel: https://ihredomain.com/pfad",
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Ermöglicht OAuth2-kompatible Authentifizierung durch andere Web-Anwendungen.",
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Die OAuth2-App ermöglicht es Administratoren, den eingebauten Authentifizierungsablauf dahingehend zu konfigurieren, dass auch eine OAuth2-kompatible Authentifizierung durch andere Web-Anwendungen möglich ist. ",
"OAuth 2.0 clients" : "OAuth 2.0-Clients",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 ermöglicht es externen Diensten, Zugriff auf {instanceName} anzufordern.",
- "Add client" : "Client hinzufügen",
"Name" : "Name",
"Redirection URI" : "Weiterleitungs-URI",
- "Add" : "Hinzufügen",
"Client Identifier" : "Client-Identifikationsmerkmal",
- "Secret" : "Geheimnis",
+ "Secret key" : "Geheimer Schlüssel",
+ "Delete client" : "Client löschen",
+ "Make sure you store the secret key, it cannot be recovered." : "Bewahren Sie den geheimen Schlüssel unbedingt auf, er kann nicht wiederhergestellt werden.",
+ "Add client" : "Client hinzufügen",
+ "Add" : "Hinzufügen",
"Show client secret" : "Geheime Zeichenkette des Clients anzeigen",
+ "Hide client secret" : "Geheime Zeichenkette des Clients ausblenden",
"Delete" : "Löschen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/el.js b/apps/oauth2/l10n/el.js
index f550304ebfa..d576b821c94 100644
--- a/apps/oauth2/l10n/el.js
+++ b/apps/oauth2/l10n/el.js
@@ -8,12 +8,12 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Η εφαρμογή OAuth2 επιτρέπει στους διαχειριστές να ρυθμίζουν τις παραμέτρους της ενσωματωμένης ροής εργασιών ελέγχου ταυτότητας για να επιτρέπουν επίσης τον έλεγχο ταυτότητας OAuth2 από άλλες εφαρμογές ιστού.",
"OAuth 2.0 clients" : "Πελάτες OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "Το OAuth 2.0 επιτρέπει στις εξωτερικές υπηρεσίες να ζητούν πρόσβαση στο {instanceName}.",
- "Add client" : "Προσθήκη πελάτη",
"Name" : "Όνομα",
"Redirection URI" : "URI ανακατεύθυνσης",
- "Add" : "Προσθήκη",
"Client Identifier" : "Αναγνωριστικό πελάτη",
- "Secret" : "Μυστικό",
+ "Secret key" : "Μυστικό κλειδί",
+ "Add client" : "Προσθήκη πελάτη",
+ "Add" : "Προσθήκη",
"Show client secret" : "Εμφάνιση μυστικού εφαρμογής υπολογιστή",
"Delete" : "Διαγραφή"
},
diff --git a/apps/oauth2/l10n/el.json b/apps/oauth2/l10n/el.json
index d698467a48e..dd771839bc0 100644
--- a/apps/oauth2/l10n/el.json
+++ b/apps/oauth2/l10n/el.json
@@ -6,12 +6,12 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Η εφαρμογή OAuth2 επιτρέπει στους διαχειριστές να ρυθμίζουν τις παραμέτρους της ενσωματωμένης ροής εργασιών ελέγχου ταυτότητας για να επιτρέπουν επίσης τον έλεγχο ταυτότητας OAuth2 από άλλες εφαρμογές ιστού.",
"OAuth 2.0 clients" : "Πελάτες OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "Το OAuth 2.0 επιτρέπει στις εξωτερικές υπηρεσίες να ζητούν πρόσβαση στο {instanceName}.",
- "Add client" : "Προσθήκη πελάτη",
"Name" : "Όνομα",
"Redirection URI" : "URI ανακατεύθυνσης",
- "Add" : "Προσθήκη",
"Client Identifier" : "Αναγνωριστικό πελάτη",
- "Secret" : "Μυστικό",
+ "Secret key" : "Μυστικό κλειδί",
+ "Add client" : "Προσθήκη πελάτη",
+ "Add" : "Προσθήκη",
"Show client secret" : "Εμφάνιση μυστικού εφαρμογής υπολογιστή",
"Delete" : "Διαγραφή"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/oauth2/l10n/en_GB.js b/apps/oauth2/l10n/en_GB.js
index 6975397c902..fb42df933ca 100644
--- a/apps/oauth2/l10n/en_GB.js
+++ b/apps/oauth2/l10n/en_GB.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications.",
"OAuth 2.0 clients" : "OAuth 2.0 clients",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 allows external services to request access to {instanceName}.",
- "Add client" : "Add client",
"Name" : "Name",
"Redirection URI" : "Redirection URI",
- "Add" : "Add",
"Client Identifier" : "Client Identifier",
- "Secret" : "Secret",
+ "Secret key" : "Secret key",
+ "Delete client" : "Delete client",
+ "Make sure you store the secret key, it cannot be recovered." : "Make sure you store the secret key, it cannot be recovered.",
+ "Add client" : "Add client",
+ "Add" : "Add",
"Show client secret" : "Show client secret",
+ "Hide client secret" : "Hide client secret",
"Delete" : "Delete"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/en_GB.json b/apps/oauth2/l10n/en_GB.json
index 22b6d8fc607..85029055a07 100644
--- a/apps/oauth2/l10n/en_GB.json
+++ b/apps/oauth2/l10n/en_GB.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications.",
"OAuth 2.0 clients" : "OAuth 2.0 clients",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 allows external services to request access to {instanceName}.",
- "Add client" : "Add client",
"Name" : "Name",
"Redirection URI" : "Redirection URI",
- "Add" : "Add",
"Client Identifier" : "Client Identifier",
- "Secret" : "Secret",
+ "Secret key" : "Secret key",
+ "Delete client" : "Delete client",
+ "Make sure you store the secret key, it cannot be recovered." : "Make sure you store the secret key, it cannot be recovered.",
+ "Add client" : "Add client",
+ "Add" : "Add",
"Show client secret" : "Show client secret",
+ "Hide client secret" : "Hide client secret",
"Delete" : "Delete"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es.js b/apps/oauth2/l10n/es.js
index a27cc6fe0d2..2c7e76a2cbb 100644
--- a/apps/oauth2/l10n/es.js
+++ b/apps/oauth2/l10n/es.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "La app OAuth2 permite a los administradores configurar el flujo de trabajo de autenticación incorporado para permitir también autenticación compatible con OAuth2 desde otras aplicaciones web.",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permite a servicios externos solicitar acceso a {instanceName}",
- "Add client" : "Añadir cliente",
"Name" : "Nombre",
"Redirection URI" : "URI de redirección",
- "Add" : "Añadir",
"Client Identifier" : "Identificador de cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Clave secreta",
+ "Delete client" : "Eliminar cliente",
+ "Make sure you store the secret key, it cannot be recovered." : "Asegúrese de guardar la clave secreta, ya que no podrá ser recuperada.",
+ "Add client" : "Añadir cliente",
+ "Add" : "Añadir",
"Show client secret" : "Mostrar secreto del cliente",
+ "Hide client secret" : "Ocultar secreto del cliente",
"Delete" : "Eliminar"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es.json b/apps/oauth2/l10n/es.json
index 4770dc0d130..9854ba3aa83 100644
--- a/apps/oauth2/l10n/es.json
+++ b/apps/oauth2/l10n/es.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "La app OAuth2 permite a los administradores configurar el flujo de trabajo de autenticación incorporado para permitir también autenticación compatible con OAuth2 desde otras aplicaciones web.",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permite a servicios externos solicitar acceso a {instanceName}",
- "Add client" : "Añadir cliente",
"Name" : "Nombre",
"Redirection URI" : "URI de redirección",
- "Add" : "Añadir",
"Client Identifier" : "Identificador de cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Clave secreta",
+ "Delete client" : "Eliminar cliente",
+ "Make sure you store the secret key, it cannot be recovered." : "Asegúrese de guardar la clave secreta, ya que no podrá ser recuperada.",
+ "Add client" : "Añadir cliente",
+ "Add" : "Añadir",
"Show client secret" : "Mostrar secreto del cliente",
+ "Hide client secret" : "Ocultar secreto del cliente",
"Delete" : "Eliminar"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_419.js b/apps/oauth2/l10n/es_419.js
deleted file mode 100644
index c5271fbd3f6..00000000000
--- a/apps/oauth2/l10n/es_419.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "oauth2",
- {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},
-"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_419.json b/apps/oauth2/l10n/es_419.json
deleted file mode 100644
index e9f1d3c6268..00000000000
--- a/apps/oauth2/l10n/es_419.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
-} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_AR.js b/apps/oauth2/l10n/es_AR.js
index d859ef2037f..ec54aae2bea 100644
--- a/apps/oauth2/l10n/es_AR.js
+++ b/apps/oauth2/l10n/es_AR.js
@@ -3,12 +3,12 @@ OC.L10N.register(
{
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
"Name" : "Nombre",
"Redirection URI" : "URI de redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
"Delete" : "Eliminar"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_AR.json b/apps/oauth2/l10n/es_AR.json
index 8ec9149cb0d..31ae3db82be 100644
--- a/apps/oauth2/l10n/es_AR.json
+++ b/apps/oauth2/l10n/es_AR.json
@@ -1,12 +1,12 @@
{ "translations": {
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
"Name" : "Nombre",
"Redirection URI" : "URI de redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
"Delete" : "Eliminar"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_CL.js b/apps/oauth2/l10n/es_CL.js
index 526958adef2..079b21192fd 100644
--- a/apps/oauth2/l10n/es_CL.js
+++ b/apps/oauth2/l10n/es_CL.js
@@ -3,12 +3,12 @@ OC.L10N.register(
{
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
"Delete" : "Borrar"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_CL.json b/apps/oauth2/l10n/es_CL.json
index 2640762b41a..40b679cc951 100644
--- a/apps/oauth2/l10n/es_CL.json
+++ b/apps/oauth2/l10n/es_CL.json
@@ -1,12 +1,12 @@
{ "translations": {
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
"Delete" : "Borrar"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_CO.js b/apps/oauth2/l10n/es_CO.js
index 526958adef2..079b21192fd 100644
--- a/apps/oauth2/l10n/es_CO.js
+++ b/apps/oauth2/l10n/es_CO.js
@@ -3,12 +3,12 @@ OC.L10N.register(
{
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
"Delete" : "Borrar"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_CO.json b/apps/oauth2/l10n/es_CO.json
index 2640762b41a..40b679cc951 100644
--- a/apps/oauth2/l10n/es_CO.json
+++ b/apps/oauth2/l10n/es_CO.json
@@ -1,12 +1,12 @@
{ "translations": {
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
"Delete" : "Borrar"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_CR.js b/apps/oauth2/l10n/es_CR.js
index 526958adef2..079b21192fd 100644
--- a/apps/oauth2/l10n/es_CR.js
+++ b/apps/oauth2/l10n/es_CR.js
@@ -3,12 +3,12 @@ OC.L10N.register(
{
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
"Delete" : "Borrar"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_CR.json b/apps/oauth2/l10n/es_CR.json
index 2640762b41a..40b679cc951 100644
--- a/apps/oauth2/l10n/es_CR.json
+++ b/apps/oauth2/l10n/es_CR.json
@@ -1,12 +1,12 @@
{ "translations": {
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
"Delete" : "Borrar"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_DO.js b/apps/oauth2/l10n/es_DO.js
index 526958adef2..079b21192fd 100644
--- a/apps/oauth2/l10n/es_DO.js
+++ b/apps/oauth2/l10n/es_DO.js
@@ -3,12 +3,12 @@ OC.L10N.register(
{
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
"Delete" : "Borrar"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_DO.json b/apps/oauth2/l10n/es_DO.json
index 2640762b41a..40b679cc951 100644
--- a/apps/oauth2/l10n/es_DO.json
+++ b/apps/oauth2/l10n/es_DO.json
@@ -1,12 +1,12 @@
{ "translations": {
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
"Delete" : "Borrar"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_EC.js b/apps/oauth2/l10n/es_EC.js
index 526958adef2..38fab4a83a6 100644
--- a/apps/oauth2/l10n/es_EC.js
+++ b/apps/oauth2/l10n/es_EC.js
@@ -1,14 +1,20 @@
OC.L10N.register(
"oauth2",
{
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Tu cliente no está autorizado para conectarse. Por favor, informa al administrador de tu cliente.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Tu URL de redirección debe ser una URL completa, por ejemplo: https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Permite la autenticación compatible con OAuth2 desde otras aplicaciones web.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "La aplicación OAuth2 permite a los administradores configurar el flujo de autenticación integrado para permitir la autenticación compatible con OAuth2 desde otras aplicaciones web.",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permite a servicios externos solicitar acceso a {instanceName}.",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
+ "Show client secret" : "Mostrar el secreto del cliente",
"Delete" : "Borrar"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_EC.json b/apps/oauth2/l10n/es_EC.json
index 2640762b41a..3dd48dcdcd2 100644
--- a/apps/oauth2/l10n/es_EC.json
+++ b/apps/oauth2/l10n/es_EC.json
@@ -1,12 +1,18 @@
{ "translations": {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Tu cliente no está autorizado para conectarse. Por favor, informa al administrador de tu cliente.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Tu URL de redirección debe ser una URL completa, por ejemplo: https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Permite la autenticación compatible con OAuth2 desde otras aplicaciones web.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "La aplicación OAuth2 permite a los administradores configurar el flujo de autenticación integrado para permitir la autenticación compatible con OAuth2 desde otras aplicaciones web.",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permite a servicios externos solicitar acceso a {instanceName}.",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
+ "Show client secret" : "Mostrar el secreto del cliente",
"Delete" : "Borrar"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_GT.js b/apps/oauth2/l10n/es_GT.js
index 526958adef2..38f9a9c8eff 100644
--- a/apps/oauth2/l10n/es_GT.js
+++ b/apps/oauth2/l10n/es_GT.js
@@ -1,14 +1,20 @@
OC.L10N.register(
"oauth2",
{
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Su cliente no está autorizado para conectarse. Por favor informe al administrador de su cliente.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Su URL de redireccionamiento debe ser una URL completa, por ejemplo: https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Permite la autenticación compatible con OAuth2 desde otras aplicaciones web.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "La aplicación OAuth2 permite a los administradores configurar el flujo de trabajo de autenticación incorporado para permitir también la autenticación compatible con OAuth2 desde otras aplicaciones web.",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permite que los servicios externos soliciten acceso a {instanceName}.",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
+ "Show client secret" : "Mostrar secreto del cliente",
"Delete" : "Borrar"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_GT.json b/apps/oauth2/l10n/es_GT.json
index 2640762b41a..fea09081d1d 100644
--- a/apps/oauth2/l10n/es_GT.json
+++ b/apps/oauth2/l10n/es_GT.json
@@ -1,12 +1,18 @@
{ "translations": {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Su cliente no está autorizado para conectarse. Por favor informe al administrador de su cliente.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Su URL de redireccionamiento debe ser una URL completa, por ejemplo: https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Permite la autenticación compatible con OAuth2 desde otras aplicaciones web.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "La aplicación OAuth2 permite a los administradores configurar el flujo de trabajo de autenticación incorporado para permitir también la autenticación compatible con OAuth2 desde otras aplicaciones web.",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permite que los servicios externos soliciten acceso a {instanceName}.",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
+ "Show client secret" : "Mostrar secreto del cliente",
"Delete" : "Borrar"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_HN.js b/apps/oauth2/l10n/es_HN.js
deleted file mode 100644
index c5271fbd3f6..00000000000
--- a/apps/oauth2/l10n/es_HN.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "oauth2",
- {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},
-"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_HN.json b/apps/oauth2/l10n/es_HN.json
deleted file mode 100644
index e9f1d3c6268..00000000000
--- a/apps/oauth2/l10n/es_HN.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
-} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_MX.js b/apps/oauth2/l10n/es_MX.js
index c269a42b89f..ac9270bc6af 100644
--- a/apps/oauth2/l10n/es_MX.js
+++ b/apps/oauth2/l10n/es_MX.js
@@ -1,16 +1,22 @@
OC.L10N.register(
"oauth2",
{
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Su cliente no está autorizado para conectarse. Por favor, informe al administrador de su cliente.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Su URL de redireccionamiento debe ser una URL completa, por ejemplo: https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Permite autenticación compatible con OAuth2 desde otras aplicaciones web.",
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "La aplicación OAuth2 le permite a los administradores configurar el flujo de autenticación integrado para también permitir la autenticación OAuth2 de otras aplicaciones web compatibles. ",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permite que servicios externos soliciten acceso a {instanceName}.",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Delete client" : "Eliminar cliente",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
+ "Show client secret" : "Mostrar el secreto del cliente",
+ "Hide client secret" : "Ocultar el secreto del cliente",
"Delete" : "Borrar"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_MX.json b/apps/oauth2/l10n/es_MX.json
index 6e853a9871f..6f0d19e414a 100644
--- a/apps/oauth2/l10n/es_MX.json
+++ b/apps/oauth2/l10n/es_MX.json
@@ -1,14 +1,20 @@
{ "translations": {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Su cliente no está autorizado para conectarse. Por favor, informe al administrador de su cliente.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Su URL de redireccionamiento debe ser una URL completa, por ejemplo: https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Permite autenticación compatible con OAuth2 desde otras aplicaciones web.",
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "La aplicación OAuth2 le permite a los administradores configurar el flujo de autenticación integrado para también permitir la autenticación OAuth2 de otras aplicaciones web compatibles. ",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permite que servicios externos soliciten acceso a {instanceName}.",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Delete client" : "Eliminar cliente",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
+ "Show client secret" : "Mostrar el secreto del cliente",
+ "Hide client secret" : "Ocultar el secreto del cliente",
"Delete" : "Borrar"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_NI.js b/apps/oauth2/l10n/es_NI.js
deleted file mode 100644
index c5271fbd3f6..00000000000
--- a/apps/oauth2/l10n/es_NI.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "oauth2",
- {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},
-"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_NI.json b/apps/oauth2/l10n/es_NI.json
deleted file mode 100644
index e9f1d3c6268..00000000000
--- a/apps/oauth2/l10n/es_NI.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
-} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_PA.js b/apps/oauth2/l10n/es_PA.js
deleted file mode 100644
index c5271fbd3f6..00000000000
--- a/apps/oauth2/l10n/es_PA.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "oauth2",
- {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},
-"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_PA.json b/apps/oauth2/l10n/es_PA.json
deleted file mode 100644
index e9f1d3c6268..00000000000
--- a/apps/oauth2/l10n/es_PA.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
-} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_PE.js b/apps/oauth2/l10n/es_PE.js
deleted file mode 100644
index c5271fbd3f6..00000000000
--- a/apps/oauth2/l10n/es_PE.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "oauth2",
- {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},
-"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_PE.json b/apps/oauth2/l10n/es_PE.json
deleted file mode 100644
index e9f1d3c6268..00000000000
--- a/apps/oauth2/l10n/es_PE.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
-} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_PR.js b/apps/oauth2/l10n/es_PR.js
deleted file mode 100644
index c5271fbd3f6..00000000000
--- a/apps/oauth2/l10n/es_PR.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "oauth2",
- {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},
-"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_PR.json b/apps/oauth2/l10n/es_PR.json
deleted file mode 100644
index e9f1d3c6268..00000000000
--- a/apps/oauth2/l10n/es_PR.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
-} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_PY.js b/apps/oauth2/l10n/es_PY.js
deleted file mode 100644
index c5271fbd3f6..00000000000
--- a/apps/oauth2/l10n/es_PY.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "oauth2",
- {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},
-"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_PY.json b/apps/oauth2/l10n/es_PY.json
deleted file mode 100644
index e9f1d3c6268..00000000000
--- a/apps/oauth2/l10n/es_PY.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
-} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_SV.js b/apps/oauth2/l10n/es_SV.js
index 526958adef2..079b21192fd 100644
--- a/apps/oauth2/l10n/es_SV.js
+++ b/apps/oauth2/l10n/es_SV.js
@@ -3,12 +3,12 @@ OC.L10N.register(
{
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
"Delete" : "Borrar"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_SV.json b/apps/oauth2/l10n/es_SV.json
index 2640762b41a..40b679cc951 100644
--- a/apps/oauth2/l10n/es_SV.json
+++ b/apps/oauth2/l10n/es_SV.json
@@ -1,12 +1,12 @@
{ "translations": {
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
"Name" : "Nombre",
"Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
"Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Llave secreta",
+ "Add client" : "Agregar cliente",
+ "Add" : "Agregar",
"Delete" : "Borrar"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/es_UY.js b/apps/oauth2/l10n/es_UY.js
deleted file mode 100644
index c5271fbd3f6..00000000000
--- a/apps/oauth2/l10n/es_UY.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "oauth2",
- {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},
-"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/es_UY.json b/apps/oauth2/l10n/es_UY.json
deleted file mode 100644
index e9f1d3c6268..00000000000
--- a/apps/oauth2/l10n/es_UY.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "OAuth 2.0 clients" : "Clientes OAuth 2.0",
- "Add client" : "Agregar cliente",
- "Name" : "Nombre",
- "Redirection URI" : "URI para redirección",
- "Add" : "Agregar",
- "Client Identifier" : "Identificador del cliente",
- "Secret" : "Secreto",
- "Delete" : "Borrar"
-},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
-} \ No newline at end of file
diff --git a/apps/oauth2/l10n/et_EE.js b/apps/oauth2/l10n/et_EE.js
index e2f54d13feb..93a7c7e97bf 100644
--- a/apps/oauth2/l10n/et_EE.js
+++ b/apps/oauth2/l10n/et_EE.js
@@ -1,13 +1,23 @@
OC.L10N.register(
"oauth2",
{
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Su klient ei ole ühenduseks autoriseeritud. Palun teavita oma kliendi peakasutajat.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Ümbersuunamise URL peab olema täis URL, näiteks: https://sinudomeen.com/asukoht",
+ "OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Võimaldab OAuth2-ga ühilduvat autentimist teistest veebirakendustest.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Rakendus OAuth2 võimaldab administraatoritel konfigureerida sisseehitatud autentimise töövoogu, et võimaldada ka OAuth2-ga ühilduvat autentimist teistest veebirakendustest.",
"OAuth 2.0 clients" : "OAuth 2.0 kliendid",
- "Add client" : "Lisa klient",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 võimaldab välisteenustel taotleda juurdepääsu {instanceName}ile",
"Name" : "Nimi",
"Redirection URI" : "Suunamise URI",
- "Add" : "Lisa",
"Client Identifier" : "Kliendi identifikaator",
- "Secret" : "Saladus",
+ "Secret key" : "Salavõti",
+ "Delete client" : "Kustuta klient",
+ "Make sure you store the secret key, it cannot be recovered." : "Salvesta salajane võti, seda ei saa taastada.",
+ "Add client" : "Lisa klient",
+ "Add" : "Lisa",
+ "Show client secret" : "Näita kliendi salakoodi",
+ "Hide client secret" : "Peida kliendi salakood",
"Delete" : "Kustuta"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/et_EE.json b/apps/oauth2/l10n/et_EE.json
index 8ee807ed375..0ddc97bea45 100644
--- a/apps/oauth2/l10n/et_EE.json
+++ b/apps/oauth2/l10n/et_EE.json
@@ -1,11 +1,21 @@
{ "translations": {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Su klient ei ole ühenduseks autoriseeritud. Palun teavita oma kliendi peakasutajat.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Ümbersuunamise URL peab olema täis URL, näiteks: https://sinudomeen.com/asukoht",
+ "OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Võimaldab OAuth2-ga ühilduvat autentimist teistest veebirakendustest.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Rakendus OAuth2 võimaldab administraatoritel konfigureerida sisseehitatud autentimise töövoogu, et võimaldada ka OAuth2-ga ühilduvat autentimist teistest veebirakendustest.",
"OAuth 2.0 clients" : "OAuth 2.0 kliendid",
- "Add client" : "Lisa klient",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 võimaldab välisteenustel taotleda juurdepääsu {instanceName}ile",
"Name" : "Nimi",
"Redirection URI" : "Suunamise URI",
- "Add" : "Lisa",
"Client Identifier" : "Kliendi identifikaator",
- "Secret" : "Saladus",
+ "Secret key" : "Salavõti",
+ "Delete client" : "Kustuta klient",
+ "Make sure you store the secret key, it cannot be recovered." : "Salvesta salajane võti, seda ei saa taastada.",
+ "Add client" : "Lisa klient",
+ "Add" : "Lisa",
+ "Show client secret" : "Näita kliendi salakoodi",
+ "Hide client secret" : "Peida kliendi salakood",
"Delete" : "Kustuta"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/eu.js b/apps/oauth2/l10n/eu.js
index 71b0a2a1475..e195a1ef3ac 100644
--- a/apps/oauth2/l10n/eu.js
+++ b/apps/oauth2/l10n/eu.js
@@ -1,20 +1,23 @@
OC.L10N.register(
"oauth2",
{
- "Your client is not authorized to connect. Please inform the administrator of your client." : "Zure bezeroak ez du konektatzeko baimenik. Esan iezaiozu zure bezeroaren kudeatzaileari.",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Zure bezeroak ez du konektatzeko baimenik. Esan iezaiozu zure bezeroaren administratzaileari.",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Berbideraketa egiteko URLa URL oso bat izan behar da, adibidez: https://zuredomeinua.eus/karpeta",
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Beste web aplikazio batzuen bidez egindako OAuth2 erako autentikazioa egitea baimentzen du",
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 aplikazioak, zerbitzu hori eskaintzen duten beste web aplikazio batzuen bidez autentikazioa egiten konfiguratzeko aukera eskaintzen die sistemaren kudeatzaileei.",
- "OAuth 2.0 clients" : "OAuth 2.0-en bezeroak",
+ "OAuth 2.0 clients" : "OAuth 2.0 bezeroak",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0k kanpo zerbitzuei {instanceName} instantziara sartzeko baimena eskatzea baimentzen die.",
- "Add client" : "Bezeroa gehitu",
"Name" : "Izena",
"Redirection URI" : "Birbideraketaren URI",
- "Add" : "Gehitu",
"Client Identifier" : "Bezeroaren Identifikadorea",
- "Secret" : "Sekretua",
+ "Secret key" : "Gako sekretua",
+ "Delete client" : "Ezabatu bezeroa",
+ "Make sure you store the secret key, it cannot be recovered." : "Ziurtatu gako sekretua gordetzen duzula, ezin da berreskuratu.",
+ "Add client" : "Gehitu bezeroa",
+ "Add" : "Gehitu",
"Show client secret" : "Erakutsi bezeroaren sekretua",
+ "Hide client secret" : "Ezkutatu bezeroaren sekretua",
"Delete" : "Ezabatu"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/eu.json b/apps/oauth2/l10n/eu.json
index ed8de4a9f35..ddfcd437650 100644
--- a/apps/oauth2/l10n/eu.json
+++ b/apps/oauth2/l10n/eu.json
@@ -1,18 +1,21 @@
{ "translations": {
- "Your client is not authorized to connect. Please inform the administrator of your client." : "Zure bezeroak ez du konektatzeko baimenik. Esan iezaiozu zure bezeroaren kudeatzaileari.",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Zure bezeroak ez du konektatzeko baimenik. Esan iezaiozu zure bezeroaren administratzaileari.",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Berbideraketa egiteko URLa URL oso bat izan behar da, adibidez: https://zuredomeinua.eus/karpeta",
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Beste web aplikazio batzuen bidez egindako OAuth2 erako autentikazioa egitea baimentzen du",
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 aplikazioak, zerbitzu hori eskaintzen duten beste web aplikazio batzuen bidez autentikazioa egiten konfiguratzeko aukera eskaintzen die sistemaren kudeatzaileei.",
- "OAuth 2.0 clients" : "OAuth 2.0-en bezeroak",
+ "OAuth 2.0 clients" : "OAuth 2.0 bezeroak",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0k kanpo zerbitzuei {instanceName} instantziara sartzeko baimena eskatzea baimentzen die.",
- "Add client" : "Bezeroa gehitu",
"Name" : "Izena",
"Redirection URI" : "Birbideraketaren URI",
- "Add" : "Gehitu",
"Client Identifier" : "Bezeroaren Identifikadorea",
- "Secret" : "Sekretua",
+ "Secret key" : "Gako sekretua",
+ "Delete client" : "Ezabatu bezeroa",
+ "Make sure you store the secret key, it cannot be recovered." : "Ziurtatu gako sekretua gordetzen duzula, ezin da berreskuratu.",
+ "Add client" : "Gehitu bezeroa",
+ "Add" : "Gehitu",
"Show client secret" : "Erakutsi bezeroaren sekretua",
+ "Hide client secret" : "Ezkutatu bezeroaren sekretua",
"Delete" : "Ezabatu"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/fa.js b/apps/oauth2/l10n/fa.js
index 9e65ce59c94..4f21d887051 100644
--- a/apps/oauth2/l10n/fa.js
+++ b/apps/oauth2/l10n/fa.js
@@ -8,12 +8,12 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "برنامه OAuth2 به مدیران اجازه می دهد تا گردش کار داخلی تأیید اعتبار را پیکربندی کنند ، همچنین اجازه تأیید هویت سازگار OAuth2 را از دیگر برنامه های وب فراهم می کند.",
"OAuth 2.0 clients" : "مشتری OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth تأیید 2.0 اجازه می دهد تا خدمات خارجی به درخواست دسترسی به {} instanceName.",
- "Add client" : "افزودن مشتری",
"Name" : "نام",
"Redirection URI" : "تغییر مسیر URI",
- "Add" : "افزودن",
"Client Identifier" : "شناسه مشتری",
- "Secret" : "راز",
+ "Secret key" : "کلید مخفی",
+ "Add client" : "افزودن مشتری",
+ "Add" : "افزودن",
"Show client secret" : "راز مشتری را نشان دهید",
"Delete" : "حذف"
},
diff --git a/apps/oauth2/l10n/fa.json b/apps/oauth2/l10n/fa.json
index 69f7ea5f0c7..f7091f5c83e 100644
--- a/apps/oauth2/l10n/fa.json
+++ b/apps/oauth2/l10n/fa.json
@@ -6,12 +6,12 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "برنامه OAuth2 به مدیران اجازه می دهد تا گردش کار داخلی تأیید اعتبار را پیکربندی کنند ، همچنین اجازه تأیید هویت سازگار OAuth2 را از دیگر برنامه های وب فراهم می کند.",
"OAuth 2.0 clients" : "مشتری OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth تأیید 2.0 اجازه می دهد تا خدمات خارجی به درخواست دسترسی به {} instanceName.",
- "Add client" : "افزودن مشتری",
"Name" : "نام",
"Redirection URI" : "تغییر مسیر URI",
- "Add" : "افزودن",
"Client Identifier" : "شناسه مشتری",
- "Secret" : "راز",
+ "Secret key" : "کلید مخفی",
+ "Add client" : "افزودن مشتری",
+ "Add" : "افزودن",
"Show client secret" : "راز مشتری را نشان دهید",
"Delete" : "حذف"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
diff --git a/apps/oauth2/l10n/fi.js b/apps/oauth2/l10n/fi.js
index 64fe3baa669..c7ad237bc72 100644
--- a/apps/oauth2/l10n/fi.js
+++ b/apps/oauth2/l10n/fi.js
@@ -6,13 +6,15 @@ OC.L10N.register(
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Sallii OAuth2-yhteensopivan tunnistautumisen muista verkkosovelluksista.",
"OAuth 2.0 clients" : "OAuth 2.0 -asiakkaat",
- "Add client" : "Lisää asiakas",
"Name" : "Nimi",
"Redirection URI" : "Uudelleenohjaus URI",
- "Add" : "Lisää",
"Client Identifier" : "Asiakkaan tunniste",
- "Secret" : "Salaisuus",
+ "Secret key" : "Salainen avain",
+ "Delete client" : "Poista asiakas",
+ "Add client" : "Lisää asiakas",
+ "Add" : "Lisää",
"Show client secret" : "Näytä asiakkaan salaisuus",
+ "Hide client secret" : "Piilota asiakkaan salaisuus",
"Delete" : "Poista"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/fi.json b/apps/oauth2/l10n/fi.json
index a1a04d87653..c74e11bef5e 100644
--- a/apps/oauth2/l10n/fi.json
+++ b/apps/oauth2/l10n/fi.json
@@ -4,13 +4,15 @@
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Sallii OAuth2-yhteensopivan tunnistautumisen muista verkkosovelluksista.",
"OAuth 2.0 clients" : "OAuth 2.0 -asiakkaat",
- "Add client" : "Lisää asiakas",
"Name" : "Nimi",
"Redirection URI" : "Uudelleenohjaus URI",
- "Add" : "Lisää",
"Client Identifier" : "Asiakkaan tunniste",
- "Secret" : "Salaisuus",
+ "Secret key" : "Salainen avain",
+ "Delete client" : "Poista asiakas",
+ "Add client" : "Lisää asiakas",
+ "Add" : "Lisää",
"Show client secret" : "Näytä asiakkaan salaisuus",
+ "Hide client secret" : "Piilota asiakkaan salaisuus",
"Delete" : "Poista"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/fr.js b/apps/oauth2/l10n/fr.js
index d2ddb02a9cf..a60dc05f74c 100644
--- a/apps/oauth2/l10n/fr.js
+++ b/apps/oauth2/l10n/fr.js
@@ -1,20 +1,23 @@
OC.L10N.register(
"oauth2",
{
- "Your client is not authorized to connect. Please inform the administrator of your client." : "Votre client n'est pas autoriser à se connecter. Veuillez informer l'administrateur de votre client.",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Votre client n'est pas autorisé à se connecter. Veuillez en informer l'administrateur.",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Votre adresse de redirection doit être une URL complète, par exemple: https://example.com/chemin",
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Autoriser l'authentification compatible OAuth2 depuis d'autres applications web.",
- "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "L'application OAuth2 permet aux administrateurs de configurer le processus d'authentification intégrée afin d'autoriser l'authentification compatible OAuth2 depuis d'autres applications web.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "L'application OAuth2 permet aux administrateurs de configurer le processus d'authentification intégré afin d'autoriser une authentification compatible OAuth2 depuis d'autres applications web.",
"OAuth 2.0 clients" : "Clients OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permet à des services externes de demander l'accès à {instanceName}.",
- "Add client" : "Ajouter un client",
"Name" : "Nom",
"Redirection URI" : "URI de redirection",
- "Add" : "Ajouter",
"Client Identifier" : "Identifiant du client",
- "Secret" : "Secret",
- "Show client secret" : "Afficher client secret",
+ "Secret key" : "Clé secrète",
+ "Delete client" : "Supprimer le client",
+ "Make sure you store the secret key, it cannot be recovered." : "Assurez-vous de stocker la clé secrète, elle ne peut pas être re récupérée.",
+ "Add client" : "Ajouter un client",
+ "Add" : "Ajouter",
+ "Show client secret" : "Afficher le code secret du client",
+ "Hide client secret" : "Masquer le secret du client",
"Delete" : "Supprimer"
},
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/fr.json b/apps/oauth2/l10n/fr.json
index 38af84dd1c4..9be9ea0d408 100644
--- a/apps/oauth2/l10n/fr.json
+++ b/apps/oauth2/l10n/fr.json
@@ -1,18 +1,21 @@
{ "translations": {
- "Your client is not authorized to connect. Please inform the administrator of your client." : "Votre client n'est pas autoriser à se connecter. Veuillez informer l'administrateur de votre client.",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Votre client n'est pas autorisé à se connecter. Veuillez en informer l'administrateur.",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Votre adresse de redirection doit être une URL complète, par exemple: https://example.com/chemin",
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Autoriser l'authentification compatible OAuth2 depuis d'autres applications web.",
- "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "L'application OAuth2 permet aux administrateurs de configurer le processus d'authentification intégrée afin d'autoriser l'authentification compatible OAuth2 depuis d'autres applications web.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "L'application OAuth2 permet aux administrateurs de configurer le processus d'authentification intégré afin d'autoriser une authentification compatible OAuth2 depuis d'autres applications web.",
"OAuth 2.0 clients" : "Clients OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permet à des services externes de demander l'accès à {instanceName}.",
- "Add client" : "Ajouter un client",
"Name" : "Nom",
"Redirection URI" : "URI de redirection",
- "Add" : "Ajouter",
"Client Identifier" : "Identifiant du client",
- "Secret" : "Secret",
- "Show client secret" : "Afficher client secret",
+ "Secret key" : "Clé secrète",
+ "Delete client" : "Supprimer le client",
+ "Make sure you store the secret key, it cannot be recovered." : "Assurez-vous de stocker la clé secrète, elle ne peut pas être re récupérée.",
+ "Add client" : "Ajouter un client",
+ "Add" : "Ajouter",
+ "Show client secret" : "Afficher le code secret du client",
+ "Hide client secret" : "Masquer le secret du client",
"Delete" : "Supprimer"
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/ga.js b/apps/oauth2/l10n/ga.js
new file mode 100644
index 00000000000..45199e91f97
--- /dev/null
+++ b/apps/oauth2/l10n/ga.js
@@ -0,0 +1,23 @@
+OC.L10N.register(
+ "oauth2",
+ {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Níl do chliant údaraithe chun nascadh. Cuir do chliant ar an eolas do riarthóir.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Ní mór do URL athsheolaidh a bheith ina URL iomlán mar shampla: https://yourdomain.com/path",
+ "OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Ceadaíonn sé fíordheimhniú comhoiriúnach OAuth2 ó fheidhmchláir ghréasáin eile.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Ligeann an aip OAuth2 do riarthóirí an sreabhadh oibre fíordheimhnithe ionsuite a chumrú chun fíordheimhniú comhoiriúnach OAuth2 a cheadú ó fheidhmchláir ghréasáin eile.",
+ "OAuth 2.0 clients" : "Cliant OAuth 2.0",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "Ligeann OAuth 2.0 do sheirbhísí seachtracha rochtain a iarraidh ar {instanceName}.",
+ "Name" : "Ainm",
+ "Redirection URI" : "Atreo URI",
+ "Client Identifier" : "Aitheantóir Cliant",
+ "Secret key" : "Eochair rúnda",
+ "Delete client" : "Scrios cliant",
+ "Make sure you store the secret key, it cannot be recovered." : "Déan cinnte go stórálann tú an eochair rúnda, ní féidir í a aisghabháil.",
+ "Add client" : "Cuir cliant leis",
+ "Add" : "Cuir",
+ "Show client secret" : "Taispeáin rún an chliaint",
+ "Hide client secret" : "Folaigh rún an chliaint",
+ "Delete" : "Scrios"
+},
+"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);");
diff --git a/apps/oauth2/l10n/ga.json b/apps/oauth2/l10n/ga.json
new file mode 100644
index 00000000000..a85a372dc24
--- /dev/null
+++ b/apps/oauth2/l10n/ga.json
@@ -0,0 +1,21 @@
+{ "translations": {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Níl do chliant údaraithe chun nascadh. Cuir do chliant ar an eolas do riarthóir.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Ní mór do URL athsheolaidh a bheith ina URL iomlán mar shampla: https://yourdomain.com/path",
+ "OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Ceadaíonn sé fíordheimhniú comhoiriúnach OAuth2 ó fheidhmchláir ghréasáin eile.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Ligeann an aip OAuth2 do riarthóirí an sreabhadh oibre fíordheimhnithe ionsuite a chumrú chun fíordheimhniú comhoiriúnach OAuth2 a cheadú ó fheidhmchláir ghréasáin eile.",
+ "OAuth 2.0 clients" : "Cliant OAuth 2.0",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "Ligeann OAuth 2.0 do sheirbhísí seachtracha rochtain a iarraidh ar {instanceName}.",
+ "Name" : "Ainm",
+ "Redirection URI" : "Atreo URI",
+ "Client Identifier" : "Aitheantóir Cliant",
+ "Secret key" : "Eochair rúnda",
+ "Delete client" : "Scrios cliant",
+ "Make sure you store the secret key, it cannot be recovered." : "Déan cinnte go stórálann tú an eochair rúnda, ní féidir í a aisghabháil.",
+ "Add client" : "Cuir cliant leis",
+ "Add" : "Cuir",
+ "Show client secret" : "Taispeáin rún an chliaint",
+ "Hide client secret" : "Folaigh rún an chliaint",
+ "Delete" : "Scrios"
+},"pluralForm" :"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);"
+} \ No newline at end of file
diff --git a/apps/oauth2/l10n/gl.js b/apps/oauth2/l10n/gl.js
index 5badcc477d7..3aaa35e0b00 100644
--- a/apps/oauth2/l10n/gl.js
+++ b/apps/oauth2/l10n/gl.js
@@ -1,20 +1,23 @@
OC.L10N.register(
"oauth2",
{
- "Your client is not authorized to connect. Please inform the administrator of your client." : "O seu cliente non ten autorización para conectarse. Informe do seu cliente ao administrador.",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "O seu cliente non ten autorización para conectarse. Informe do seu cliente á administración da instancia",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "o seu URL de redirección debe ser un URL completo, por exemplo: https://omeudominio.com/ruta",
"OAuth 2.0" : "OAuth 2.0",
- "Allows OAuth2 compatible authentication from other web applications." : "Permite a autenticación compatíbel con OAuth2 dende outras aplicacións web.",
- "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "A aplicación OAuth2 permítelle aos administradores configurar o fluxo de traballo de autenticación incorporado para permitir tamén autenticación compatíbel con OAuth2 dende outras aplicacións web.",
+ "Allows OAuth2 compatible authentication from other web applications." : "Permite a autenticación compatíbel con OAuth2 desde outras aplicacións web.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "A aplicación OAuth2 permítelle aos administradores configurar o fluxo de traballo de autenticación integrado para permitir tamén autenticación compatíbel con OAuth2 desde outras aplicacións web.",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permítelle aos servizos externos solicitar acceso a {instanceName}.",
- "Add client" : "Engadir cliente",
"Name" : "Nome",
"Redirection URI" : "URI de redireccionamento",
- "Add" : "Engadir",
"Client Identifier" : "Identificador do cliente",
- "Secret" : "Segredo",
+ "Secret key" : "Chave secreta",
+ "Delete client" : "Eliminar cliente",
+ "Make sure you store the secret key, it cannot be recovered." : "Asegúrese de gardar a chave secreta, non é posíbel recuperala.",
+ "Add client" : "Engadir cliente",
+ "Add" : "Engadir",
"Show client secret" : "Amosar o segredo do cliente",
+ "Hide client secret" : "Agochar o segredo do cliente",
"Delete" : "Eliminar"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/gl.json b/apps/oauth2/l10n/gl.json
index fcbf78cb6cb..3401883d361 100644
--- a/apps/oauth2/l10n/gl.json
+++ b/apps/oauth2/l10n/gl.json
@@ -1,18 +1,21 @@
{ "translations": {
- "Your client is not authorized to connect. Please inform the administrator of your client." : "O seu cliente non ten autorización para conectarse. Informe do seu cliente ao administrador.",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "O seu cliente non ten autorización para conectarse. Informe do seu cliente á administración da instancia",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "o seu URL de redirección debe ser un URL completo, por exemplo: https://omeudominio.com/ruta",
"OAuth 2.0" : "OAuth 2.0",
- "Allows OAuth2 compatible authentication from other web applications." : "Permite a autenticación compatíbel con OAuth2 dende outras aplicacións web.",
- "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "A aplicación OAuth2 permítelle aos administradores configurar o fluxo de traballo de autenticación incorporado para permitir tamén autenticación compatíbel con OAuth2 dende outras aplicacións web.",
+ "Allows OAuth2 compatible authentication from other web applications." : "Permite a autenticación compatíbel con OAuth2 desde outras aplicacións web.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "A aplicación OAuth2 permítelle aos administradores configurar o fluxo de traballo de autenticación integrado para permitir tamén autenticación compatíbel con OAuth2 desde outras aplicacións web.",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permítelle aos servizos externos solicitar acceso a {instanceName}.",
- "Add client" : "Engadir cliente",
"Name" : "Nome",
"Redirection URI" : "URI de redireccionamento",
- "Add" : "Engadir",
"Client Identifier" : "Identificador do cliente",
- "Secret" : "Segredo",
+ "Secret key" : "Chave secreta",
+ "Delete client" : "Eliminar cliente",
+ "Make sure you store the secret key, it cannot be recovered." : "Asegúrese de gardar a chave secreta, non é posíbel recuperala.",
+ "Add client" : "Engadir cliente",
+ "Add" : "Engadir",
"Show client secret" : "Amosar o segredo do cliente",
+ "Hide client secret" : "Agochar o segredo do cliente",
"Delete" : "Eliminar"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/he.js b/apps/oauth2/l10n/he.js
index 2b0cee6bbe7..2d32792f86e 100644
--- a/apps/oauth2/l10n/he.js
+++ b/apps/oauth2/l10n/he.js
@@ -8,13 +8,13 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "יישומון OAuth2 מאפשר למנהלים להגדיר את הסדר האימות המובנה כדי לאפשר אימות תואם OAuth2 מיישומים אחרים.",
"OAuth 2.0 clients" : "לקוחות OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 מאפשר לשירותים חיצוניים לבקש גישה אל {instanceName}.",
- "Add client" : "הוספת לקוחי",
"Name" : "שם",
"Redirection URI" : "כתובת הפנייה",
- "Add" : "הוספה",
"Client Identifier" : "זיהוי לקו",
- "Secret" : "סוד",
+ "Secret key" : "מפתח סודי",
+ "Add client" : "הוספת לקוחי",
+ "Add" : "הוספה",
"Show client secret" : "הצגת סוד לקוח",
"Delete" : "מחיקה"
},
-"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;");
+"nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;");
diff --git a/apps/oauth2/l10n/he.json b/apps/oauth2/l10n/he.json
index 27ea4625363..d46ae0195f4 100644
--- a/apps/oauth2/l10n/he.json
+++ b/apps/oauth2/l10n/he.json
@@ -6,13 +6,13 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "יישומון OAuth2 מאפשר למנהלים להגדיר את הסדר האימות המובנה כדי לאפשר אימות תואם OAuth2 מיישומים אחרים.",
"OAuth 2.0 clients" : "לקוחות OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 מאפשר לשירותים חיצוניים לבקש גישה אל {instanceName}.",
- "Add client" : "הוספת לקוחי",
"Name" : "שם",
"Redirection URI" : "כתובת הפנייה",
- "Add" : "הוספה",
"Client Identifier" : "זיהוי לקו",
- "Secret" : "סוד",
+ "Secret key" : "מפתח סודי",
+ "Add client" : "הוספת לקוחי",
+ "Add" : "הוספה",
"Show client secret" : "הצגת סוד לקוח",
"Delete" : "מחיקה"
-},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;"
+},"pluralForm" :"nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/hr.js b/apps/oauth2/l10n/hr.js
index 8e1ab442d54..396209ee36b 100644
--- a/apps/oauth2/l10n/hr.js
+++ b/apps/oauth2/l10n/hr.js
@@ -8,12 +8,12 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Aplikacija OAuth2 omogućuje administratorima da konfiguriraju ugrađeni tijek autentifikacije kako bi također omogućili autentifikaciju kompatibilnu s OAuth2 iz drugih web aplikacija.",
"OAuth 2.0 clients" : "OAuth 2.0 klijenti",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 omogućuje vanjskim servisima da zahtijevaju pristup {instanceName}.",
- "Add client" : "Dodaj klijenta",
"Name" : "Naziv",
"Redirection URI" : "URL za preusmjeravanje",
- "Add" : "Dodaj",
"Client Identifier" : "Identifikator klijenta",
- "Secret" : "Tajno",
+ "Secret key" : "Tajni ključ",
+ "Add client" : "Dodaj klijenta",
+ "Add" : "Dodaj",
"Show client secret" : "Prikaži tajni ključ klijenta",
"Delete" : "Izbriši"
},
diff --git a/apps/oauth2/l10n/hr.json b/apps/oauth2/l10n/hr.json
index ad5fa8ebe28..79303555b6b 100644
--- a/apps/oauth2/l10n/hr.json
+++ b/apps/oauth2/l10n/hr.json
@@ -6,12 +6,12 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Aplikacija OAuth2 omogućuje administratorima da konfiguriraju ugrađeni tijek autentifikacije kako bi također omogućili autentifikaciju kompatibilnu s OAuth2 iz drugih web aplikacija.",
"OAuth 2.0 clients" : "OAuth 2.0 klijenti",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 omogućuje vanjskim servisima da zahtijevaju pristup {instanceName}.",
- "Add client" : "Dodaj klijenta",
"Name" : "Naziv",
"Redirection URI" : "URL za preusmjeravanje",
- "Add" : "Dodaj",
"Client Identifier" : "Identifikator klijenta",
- "Secret" : "Tajno",
+ "Secret key" : "Tajni ključ",
+ "Add client" : "Dodaj klijenta",
+ "Add" : "Dodaj",
"Show client secret" : "Prikaži tajni ključ klijenta",
"Delete" : "Izbriši"
},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
diff --git a/apps/oauth2/l10n/hu.js b/apps/oauth2/l10n/hu.js
index 4f3216c3750..eddb2928651 100644
--- a/apps/oauth2/l10n/hu.js
+++ b/apps/oauth2/l10n/hu.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Az OAuth2 alkalmazás lehetővé teszi a rendszergazdák számára, hogy beállíthassák a beépített azonosítási munkafolyamat számára az OAuth2 kompatibilis hitelesítést más webalkalmazásokból.",
"OAuth 2.0 clients" : "OAuth 2.0 kliensek",
"OAuth 2.0 allows external services to request access to {instanceName}." : "Az OAuth 2.0 engedélyezi, hogy külső szolgáltatások hozzáférést kérjenek a következőhöz: {instanceName}.",
- "Add client" : "Kliens hozzáadása",
"Name" : "Név",
- "Redirection URI" : "Átirányítési URI",
- "Add" : "Hozzáadás",
+ "Redirection URI" : "Átirányítási URI",
"Client Identifier" : "Ügyfélazonosító",
- "Secret" : "Titok",
- "Show client secret" : "Kliens titkának megjelenítése",
+ "Secret key" : "Titkos kulcs",
+ "Delete client" : "Kliens törlése",
+ "Make sure you store the secret key, it cannot be recovered." : "Győződjön meg róla tárolja a titkos kulcsot, mert nem nyerhető vissza.",
+ "Add client" : "Kliens hozzáadása",
+ "Add" : "Hozzáadás",
+ "Show client secret" : "Klienstitok megjelenítése",
+ "Hide client secret" : "Klienstitok elrejtése",
"Delete" : "Törlés"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/hu.json b/apps/oauth2/l10n/hu.json
index bfa670928dd..2e0a9c4de02 100644
--- a/apps/oauth2/l10n/hu.json
+++ b/apps/oauth2/l10n/hu.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Az OAuth2 alkalmazás lehetővé teszi a rendszergazdák számára, hogy beállíthassák a beépített azonosítási munkafolyamat számára az OAuth2 kompatibilis hitelesítést más webalkalmazásokból.",
"OAuth 2.0 clients" : "OAuth 2.0 kliensek",
"OAuth 2.0 allows external services to request access to {instanceName}." : "Az OAuth 2.0 engedélyezi, hogy külső szolgáltatások hozzáférést kérjenek a következőhöz: {instanceName}.",
- "Add client" : "Kliens hozzáadása",
"Name" : "Név",
- "Redirection URI" : "Átirányítési URI",
- "Add" : "Hozzáadás",
+ "Redirection URI" : "Átirányítási URI",
"Client Identifier" : "Ügyfélazonosító",
- "Secret" : "Titok",
- "Show client secret" : "Kliens titkának megjelenítése",
+ "Secret key" : "Titkos kulcs",
+ "Delete client" : "Kliens törlése",
+ "Make sure you store the secret key, it cannot be recovered." : "Győződjön meg róla tárolja a titkos kulcsot, mert nem nyerhető vissza.",
+ "Add client" : "Kliens hozzáadása",
+ "Add" : "Hozzáadás",
+ "Show client secret" : "Klienstitok megjelenítése",
+ "Hide client secret" : "Klienstitok elrejtése",
"Delete" : "Törlés"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/id.js b/apps/oauth2/l10n/id.js
deleted file mode 100644
index 79f05d1b1b2..00000000000
--- a/apps/oauth2/l10n/id.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "oauth2",
- {
- "OAuth 2.0 clients" : "Klien OAuth 2.0",
- "Add client" : "Tambah klien",
- "Name" : "Nama",
- "Redirection URI" : "URI Pengalihan",
- "Add" : "Tambah",
- "Client Identifier" : "Identifier klien",
- "Secret" : "Rahasia",
- "Delete" : "Hapus"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/oauth2/l10n/id.json b/apps/oauth2/l10n/id.json
deleted file mode 100644
index d593b145a06..00000000000
--- a/apps/oauth2/l10n/id.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "OAuth 2.0 clients" : "Klien OAuth 2.0",
- "Add client" : "Tambah klien",
- "Name" : "Nama",
- "Redirection URI" : "URI Pengalihan",
- "Add" : "Tambah",
- "Client Identifier" : "Identifier klien",
- "Secret" : "Rahasia",
- "Delete" : "Hapus"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/oauth2/l10n/is.js b/apps/oauth2/l10n/is.js
index 56181b4808d..e786a1e409d 100644
--- a/apps/oauth2/l10n/is.js
+++ b/apps/oauth2/l10n/is.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2-forritið gerir kerfisstjórum kleift að stilla innbyggða auðkenningarferlið þannig að einnig sé hægt að nota OAuth2-samhæfða auðkenningu frá öðrum vefforritum.",
"OAuth 2.0 clients" : "OAuth 2.0 biðlarar",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 gerir utanaðkomandi þjónustum kleift að biðja um aðgang að {instanceName}.",
- "Add client" : "Bæta við biðlara",
"Name" : "Nafn",
"Redirection URI" : "Endurbeiningarslóð",
- "Add" : "Bæta við",
"Client Identifier" : "Biðlaraauðkenni",
- "Secret" : "Leynilykill",
+ "Secret key" : "Leynilykill",
+ "Delete client" : "Eyða biðlara",
+ "Make sure you store the secret key, it cannot be recovered." : "Vertu viss um að geyma leynilykilinn á góðum stað, henn er ekki hægt að endurheimta.",
+ "Add client" : "Bæta við biðlara",
+ "Add" : "Bæta við",
"Show client secret" : "Sýna leynilykil biðlara",
+ "Hide client secret" : "Fela leynilykil biðlara",
"Delete" : "Eyða"
},
"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");
diff --git a/apps/oauth2/l10n/is.json b/apps/oauth2/l10n/is.json
index d4afe27b1b2..573b3a496a4 100644
--- a/apps/oauth2/l10n/is.json
+++ b/apps/oauth2/l10n/is.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2-forritið gerir kerfisstjórum kleift að stilla innbyggða auðkenningarferlið þannig að einnig sé hægt að nota OAuth2-samhæfða auðkenningu frá öðrum vefforritum.",
"OAuth 2.0 clients" : "OAuth 2.0 biðlarar",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 gerir utanaðkomandi þjónustum kleift að biðja um aðgang að {instanceName}.",
- "Add client" : "Bæta við biðlara",
"Name" : "Nafn",
"Redirection URI" : "Endurbeiningarslóð",
- "Add" : "Bæta við",
"Client Identifier" : "Biðlaraauðkenni",
- "Secret" : "Leynilykill",
+ "Secret key" : "Leynilykill",
+ "Delete client" : "Eyða biðlara",
+ "Make sure you store the secret key, it cannot be recovered." : "Vertu viss um að geyma leynilykilinn á góðum stað, henn er ekki hægt að endurheimta.",
+ "Add client" : "Bæta við biðlara",
+ "Add" : "Bæta við",
"Show client secret" : "Sýna leynilykil biðlara",
+ "Hide client secret" : "Fela leynilykil biðlara",
"Delete" : "Eyða"
},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/it.js b/apps/oauth2/l10n/it.js
index 0297c08cc13..f6365b013d0 100644
--- a/apps/oauth2/l10n/it.js
+++ b/apps/oauth2/l10n/it.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "L'applicazione OAuth2 consente agli amministratori di configurare la procedura di autenticazione integrata per consentire anche l'autenticazione compatibile con OAuth2 da altre applicazioni web.",
"OAuth 2.0 clients" : "Client OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 consente a servizi esterni di richiedere accesso a {instanceName}.",
- "Add client" : "Aggiungi client",
"Name" : "Nome",
"Redirection URI" : "URI di redirezione",
- "Add" : "Aggiungi",
"Client Identifier" : "Identificatore client",
- "Secret" : "Segreto",
+ "Secret key" : "Chiave segreta",
+ "Delete client" : "Elimina client",
+ "Make sure you store the secret key, it cannot be recovered." : "Assicurati di salvare la chiave segreta, non può essere recuperata.",
+ "Add client" : "Aggiungi client",
+ "Add" : "Aggiungi",
"Show client secret" : "Mostra segreto del client",
+ "Hide client secret" : "Nascondi segreto del client",
"Delete" : "Elimina"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/it.json b/apps/oauth2/l10n/it.json
index 8f77ef8ac7d..d7db0bbe00d 100644
--- a/apps/oauth2/l10n/it.json
+++ b/apps/oauth2/l10n/it.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "L'applicazione OAuth2 consente agli amministratori di configurare la procedura di autenticazione integrata per consentire anche l'autenticazione compatibile con OAuth2 da altre applicazioni web.",
"OAuth 2.0 clients" : "Client OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 consente a servizi esterni di richiedere accesso a {instanceName}.",
- "Add client" : "Aggiungi client",
"Name" : "Nome",
"Redirection URI" : "URI di redirezione",
- "Add" : "Aggiungi",
"Client Identifier" : "Identificatore client",
- "Secret" : "Segreto",
+ "Secret key" : "Chiave segreta",
+ "Delete client" : "Elimina client",
+ "Make sure you store the secret key, it cannot be recovered." : "Assicurati di salvare la chiave segreta, non può essere recuperata.",
+ "Add client" : "Aggiungi client",
+ "Add" : "Aggiungi",
"Show client secret" : "Mostra segreto del client",
+ "Hide client secret" : "Nascondi segreto del client",
"Delete" : "Elimina"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/ja.js b/apps/oauth2/l10n/ja.js
index 95e326a8ddb..c1418fb2021 100644
--- a/apps/oauth2/l10n/ja.js
+++ b/apps/oauth2/l10n/ja.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2アプリは、他のWebサービスからOAuth2互換の認証に接続し、管理者が認証の流れを設定できるようにするものです。",
"OAuth 2.0 clients" : "OAuth 2.0クライアント",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0により {instanceName} へのアクセス要求を外部サービスに許可します。",
- "Add client" : "クライアントの追加",
"Name" : "名前",
"Redirection URI" : "リダイレクトURI",
- "Add" : "追加",
"Client Identifier" : "クライアントID",
- "Secret" : "シークレットキー",
+ "Secret key" : "シークレットキー",
+ "Delete client" : "クライアントを削除",
+ "Make sure you store the secret key, it cannot be recovered." : "秘密鍵は復元できないので、必ず保管してください。",
+ "Add client" : "クライアントの追加",
+ "Add" : "追加",
"Show client secret" : "クライアントシークレットキーを表示",
+ "Hide client secret" : "クライアントのシークレットキーを隠す",
"Delete" : "削除"
},
"nplurals=1; plural=0;");
diff --git a/apps/oauth2/l10n/ja.json b/apps/oauth2/l10n/ja.json
index e27b5aad745..09357aca90f 100644
--- a/apps/oauth2/l10n/ja.json
+++ b/apps/oauth2/l10n/ja.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2アプリは、他のWebサービスからOAuth2互換の認証に接続し、管理者が認証の流れを設定できるようにするものです。",
"OAuth 2.0 clients" : "OAuth 2.0クライアント",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0により {instanceName} へのアクセス要求を外部サービスに許可します。",
- "Add client" : "クライアントの追加",
"Name" : "名前",
"Redirection URI" : "リダイレクトURI",
- "Add" : "追加",
"Client Identifier" : "クライアントID",
- "Secret" : "シークレットキー",
+ "Secret key" : "シークレットキー",
+ "Delete client" : "クライアントを削除",
+ "Make sure you store the secret key, it cannot be recovered." : "秘密鍵は復元できないので、必ず保管してください。",
+ "Add client" : "クライアントの追加",
+ "Add" : "追加",
"Show client secret" : "クライアントシークレットキーを表示",
+ "Hide client secret" : "クライアントのシークレットキーを隠す",
"Delete" : "削除"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/ka.js b/apps/oauth2/l10n/ka.js
new file mode 100644
index 00000000000..c3a7a9385ba
--- /dev/null
+++ b/apps/oauth2/l10n/ka.js
@@ -0,0 +1,22 @@
+OC.L10N.register(
+ "oauth2",
+ {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Your client is not authorized to connect. Please inform the administrator of your client.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path",
+ "OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Allows OAuth2 compatible authentication from other web applications.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications.",
+ "OAuth 2.0 clients" : "OAuth 2.0 clients",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 allows external services to request access to {instanceName}.",
+ "Name" : "Name",
+ "Redirection URI" : "Redirection URI",
+ "Client Identifier" : "Client Identifier",
+ "Secret key" : "Secret key",
+ "Delete client" : "Delete client",
+ "Add client" : "Add client",
+ "Add" : "Add",
+ "Show client secret" : "Show client secret",
+ "Hide client secret" : "Hide client secret",
+ "Delete" : "Delete"
+},
+"nplurals=2; plural=(n!=1);");
diff --git a/apps/oauth2/l10n/ka.json b/apps/oauth2/l10n/ka.json
new file mode 100644
index 00000000000..9d634320a17
--- /dev/null
+++ b/apps/oauth2/l10n/ka.json
@@ -0,0 +1,20 @@
+{ "translations": {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Your client is not authorized to connect. Please inform the administrator of your client.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path",
+ "OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Allows OAuth2 compatible authentication from other web applications.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications.",
+ "OAuth 2.0 clients" : "OAuth 2.0 clients",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 allows external services to request access to {instanceName}.",
+ "Name" : "Name",
+ "Redirection URI" : "Redirection URI",
+ "Client Identifier" : "Client Identifier",
+ "Secret key" : "Secret key",
+ "Delete client" : "Delete client",
+ "Add client" : "Add client",
+ "Add" : "Add",
+ "Show client secret" : "Show client secret",
+ "Hide client secret" : "Hide client secret",
+ "Delete" : "Delete"
+},"pluralForm" :"nplurals=2; plural=(n!=1);"
+} \ No newline at end of file
diff --git a/apps/oauth2/l10n/ka_GE.js b/apps/oauth2/l10n/ka_GE.js
index 11f4c35a995..a94015e4803 100644
--- a/apps/oauth2/l10n/ka_GE.js
+++ b/apps/oauth2/l10n/ka_GE.js
@@ -3,12 +3,12 @@ OC.L10N.register(
{
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "OAuth 2.0 კლიენტები",
- "Add client" : "კლიენტის დამატება",
"Name" : "სახელი",
"Redirection URI" : "გადამისამართების URI",
- "Add" : "დამატება",
"Client Identifier" : "კლიენტის იდენტიფიკატორი",
- "Secret" : "საიდუმლო",
+ "Secret key" : "საიდუმლო გასაღები",
+ "Add client" : "კლიენტის დამატება",
+ "Add" : "დამატება",
"Show client secret" : "გამოაჩინე კლიენტის საიდუმლო",
"Delete" : "წაშლა"
},
diff --git a/apps/oauth2/l10n/ka_GE.json b/apps/oauth2/l10n/ka_GE.json
index 55b1e0d2bc5..186b5570c7f 100644
--- a/apps/oauth2/l10n/ka_GE.json
+++ b/apps/oauth2/l10n/ka_GE.json
@@ -1,12 +1,12 @@
{ "translations": {
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "OAuth 2.0 კლიენტები",
- "Add client" : "კლიენტის დამატება",
"Name" : "სახელი",
"Redirection URI" : "გადამისამართების URI",
- "Add" : "დამატება",
"Client Identifier" : "კლიენტის იდენტიფიკატორი",
- "Secret" : "საიდუმლო",
+ "Secret key" : "საიდუმლო გასაღები",
+ "Add client" : "კლიენტის დამატება",
+ "Add" : "დამატება",
"Show client secret" : "გამოაჩინე კლიენტის საიდუმლო",
"Delete" : "წაშლა"
},"pluralForm" :"nplurals=2; plural=(n!=1);"
diff --git a/apps/oauth2/l10n/ko.js b/apps/oauth2/l10n/ko.js
index 68f94352a0b..8a9da68e958 100644
--- a/apps/oauth2/l10n/ko.js
+++ b/apps/oauth2/l10n/ko.js
@@ -8,12 +8,12 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 앱을 사용하면 관리자가 기본 인증 작업 과정을 통해서 다른 웹 애플리케이션에서 OAuth2 호환 인증을 허용합니다.",
"OAuth 2.0 clients" : "OAuth 2.0 클라이언트",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0을 사용하여 외부 서비스에서 {instanceName}에 접근할 수 있습니다.",
- "Add client" : "클라이언트 추가",
"Name" : "이름",
"Redirection URI" : "전환될 URI",
- "Add" : "추가",
"Client Identifier" : "클라이언트 식별자",
- "Secret" : "비밀 값",
+ "Secret key" : "비밀 키",
+ "Add client" : "클라이언트 추가",
+ "Add" : "추가",
"Show client secret" : "클라이언트 비밀 값 표시",
"Delete" : "삭제"
},
diff --git a/apps/oauth2/l10n/ko.json b/apps/oauth2/l10n/ko.json
index 012361acb7c..fd689b591f7 100644
--- a/apps/oauth2/l10n/ko.json
+++ b/apps/oauth2/l10n/ko.json
@@ -6,12 +6,12 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 앱을 사용하면 관리자가 기본 인증 작업 과정을 통해서 다른 웹 애플리케이션에서 OAuth2 호환 인증을 허용합니다.",
"OAuth 2.0 clients" : "OAuth 2.0 클라이언트",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0을 사용하여 외부 서비스에서 {instanceName}에 접근할 수 있습니다.",
- "Add client" : "클라이언트 추가",
"Name" : "이름",
"Redirection URI" : "전환될 URI",
- "Add" : "추가",
"Client Identifier" : "클라이언트 식별자",
- "Secret" : "비밀 값",
+ "Secret key" : "비밀 키",
+ "Add client" : "클라이언트 추가",
+ "Add" : "추가",
"Show client secret" : "클라이언트 비밀 값 표시",
"Delete" : "삭제"
},"pluralForm" :"nplurals=1; plural=0;"
diff --git a/apps/oauth2/l10n/lt_LT.js b/apps/oauth2/l10n/lt_LT.js
index 152bf3dd4f2..d6ba78db8e1 100644
--- a/apps/oauth2/l10n/lt_LT.js
+++ b/apps/oauth2/l10n/lt_LT.js
@@ -2,15 +2,16 @@ OC.L10N.register(
"oauth2",
{
"Your client is not authorized to connect. Please inform the administrator of your client." : "Jūsų kliento programa nėra įgaliota prisijungti. Informuokite administratorių apie savo kliento programą.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Jūsų nukreipimo adresas (redirect URL) turi būti pilnas, pavyzdžiui: https://jusuadresas.com/path",
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "OAuth 2.0 klientai",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 leidžia išorinėms tarnyboms užklausti prieigą prie {instanceName}.",
- "Add client" : "Pridėti klientą",
"Name" : "Pavadinimas",
"Redirection URI" : "Peradresavimo URI",
- "Add" : "Pridėti",
"Client Identifier" : "Kliento identifikatorius",
- "Secret" : "Paslaptis",
+ "Secret key" : "Slaptasis raktas",
+ "Add client" : "Pridėti klientą",
+ "Add" : "Pridėti",
"Delete" : "Ištrinti"
},
"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);");
diff --git a/apps/oauth2/l10n/lt_LT.json b/apps/oauth2/l10n/lt_LT.json
index 418c0e3b5fa..fed347c6a89 100644
--- a/apps/oauth2/l10n/lt_LT.json
+++ b/apps/oauth2/l10n/lt_LT.json
@@ -1,14 +1,15 @@
{ "translations": {
"Your client is not authorized to connect. Please inform the administrator of your client." : "Jūsų kliento programa nėra įgaliota prisijungti. Informuokite administratorių apie savo kliento programą.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Jūsų nukreipimo adresas (redirect URL) turi būti pilnas, pavyzdžiui: https://jusuadresas.com/path",
"OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "OAuth 2.0 klientai",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 leidžia išorinėms tarnyboms užklausti prieigą prie {instanceName}.",
- "Add client" : "Pridėti klientą",
"Name" : "Pavadinimas",
"Redirection URI" : "Peradresavimo URI",
- "Add" : "Pridėti",
"Client Identifier" : "Kliento identifikatorius",
- "Secret" : "Paslaptis",
+ "Secret key" : "Slaptasis raktas",
+ "Add client" : "Pridėti klientą",
+ "Add" : "Pridėti",
"Delete" : "Ištrinti"
},"pluralForm" :"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/lv.js b/apps/oauth2/l10n/lv.js
index 67a71ce5eb8..a6df308f198 100644
--- a/apps/oauth2/l10n/lv.js
+++ b/apps/oauth2/l10n/lv.js
@@ -4,14 +4,14 @@ OC.L10N.register(
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Tavam pārvirzīšanas URL ir jābūt pilnam URL, piemēram https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Ļauj OAuth2 saderīgu autentifikāciju citām tīmekļa lietotnēm.",
- "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 lietotne ļauj administratoriem konfigurēt iebūvēto autentifikācijas darbplūsmu un ļauj OAuth2 saderīgu autentifikāciju citām web lietotnēm.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 lietotne ļauj pārvaldītājiem konfigurēt iebūvēto autentificēšanās darbplūsmu un ļauj ar OAuth2 saderīgu autentificēšanos no citām tīmekļa lietotnēm.",
"OAuth 2.0 clients" : "OAuth 2.0 klients",
- "Add client" : "Pievienot klientu",
"Name" : "Nosaukums",
"Redirection URI" : "Pārvirzāmais URI",
- "Add" : "Pievienot",
"Client Identifier" : "Klienta identifikators",
- "Secret" : "Noslēpums",
- "Delete" : "Dzēst"
+ "Secret key" : "Slepenā atslēga",
+ "Add client" : "Pievienot klientu",
+ "Add" : "Pievienot",
+ "Delete" : "Izdzēst"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);");
diff --git a/apps/oauth2/l10n/lv.json b/apps/oauth2/l10n/lv.json
index 4b9e711dd88..3fddb2506ac 100644
--- a/apps/oauth2/l10n/lv.json
+++ b/apps/oauth2/l10n/lv.json
@@ -2,14 +2,14 @@
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Tavam pārvirzīšanas URL ir jābūt pilnam URL, piemēram https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Ļauj OAuth2 saderīgu autentifikāciju citām tīmekļa lietotnēm.",
- "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 lietotne ļauj administratoriem konfigurēt iebūvēto autentifikācijas darbplūsmu un ļauj OAuth2 saderīgu autentifikāciju citām web lietotnēm.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 lietotne ļauj pārvaldītājiem konfigurēt iebūvēto autentificēšanās darbplūsmu un ļauj ar OAuth2 saderīgu autentificēšanos no citām tīmekļa lietotnēm.",
"OAuth 2.0 clients" : "OAuth 2.0 klients",
- "Add client" : "Pievienot klientu",
"Name" : "Nosaukums",
"Redirection URI" : "Pārvirzāmais URI",
- "Add" : "Pievienot",
"Client Identifier" : "Klienta identifikators",
- "Secret" : "Noslēpums",
- "Delete" : "Dzēst"
+ "Secret key" : "Slepenā atslēga",
+ "Add client" : "Pievienot klientu",
+ "Add" : "Pievienot",
+ "Delete" : "Izdzēst"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/mk.js b/apps/oauth2/l10n/mk.js
index 2dfb7f302dc..3ef703ea529 100644
--- a/apps/oauth2/l10n/mk.js
+++ b/apps/oauth2/l10n/mk.js
@@ -8,12 +8,12 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 апликацијата им овозможува на администраторите да конфигурираат вграден проток за автентификација, истотака дозволува OAuth2 компатибилна автентификација од други веб апликации.",
"OAuth 2.0 clients" : "OAuth 2.0 клиенти",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 овозможува на надворешни сервиси да побараат пристап на {instanceName}.",
- "Add client" : "Додади клиент",
"Name" : "Име",
"Redirection URI" : "Пренасочено URI",
- "Add" : "Додади",
"Client Identifier" : "Идентификатор на клиент",
- "Secret" : "Тајна",
+ "Secret key" : "Таен клуч",
+ "Add client" : "Додади клиент",
+ "Add" : "Додади",
"Show client secret" : "Прикажи тајна на клиент",
"Delete" : "Избриши"
},
diff --git a/apps/oauth2/l10n/mk.json b/apps/oauth2/l10n/mk.json
index b043358ef7e..993f4112fb1 100644
--- a/apps/oauth2/l10n/mk.json
+++ b/apps/oauth2/l10n/mk.json
@@ -6,12 +6,12 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 апликацијата им овозможува на администраторите да конфигурираат вграден проток за автентификација, истотака дозволува OAuth2 компатибилна автентификација од други веб апликации.",
"OAuth 2.0 clients" : "OAuth 2.0 клиенти",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 овозможува на надворешни сервиси да побараат пристап на {instanceName}.",
- "Add client" : "Додади клиент",
"Name" : "Име",
"Redirection URI" : "Пренасочено URI",
- "Add" : "Додади",
"Client Identifier" : "Идентификатор на клиент",
- "Secret" : "Тајна",
+ "Secret key" : "Таен клуч",
+ "Add client" : "Додади клиент",
+ "Add" : "Додади",
"Show client secret" : "Прикажи тајна на клиент",
"Delete" : "Избриши"
},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"
diff --git a/apps/oauth2/l10n/nb.js b/apps/oauth2/l10n/nb.js
index 2fb1f83ba15..9cf61c0eed0 100644
--- a/apps/oauth2/l10n/nb.js
+++ b/apps/oauth2/l10n/nb.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2-appen gir administratorer mulighet til å konfigurere den innebygde arbeidsflyten for autentisering til å også tillate OAuth2-kompatibel autentisering fra andre nett-applikasjoner.",
"OAuth 2.0 clients" : "OAuth 2.0-klienter",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 gir eksterne tjenester tillatelse til å be om tilgang til {instanceName}.",
- "Add client" : "Legg til klient",
"Name" : "Navn",
"Redirection URI" : "Videresendings-URI",
- "Add" : "Legg til",
"Client Identifier" : "Klient-identifikator",
- "Secret" : "Hemmelighet",
+ "Secret key" : "Hemmelig nøkkel",
+ "Delete client" : "Slett klient",
+ "Make sure you store the secret key, it cannot be recovered." : "Pass på at du oppbevarer den hemmelige nøkkelen, den kan ikke gjenopprettes.",
+ "Add client" : "Legg til klient",
+ "Add" : "Legg til",
"Show client secret" : "Vis klients hemmelighet",
+ "Hide client secret" : "Skjul klienthemmelighet",
"Delete" : "Slett"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/nb.json b/apps/oauth2/l10n/nb.json
index ff0b4b735df..70154349c8b 100644
--- a/apps/oauth2/l10n/nb.json
+++ b/apps/oauth2/l10n/nb.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2-appen gir administratorer mulighet til å konfigurere den innebygde arbeidsflyten for autentisering til å også tillate OAuth2-kompatibel autentisering fra andre nett-applikasjoner.",
"OAuth 2.0 clients" : "OAuth 2.0-klienter",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 gir eksterne tjenester tillatelse til å be om tilgang til {instanceName}.",
- "Add client" : "Legg til klient",
"Name" : "Navn",
"Redirection URI" : "Videresendings-URI",
- "Add" : "Legg til",
"Client Identifier" : "Klient-identifikator",
- "Secret" : "Hemmelighet",
+ "Secret key" : "Hemmelig nøkkel",
+ "Delete client" : "Slett klient",
+ "Make sure you store the secret key, it cannot be recovered." : "Pass på at du oppbevarer den hemmelige nøkkelen, den kan ikke gjenopprettes.",
+ "Add client" : "Legg til klient",
+ "Add" : "Legg til",
"Show client secret" : "Vis klients hemmelighet",
+ "Hide client secret" : "Skjul klienthemmelighet",
"Delete" : "Slett"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/nl.js b/apps/oauth2/l10n/nl.js
index acd2e4b303f..f27d2a062d8 100644
--- a/apps/oauth2/l10n/nl.js
+++ b/apps/oauth2/l10n/nl.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "De OAuth2 app laat beheerders de ingebouwde inlog-workflow configureren om ook OAuth2 compatible authenticatie vanaf andere web applicaties mogelijk te maken.",
"OAuth 2.0 clients" : "OAuth 2.0 Clients",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 staat externe services toe om toegang te vragen bij {instanceName}.",
- "Add client" : "Voeg client toe",
"Name" : "Naam",
"Redirection URI" : "Omeiding URI",
- "Add" : "Toevoegen",
"Client Identifier" : "Client identificatie",
- "Secret" : "Geheim",
- "Show client secret" : "Tonen client secret",
+ "Secret key" : "Geheime sleutel",
+ "Delete client" : "Client verwijderen",
+ "Make sure you store the secret key, it cannot be recovered." : "Zorg ervoor dat je de geheime sleutel opslaat, deze kan niet worden hersteld.",
+ "Add client" : "Voeg client toe",
+ "Add" : "Toevoegen",
+ "Show client secret" : "Geheime sleutel van cliënt weergeven",
+ "Hide client secret" : "Geheime sleutel van cliënt verbergen",
"Delete" : "verwijderen"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/nl.json b/apps/oauth2/l10n/nl.json
index 7ba5c900ddc..c66631b5750 100644
--- a/apps/oauth2/l10n/nl.json
+++ b/apps/oauth2/l10n/nl.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "De OAuth2 app laat beheerders de ingebouwde inlog-workflow configureren om ook OAuth2 compatible authenticatie vanaf andere web applicaties mogelijk te maken.",
"OAuth 2.0 clients" : "OAuth 2.0 Clients",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 staat externe services toe om toegang te vragen bij {instanceName}.",
- "Add client" : "Voeg client toe",
"Name" : "Naam",
"Redirection URI" : "Omeiding URI",
- "Add" : "Toevoegen",
"Client Identifier" : "Client identificatie",
- "Secret" : "Geheim",
- "Show client secret" : "Tonen client secret",
+ "Secret key" : "Geheime sleutel",
+ "Delete client" : "Client verwijderen",
+ "Make sure you store the secret key, it cannot be recovered." : "Zorg ervoor dat je de geheime sleutel opslaat, deze kan niet worden hersteld.",
+ "Add client" : "Voeg client toe",
+ "Add" : "Toevoegen",
+ "Show client secret" : "Geheime sleutel van cliënt weergeven",
+ "Hide client secret" : "Geheime sleutel van cliënt verbergen",
"Delete" : "verwijderen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/oc.js b/apps/oauth2/l10n/oc.js
index 8c070c5bda4..8b114800cd1 100644
--- a/apps/oauth2/l10n/oc.js
+++ b/apps/oauth2/l10n/oc.js
@@ -6,12 +6,11 @@ OC.L10N.register(
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Permet l’autentificacion compatibla OAuth2 a partir d’autras aplicacions web",
"OAuth 2.0 clients" : "clients OAuth 2.0",
- "Add client" : "Apondre un client",
"Name" : "Nom",
"Redirection URI" : "URI de redireccion",
- "Add" : "Apondre",
"Client Identifier" : "Identificador client",
- "Secret" : "Secret",
+ "Add client" : "Apondre un client",
+ "Add" : "Apondre",
"Show client secret" : "Afichar lo secret del client",
"Delete" : "Suprimir"
},
diff --git a/apps/oauth2/l10n/oc.json b/apps/oauth2/l10n/oc.json
index b704b386d18..cee27e15d72 100644
--- a/apps/oauth2/l10n/oc.json
+++ b/apps/oauth2/l10n/oc.json
@@ -4,12 +4,11 @@
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Permet l’autentificacion compatibla OAuth2 a partir d’autras aplicacions web",
"OAuth 2.0 clients" : "clients OAuth 2.0",
- "Add client" : "Apondre un client",
"Name" : "Nom",
"Redirection URI" : "URI de redireccion",
- "Add" : "Apondre",
"Client Identifier" : "Identificador client",
- "Secret" : "Secret",
+ "Add client" : "Apondre un client",
+ "Add" : "Apondre",
"Show client secret" : "Afichar lo secret del client",
"Delete" : "Suprimir"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
diff --git a/apps/oauth2/l10n/pl.js b/apps/oauth2/l10n/pl.js
index 049fff0a3cb..50a5f361808 100644
--- a/apps/oauth2/l10n/pl.js
+++ b/apps/oauth2/l10n/pl.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Aplikacja OAuth2 umożliwia administratorom modyfikację wbudowanego uwierzytelnienia, pozwalając na korzystanie z OAuth2 innych aplikacji internetowych.",
"OAuth 2.0 clients" : "Klienci OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 pozwala zewnętrznym serwisom na korzystanie z dostępu do {instanceName}.",
- "Add client" : "Dodaj klienta",
"Name" : "Nazwa",
"Redirection URI" : "URI przekierowania",
- "Add" : "Dodaj",
"Client Identifier" : "Identyfikator Klienta",
- "Secret" : "Tajny klucz",
+ "Secret key" : "Tajny klucz",
+ "Delete client" : "Usuń klienta",
+ "Make sure you store the secret key, it cannot be recovered." : "Upewnij się, że przechowujesz klucz tajny, gdyż nie będzie można go odzyskać.",
+ "Add client" : "Dodaj klienta",
+ "Add" : "Dodaj",
"Show client secret" : "Pokaż tajny klucz klienta",
+ "Hide client secret" : "Ukryj tajny klucz klienta",
"Delete" : "Usuń"
},
"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);");
diff --git a/apps/oauth2/l10n/pl.json b/apps/oauth2/l10n/pl.json
index f8e2ffa58bf..09ac52e38c7 100644
--- a/apps/oauth2/l10n/pl.json
+++ b/apps/oauth2/l10n/pl.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Aplikacja OAuth2 umożliwia administratorom modyfikację wbudowanego uwierzytelnienia, pozwalając na korzystanie z OAuth2 innych aplikacji internetowych.",
"OAuth 2.0 clients" : "Klienci OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 pozwala zewnętrznym serwisom na korzystanie z dostępu do {instanceName}.",
- "Add client" : "Dodaj klienta",
"Name" : "Nazwa",
"Redirection URI" : "URI przekierowania",
- "Add" : "Dodaj",
"Client Identifier" : "Identyfikator Klienta",
- "Secret" : "Tajny klucz",
+ "Secret key" : "Tajny klucz",
+ "Delete client" : "Usuń klienta",
+ "Make sure you store the secret key, it cannot be recovered." : "Upewnij się, że przechowujesz klucz tajny, gdyż nie będzie można go odzyskać.",
+ "Add client" : "Dodaj klienta",
+ "Add" : "Dodaj",
"Show client secret" : "Pokaż tajny klucz klienta",
+ "Hide client secret" : "Ukryj tajny klucz klienta",
"Delete" : "Usuń"
},"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/pt_BR.js b/apps/oauth2/l10n/pt_BR.js
index 3b0bb4f2fa9..4d390ef783e 100644
--- a/apps/oauth2/l10n/pt_BR.js
+++ b/apps/oauth2/l10n/pt_BR.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "O aplicativo OAuth2 permite que os administradores configurem o fluxo de trabalho de autenticação integrado para permitir também a autenticação compatível com OAuth2 de outros aplicativos da Web.",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permite que serviços externos solicitem acesso a {instanceName}.",
- "Add client" : "Adicionar cliente",
"Name" : "Nome",
"Redirection URI" : "Redirecionamento URI",
- "Add" : "Adicionar",
"Client Identifier" : "Identificador do Cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Chave secreta",
+ "Delete client" : "Excluir cliente",
+ "Make sure you store the secret key, it cannot be recovered." : "Certifique-se de armazenar a chave secreta, ela não pode ser recuperada.",
+ "Add client" : "Adicionar cliente",
+ "Add" : "Adicionar",
"Show client secret" : "Mostra senha do cliente",
+ "Hide client secret" : "Ocultar segredo do cliente",
"Delete" : "Excluir"
},
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/oauth2/l10n/pt_BR.json b/apps/oauth2/l10n/pt_BR.json
index 09862363ef9..4407ca4c591 100644
--- a/apps/oauth2/l10n/pt_BR.json
+++ b/apps/oauth2/l10n/pt_BR.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "O aplicativo OAuth2 permite que os administradores configurem o fluxo de trabalho de autenticação integrado para permitir também a autenticação compatível com OAuth2 de outros aplicativos da Web.",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 permite que serviços externos solicitem acesso a {instanceName}.",
- "Add client" : "Adicionar cliente",
"Name" : "Nome",
"Redirection URI" : "Redirecionamento URI",
- "Add" : "Adicionar",
"Client Identifier" : "Identificador do Cliente",
- "Secret" : "Secreto",
+ "Secret key" : "Chave secreta",
+ "Delete client" : "Excluir cliente",
+ "Make sure you store the secret key, it cannot be recovered." : "Certifique-se de armazenar a chave secreta, ela não pode ser recuperada.",
+ "Add client" : "Adicionar cliente",
+ "Add" : "Adicionar",
"Show client secret" : "Mostra senha do cliente",
+ "Hide client secret" : "Ocultar segredo do cliente",
"Delete" : "Excluir"
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/pt_PT.js b/apps/oauth2/l10n/pt_PT.js
index 88e49233d01..09f9f952d30 100644
--- a/apps/oauth2/l10n/pt_PT.js
+++ b/apps/oauth2/l10n/pt_PT.js
@@ -8,12 +8,12 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "A app OAuth2 permite que os administradores configurem o fluxo de autenticação para também permitir autenticação compatível com OAuth2 de outras aplicações web.",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth2.0 permite que dispositivos externos peçam acesso a {instanceName}.",
- "Add client" : "Adicionar cliente",
"Name" : "Nome",
"Redirection URI" : "URI de redirecionamento",
- "Add" : "Adicionar",
"Client Identifier" : "Identificador de Cliente",
- "Secret" : "Segredo",
+ "Secret key" : "Código secreto",
+ "Add client" : "Adicionar cliente",
+ "Add" : "Adicionar",
"Show client secret" : "Mostrar segredo do cliente",
"Delete" : "Apagar"
},
diff --git a/apps/oauth2/l10n/pt_PT.json b/apps/oauth2/l10n/pt_PT.json
index 429024f8935..37b9ea94e98 100644
--- a/apps/oauth2/l10n/pt_PT.json
+++ b/apps/oauth2/l10n/pt_PT.json
@@ -6,12 +6,12 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "A app OAuth2 permite que os administradores configurem o fluxo de autenticação para também permitir autenticação compatível com OAuth2 de outras aplicações web.",
"OAuth 2.0 clients" : "Clientes OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth2.0 permite que dispositivos externos peçam acesso a {instanceName}.",
- "Add client" : "Adicionar cliente",
"Name" : "Nome",
"Redirection URI" : "URI de redirecionamento",
- "Add" : "Adicionar",
"Client Identifier" : "Identificador de Cliente",
- "Secret" : "Segredo",
+ "Secret key" : "Código secreto",
+ "Add client" : "Adicionar cliente",
+ "Add" : "Adicionar",
"Show client secret" : "Mostrar segredo do cliente",
"Delete" : "Apagar"
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
diff --git a/apps/oauth2/l10n/ru.js b/apps/oauth2/l10n/ru.js
index ed653d32bbd..0566016ee23 100644
--- a/apps/oauth2/l10n/ru.js
+++ b/apps/oauth2/l10n/ru.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Приложение OAuth2 позволяет администраторам настроить встроенный процесс проверки подлинности, чтобы также обеспечить совместимость OAuth2 с другими веб-приложениями.",
"OAuth 2.0 clients" : "Клиенты OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 позволяет внешним службам запрашивать доступ к {instanceName}.",
- "Add client" : "Добавить клиента",
"Name" : "Имя",
"Redirection URI" : "URI перенаправления",
- "Add" : "Добавить",
"Client Identifier" : "Идентификатор клиента",
- "Secret" : "Секрет",
+ "Secret key" : "Секретный ключ",
+ "Delete client" : "Удалить клиент",
+ "Make sure you store the secret key, it cannot be recovered." : "Убедитесь, что вы сохранили секретный ключ, он не может быть восстановлен.",
+ "Add client" : "Добавить клиент",
+ "Add" : "Добавить",
"Show client secret" : "Показать секретный ключ клиента",
+ "Hide client secret" : "Скрыть секрет клиента",
"Delete" : "Удалить"
},
"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/oauth2/l10n/ru.json b/apps/oauth2/l10n/ru.json
index d0f7b24ab93..0e34793a1a1 100644
--- a/apps/oauth2/l10n/ru.json
+++ b/apps/oauth2/l10n/ru.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Приложение OAuth2 позволяет администраторам настроить встроенный процесс проверки подлинности, чтобы также обеспечить совместимость OAuth2 с другими веб-приложениями.",
"OAuth 2.0 clients" : "Клиенты OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 позволяет внешним службам запрашивать доступ к {instanceName}.",
- "Add client" : "Добавить клиента",
"Name" : "Имя",
"Redirection URI" : "URI перенаправления",
- "Add" : "Добавить",
"Client Identifier" : "Идентификатор клиента",
- "Secret" : "Секрет",
+ "Secret key" : "Секретный ключ",
+ "Delete client" : "Удалить клиент",
+ "Make sure you store the secret key, it cannot be recovered." : "Убедитесь, что вы сохранили секретный ключ, он не может быть восстановлен.",
+ "Add client" : "Добавить клиент",
+ "Add" : "Добавить",
"Show client secret" : "Показать секретный ключ клиента",
+ "Hide client secret" : "Скрыть секрет клиента",
"Delete" : "Удалить"
},"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/oauth2/l10n/sc.js b/apps/oauth2/l10n/sc.js
index e580a8d9d59..833214ed6d7 100644
--- a/apps/oauth2/l10n/sc.js
+++ b/apps/oauth2/l10n/sc.js
@@ -8,12 +8,12 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "S'aplicatzione OAuth2 cunsentit a is amministradores de cunfigurare sa protzedura de autenticatzione integrada pro cunsentire fintzas s'autenticatzione cumpatìbile cun OAuth2 dae àteras aplicatziones in sa rete.",
"OAuth 2.0 clients" : "Clientes de OAuth 2.0 ",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 cunsentit a is zservìtzios de foras de pedire s'atzessu a {instanceName}.",
- "Add client" : "Agiunghe cliente",
"Name" : "Nùmene",
"Redirection URI" : "URI de torrada a deretare",
- "Add" : "Agiunghe",
"Client Identifier" : "Identificadore cliente",
- "Secret" : "Segretu",
+ "Secret key" : "Crae segreta",
+ "Add client" : "Agiunghe cliente",
+ "Add" : "Agiunghe",
"Show client secret" : "Mustra su segretu de su cliente",
"Delete" : "Cantzella"
},
diff --git a/apps/oauth2/l10n/sc.json b/apps/oauth2/l10n/sc.json
index 11b8d80ac94..61e866c2a39 100644
--- a/apps/oauth2/l10n/sc.json
+++ b/apps/oauth2/l10n/sc.json
@@ -6,12 +6,12 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "S'aplicatzione OAuth2 cunsentit a is amministradores de cunfigurare sa protzedura de autenticatzione integrada pro cunsentire fintzas s'autenticatzione cumpatìbile cun OAuth2 dae àteras aplicatziones in sa rete.",
"OAuth 2.0 clients" : "Clientes de OAuth 2.0 ",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 cunsentit a is zservìtzios de foras de pedire s'atzessu a {instanceName}.",
- "Add client" : "Agiunghe cliente",
"Name" : "Nùmene",
"Redirection URI" : "URI de torrada a deretare",
- "Add" : "Agiunghe",
"Client Identifier" : "Identificadore cliente",
- "Secret" : "Segretu",
+ "Secret key" : "Crae segreta",
+ "Add client" : "Agiunghe cliente",
+ "Add" : "Agiunghe",
"Show client secret" : "Mustra su segretu de su cliente",
"Delete" : "Cantzella"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/oauth2/l10n/si.js b/apps/oauth2/l10n/si.js
index 72272829cef..6dc3386f6ae 100644
--- a/apps/oauth2/l10n/si.js
+++ b/apps/oauth2/l10n/si.js
@@ -7,11 +7,11 @@ OC.L10N.register(
"Allows OAuth2 compatible authentication from other web applications." : "වෙනත් වියමන යෙදුම් වලින් OAuth2 අනුකූල සත්‍යාපනය සඳහා ඉඩ ලබා දේ.",
"OAuth 2.0 clients" : "OAuth 2.0 අනුග්‍රාහකයින්",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 බාහිර සේවාවන්ට {instanceName} වෙත ප්‍රවේශය ඉල්ලීමට ඉඩ දෙයි.",
- "Add client" : "අනුග්‍රාහකයක් එකතු කරන්න",
"Name" : "නම",
- "Add" : "එකතු කරන්න",
"Client Identifier" : "අනුග්‍රාහක හඳුන්වනය",
- "Secret" : "රහස",
+ "Secret key" : "රහස්‍ය යතුර",
+ "Add client" : "අනුග්‍රාහකයක් එකතු කරන්න",
+ "Add" : "එකතු කරන්න",
"Show client secret" : "අනුග්‍රාහකයේ රහස්‍යතාව පෙන්වන්න"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/si.json b/apps/oauth2/l10n/si.json
index 82ba8d9ae98..335d13c7a0c 100644
--- a/apps/oauth2/l10n/si.json
+++ b/apps/oauth2/l10n/si.json
@@ -5,11 +5,11 @@
"Allows OAuth2 compatible authentication from other web applications." : "වෙනත් වියමන යෙදුම් වලින් OAuth2 අනුකූල සත්‍යාපනය සඳහා ඉඩ ලබා දේ.",
"OAuth 2.0 clients" : "OAuth 2.0 අනුග්‍රාහකයින්",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 බාහිර සේවාවන්ට {instanceName} වෙත ප්‍රවේශය ඉල්ලීමට ඉඩ දෙයි.",
- "Add client" : "අනුග්‍රාහකයක් එකතු කරන්න",
"Name" : "නම",
- "Add" : "එකතු කරන්න",
"Client Identifier" : "අනුග්‍රාහක හඳුන්වනය",
- "Secret" : "රහස",
+ "Secret key" : "රහස්‍ය යතුර",
+ "Add client" : "අනුග්‍රාහකයක් එකතු කරන්න",
+ "Add" : "එකතු කරන්න",
"Show client secret" : "අනුග්‍රාහකයේ රහස්‍යතාව පෙන්වන්න"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/sk.js b/apps/oauth2/l10n/sk.js
index fec9a26f73a..5bd63fde0ff 100644
--- a/apps/oauth2/l10n/sk.js
+++ b/apps/oauth2/l10n/sk.js
@@ -6,15 +6,18 @@ OC.L10N.register(
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Povoliť overenie kompatibilné s OAuth2 iných webových aplikácií.",
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Aplikácia OAuth2 umožňuje správcom nakonfigurovať vstavaný postup overovania tak, aby povolil autentifikáciu kompatibilnú s protokolom OAuth2 aj z iných webových aplikácií.",
- "OAuth 2.0 clients" : "klienti OAuth 2.0",
+ "OAuth 2.0 clients" : "Klienti OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 umožňuje externým službám požiadať o prístup k {instanceName}.",
- "Add client" : "Pridať klienta",
"Name" : "Názov",
"Redirection URI" : "URI presmerovania",
- "Add" : "Pridať",
"Client Identifier" : "Identifikátor klienta",
- "Secret" : "Tajný kľúč",
+ "Secret key" : "Tajný kľúč",
+ "Delete client" : "Odstrániť klienta",
+ "Make sure you store the secret key, it cannot be recovered." : "Uistite sa, že ste uložili tajný kľúč. Nedá sa obnoviť.",
+ "Add client" : "Pridať klienta",
+ "Add" : "Pridať",
"Show client secret" : "Zobraziť tajomstvo klienta",
+ "Hide client secret" : "Skryť klienta",
"Delete" : "Zmazať"
},
"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);");
diff --git a/apps/oauth2/l10n/sk.json b/apps/oauth2/l10n/sk.json
index 641a2cdbbdf..f7f9ac19229 100644
--- a/apps/oauth2/l10n/sk.json
+++ b/apps/oauth2/l10n/sk.json
@@ -4,15 +4,18 @@
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Povoliť overenie kompatibilné s OAuth2 iných webových aplikácií.",
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Aplikácia OAuth2 umožňuje správcom nakonfigurovať vstavaný postup overovania tak, aby povolil autentifikáciu kompatibilnú s protokolom OAuth2 aj z iných webových aplikácií.",
- "OAuth 2.0 clients" : "klienti OAuth 2.0",
+ "OAuth 2.0 clients" : "Klienti OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 umožňuje externým službám požiadať o prístup k {instanceName}.",
- "Add client" : "Pridať klienta",
"Name" : "Názov",
"Redirection URI" : "URI presmerovania",
- "Add" : "Pridať",
"Client Identifier" : "Identifikátor klienta",
- "Secret" : "Tajný kľúč",
+ "Secret key" : "Tajný kľúč",
+ "Delete client" : "Odstrániť klienta",
+ "Make sure you store the secret key, it cannot be recovered." : "Uistite sa, že ste uložili tajný kľúč. Nedá sa obnoviť.",
+ "Add client" : "Pridať klienta",
+ "Add" : "Pridať",
"Show client secret" : "Zobraziť tajomstvo klienta",
+ "Hide client secret" : "Skryť klienta",
"Delete" : "Zmazať"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/sl.js b/apps/oauth2/l10n/sl.js
index 76656e59d8e..5786c7d8b36 100644
--- a/apps/oauth2/l10n/sl.js
+++ b/apps/oauth2/l10n/sl.js
@@ -8,12 +8,12 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Program OAuth2 omogoča skrbnikom nastavitev vgrajenega sistema overitve za skladnost z drugimi spletnimi programi.",
"OAuth 2.0 clients" : "Odjemalci OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "Program OAuth 2.0 omogoča zunanjim storitvam odobritev dostopa do {instanceName}.",
- "Add client" : "Dodaj odjemalca",
"Name" : "Ime",
"Redirection URI" : "Preusmeritveni naslov URI",
- "Add" : "Dodaj",
"Client Identifier" : "ID odjemalca",
- "Secret" : "Skrivna koda",
+ "Secret key" : "Skrivni ključ",
+ "Add client" : "Dodaj odjemalca",
+ "Add" : "Dodaj",
"Show client secret" : "Pokaži skrivno kodo odjemalca",
"Delete" : "Izbriši"
},
diff --git a/apps/oauth2/l10n/sl.json b/apps/oauth2/l10n/sl.json
index aa40e2e1564..a419d4c3263 100644
--- a/apps/oauth2/l10n/sl.json
+++ b/apps/oauth2/l10n/sl.json
@@ -6,12 +6,12 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Program OAuth2 omogoča skrbnikom nastavitev vgrajenega sistema overitve za skladnost z drugimi spletnimi programi.",
"OAuth 2.0 clients" : "Odjemalci OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "Program OAuth 2.0 omogoča zunanjim storitvam odobritev dostopa do {instanceName}.",
- "Add client" : "Dodaj odjemalca",
"Name" : "Ime",
"Redirection URI" : "Preusmeritveni naslov URI",
- "Add" : "Dodaj",
"Client Identifier" : "ID odjemalca",
- "Secret" : "Skrivna koda",
+ "Secret key" : "Skrivni ključ",
+ "Add client" : "Dodaj odjemalca",
+ "Add" : "Dodaj",
"Show client secret" : "Pokaži skrivno kodo odjemalca",
"Delete" : "Izbriši"
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
diff --git a/apps/oauth2/l10n/sq.js b/apps/oauth2/l10n/sq.js
index 81df5d3dc84..fe81fb5069d 100644
--- a/apps/oauth2/l10n/sq.js
+++ b/apps/oauth2/l10n/sq.js
@@ -3,12 +3,12 @@ OC.L10N.register(
{
"OAuth 2.0" : "O.Auth 2.0",
"OAuth 2.0 clients" : "Klientë OAuth 2.0",
- "Add client" : "Shto klient",
"Name" : "Emri",
"Redirection URI" : "URI Ridrejtimi",
- "Add" : "Shto ",
"Client Identifier" : "Identifikues Klienti",
- "Secret" : "Sekret",
+ "Secret key" : "Kyç i fshehtë",
+ "Add client" : "Shto klient",
+ "Add" : "Shto ",
"Delete" : "Delete"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/sq.json b/apps/oauth2/l10n/sq.json
index 8701c5a0552..c6623df185a 100644
--- a/apps/oauth2/l10n/sq.json
+++ b/apps/oauth2/l10n/sq.json
@@ -1,12 +1,12 @@
{ "translations": {
"OAuth 2.0" : "O.Auth 2.0",
"OAuth 2.0 clients" : "Klientë OAuth 2.0",
- "Add client" : "Shto klient",
"Name" : "Emri",
"Redirection URI" : "URI Ridrejtimi",
- "Add" : "Shto ",
"Client Identifier" : "Identifikues Klienti",
- "Secret" : "Sekret",
+ "Secret key" : "Kyç i fshehtë",
+ "Add client" : "Shto klient",
+ "Add" : "Shto ",
"Delete" : "Delete"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/sr.js b/apps/oauth2/l10n/sr.js
index 0cfe2ca684a..9ec881c1a2a 100644
--- a/apps/oauth2/l10n/sr.js
+++ b/apps/oauth2/l10n/sr.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 апликација дозвољава администраторима да подесе уграђени след индетификације тако да дозвољава и OAuth2 компатибилну идентификацију са других веб апликација.",
"OAuth 2.0 clients" : "OAuth 2.0 клијенти",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 омогућава спољним сервисима да захтевају приступ инстанци {instanceName}.",
- "Add client" : "Додај клијента",
"Name" : "Име",
"Redirection URI" : "Адреса за преусмеравање",
- "Add" : "Додај",
"Client Identifier" : "Идентификација клијента",
- "Secret" : "Тајна",
+ "Secret key" : "Тајни кључ ",
+ "Delete client" : "Обриши клијента",
+ "Make sure you store the secret key, it cannot be recovered." : "Сачувајте тајни кључ, нећете моћи поново да му приступите.",
+ "Add client" : "Додај клијента",
+ "Add" : "Додај",
"Show client secret" : "Прикажи клијентску лозинку",
+ "Hide client secret" : "Сакриј клијентску тајну",
"Delete" : "Обриши"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/oauth2/l10n/sr.json b/apps/oauth2/l10n/sr.json
index ae7a17a037d..815e73ada5a 100644
--- a/apps/oauth2/l10n/sr.json
+++ b/apps/oauth2/l10n/sr.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 апликација дозвољава администраторима да подесе уграђени след индетификације тако да дозвољава и OAuth2 компатибилну идентификацију са других веб апликација.",
"OAuth 2.0 clients" : "OAuth 2.0 клијенти",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 омогућава спољним сервисима да захтевају приступ инстанци {instanceName}.",
- "Add client" : "Додај клијента",
"Name" : "Име",
"Redirection URI" : "Адреса за преусмеравање",
- "Add" : "Додај",
"Client Identifier" : "Идентификација клијента",
- "Secret" : "Тајна",
+ "Secret key" : "Тајни кључ ",
+ "Delete client" : "Обриши клијента",
+ "Make sure you store the secret key, it cannot be recovered." : "Сачувајте тајни кључ, нећете моћи поново да му приступите.",
+ "Add client" : "Додај клијента",
+ "Add" : "Додај",
"Show client secret" : "Прикажи клијентску лозинку",
+ "Hide client secret" : "Сакриј клијентску тајну",
"Delete" : "Обриши"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/sv.js b/apps/oauth2/l10n/sv.js
index 343e7516b6b..4d55cf91c3a 100644
--- a/apps/oauth2/l10n/sv.js
+++ b/apps/oauth2/l10n/sv.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "I appen OAuth2 kan administratörer konfigurera det inbyggda autentiseringsflödet för att även tillåta OAuth2-kompatibel autentisering från andra webbapplikationer.",
"OAuth 2.0 clients" : "OAuth 2.0 klienter",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 tillåter externa tjänster att begära åtkomst till {instanceName}.",
- "Add client" : "Lägg till klient",
"Name" : "Namn",
"Redirection URI" : "Omdirigerings-URI",
- "Add" : "Lägg till",
"Client Identifier" : "Klientidentifierare",
- "Secret" : "Hemlighet",
+ "Secret key" : "Hemlig nyckel",
+ "Delete client" : "Ta bort klient",
+ "Make sure you store the secret key, it cannot be recovered." : "Se till att du lagrar den hemliga nyckeln, den kan inte återställas.",
+ "Add client" : "Lägg till klient",
+ "Add" : "Lägg till",
"Show client secret" : "Visa klienthemlighet",
+ "Hide client secret" : "Dölj klienthemlighet",
"Delete" : "Ta bort"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/sv.json b/apps/oauth2/l10n/sv.json
index 1e02310573e..064e6923f96 100644
--- a/apps/oauth2/l10n/sv.json
+++ b/apps/oauth2/l10n/sv.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "I appen OAuth2 kan administratörer konfigurera det inbyggda autentiseringsflödet för att även tillåta OAuth2-kompatibel autentisering från andra webbapplikationer.",
"OAuth 2.0 clients" : "OAuth 2.0 klienter",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 tillåter externa tjänster att begära åtkomst till {instanceName}.",
- "Add client" : "Lägg till klient",
"Name" : "Namn",
"Redirection URI" : "Omdirigerings-URI",
- "Add" : "Lägg till",
"Client Identifier" : "Klientidentifierare",
- "Secret" : "Hemlighet",
+ "Secret key" : "Hemlig nyckel",
+ "Delete client" : "Ta bort klient",
+ "Make sure you store the secret key, it cannot be recovered." : "Se till att du lagrar den hemliga nyckeln, den kan inte återställas.",
+ "Add client" : "Lägg till klient",
+ "Add" : "Lägg till",
"Show client secret" : "Visa klienthemlighet",
+ "Hide client secret" : "Dölj klienthemlighet",
"Delete" : "Ta bort"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/sw.js b/apps/oauth2/l10n/sw.js
new file mode 100644
index 00000000000..44e346ffa4f
--- /dev/null
+++ b/apps/oauth2/l10n/sw.js
@@ -0,0 +1,23 @@
+OC.L10N.register(
+ "oauth2",
+ {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Mteja wako hajaidhinishwa kuunganisha. Tafadhali mjulishe msimamizi wa mteja wako.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "URL yako ya kuelekeza kwingine inahitaji kuwa URL kamili kwa mfano: https://yourdomain.com/path",
+ "OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Huruhusu uthibitishaji tangamanifu wa OAuth2 kutoka kwa programu zingine za wavuti.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Programu ya OAuth2 huruhusu wasimamizi kusanidi utendakazi wa uthibitishaji uliojengewa ndani ili kuruhusu pia uthibitishaji unaooana na OAuth2 kutoka kwa programu zingine za wavuti.",
+ "OAuth 2.0 clients" : "OAuth 2.0 clients",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 inaruhusu huduma za nje kuomba ufikiaji {instanceName}.",
+ "Name" : "Jina",
+ "Redirection URI" : "URI ya kuelekeza kwingine",
+ "Client Identifier" : "Kitambulisho cha Mteja",
+ "Secret key" : "Ufunguo wa siri",
+ "Delete client" : "Futa mteja",
+ "Make sure you store the secret key, it cannot be recovered." : "Hakikisha umehifadhi ufunguo wa siri, hauwezi kurejeshwa.",
+ "Add client" : "Ongeza mteja",
+ "Add" : "Ongeza",
+ "Show client secret" : "Onyesha siri ya mteja",
+ "Hide client secret" : "Ficha siri ya mteja",
+ "Delete" : "Futa"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/sw.json b/apps/oauth2/l10n/sw.json
new file mode 100644
index 00000000000..0bdbdd3a440
--- /dev/null
+++ b/apps/oauth2/l10n/sw.json
@@ -0,0 +1,21 @@
+{ "translations": {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Mteja wako hajaidhinishwa kuunganisha. Tafadhali mjulishe msimamizi wa mteja wako.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "URL yako ya kuelekeza kwingine inahitaji kuwa URL kamili kwa mfano: https://yourdomain.com/path",
+ "OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Huruhusu uthibitishaji tangamanifu wa OAuth2 kutoka kwa programu zingine za wavuti.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Programu ya OAuth2 huruhusu wasimamizi kusanidi utendakazi wa uthibitishaji uliojengewa ndani ili kuruhusu pia uthibitishaji unaooana na OAuth2 kutoka kwa programu zingine za wavuti.",
+ "OAuth 2.0 clients" : "OAuth 2.0 clients",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 inaruhusu huduma za nje kuomba ufikiaji {instanceName}.",
+ "Name" : "Jina",
+ "Redirection URI" : "URI ya kuelekeza kwingine",
+ "Client Identifier" : "Kitambulisho cha Mteja",
+ "Secret key" : "Ufunguo wa siri",
+ "Delete client" : "Futa mteja",
+ "Make sure you store the secret key, it cannot be recovered." : "Hakikisha umehifadhi ufunguo wa siri, hauwezi kurejeshwa.",
+ "Add client" : "Ongeza mteja",
+ "Add" : "Ongeza",
+ "Show client secret" : "Onyesha siri ya mteja",
+ "Hide client secret" : "Ficha siri ya mteja",
+ "Delete" : "Futa"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/oauth2/l10n/tr.js b/apps/oauth2/l10n/tr.js
index ba164214f20..eb672477de8 100644
--- a/apps/oauth2/l10n/tr.js
+++ b/apps/oauth2/l10n/tr.js
@@ -2,19 +2,22 @@ OC.L10N.register(
"oauth2",
{
"Your client is not authorized to connect. Please inform the administrator of your client." : "İstemcinizin bağlanma izni yok. Lütfen BT yöneticinize istemciniz ile ilgili bilgi verin.",
- "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Yönlendirme adresi https://websitem.com/yol gibi tam bir adres olmalıdır",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Yönlendirme adresi https://sitem.com/yol gibi tam bir adres olmalıdır",
"OAuth 2.0" : "OAuth 2.0",
- "Allows OAuth2 compatible authentication from other web applications." : "Diğer web uygulamaları için OAuth2 uyumlu kimlik doğrulaması sağlar.",
- "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 uygulaması, BT yöneticilerinin iç kimlik doğrulama iş akışını yapılandırabilmesini ve diğer web uygulamaları için OAuth2 uyumlu kimlik doğrulaması kullanılabilmesini sağlar.",
+ "Allows OAuth2 compatible authentication from other web applications." : "Diğer site uygulamaları için OAuth2 uyumlu kimlik doğrulaması sağlar.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 uygulaması, BT yöneticilerinin iç kimlik doğrulama iş akışını yapılandırabilmesini ve diğer site uygulamaları için OAuth2 uyumlu kimlik doğrulaması kullanılabilmesini sağlar.",
"OAuth 2.0 clients" : "OAuth 2.0 istemcileri",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 dış hizmetlerin {instanceName} için erişim isteğinde bulunmasını sağlar.",
- "Add client" : "İstemci ekle",
"Name" : "Ad",
"Redirection URI" : "Yönlendirme adresi",
- "Add" : "Ekle",
"Client Identifier" : "İstemci belirteci",
- "Secret" : "Parola",
+ "Secret key" : "Gizli anahtar",
+ "Delete client" : "İstemciyi sil",
+ "Make sure you store the secret key, it cannot be recovered." : "Yeniden öğrenilemeyeceği için gizli anahtarı kaydettiğinizden emin olun.",
+ "Add client" : "İstemci ekle",
+ "Add" : "Ekle",
"Show client secret" : "İstemci parolasını görüntüle",
+ "Hide client secret" : "İstemci parolasını gizle",
"Delete" : "Sil"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/oauth2/l10n/tr.json b/apps/oauth2/l10n/tr.json
index a2b5999bf63..ec9e8fc1e83 100644
--- a/apps/oauth2/l10n/tr.json
+++ b/apps/oauth2/l10n/tr.json
@@ -1,18 +1,21 @@
{ "translations": {
"Your client is not authorized to connect. Please inform the administrator of your client." : "İstemcinizin bağlanma izni yok. Lütfen BT yöneticinize istemciniz ile ilgili bilgi verin.",
- "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Yönlendirme adresi https://websitem.com/yol gibi tam bir adres olmalıdır",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Yönlendirme adresi https://sitem.com/yol gibi tam bir adres olmalıdır",
"OAuth 2.0" : "OAuth 2.0",
- "Allows OAuth2 compatible authentication from other web applications." : "Diğer web uygulamaları için OAuth2 uyumlu kimlik doğrulaması sağlar.",
- "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 uygulaması, BT yöneticilerinin iç kimlik doğrulama iş akışını yapılandırabilmesini ve diğer web uygulamaları için OAuth2 uyumlu kimlik doğrulaması kullanılabilmesini sağlar.",
+ "Allows OAuth2 compatible authentication from other web applications." : "Diğer site uygulamaları için OAuth2 uyumlu kimlik doğrulaması sağlar.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 uygulaması, BT yöneticilerinin iç kimlik doğrulama iş akışını yapılandırabilmesini ve diğer site uygulamaları için OAuth2 uyumlu kimlik doğrulaması kullanılabilmesini sağlar.",
"OAuth 2.0 clients" : "OAuth 2.0 istemcileri",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 dış hizmetlerin {instanceName} için erişim isteğinde bulunmasını sağlar.",
- "Add client" : "İstemci ekle",
"Name" : "Ad",
"Redirection URI" : "Yönlendirme adresi",
- "Add" : "Ekle",
"Client Identifier" : "İstemci belirteci",
- "Secret" : "Parola",
+ "Secret key" : "Gizli anahtar",
+ "Delete client" : "İstemciyi sil",
+ "Make sure you store the secret key, it cannot be recovered." : "Yeniden öğrenilemeyeceği için gizli anahtarı kaydettiğinizden emin olun.",
+ "Add client" : "İstemci ekle",
+ "Add" : "Ekle",
"Show client secret" : "İstemci parolasını görüntüle",
+ "Hide client secret" : "İstemci parolasını gizle",
"Delete" : "Sil"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/ug.js b/apps/oauth2/l10n/ug.js
new file mode 100644
index 00000000000..89db1a948ef
--- /dev/null
+++ b/apps/oauth2/l10n/ug.js
@@ -0,0 +1,23 @@
+OC.L10N.register(
+ "oauth2",
+ {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "خېرىدارىڭىزنىڭ ئۇلىنىش ھوقۇقى يوق. خېرىدارىڭىزنىڭ باشقۇرغۇچىغا خەۋەر قىلىڭ.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "قايتا نىشانلانغان URL ئادرېسىڭىز تولۇق URL بولۇشى كېرەك: https://yourdomain.com/path",
+ "OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "باشقا تور پروگراممىلىرىدىن OAuth2 ماسلاشتۇرۇلغان دەلىللەشكە يول قويىدۇ.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 دېتالى باشقۇرغۇچىنىڭ ئىچىگە دەلىللەش خىزمەت ئېقىمىنى سەپلەپ ، باشقا تور قوللىنىشچان پروگراممىلىرىنىڭ OAuth2 ماسلاشتۇرۇلغان دەلىللىشىگە يول قويىدۇ.",
+ "OAuth 2.0 clients" : "OAuth 2.0 خېرىدارى",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 سىرتقى مۇلازىمەتلەرنىڭ {instanceName} access نى زىيارەت قىلىشىنى تەلەپ قىلىدۇ.",
+ "Name" : "ئاتى",
+ "Redirection URI" : "قايتا نىشانلاش URI",
+ "Client Identifier" : "Client Identifier",
+ "Secret key" : "مەخپىي ئاچقۇچ",
+ "Delete client" : "خېرىدارنى ئۆچۈرۈڭ",
+ "Make sure you store the secret key, it cannot be recovered." : "مەخپىي ئاچقۇچنى ساقلىغانلىقىڭىزنى جەزملەشتۈرۈڭ ، ئەسلىگە كەلتۈرگىلى بولمايدۇ.",
+ "Add client" : "خېرىدار قوشۇڭ",
+ "Add" : "قوش",
+ "Show client secret" : "خېرىدارلارنىڭ مەخپىيىتىنى كۆرسىتىڭ",
+ "Hide client secret" : "خېرىدارلارنىڭ مەخپىيىتىنى يوشۇرۇش",
+ "Delete" : "ئۆچۈر"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/ug.json b/apps/oauth2/l10n/ug.json
new file mode 100644
index 00000000000..4dac11f85c2
--- /dev/null
+++ b/apps/oauth2/l10n/ug.json
@@ -0,0 +1,21 @@
+{ "translations": {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "خېرىدارىڭىزنىڭ ئۇلىنىش ھوقۇقى يوق. خېرىدارىڭىزنىڭ باشقۇرغۇچىغا خەۋەر قىلىڭ.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "قايتا نىشانلانغان URL ئادرېسىڭىز تولۇق URL بولۇشى كېرەك: https://yourdomain.com/path",
+ "OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "باشقا تور پروگراممىلىرىدىن OAuth2 ماسلاشتۇرۇلغان دەلىللەشكە يول قويىدۇ.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 دېتالى باشقۇرغۇچىنىڭ ئىچىگە دەلىللەش خىزمەت ئېقىمىنى سەپلەپ ، باشقا تور قوللىنىشچان پروگراممىلىرىنىڭ OAuth2 ماسلاشتۇرۇلغان دەلىللىشىگە يول قويىدۇ.",
+ "OAuth 2.0 clients" : "OAuth 2.0 خېرىدارى",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 سىرتقى مۇلازىمەتلەرنىڭ {instanceName} access نى زىيارەت قىلىشىنى تەلەپ قىلىدۇ.",
+ "Name" : "ئاتى",
+ "Redirection URI" : "قايتا نىشانلاش URI",
+ "Client Identifier" : "Client Identifier",
+ "Secret key" : "مەخپىي ئاچقۇچ",
+ "Delete client" : "خېرىدارنى ئۆچۈرۈڭ",
+ "Make sure you store the secret key, it cannot be recovered." : "مەخپىي ئاچقۇچنى ساقلىغانلىقىڭىزنى جەزملەشتۈرۈڭ ، ئەسلىگە كەلتۈرگىلى بولمايدۇ.",
+ "Add client" : "خېرىدار قوشۇڭ",
+ "Add" : "قوش",
+ "Show client secret" : "خېرىدارلارنىڭ مەخپىيىتىنى كۆرسىتىڭ",
+ "Hide client secret" : "خېرىدارلارنىڭ مەخپىيىتىنى يوشۇرۇش",
+ "Delete" : "ئۆچۈر"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/oauth2/l10n/uk.js b/apps/oauth2/l10n/uk.js
index fe23bda5602..8c3b6433b20 100644
--- a/apps/oauth2/l10n/uk.js
+++ b/apps/oauth2/l10n/uk.js
@@ -4,17 +4,20 @@ OC.L10N.register(
"Your client is not authorized to connect. Please inform the administrator of your client." : "Ваш клієнт не авторизований для підключення. Будь ласка, повідомте адміністратора вашого клієнта.",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Ваша URL-адреса переспрямування має бути повною URL-адресою, наприклад: https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
- "Allows OAuth2 compatible authentication from other web applications." : "Дозволяє автентифікацію, сумісну з OAuth2, з інших веб-програм.",
- "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Програма OAuth2 дозволяє адміністраторам налаштувати вбудований робочий процес автентифікації, щоб також дозволити сумісну з OAuth2 автентифікацію з інших веб-програм.",
+ "Allows OAuth2 compatible authentication from other web applications." : "Дозволяє авторизацію OAuth2, яка підтримується іншими вебзастосунками.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Застосунок OAuth2 дозволяє адміністраторам налаштувати вбудований процес авторизації, який дозволить використовувати сумісний з OAuth2 метод авторизації для сторонніз вебзастосунків.",
"OAuth 2.0 clients" : "Клієнти OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 дозволяє зовнішнім службам запитувати доступ до {instanceName}.",
- "Add client" : "Додати клієнта",
"Name" : "Ім'я",
"Redirection URI" : "URI перенаправлення",
- "Add" : "Додати",
"Client Identifier" : "Ідентифікатор клієнта",
- "Secret" : "Секретне",
- "Show client secret" : "Показати секрет клієнта",
+ "Secret key" : "Пароль",
+ "Delete client" : "Вилучити клієнта",
+ "Make sure you store the secret key, it cannot be recovered." : "Обов'язково збережіть секретний ключ, його неможливо відновити.",
+ "Add client" : "Додати клієнта",
+ "Add" : "Додати",
+ "Show client secret" : "Показати ключ клієнта",
+ "Hide client secret" : "Приховати ключ клієнта",
"Delete" : "Вилучити"
},
"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);");
diff --git a/apps/oauth2/l10n/uk.json b/apps/oauth2/l10n/uk.json
index f749a3bf6bb..ad7906e1795 100644
--- a/apps/oauth2/l10n/uk.json
+++ b/apps/oauth2/l10n/uk.json
@@ -2,17 +2,20 @@
"Your client is not authorized to connect. Please inform the administrator of your client." : "Ваш клієнт не авторизований для підключення. Будь ласка, повідомте адміністратора вашого клієнта.",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Ваша URL-адреса переспрямування має бути повною URL-адресою, наприклад: https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
- "Allows OAuth2 compatible authentication from other web applications." : "Дозволяє автентифікацію, сумісну з OAuth2, з інших веб-програм.",
- "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Програма OAuth2 дозволяє адміністраторам налаштувати вбудований робочий процес автентифікації, щоб також дозволити сумісну з OAuth2 автентифікацію з інших веб-програм.",
+ "Allows OAuth2 compatible authentication from other web applications." : "Дозволяє авторизацію OAuth2, яка підтримується іншими вебзастосунками.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Застосунок OAuth2 дозволяє адміністраторам налаштувати вбудований процес авторизації, який дозволить використовувати сумісний з OAuth2 метод авторизації для сторонніз вебзастосунків.",
"OAuth 2.0 clients" : "Клієнти OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 дозволяє зовнішнім службам запитувати доступ до {instanceName}.",
- "Add client" : "Додати клієнта",
"Name" : "Ім'я",
"Redirection URI" : "URI перенаправлення",
- "Add" : "Додати",
"Client Identifier" : "Ідентифікатор клієнта",
- "Secret" : "Секретне",
- "Show client secret" : "Показати секрет клієнта",
+ "Secret key" : "Пароль",
+ "Delete client" : "Вилучити клієнта",
+ "Make sure you store the secret key, it cannot be recovered." : "Обов'язково збережіть секретний ключ, його неможливо відновити.",
+ "Add client" : "Додати клієнта",
+ "Add" : "Додати",
+ "Show client secret" : "Показати ключ клієнта",
+ "Hide client secret" : "Приховати ключ клієнта",
"Delete" : "Вилучити"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (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/oauth2/l10n/vi.js b/apps/oauth2/l10n/vi.js
index c34733e9912..3800d4efd5f 100644
--- a/apps/oauth2/l10n/vi.js
+++ b/apps/oauth2/l10n/vi.js
@@ -8,12 +8,11 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Ứng dụng OAuth2 cho phép các quản trị viên thiết lập dòng chảy công việc xác thực để cũng cho phép xác thực tương thích với OAuth2 từ các ứng dụng web khác.",
"OAuth 2.0 clients" : "kết nối OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 cho phép các dịch vụ ở ngoài yêu cầu quyền truy cập vào {instanceName}.",
- "Add client" : "Thêm kết nối",
"Name" : "Tên",
"Redirection URI" : "Liên kết chuyển tiếp",
- "Add" : "Thêm",
"Client Identifier" : "Mã định danh ứng dụng khách",
- "Secret" : "Mật khẩu",
+ "Add client" : "Thêm kết nối",
+ "Add" : "Thêm",
"Show client secret" : "Hiện bí mật ứng dụng khách",
"Delete" : "Xóa"
},
diff --git a/apps/oauth2/l10n/vi.json b/apps/oauth2/l10n/vi.json
index f0611b2c460..c845ec0e30d 100644
--- a/apps/oauth2/l10n/vi.json
+++ b/apps/oauth2/l10n/vi.json
@@ -6,12 +6,11 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Ứng dụng OAuth2 cho phép các quản trị viên thiết lập dòng chảy công việc xác thực để cũng cho phép xác thực tương thích với OAuth2 từ các ứng dụng web khác.",
"OAuth 2.0 clients" : "kết nối OAuth 2.0",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 cho phép các dịch vụ ở ngoài yêu cầu quyền truy cập vào {instanceName}.",
- "Add client" : "Thêm kết nối",
"Name" : "Tên",
"Redirection URI" : "Liên kết chuyển tiếp",
- "Add" : "Thêm",
"Client Identifier" : "Mã định danh ứng dụng khách",
- "Secret" : "Mật khẩu",
+ "Add client" : "Thêm kết nối",
+ "Add" : "Thêm",
"Show client secret" : "Hiện bí mật ứng dụng khách",
"Delete" : "Xóa"
},"pluralForm" :"nplurals=1; plural=0;"
diff --git a/apps/oauth2/l10n/zh_CN.js b/apps/oauth2/l10n/zh_CN.js
index 2806db7428c..5f2ee894089 100644
--- a/apps/oauth2/l10n/zh_CN.js
+++ b/apps/oauth2/l10n/zh_CN.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 应用允许管理员配置内置的验证工作流,同时允许其它网站应用的OAuth2 兼容验证。",
"OAuth 2.0 clients" : "OAuth 2.0 客户端",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 允许外部服务请求访问 {instanceName}。",
- "Add client" : "添加客户端",
"Name" : "名称",
"Redirection URI" : "跳转URI",
+ "Client Identifier" : "客户端标识",
+ "Secret key" : "密钥",
+ "Delete client" : "删除客户端",
+ "Make sure you store the secret key, it cannot be recovered." : "请确保您存储了密钥,它无法恢复。",
+ "Add client" : "添加客户端",
"Add" : "添加",
- "Client Identifier" : "客户端 ID",
- "Secret" : "Secret",
- "Show client secret" : "显示客户端 secret",
+ "Show client secret" : "显示客户端密钥",
+ "Hide client secret" : "隐藏客户端密钥",
"Delete" : "删除"
},
"nplurals=1; plural=0;");
diff --git a/apps/oauth2/l10n/zh_CN.json b/apps/oauth2/l10n/zh_CN.json
index 4aa0d6bf0b6..4b1c4270e48 100644
--- a/apps/oauth2/l10n/zh_CN.json
+++ b/apps/oauth2/l10n/zh_CN.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 应用允许管理员配置内置的验证工作流,同时允许其它网站应用的OAuth2 兼容验证。",
"OAuth 2.0 clients" : "OAuth 2.0 客户端",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 允许外部服务请求访问 {instanceName}。",
- "Add client" : "添加客户端",
"Name" : "名称",
"Redirection URI" : "跳转URI",
+ "Client Identifier" : "客户端标识",
+ "Secret key" : "密钥",
+ "Delete client" : "删除客户端",
+ "Make sure you store the secret key, it cannot be recovered." : "请确保您存储了密钥,它无法恢复。",
+ "Add client" : "添加客户端",
"Add" : "添加",
- "Client Identifier" : "客户端 ID",
- "Secret" : "Secret",
- "Show client secret" : "显示客户端 secret",
+ "Show client secret" : "显示客户端密钥",
+ "Hide client secret" : "隐藏客户端密钥",
"Delete" : "删除"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/zh_HK.js b/apps/oauth2/l10n/zh_HK.js
index a21e4029f1b..727019e492c 100644
--- a/apps/oauth2/l10n/zh_HK.js
+++ b/apps/oauth2/l10n/zh_HK.js
@@ -8,13 +8,16 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 APPs允許管理員為其他支援OAuth2的網頁應用程式啟用原生的驗證流程。",
"OAuth 2.0 clients" : "OAuth 2.0 客戶端",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 允許外部服務要求存取 {instanceName}。",
- "Add client" : "新增第三方應用程式",
"Name" : "名稱",
"Redirection URI" : "重導向 URI",
- "Add" : "新增",
"Client Identifier" : "用戶識別",
- "Secret" : "密鑰",
+ "Secret key" : "私密密鑰",
+ "Delete client" : "刪除客戶端",
+ "Make sure you store the secret key, it cannot be recovered." : "請確保妥善保存密鑰,因為它無法復得。",
+ "Add client" : "新增第三方應用程式",
+ "Add" : "新增",
"Show client secret" : "顯示客戶端密碼",
+ "Hide client secret" : "隱藏客戶端密碼",
"Delete" : "刪除"
},
"nplurals=1; plural=0;");
diff --git a/apps/oauth2/l10n/zh_HK.json b/apps/oauth2/l10n/zh_HK.json
index 88b3cee8e7a..1773d8ec559 100644
--- a/apps/oauth2/l10n/zh_HK.json
+++ b/apps/oauth2/l10n/zh_HK.json
@@ -6,13 +6,16 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 APPs允許管理員為其他支援OAuth2的網頁應用程式啟用原生的驗證流程。",
"OAuth 2.0 clients" : "OAuth 2.0 客戶端",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 允許外部服務要求存取 {instanceName}。",
- "Add client" : "新增第三方應用程式",
"Name" : "名稱",
"Redirection URI" : "重導向 URI",
- "Add" : "新增",
"Client Identifier" : "用戶識別",
- "Secret" : "密鑰",
+ "Secret key" : "私密密鑰",
+ "Delete client" : "刪除客戶端",
+ "Make sure you store the secret key, it cannot be recovered." : "請確保妥善保存密鑰,因為它無法復得。",
+ "Add client" : "新增第三方應用程式",
+ "Add" : "新增",
"Show client secret" : "顯示客戶端密碼",
+ "Hide client secret" : "隱藏客戶端密碼",
"Delete" : "刪除"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/oauth2/l10n/zh_TW.js b/apps/oauth2/l10n/zh_TW.js
index c8c2ecd9570..e61fe31d36b 100644
--- a/apps/oauth2/l10n/zh_TW.js
+++ b/apps/oauth2/l10n/zh_TW.js
@@ -1,20 +1,23 @@
OC.L10N.register(
"oauth2",
{
- "Your client is not authorized to connect. Please inform the administrator of your client." : "您的客戶端無權連線。請通知您客戶端的管理員。",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "您的客戶端無連線授權。請通知您客戶端的管理員。",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "您的重新導向 URL 必須為完整的 URL,例如:https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
- "Allows OAuth2 compatible authentication from other web applications." : "允許來自其他網路應用程式的 OAuth2 相容身份驗證。",
- "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 應用程式讓管理員可以設定內建的身份驗證工作流程,以讓其他網路應用程式可以進行相容於 OAuth2 的身份驗證。",
+ "Allows OAuth2 compatible authentication from other web applications." : "允許來自其他網路應用程式的 OAuth2 相容身份認證。",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 應用程式讓管理員可以設定內建的身份認證工作流程,以讓其他網路應用程式可以進行相容於 OAuth2 的身份認證。",
"OAuth 2.0 clients" : "OAuth 2.0 客戶端",
- "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 讓外部服務請求存取 {instanceName}。",
- "Add client" : "新增客戶端",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 讓外部服務請求能存取 {instanceName}。",
"Name" : "名稱",
"Redirection URI" : "重新導向 URI",
- "Add" : "新增",
"Client Identifier" : "客戶端識別",
- "Secret" : "密碼",
+ "Secret key" : "私密金鑰",
+ "Delete client" : "刪除客戶端",
+ "Make sure you store the secret key, it cannot be recovered." : "請確定您儲存了私鑰,其無法還原。",
+ "Add client" : "新增客戶端",
+ "Add" : "新增",
"Show client secret" : "顯示客戶端密碼",
+ "Hide client secret" : "隱藏客戶端密碼",
"Delete" : "刪除"
},
"nplurals=1; plural=0;");
diff --git a/apps/oauth2/l10n/zh_TW.json b/apps/oauth2/l10n/zh_TW.json
index 95890440cca..ba0a879f152 100644
--- a/apps/oauth2/l10n/zh_TW.json
+++ b/apps/oauth2/l10n/zh_TW.json
@@ -1,18 +1,21 @@
{ "translations": {
- "Your client is not authorized to connect. Please inform the administrator of your client." : "您的客戶端無權連線。請通知您客戶端的管理員。",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "您的客戶端無連線授權。請通知您客戶端的管理員。",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "您的重新導向 URL 必須為完整的 URL,例如:https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
- "Allows OAuth2 compatible authentication from other web applications." : "允許來自其他網路應用程式的 OAuth2 相容身份驗證。",
- "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 應用程式讓管理員可以設定內建的身份驗證工作流程,以讓其他網路應用程式可以進行相容於 OAuth2 的身份驗證。",
+ "Allows OAuth2 compatible authentication from other web applications." : "允許來自其他網路應用程式的 OAuth2 相容身份認證。",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 應用程式讓管理員可以設定內建的身份認證工作流程,以讓其他網路應用程式可以進行相容於 OAuth2 的身份認證。",
"OAuth 2.0 clients" : "OAuth 2.0 客戶端",
- "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 讓外部服務請求存取 {instanceName}。",
- "Add client" : "新增客戶端",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 讓外部服務請求能存取 {instanceName}。",
"Name" : "名稱",
"Redirection URI" : "重新導向 URI",
- "Add" : "新增",
"Client Identifier" : "客戶端識別",
- "Secret" : "密碼",
+ "Secret key" : "私密金鑰",
+ "Delete client" : "刪除客戶端",
+ "Make sure you store the secret key, it cannot be recovered." : "請確定您儲存了私鑰,其無法還原。",
+ "Add client" : "新增客戶端",
+ "Add" : "新增",
"Show client secret" : "顯示客戶端密碼",
+ "Hide client secret" : "隱藏客戶端密碼",
"Delete" : "刪除"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/oauth2/lib/BackgroundJob/CleanupExpiredAuthorizationCode.php b/apps/oauth2/lib/BackgroundJob/CleanupExpiredAuthorizationCode.php
new file mode 100644
index 00000000000..b819a45ace2
--- /dev/null
+++ b/apps/oauth2/lib/BackgroundJob/CleanupExpiredAuthorizationCode.php
@@ -0,0 +1,43 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+
+namespace OCA\OAuth2\BackgroundJob;
+
+use OCA\OAuth2\Db\AccessTokenMapper;
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\BackgroundJob\TimedJob;
+use OCP\DB\Exception;
+use Psr\Log\LoggerInterface;
+
+class CleanupExpiredAuthorizationCode extends TimedJob {
+
+ public function __construct(
+ ITimeFactory $timeFactory,
+ private AccessTokenMapper $accessTokenMapper,
+ private LoggerInterface $logger,
+ ) {
+ parent::__construct($timeFactory);
+ // 30 days
+ $this->setInterval(60 * 60 * 24 * 30);
+ $this->setTimeSensitivity(self::TIME_INSENSITIVE);
+ }
+
+ /**
+ * @param mixed $argument
+ * @inheritDoc
+ */
+ protected function run($argument): void {
+ try {
+ $this->accessTokenMapper->cleanupExpiredAuthorizationCode();
+ } catch (Exception $e) {
+ $this->logger->warning('Failed to cleanup tokens with expired authorization code', ['exception' => $e]);
+ }
+ }
+}
diff --git a/apps/oauth2/lib/Command/ImportLegacyOcClient.php b/apps/oauth2/lib/Command/ImportLegacyOcClient.php
new file mode 100644
index 00000000000..acdc57cf991
--- /dev/null
+++ b/apps/oauth2/lib/Command/ImportLegacyOcClient.php
@@ -0,0 +1,76 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\OAuth2\Command;
+
+use OCA\OAuth2\Db\Client;
+use OCA\OAuth2\Db\ClientMapper;
+use OCP\IConfig;
+use OCP\Security\ICrypto;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class ImportLegacyOcClient extends Command {
+ private const ARGUMENT_CLIENT_ID = 'client-id';
+ private const ARGUMENT_CLIENT_SECRET = 'client-secret';
+
+ public function __construct(
+ private readonly IConfig $config,
+ private readonly ICrypto $crypto,
+ private readonly ClientMapper $clientMapper,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ $this->setName('oauth2:import-legacy-oc-client');
+ $this->setDescription('This command is only required to be run on instances which were migrated from ownCloud without the oauth2.enable_oc_clients system config! Import a legacy Oauth2 client from an ownCloud instance and migrate it. The data is expected to be straight out of the database table oc_oauth2_clients.');
+ $this->addArgument(
+ self::ARGUMENT_CLIENT_ID,
+ InputArgument::REQUIRED,
+ 'Value of the "identifier" column',
+ );
+ $this->addArgument(
+ self::ARGUMENT_CLIENT_SECRET,
+ InputArgument::REQUIRED,
+ 'Value of the "secret" column',
+ );
+ }
+
+ public function isEnabled(): bool {
+ return $this->config->getSystemValueBool('oauth2.enable_oc_clients', false);
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int {
+ /** @var string $clientId */
+ $clientId = $input->getArgument(self::ARGUMENT_CLIENT_ID);
+
+ /** @var string $clientSecret */
+ $clientSecret = $input->getArgument(self::ARGUMENT_CLIENT_SECRET);
+
+ // Should not happen but just to be sure
+ if (empty($clientId) || empty($clientSecret)) {
+ return 1;
+ }
+
+ $hashedClientSecret = bin2hex($this->crypto->calculateHMAC($clientSecret));
+
+ $client = new Client();
+ $client->setName('ownCloud Desktop Client');
+ $client->setRedirectUri('http://localhost:*');
+ $client->setClientIdentifier($clientId);
+ $client->setSecret($hashedClientSecret);
+ $this->clientMapper->insert($client);
+
+ $output->writeln('<info>Client imported successfully</info>');
+ return 0;
+ }
+}
diff --git a/apps/oauth2/lib/Controller/LoginRedirectorController.php b/apps/oauth2/lib/Controller/LoginRedirectorController.php
index 57f18a97f85..7241b35cdcf 100644
--- a/apps/oauth2/lib/Controller/LoginRedirectorController.php
+++ b/apps/oauth2/lib/Controller/LoginRedirectorController.php
@@ -3,51 +3,32 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Daniel Kesselberg <mail@danielkesselberg.de>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Controller;
+use OC\Core\Controller\ClientFlowLoginController;
use OCA\OAuth2\Db\ClientMapper;
use OCA\OAuth2\Exceptions\ClientNotFoundException;
use OCP\AppFramework\Controller;
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
+use OCP\AppFramework\Http\Attribute\OpenAPI;
+use OCP\AppFramework\Http\Attribute\PublicPage;
+use OCP\AppFramework\Http\Attribute\UseSession;
use OCP\AppFramework\Http\RedirectResponse;
-use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Http\TemplateResponse;
+use OCP\IAppConfig;
+use OCP\IConfig;
use OCP\IL10N;
use OCP\IRequest;
use OCP\ISession;
use OCP\IURLGenerator;
+use OCP\Security\ISecureRandom;
+#[OpenAPI(scope: OpenAPI::SCOPE_DEFAULT)]
class LoginRedirectorController extends Controller {
- /** @var IURLGenerator */
- private $urlGenerator;
- /** @var ClientMapper */
- private $clientMapper;
- /** @var ISession */
- private $session;
- /** @var IL10N */
- private $l;
-
/**
* @param string $appName
* @param IRequest $request
@@ -56,32 +37,39 @@ class LoginRedirectorController extends Controller {
* @param ISession $session
* @param IL10N $l
*/
- public function __construct(string $appName,
- IRequest $request,
- IURLGenerator $urlGenerator,
- ClientMapper $clientMapper,
- ISession $session,
- IL10N $l) {
+ public function __construct(
+ string $appName,
+ IRequest $request,
+ private IURLGenerator $urlGenerator,
+ private ClientMapper $clientMapper,
+ private ISession $session,
+ private IL10N $l,
+ private ISecureRandom $random,
+ private IAppConfig $appConfig,
+ private IConfig $config,
+ ) {
parent::__construct($appName, $request);
- $this->urlGenerator = $urlGenerator;
- $this->clientMapper = $clientMapper;
- $this->session = $session;
- $this->l = $l;
}
/**
- * @PublicPage
- * @NoCSRFRequired
- * @UseSession
+ * Authorize the user
+ *
+ * @param string $client_id Client ID
+ * @param string $state State of the flow
+ * @param string $response_type Response type for the flow
+ * @param string $redirect_uri URI to redirect to after the flow (is only used for legacy ownCloud clients)
+ * @return TemplateResponse<Http::STATUS_OK, array{}>|RedirectResponse<Http::STATUS_SEE_OTHER, array{}>
*
- * @param string $client_id
- * @param string $state
- * @param string $response_type
- * @return Response
+ * 200: Client not found
+ * 303: Redirect to login URL
*/
+ #[PublicPage]
+ #[NoCSRFRequired]
+ #[UseSession]
public function authorize($client_id,
- $state,
- $response_type): Response {
+ $state,
+ $response_type,
+ string $redirect_uri = ''): TemplateResponse|RedirectResponse {
try {
$client = $this->clientMapper->getByIdentifier($client_id);
} catch (ClientNotFoundException $e) {
@@ -97,14 +85,39 @@ class LoginRedirectorController extends Controller {
return new RedirectResponse($url);
}
+ $enableOcClients = $this->config->getSystemValueBool('oauth2.enable_oc_clients', false);
+
+ $providedRedirectUri = '';
+ if ($enableOcClients && $client->getRedirectUri() === 'http://localhost:*') {
+ $providedRedirectUri = $redirect_uri;
+ }
+
$this->session->set('oauth.state', $state);
- $targetUrl = $this->urlGenerator->linkToRouteAbsolute(
- 'core.ClientFlowLogin.showAuthPickerPage',
- [
- 'clientIdentifier' => $client->getClientIdentifier(),
- ]
- );
+ if (in_array($client->getName(), $this->appConfig->getValueArray('oauth2', 'skipAuthPickerApplications', []))) {
+ /** @see ClientFlowLoginController::showAuthPickerPage **/
+ $stateToken = $this->random->generate(
+ 64,
+ ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_UPPER . ISecureRandom::CHAR_DIGITS
+ );
+ $this->session->set(ClientFlowLoginController::STATE_NAME, $stateToken);
+ $targetUrl = $this->urlGenerator->linkToRouteAbsolute(
+ 'core.ClientFlowLogin.grantPage',
+ [
+ 'stateToken' => $stateToken,
+ 'clientIdentifier' => $client->getClientIdentifier(),
+ 'providedRedirectUri' => $providedRedirectUri,
+ ]
+ );
+ } else {
+ $targetUrl = $this->urlGenerator->linkToRouteAbsolute(
+ 'core.ClientFlowLogin.showAuthPickerPage',
+ [
+ 'clientIdentifier' => $client->getClientIdentifier(),
+ 'providedRedirectUri' => $providedRedirectUri,
+ ]
+ );
+ }
return new RedirectResponse($targetUrl);
}
}
diff --git a/apps/oauth2/lib/Controller/OauthApiController.php b/apps/oauth2/lib/Controller/OauthApiController.php
index 910fdc99432..11f17fda4bf 100644
--- a/apps/oauth2/lib/Controller/OauthApiController.php
+++ b/apps/oauth2/lib/Controller/OauthApiController.php
@@ -3,99 +3,83 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Controller;
-use OC\Authentication\Exceptions\ExpiredTokenException;
-use OC\Authentication\Exceptions\InvalidTokenException;
use OC\Authentication\Token\IProvider as TokenProvider;
-use OC\Security\Bruteforce\Throttler;
use OCA\OAuth2\Db\AccessTokenMapper;
use OCA\OAuth2\Db\ClientMapper;
use OCA\OAuth2\Exceptions\AccessTokenNotFoundException;
use OCA\OAuth2\Exceptions\ClientNotFoundException;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\Attribute\BruteForceProtection;
+use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
+use OCP\AppFramework\Http\Attribute\OpenAPI;
+use OCP\AppFramework\Http\Attribute\PublicPage;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\Authentication\Exceptions\ExpiredTokenException;
+use OCP\Authentication\Exceptions\InvalidTokenException;
+use OCP\DB\Exception;
use OCP\IRequest;
+use OCP\Security\Bruteforce\IThrottler;
use OCP\Security\ICrypto;
use OCP\Security\ISecureRandom;
+use Psr\Log\LoggerInterface;
+#[OpenAPI(scope: OpenAPI::SCOPE_DEFAULT)]
class OauthApiController extends Controller {
- /** @var AccessTokenMapper */
- private $accessTokenMapper;
- /** @var ClientMapper */
- private $clientMapper;
- /** @var ICrypto */
- private $crypto;
- /** @var TokenProvider */
- private $tokenProvider;
- /** @var ISecureRandom */
- private $secureRandom;
- /** @var ITimeFactory */
- private $time;
- /** @var Throttler */
- private $throttler;
-
- public function __construct(string $appName,
- IRequest $request,
- ICrypto $crypto,
- AccessTokenMapper $accessTokenMapper,
- ClientMapper $clientMapper,
- TokenProvider $tokenProvider,
- ISecureRandom $secureRandom,
- ITimeFactory $time,
- Throttler $throttler) {
+ // the authorization code expires after 10 minutes
+ public const AUTHORIZATION_CODE_EXPIRES_AFTER = 10 * 60;
+
+ public function __construct(
+ string $appName,
+ IRequest $request,
+ private ICrypto $crypto,
+ private AccessTokenMapper $accessTokenMapper,
+ private ClientMapper $clientMapper,
+ private TokenProvider $tokenProvider,
+ private ISecureRandom $secureRandom,
+ private ITimeFactory $time,
+ private LoggerInterface $logger,
+ private IThrottler $throttler,
+ private ITimeFactory $timeFactory,
+ ) {
parent::__construct($appName, $request);
- $this->crypto = $crypto;
- $this->accessTokenMapper = $accessTokenMapper;
- $this->clientMapper = $clientMapper;
- $this->tokenProvider = $tokenProvider;
- $this->secureRandom = $secureRandom;
- $this->time = $time;
- $this->throttler = $throttler;
}
/**
- * @PublicPage
- * @NoCSRFRequired
+ * Get a token
*
- * @param string $grant_type
- * @param string $code
- * @param string $refresh_token
- * @param string $client_id
- * @param string $client_secret
- * @return JSONResponse
+ * @param string $grant_type Token type that should be granted
+ * @param ?string $code Code of the flow
+ * @param ?string $refresh_token Refresh token
+ * @param ?string $client_id Client ID
+ * @param ?string $client_secret Client secret
+ * @throws Exception
+ * @return JSONResponse<Http::STATUS_OK, array{access_token: string, token_type: string, expires_in: int, refresh_token: string, user_id: string}, array{}>|JSONResponse<Http::STATUS_BAD_REQUEST, array{error: string}, array{}>
+ *
+ * 200: Token returned
+ * 400: Getting token is not possible
*/
- public function getToken($grant_type, $code, $refresh_token, $client_id, $client_secret): JSONResponse {
+ #[PublicPage]
+ #[NoCSRFRequired]
+ #[BruteForceProtection(action: 'oauth2GetToken')]
+ public function getToken(
+ string $grant_type, ?string $code, ?string $refresh_token,
+ ?string $client_id, ?string $client_secret,
+ ): JSONResponse {
// We only handle two types
if ($grant_type !== 'authorization_code' && $grant_type !== 'refresh_token') {
- return new JSONResponse([
+ $response = new JSONResponse([
'error' => 'invalid_grant',
], Http::STATUS_BAD_REQUEST);
+ $response->throttle(['invalid_grant' => $grant_type]);
+ return $response;
}
// We handle the initial and refresh tokens the same way
@@ -106,17 +90,48 @@ class OauthApiController extends Controller {
try {
$accessToken = $this->accessTokenMapper->getByCode($code);
} catch (AccessTokenNotFoundException $e) {
- return new JSONResponse([
+ $response = new JSONResponse([
'error' => 'invalid_request',
], Http::STATUS_BAD_REQUEST);
+ $response->throttle(['invalid_request' => 'token not found', 'code' => $code]);
+ return $response;
+ }
+
+ if ($grant_type === 'authorization_code') {
+ // check this token is in authorization code state
+ $deliveredTokenCount = $accessToken->getTokenCount();
+ if ($deliveredTokenCount > 0) {
+ $response = new JSONResponse([
+ 'error' => 'invalid_request',
+ ], Http::STATUS_BAD_REQUEST);
+ $response->throttle(['invalid_request' => 'authorization_code_received_for_active_token']);
+ return $response;
+ }
+
+ // check authorization code expiration
+ $now = $this->timeFactory->now()->getTimestamp();
+ $codeCreatedAt = $accessToken->getCodeCreatedAt();
+ if ($codeCreatedAt < $now - self::AUTHORIZATION_CODE_EXPIRES_AFTER) {
+ // we know this token is not useful anymore
+ $this->accessTokenMapper->delete($accessToken);
+
+ $response = new JSONResponse([
+ 'error' => 'invalid_request',
+ ], Http::STATUS_BAD_REQUEST);
+ $expiredSince = $now - self::AUTHORIZATION_CODE_EXPIRES_AFTER - $codeCreatedAt;
+ $response->throttle(['invalid_request' => 'authorization_code_expired', 'expired_since' => $expiredSince]);
+ return $response;
+ }
}
try {
$client = $this->clientMapper->getByUid($accessToken->getClientId());
} catch (ClientNotFoundException $e) {
- return new JSONResponse([
+ $response = new JSONResponse([
'error' => 'invalid_request',
], Http::STATUS_BAD_REQUEST);
+ $response->throttle(['invalid_request' => 'client not found', 'client_id' => $accessToken->getClientId()]);
+ return $response;
}
if (isset($this->request->server['PHP_AUTH_USER'])) {
@@ -124,12 +139,24 @@ class OauthApiController extends Controller {
$client_secret = $this->request->server['PHP_AUTH_PW'];
}
- // The client id and secret must match. Else we don't provide an access token!
- if ($client->getClientIdentifier() !== $client_id || $client->getSecret() !== $client_secret) {
+ try {
+ $storedClientSecretHash = $client->getSecret();
+ $clientSecretHash = bin2hex($this->crypto->calculateHMAC($client_secret));
+ } catch (\Exception $e) {
+ $this->logger->error('OAuth client secret decryption error', ['exception' => $e]);
+ // we don't throttle here because it might not be a bruteforce attack
return new JSONResponse([
'error' => 'invalid_client',
], Http::STATUS_BAD_REQUEST);
}
+ // The client id and secret must match. Else we don't provide an access token!
+ if ($client->getClientIdentifier() !== $client_id || $storedClientSecretHash !== $clientSecretHash) {
+ $response = new JSONResponse([
+ 'error' => 'invalid_client',
+ ], Http::STATUS_BAD_REQUEST);
+ $response->throttle(['invalid_client' => 'client ID or secret does not match']);
+ return $response;
+ }
$decryptedToken = $this->crypto->decrypt($accessToken->getEncryptedToken(), $code);
@@ -141,9 +168,11 @@ class OauthApiController extends Controller {
} catch (InvalidTokenException $e) {
//We can't do anything...
$this->accessTokenMapper->delete($accessToken);
- return new JSONResponse([
+ $response = new JSONResponse([
'error' => 'invalid_request',
], Http::STATUS_BAD_REQUEST);
+ $response->throttle(['invalid_request' => 'token is invalid']);
+ return $response;
}
// Rotate the apptoken (so the old one becomes invalid basically)
@@ -163,6 +192,11 @@ class OauthApiController extends Controller {
$newCode = $this->secureRandom->generate(128, ISecureRandom::CHAR_ALPHANUMERIC);
$accessToken->setHashedCode(hash('sha512', $newCode));
$accessToken->setEncryptedToken($this->crypto->encrypt($newToken, $newCode));
+ // increase the number of delivered oauth token
+ // this helps with cleaning up DB access token when authorization code has expired
+ // and it never delivered any oauth token
+ $tokenCount = $accessToken->getTokenCount();
+ $accessToken->setTokenCount($tokenCount + 1);
$this->accessTokenMapper->update($accessToken);
$this->throttler->resetDelay($this->request->getRemoteAddress(), 'login', ['user' => $appToken->getUID()]);
diff --git a/apps/oauth2/lib/Controller/SettingsController.php b/apps/oauth2/lib/Controller/SettingsController.php
index 046e6d77041..9bd02c8a2cd 100644
--- a/apps/oauth2/lib/Controller/SettingsController.php
+++ b/apps/oauth2/lib/Controller/SettingsController.php
@@ -3,30 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Bjoern Schiessle <bjoern@schiessle.org>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Patrik Kernstock <info@pkern.at>
- * @author rakekniven <mark.ziegler@rakekniven.de>
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Controller;
@@ -36,38 +14,34 @@ use OCA\OAuth2\Db\ClientMapper;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
+use OCP\Authentication\Token\IProvider as IAuthTokenProvider;
use OCP\IL10N;
use OCP\IRequest;
+use OCP\IUser;
+use OCP\IUserManager;
+use OCP\Security\ICrypto;
use OCP\Security\ISecureRandom;
class SettingsController extends Controller {
- /** @var ClientMapper */
- private $clientMapper;
- /** @var ISecureRandom */
- private $secureRandom;
- /** @var AccessTokenMapper */
- private $accessTokenMapper;
- /** @var IL10N */
- private $l;
public const validChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
- public function __construct(string $appName,
- IRequest $request,
- ClientMapper $clientMapper,
- ISecureRandom $secureRandom,
- AccessTokenMapper $accessTokenMapper,
- IL10N $l
+ public function __construct(
+ string $appName,
+ IRequest $request,
+ private ClientMapper $clientMapper,
+ private ISecureRandom $secureRandom,
+ private AccessTokenMapper $accessTokenMapper,
+ private IL10N $l,
+ private IAuthTokenProvider $tokenProvider,
+ private IUserManager $userManager,
+ private ICrypto $crypto,
) {
parent::__construct($appName, $request);
- $this->secureRandom = $secureRandom;
- $this->clientMapper = $clientMapper;
- $this->accessTokenMapper = $accessTokenMapper;
- $this->l = $l;
}
public function addClient(string $name,
- string $redirectUri): JSONResponse {
+ string $redirectUri): JSONResponse {
if (filter_var($redirectUri, FILTER_VALIDATE_URL) === false) {
return new JSONResponse(['message' => $this->l->t('Your redirect URL needs to be a full URL for example: https://yourdomain.com/path')], Http::STATUS_BAD_REQUEST);
}
@@ -75,7 +49,9 @@ class SettingsController extends Controller {
$client = new Client();
$client->setName($name);
$client->setRedirectUri($redirectUri);
- $client->setSecret($this->secureRandom->generate(64, self::validChars));
+ $secret = $this->secureRandom->generate(64, self::validChars);
+ $hashedSecret = bin2hex($this->crypto->calculateHMAC($secret));
+ $client->setSecret($hashedSecret);
$client->setClientIdentifier($this->secureRandom->generate(64, self::validChars));
$client = $this->clientMapper->insert($client);
@@ -84,7 +60,7 @@ class SettingsController extends Controller {
'name' => $client->getName(),
'redirectUri' => $client->getRedirectUri(),
'clientId' => $client->getClientIdentifier(),
- 'clientSecret' => $client->getSecret(),
+ 'clientSecret' => $secret,
];
return new JSONResponse($result);
@@ -92,6 +68,11 @@ class SettingsController extends Controller {
public function deleteClient(int $id): JSONResponse {
$client = $this->clientMapper->getByUid($id);
+
+ $this->userManager->callForSeenUsers(function (IUser $user) use ($client): void {
+ $this->tokenProvider->invalidateTokensOfUser($user->getUID(), $client->getName());
+ });
+
$this->accessTokenMapper->deleteByClientId($id);
$this->clientMapper->delete($client);
return new JSONResponse([]);
diff --git a/apps/oauth2/lib/Db/AccessToken.php b/apps/oauth2/lib/Db/AccessToken.php
index 26c830c64ad..34adc4f4797 100644
--- a/apps/oauth2/lib/Db/AccessToken.php
+++ b/apps/oauth2/lib/Db/AccessToken.php
@@ -1,29 +1,13 @@
<?php
+
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Db;
use OCP\AppFramework\Db\Entity;
+use OCP\DB\Types;
/**
* @method int getTokenId()
@@ -34,6 +18,10 @@ use OCP\AppFramework\Db\Entity;
* @method void setEncryptedToken(string $token)
* @method string getHashedCode()
* @method void setHashedCode(string $token)
+ * @method int getCodeCreatedAt()
+ * @method void setCodeCreatedAt(int $createdAt)
+ * @method int getTokenCount()
+ * @method void setTokenCount(int $tokenCount)
*/
class AccessToken extends Entity {
/** @var int */
@@ -44,12 +32,18 @@ class AccessToken extends Entity {
protected $hashedCode;
/** @var string */
protected $encryptedToken;
+ /** @var int */
+ protected $codeCreatedAt;
+ /** @var int */
+ protected $tokenCount;
public function __construct() {
- $this->addType('id', 'int');
- $this->addType('tokenId', 'int');
- $this->addType('clientId', 'int');
+ $this->addType('id', Types::INTEGER);
+ $this->addType('tokenId', Types::INTEGER);
+ $this->addType('clientId', Types::INTEGER);
$this->addType('hashedCode', 'string');
$this->addType('encryptedToken', 'string');
+ $this->addType('codeCreatedAt', Types::INTEGER);
+ $this->addType('tokenCount', Types::INTEGER);
}
}
diff --git a/apps/oauth2/lib/Db/AccessTokenMapper.php b/apps/oauth2/lib/Db/AccessTokenMapper.php
index da351d5d496..8d5f6cf1da1 100644
--- a/apps/oauth2/lib/Db/AccessTokenMapper.php
+++ b/apps/oauth2/lib/Db/AccessTokenMapper.php
@@ -3,34 +3,17 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Bjoern Schiessle <bjoern@schiessle.org>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Db;
+use OCA\OAuth2\Controller\OauthApiController;
use OCA\OAuth2\Exceptions\AccessTokenNotFoundException;
use OCP\AppFramework\Db\IMapperException;
use OCP\AppFramework\Db\QBMapper;
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\DB\Exception;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
@@ -39,10 +22,10 @@ use OCP\IDBConnection;
*/
class AccessTokenMapper extends QBMapper {
- /**
- * @param IDBConnection $db
- */
- public function __construct(IDBConnection $db) {
+ public function __construct(
+ IDBConnection $db,
+ private ITimeFactory $timeFactory,
+ ) {
parent::__construct($db, 'oauth2_access_tokens');
}
@@ -79,4 +62,24 @@ class AccessTokenMapper extends QBMapper {
->where($qb->expr()->eq('client_id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)));
$qb->executeStatement();
}
+
+ /**
+ * Delete access tokens that have an expired authorization code
+ * -> those that are old enough
+ * and which never delivered any oauth token (still in authorization state)
+ *
+ * @return void
+ * @throws Exception
+ */
+ public function cleanupExpiredAuthorizationCode(): void {
+ $now = $this->timeFactory->now()->getTimestamp();
+ $maxTokenCreationTs = $now - OauthApiController::AUTHORIZATION_CODE_EXPIRES_AFTER;
+
+ $qb = $this->db->getQueryBuilder();
+ $qb
+ ->delete($this->tableName)
+ ->where($qb->expr()->eq('token_count', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)))
+ ->andWhere($qb->expr()->lt('code_created_at', $qb->createNamedParameter($maxTokenCreationTs, IQueryBuilder::PARAM_INT)));
+ $qb->executeStatement();
+ }
}
diff --git a/apps/oauth2/lib/Db/Client.php b/apps/oauth2/lib/Db/Client.php
index 78f3d966928..8fce0040c96 100644
--- a/apps/oauth2/lib/Db/Client.php
+++ b/apps/oauth2/lib/Db/Client.php
@@ -1,28 +1,13 @@
<?php
+
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Lukas Reschke <lukas@statuscode.ch>
- *
- * @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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Db;
use OCP\AppFramework\Db\Entity;
+use OCP\DB\Types;
/**
* @method string getClientIdentifier()
@@ -45,7 +30,7 @@ class Client extends Entity {
protected $secret;
public function __construct() {
- $this->addType('id', 'int');
+ $this->addType('id', Types::INTEGER);
$this->addType('name', 'string');
$this->addType('redirectUri', 'string');
$this->addType('clientIdentifier', 'string');
diff --git a/apps/oauth2/lib/Db/ClientMapper.php b/apps/oauth2/lib/Db/ClientMapper.php
index a3d5df35482..c5ca2989d0f 100644
--- a/apps/oauth2/lib/Db/ClientMapper.php
+++ b/apps/oauth2/lib/Db/ClientMapper.php
@@ -3,27 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Bjoern Schiessle <bjoern@schiessle.org>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Db;
@@ -60,7 +41,7 @@ class ClientMapper extends QBMapper {
try {
$client = $this->findEntity($qb);
} catch (IMapperException $e) {
- throw new ClientNotFoundException('could not find client '.$clientIdentifier, 0, $e);
+ throw new ClientNotFoundException('could not find client ' . $clientIdentifier, 0, $e);
}
return $client;
}
@@ -80,7 +61,7 @@ class ClientMapper extends QBMapper {
try {
$client = $this->findEntity($qb);
} catch (IMapperException $e) {
- throw new ClientNotFoundException('could not find client with id '.$id, 0, $e);
+ throw new ClientNotFoundException('could not find client with id ' . $id, 0, $e);
}
return $client;
}
diff --git a/apps/oauth2/lib/Exceptions/AccessTokenNotFoundException.php b/apps/oauth2/lib/Exceptions/AccessTokenNotFoundException.php
index 8ccc32d67e1..809598e258e 100644
--- a/apps/oauth2/lib/Exceptions/AccessTokenNotFoundException.php
+++ b/apps/oauth2/lib/Exceptions/AccessTokenNotFoundException.php
@@ -3,26 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Lukas Reschke <lukas@statuscode.ch>
- *
- * @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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Exceptions;
diff --git a/apps/oauth2/lib/Exceptions/ClientNotFoundException.php b/apps/oauth2/lib/Exceptions/ClientNotFoundException.php
index d2f819449ce..cec7a24e22d 100644
--- a/apps/oauth2/lib/Exceptions/ClientNotFoundException.php
+++ b/apps/oauth2/lib/Exceptions/ClientNotFoundException.php
@@ -3,26 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Lukas Reschke <lukas@statuscode.ch>
- *
- * @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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Exceptions;
diff --git a/apps/oauth2/lib/Migration/SetTokenExpiration.php b/apps/oauth2/lib/Migration/SetTokenExpiration.php
index 7188985f3f5..dc925e26bb2 100644
--- a/apps/oauth2/lib/Migration/SetTokenExpiration.php
+++ b/apps/oauth2/lib/Migration/SetTokenExpiration.php
@@ -3,54 +3,26 @@
declare(strict_types=1);
/**
- * @copyright Copyright 2018, Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Migration;
-use OC\Authentication\Exceptions\InvalidTokenException;
use OC\Authentication\Token\IProvider as TokenProvider;
use OCA\OAuth2\Db\AccessToken;
use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\Authentication\Exceptions\InvalidTokenException;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\IRepairStep;
class SetTokenExpiration implements IRepairStep {
- /** @var IDBConnection */
- private $connection;
-
- /** @var ITimeFactory */
- private $time;
-
- /** @var TokenProvider */
- private $tokenProvider;
-
- public function __construct(IDBConnection $connection,
- ITimeFactory $timeFactory,
- TokenProvider $tokenProvider) {
- $this->connection = $connection;
- $this->time = $timeFactory;
- $this->tokenProvider = $tokenProvider;
+ public function __construct(
+ private IDBConnection $connection,
+ private ITimeFactory $time,
+ private TokenProvider $tokenProvider,
+ ) {
}
public function getName(): string {
@@ -62,7 +34,7 @@ class SetTokenExpiration implements IRepairStep {
$qb->select('*')
->from('oauth2_access_tokens');
- $cursor = $qb->execute();
+ $cursor = $qb->executeQuery();
while ($row = $cursor->fetch()) {
$token = AccessToken::fromRow($row);
diff --git a/apps/oauth2/lib/Migration/Version010401Date20181207190718.php b/apps/oauth2/lib/Migration/Version010401Date20181207190718.php
index 51fd77c5528..8648826d53c 100644
--- a/apps/oauth2/lib/Migration/Version010401Date20181207190718.php
+++ b/apps/oauth2/lib/Migration/Version010401Date20181207190718.php
@@ -3,25 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright 2018, Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Migration;
diff --git a/apps/oauth2/lib/Migration/Version010402Date20190107124745.php b/apps/oauth2/lib/Migration/Version010402Date20190107124745.php
index b80e3a9575f..08099c625f7 100644
--- a/apps/oauth2/lib/Migration/Version010402Date20190107124745.php
+++ b/apps/oauth2/lib/Migration/Version010402Date20190107124745.php
@@ -3,25 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright 2018, Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Migration;
diff --git a/apps/oauth2/lib/Migration/Version011601Date20230522143227.php b/apps/oauth2/lib/Migration/Version011601Date20230522143227.php
new file mode 100644
index 00000000000..f2998202e02
--- /dev/null
+++ b/apps/oauth2/lib/Migration/Version011601Date20230522143227.php
@@ -0,0 +1,65 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\OAuth2\Migration;
+
+use Closure;
+use OCP\DB\ISchemaWrapper;
+use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\IDBConnection;
+use OCP\Migration\IOutput;
+use OCP\Migration\SimpleMigrationStep;
+use OCP\Security\ICrypto;
+
+class Version011601Date20230522143227 extends SimpleMigrationStep {
+
+ public function __construct(
+ private IDBConnection $connection,
+ private ICrypto $crypto,
+ ) {
+ }
+
+ public function changeSchema(IOutput $output, Closure $schemaClosure, array $options) {
+ /** @var ISchemaWrapper $schema */
+ $schema = $schemaClosure();
+
+ if ($schema->hasTable('oauth2_clients')) {
+ $table = $schema->getTable('oauth2_clients');
+ if ($table->hasColumn('secret')) {
+ $column = $table->getColumn('secret');
+ $column->setLength(512);
+ return $schema;
+ }
+ }
+
+ return null;
+ }
+
+ public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
+ $qbUpdate = $this->connection->getQueryBuilder();
+ $qbUpdate->update('oauth2_clients')
+ ->set('secret', $qbUpdate->createParameter('updateSecret'))
+ ->where(
+ $qbUpdate->expr()->eq('id', $qbUpdate->createParameter('updateId'))
+ );
+
+ $qbSelect = $this->connection->getQueryBuilder();
+ $qbSelect->select('id', 'secret')
+ ->from('oauth2_clients');
+ $req = $qbSelect->executeQuery();
+ while ($row = $req->fetch()) {
+ $id = $row['id'];
+ $secret = $row['secret'];
+ $encryptedSecret = $this->crypto->encrypt($secret);
+ $qbUpdate->setParameter('updateSecret', $encryptedSecret, IQueryBuilder::PARAM_STR);
+ $qbUpdate->setParameter('updateId', $id, IQueryBuilder::PARAM_INT);
+ $qbUpdate->executeStatement();
+ }
+ $req->closeCursor();
+ }
+}
diff --git a/apps/oauth2/lib/Migration/Version011602Date20230613160650.php b/apps/oauth2/lib/Migration/Version011602Date20230613160650.php
new file mode 100644
index 00000000000..06efce324b2
--- /dev/null
+++ b/apps/oauth2/lib/Migration/Version011602Date20230613160650.php
@@ -0,0 +1,39 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\OAuth2\Migration;
+
+use Closure;
+use OCP\DB\ISchemaWrapper;
+use OCP\Migration\IOutput;
+use OCP\Migration\SimpleMigrationStep;
+
+class Version011602Date20230613160650 extends SimpleMigrationStep {
+
+ public function __construct(
+ ) {
+ }
+
+ public function changeSchema(IOutput $output, Closure $schemaClosure, array $options) {
+ /** @var ISchemaWrapper $schema */
+ $schema = $schemaClosure();
+
+ if ($schema->hasTable('oauth2_clients')) {
+ $table = $schema->getTable('oauth2_clients');
+ if ($table->hasColumn('secret')) {
+ $column = $table->getColumn('secret');
+ // we still change the column length in case Version011601Date20230522143227
+ // has run before it was changed to set the length to 512
+ $column->setLength(512);
+ return $schema;
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/apps/oauth2/lib/Migration/Version011603Date20230620111039.php b/apps/oauth2/lib/Migration/Version011603Date20230620111039.php
new file mode 100644
index 00000000000..853eacd2873
--- /dev/null
+++ b/apps/oauth2/lib/Migration/Version011603Date20230620111039.php
@@ -0,0 +1,69 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\OAuth2\Migration;
+
+use Closure;
+use OCP\DB\ISchemaWrapper;
+use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\DB\Types;
+use OCP\IDBConnection;
+use OCP\Migration\IOutput;
+use OCP\Migration\SimpleMigrationStep;
+
+class Version011603Date20230620111039 extends SimpleMigrationStep {
+
+ public function __construct(
+ private IDBConnection $connection,
+ ) {
+ }
+
+ public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
+ /** @var ISchemaWrapper $schema */
+ $schema = $schemaClosure();
+
+ if ($schema->hasTable('oauth2_access_tokens')) {
+ $table = $schema->getTable('oauth2_access_tokens');
+ $dbChanged = false;
+ if (!$table->hasColumn('code_created_at')) {
+ $table->addColumn('code_created_at', Types::BIGINT, [
+ 'notnull' => true,
+ 'default' => 0,
+ 'unsigned' => true,
+ ]);
+ $dbChanged = true;
+ }
+ if (!$table->hasColumn('token_count')) {
+ $table->addColumn('token_count', Types::BIGINT, [
+ 'notnull' => true,
+ 'default' => 0,
+ 'unsigned' => true,
+ ]);
+ $dbChanged = true;
+ }
+ if (!$table->hasIndex('oauth2_tk_c_created_idx')) {
+ $table->addIndex(['token_count', 'code_created_at'], 'oauth2_tk_c_created_idx');
+ $dbChanged = true;
+ }
+ if ($dbChanged) {
+ return $schema;
+ }
+ }
+
+ return null;
+ }
+
+ public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
+ // we consider that existing access_tokens have already produced at least one oauth token
+ // which prevents cleaning them up
+ $qbUpdate = $this->connection->getQueryBuilder();
+ $qbUpdate->update('oauth2_access_tokens')
+ ->set('token_count', $qbUpdate->createNamedParameter(1, IQueryBuilder::PARAM_INT));
+ $qbUpdate->executeStatement();
+ }
+}
diff --git a/apps/oauth2/lib/Migration/Version011901Date20240829164356.php b/apps/oauth2/lib/Migration/Version011901Date20240829164356.php
new file mode 100644
index 00000000000..20f5754bf11
--- /dev/null
+++ b/apps/oauth2/lib/Migration/Version011901Date20240829164356.php
@@ -0,0 +1,49 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\OAuth2\Migration;
+
+use Closure;
+use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\IDBConnection;
+use OCP\Migration\IOutput;
+use OCP\Migration\SimpleMigrationStep;
+use OCP\Security\ICrypto;
+
+class Version011901Date20240829164356 extends SimpleMigrationStep {
+
+ public function __construct(
+ private IDBConnection $connection,
+ private ICrypto $crypto,
+ ) {
+ }
+
+ public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
+ $qbUpdate = $this->connection->getQueryBuilder();
+ $qbUpdate->update('oauth2_clients')
+ ->set('secret', $qbUpdate->createParameter('updateSecret'))
+ ->where(
+ $qbUpdate->expr()->eq('id', $qbUpdate->createParameter('updateId'))
+ );
+
+ $qbSelect = $this->connection->getQueryBuilder();
+ $qbSelect->select('id', 'secret')
+ ->from('oauth2_clients');
+ $req = $qbSelect->executeQuery();
+ while ($row = $req->fetch()) {
+ $id = $row['id'];
+ $storedEncryptedSecret = $row['secret'];
+ $secret = $this->crypto->decrypt($storedEncryptedSecret);
+ $hashedSecret = bin2hex($this->crypto->calculateHMAC($secret));
+ $qbUpdate->setParameter('updateSecret', $hashedSecret, IQueryBuilder::PARAM_STR);
+ $qbUpdate->setParameter('updateId', $id, IQueryBuilder::PARAM_INT);
+ $qbUpdate->executeStatement();
+ }
+ $req->closeCursor();
+ }
+}
diff --git a/apps/oauth2/lib/Settings/Admin.php b/apps/oauth2/lib/Settings/Admin.php
index aa2bd6db012..93b6b7bcc3f 100644
--- a/apps/oauth2/lib/Settings/Admin.php
+++ b/apps/oauth2/lib/Settings/Admin.php
@@ -3,48 +3,26 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Settings;
use OCA\OAuth2\Db\ClientMapper;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
-use OCP\Settings\ISettings;
use OCP\IURLGenerator;
+use OCP\Settings\ISettings;
+use Psr\Log\LoggerInterface;
class Admin implements ISettings {
- private IInitialState $initialState;
- private ClientMapper $clientMapper;
- private IURLGenerator $urlGenerator;
public function __construct(
- IInitialState $initialState,
- ClientMapper $clientMapper,
- IURLGenerator $urlGenerator
+ private IInitialState $initialState,
+ private ClientMapper $clientMapper,
+ private IURLGenerator $urlGenerator,
+ private LoggerInterface $logger,
) {
- $this->initialState = $initialState;
- $this->clientMapper = $clientMapper;
- $this->urlGenerator = $urlGenerator;
}
public function getForm(): TemplateResponse {
@@ -52,13 +30,17 @@ class Admin implements ISettings {
$result = [];
foreach ($clients as $client) {
- $result[] = [
- 'id' => $client->getId(),
- 'name' => $client->getName(),
- 'redirectUri' => $client->getRedirectUri(),
- 'clientId' => $client->getClientIdentifier(),
- 'clientSecret' => $client->getSecret(),
- ];
+ try {
+ $result[] = [
+ 'id' => $client->getId(),
+ 'name' => $client->getName(),
+ 'redirectUri' => $client->getRedirectUri(),
+ 'clientId' => $client->getClientIdentifier(),
+ 'clientSecret' => '',
+ ];
+ } catch (\Exception $e) {
+ $this->logger->error('[Settings] OAuth client secret decryption error', ['exception' => $e]);
+ }
}
$this->initialState->provideInitialState('clients', $result);
$this->initialState->provideInitialState('oauth2-doc-link', $this->urlGenerator->linkToDocs('admin-oauth2'));
diff --git a/apps/oauth2/openapi.json b/apps/oauth2/openapi.json
new file mode 100644
index 00000000000..76cd2da3150
--- /dev/null
+++ b/apps/oauth2/openapi.json
@@ -0,0 +1,227 @@
+{
+ "openapi": "3.0.3",
+ "info": {
+ "title": "oauth2",
+ "version": "0.0.1",
+ "description": "Allows OAuth2 compatible authentication from other web applications.",
+ "license": {
+ "name": "agpl"
+ }
+ },
+ "components": {
+ "securitySchemes": {
+ "basic_auth": {
+ "type": "http",
+ "scheme": "basic"
+ },
+ "bearer_auth": {
+ "type": "http",
+ "scheme": "bearer"
+ }
+ },
+ "schemas": {}
+ },
+ "paths": {
+ "/index.php/apps/oauth2/authorize": {
+ "get": {
+ "operationId": "login_redirector-authorize",
+ "summary": "Authorize the user",
+ "tags": [
+ "login_redirector"
+ ],
+ "security": [
+ {},
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "client_id",
+ "in": "query",
+ "description": "Client ID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "state",
+ "in": "query",
+ "description": "State of the flow",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "response_type",
+ "in": "query",
+ "description": "Response type for the flow",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "redirect_uri",
+ "in": "query",
+ "description": "URI to redirect to after the flow (is only used for legacy ownCloud clients)",
+ "schema": {
+ "type": "string",
+ "default": ""
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Client not found",
+ "content": {
+ "text/html": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "303": {
+ "description": "Redirect to login URL",
+ "headers": {
+ "Location": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/index.php/apps/oauth2/api/v1/token": {
+ "post": {
+ "operationId": "oauth_api-get-token",
+ "summary": "Get a token",
+ "tags": [
+ "oauth_api"
+ ],
+ "security": [
+ {},
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "grant_type"
+ ],
+ "properties": {
+ "grant_type": {
+ "type": "string",
+ "description": "Token type that should be granted"
+ },
+ "code": {
+ "type": "string",
+ "nullable": true,
+ "description": "Code of the flow"
+ },
+ "refresh_token": {
+ "type": "string",
+ "nullable": true,
+ "description": "Refresh token"
+ },
+ "client_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Client ID"
+ },
+ "client_secret": {
+ "type": "string",
+ "nullable": true,
+ "description": "Client secret"
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "500": {
+ "description": "",
+ "content": {
+ "text/plain": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "200": {
+ "description": "Token returned",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "access_token",
+ "token_type",
+ "expires_in",
+ "refresh_token",
+ "user_id"
+ ],
+ "properties": {
+ "access_token": {
+ "type": "string"
+ },
+ "token_type": {
+ "type": "string"
+ },
+ "expires_in": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "refresh_token": {
+ "type": "string"
+ },
+ "user_id": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Getting token is not possible",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "error"
+ ],
+ "properties": {
+ "error": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "tags": []
+}
diff --git a/apps/oauth2/openapi.json.license b/apps/oauth2/openapi.json.license
new file mode 100644
index 00000000000..83559daa9dc
--- /dev/null
+++ b/apps/oauth2/openapi.json.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+SPDX-License-Identifier: AGPL-3.0-or-later \ No newline at end of file
diff --git a/apps/oauth2/src/App.vue b/apps/oauth2/src/App.vue
index 28b1f9182e2..941317a3e64 100644
--- a/apps/oauth2/src/App.vue
+++ b/apps/oauth2/src/App.vue
@@ -1,34 +1,28 @@
<!--
- - @copyright Copyright (c) 2018 Roeland Jago Douma <roeland@famdouma.nl>
- -
- - @author Roeland Jago Douma <roeland@famdouma.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/>.
- -
- -->
+ - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
<template>
- <NcSettingsSection :title="t('oauth2', 'OAuth 2.0 clients')"
+ <NcSettingsSection :name="t('oauth2', 'OAuth 2.0 clients')"
:description="t('oauth2', 'OAuth 2.0 allows external services to request access to {instanceName}.', { instanceName })"
:doc-url="oauthDocLink">
<table v-if="clients.length > 0" class="grid">
<thead>
<tr>
- <th id="headerContent" />
- <th id="headerRemove">
-&nbsp;
+ <th>
+ {{ t('oauth2', 'Name') }}
+ </th>
+ <th>
+ {{ t('oauth2', 'Redirection URI') }}
+ </th>
+ <th>
+ {{ t('oauth2', 'Client Identifier') }}
+ </th>
+ <th>
+ {{ t('oauth2', 'Secret key') }}
+ </th>
+ <th>
+ {{ t('oauth2', 'Delete client') }}
</th>
</tr>
</thead>
@@ -39,21 +33,29 @@
@delete="deleteClient" />
</tbody>
</table>
+ <NcNoteCard v-if="showSecretWarning"
+ type="warning">
+ {{ t('oauth2', 'Make sure you store the secret key, it cannot be recovered.') }}
+ </NcNoteCard>
<br>
<h3>{{ t('oauth2', 'Add client') }}</h3>
<span v-if="newClient.error" class="msg error">{{ newClient.errorMsg }}</span>
- <form @submit.prevent="addClient">
- <input id="name"
- v-model="newClient.name"
+ <form class="oauth2-form" @submit.prevent="addClient">
+ <NcTextField id="name"
+ :value.sync="newClient.name"
type="text"
+ class="oauth2-form--input"
name="name"
- :placeholder="t('oauth2', 'Name')">
- <input id="redirectUri"
- v-model="newClient.redirectUri"
+ :label="t('oauth2', 'Name')"
+ :placeholder="t('oauth2', 'Name')" />
+ <NcTextField id="redirectUri"
+ :value.sync="newClient.redirectUri"
type="url"
+ class="oauth2-form--input"
name="redirectUri"
- :placeholder="t('oauth2', 'Redirection URI')">
+ :label="t('oauth2', 'Redirection URI')"
+ :placeholder="t('oauth2', 'Redirection URI')" />
<NcButton native-type="submit" class="inline-button">
{{ t('oauth2', 'Add') }}
</NcButton>
@@ -63,12 +65,14 @@
<script>
import axios from '@nextcloud/axios'
-import OAuthItem from './components/OAuthItem'
+import OAuthItem from './components/OAuthItem.vue'
import { generateUrl } from '@nextcloud/router'
import { getCapabilities } from '@nextcloud/capabilities'
-import NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection'
-import NcButton from '@nextcloud/vue/dist/Components/NcButton'
+import NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection'
+import NcButton from '@nextcloud/vue/components/NcButton'
+import NcNoteCard from '@nextcloud/vue/components/NcNoteCard'
import { loadState } from '@nextcloud/initial-state'
+import NcTextField from '@nextcloud/vue/components/NcTextField'
export default {
name: 'App',
@@ -76,6 +80,8 @@ export default {
OAuthItem,
NcSettingsSection,
NcButton,
+ NcTextField,
+ NcNoteCard,
},
props: {
clients: {
@@ -92,6 +98,7 @@ export default {
error: false,
},
oauthDocLink: loadState('oauth2', 'oauth2-doc-link'),
+ showSecretWarning: false,
}
},
computed: {
@@ -102,7 +109,7 @@ export default {
methods: {
deleteClient(id) {
axios.delete(generateUrl('apps/oauth2/clients/{id}', { id }))
- .then((response) => {
+ .then(() => {
// eslint-disable-next-line vue/no-mutating-props
this.clients = this.clients.filter(client => client.id !== id)
})
@@ -115,10 +122,11 @@ export default {
{
name: this.newClient.name,
redirectUri: this.newClient.redirectUri,
- }
+ },
).then(response => {
// eslint-disable-next-line vue/no-mutating-props
this.clients.push(response.data)
+ this.showSecretWarning = true
this.newClient.name = ''
this.newClient.redirectUri = ''
@@ -140,4 +148,14 @@ export default {
min-height: 34px !important;
display: inline-flex !important;
}
+
+ .oauth2-form {
+ display: flex;
+ flex-direction: row;
+ }
+
+ .oauth2-form--input {
+ max-width: 200px;
+ margin-inline-end: 10px;
+ }
</style>
diff --git a/apps/oauth2/src/components/OAuthItem.vue b/apps/oauth2/src/components/OAuthItem.vue
index 41874b1f02b..5a8f1556203 100644
--- a/apps/oauth2/src/components/OAuthItem.vue
+++ b/apps/oauth2/src/components/OAuthItem.vue
@@ -1,45 +1,24 @@
<!--
- - @copyright Copyright (c) 2018 Roeland Jago Douma <roeland@famdouma.nl>
- -
- - @author Roeland Jago Douma <roeland@famdouma.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/>.
- -
- -->
+ - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
<template>
<tr>
+ <td>{{ name }}</td>
+ <td>{{ redirectUri }}</td>
+ <td><code>{{ clientId }}</code></td>
<td>
- <table class="inline">
- <tr>
- <td>{{ t('oauth2', 'Name') }}</td>
- <td>{{ name }}</td>
- </tr>
- <tr>
- <td>{{ t('oauth2', 'Redirection URI') }}</td>
- <td>{{ redirectUri }}</td>
- </tr>
- <tr>
- <td>{{ t('oauth2', 'Client Identifier') }}</td>
- <td><code>{{ clientId }}</code></td>
- </tr>
- <tr>
- <td>{{ t('oauth2', 'Secret') }}</td>
- <td><code>{{ renderedSecret }}</code><a class="icon-toggle has-tooltip" :title="t('oauth2', 'Show client secret')" @click="toggleSecret" /></td>
- </tr>
- </table>
+ <div class="action-secret">
+ <code>{{ renderedSecret }}</code>
+ <NcButton v-if="clientSecret !== ''"
+ type="tertiary-no-background"
+ :aria-label="toggleAriaLabel"
+ @click="toggleSecret">
+ <template #icon>
+ <EyeOutline :size="20" />
+ </template>
+ </NcButton>
+ </div>
</td>
<td class="action-column">
<NcButton type="tertiary-no-background"
@@ -56,14 +35,16 @@
<script>
-import Delete from 'vue-material-design-icons/Delete'
-import NcButton from '@nextcloud/vue/dist/Components/NcButton'
+import Delete from 'vue-material-design-icons/DeleteOutline.vue'
+import EyeOutline from 'vue-material-design-icons/EyeOutline.vue'
+import NcButton from '@nextcloud/vue/components/NcButton'
export default {
name: 'OAuthItem',
components: {
Delete,
NcButton,
+ EyeOutline,
},
props: {
client: {
@@ -89,6 +70,12 @@ export default {
return '****'
}
},
+ toggleAriaLabel() {
+ if (!this.renderSecret) {
+ return t('oauth2', 'Show client secret')
+ }
+ return t('oauth2', 'Hide client secret')
+ },
},
methods: {
toggleSecret() {
@@ -99,20 +86,28 @@ export default {
</script>
<style scoped>
- .icon-toggle,
- .icon-delete {
- display: inline-block;
- width: 16px;
- height: 16px;
- padding: 10px;
- vertical-align: middle;
+ .action-secret {
+ display: flex;
+ align-items: center;
+ }
+
+ .action-secret code {
+ padding-top: 5px;
}
+
td code {
display: inline-block;
vertical-align: middle;
}
+
table.inline td {
border: none;
padding: 5px;
}
+
+ .action-column {
+ display: flex;
+ justify-content: flex-end;
+ padding-inline-end: 0;
+ }
</style>
diff --git a/apps/oauth2/src/main.js b/apps/oauth2/src/main.js
index 64a936bea40..10d537455df 100644
--- a/apps/oauth2/src/main.js
+++ b/apps/oauth2/src/main.js
@@ -1,25 +1,6 @@
/**
- * @copyright Copyright (c) 2018 Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license AGPL-3.0-or-later
- *
- * 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/>.
- *
+ * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
import Vue from 'vue'
diff --git a/apps/oauth2/templates/admin.php b/apps/oauth2/templates/admin.php
index 284a52231e9..844eeee2c08 100644
--- a/apps/oauth2/templates/admin.php
+++ b/apps/oauth2/templates/admin.php
@@ -1,25 +1,10 @@
<?php
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
-script('oauth2', 'oauth2');
+\OCP\Util::addScript('oauth2', 'oauth2', 'core');
?>
diff --git a/apps/oauth2/tests/Controller/LoginRedirectorControllerTest.php b/apps/oauth2/tests/Controller/LoginRedirectorControllerTest.php
index 7f45f9c5b4b..04ac0bfbd28 100644
--- a/apps/oauth2/tests/Controller/LoginRedirectorControllerTest.php
+++ b/apps/oauth2/tests/Controller/LoginRedirectorControllerTest.php
@@ -1,58 +1,42 @@
<?php
+
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Daniel Kesselberg <mail@danielkesselberg.de>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Tests\Controller;
+use OC\Core\Controller\ClientFlowLoginController;
use OCA\OAuth2\Controller\LoginRedirectorController;
use OCA\OAuth2\Db\Client;
use OCA\OAuth2\Db\ClientMapper;
use OCA\OAuth2\Exceptions\ClientNotFoundException;
use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\TemplateResponse;
+use OCP\IAppConfig;
+use OCP\IConfig;
use OCP\IL10N;
use OCP\IRequest;
use OCP\ISession;
use OCP\IURLGenerator;
+use OCP\Security\ISecureRandom;
+use PHPUnit\Framework\MockObject\MockObject;
use Test\TestCase;
/**
* @group DB
*/
class LoginRedirectorControllerTest extends TestCase {
- /** @var IRequest|\PHPUnit\Framework\MockObject\MockObject */
- private $request;
- /** @var IURLGenerator|\PHPUnit\Framework\MockObject\MockObject */
- private $urlGenerator;
- /** @var ClientMapper|\PHPUnit\Framework\MockObject\MockObject */
- private $clientMapper;
- /** @var ISession|\PHPUnit\Framework\MockObject\MockObject */
- private $session;
- /** @var LoginRedirectorController */
- private $loginRedirectorController;
- /** @var IL10N */
- private $l;
+ private IRequest&MockObject $request;
+ private IURLGenerator&MockObject $urlGenerator;
+ private ClientMapper&MockObject $clientMapper;
+ private ISession&MockObject $session;
+ private IL10N&MockObject $l;
+ private ISecureRandom&MockObject $random;
+ private IAppConfig&MockObject $appConfig;
+ private IConfig&MockObject $config;
+
+ private LoginRedirectorController $loginRedirectorController;
protected function setUp(): void {
parent::setUp();
@@ -62,6 +46,9 @@ class LoginRedirectorControllerTest extends TestCase {
$this->clientMapper = $this->createMock(ClientMapper::class);
$this->session = $this->createMock(ISession::class);
$this->l = $this->createMock(IL10N::class);
+ $this->random = $this->createMock(ISecureRandom::class);
+ $this->appConfig = $this->createMock(IAppConfig::class);
+ $this->config = $this->createMock(IConfig::class);
$this->loginRedirectorController = new LoginRedirectorController(
'oauth2',
@@ -69,11 +56,14 @@ class LoginRedirectorControllerTest extends TestCase {
$this->urlGenerator,
$this->clientMapper,
$this->session,
- $this->l
+ $this->l,
+ $this->random,
+ $this->appConfig,
+ $this->config,
);
}
- public function testAuthorize() {
+ public function testAuthorize(): void {
$client = new Client();
$client->setClientIdentifier('MyClientIdentifier');
$this->clientMapper
@@ -92,15 +82,74 @@ class LoginRedirectorControllerTest extends TestCase {
'core.ClientFlowLogin.showAuthPickerPage',
[
'clientIdentifier' => 'MyClientIdentifier',
+ 'providedRedirectUri' => '',
]
)
->willReturn('https://example.com/?clientIdentifier=foo');
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueBool')
+ ->with('oauth2.enable_oc_clients', false)
+ ->willReturn(false);
$expected = new RedirectResponse('https://example.com/?clientIdentifier=foo');
$this->assertEquals($expected, $this->loginRedirectorController->authorize('MyClientId', 'MyState', 'code'));
}
- public function testAuthorizeWrongResponseType() {
+ public function testAuthorizeSkipPicker(): void {
+ $client = new Client();
+ $client->setName('MyClientName');
+ $client->setClientIdentifier('MyClientIdentifier');
+ $this->clientMapper
+ ->expects($this->once())
+ ->method('getByIdentifier')
+ ->with('MyClientId')
+ ->willReturn($client);
+ $this->session
+ ->expects(static::exactly(2))
+ ->method('set')
+ ->willReturnCallback(function (string $key, string $value): void {
+ switch ([$key, $value]) {
+ case ['oauth.state', 'MyState']:
+ case [ClientFlowLoginController::STATE_NAME, 'MyStateToken']:
+ /* Expected */
+ break;
+ default:
+ throw new LogicException();
+ }
+ });
+ $this->appConfig
+ ->expects(static::once())
+ ->method('getValueArray')
+ ->with('oauth2', 'skipAuthPickerApplications', [])
+ ->willReturn(['MyClientName']);
+ $this->random
+ ->expects(static::once())
+ ->method('generate')
+ ->willReturn('MyStateToken');
+ $this->urlGenerator
+ ->expects($this->once())
+ ->method('linkToRouteAbsolute')
+ ->with(
+ 'core.ClientFlowLogin.grantPage',
+ [
+ 'stateToken' => 'MyStateToken',
+ 'clientIdentifier' => 'MyClientIdentifier',
+ 'providedRedirectUri' => '',
+ ]
+ )
+ ->willReturn('https://example.com/?clientIdentifier=foo');
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueBool')
+ ->with('oauth2.enable_oc_clients', false)
+ ->willReturn(false);
+
+ $expected = new RedirectResponse('https://example.com/?clientIdentifier=foo');
+ $this->assertEquals($expected, $this->loginRedirectorController->authorize('MyClientId', 'MyState', 'code'));
+ }
+
+ public function testAuthorizeWrongResponseType(): void {
$client = new Client();
$client->setClientIdentifier('MyClientIdentifier');
$client->setRedirectUri('http://foo.bar');
@@ -118,7 +167,75 @@ class LoginRedirectorControllerTest extends TestCase {
$this->assertEquals($expected, $this->loginRedirectorController->authorize('MyClientId', 'MyState', 'wrongcode'));
}
- public function testClientNotFound() {
+ public function testAuthorizeWithLegacyOcClient(): void {
+ $client = new Client();
+ $client->setClientIdentifier('MyClientIdentifier');
+ $client->setRedirectUri('http://localhost:*');
+ $this->clientMapper
+ ->expects($this->once())
+ ->method('getByIdentifier')
+ ->with('MyClientId')
+ ->willReturn($client);
+ $this->session
+ ->expects($this->once())
+ ->method('set')
+ ->with('oauth.state', 'MyState');
+ $this->urlGenerator
+ ->expects($this->once())
+ ->method('linkToRouteAbsolute')
+ ->with(
+ 'core.ClientFlowLogin.showAuthPickerPage',
+ [
+ 'clientIdentifier' => 'MyClientIdentifier',
+ 'providedRedirectUri' => 'http://localhost:30000',
+ ]
+ )
+ ->willReturn('https://example.com/?clientIdentifier=foo&providedRedirectUri=http://localhost:30000');
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueBool')
+ ->with('oauth2.enable_oc_clients', false)
+ ->willReturn(true);
+
+ $expected = new RedirectResponse('https://example.com/?clientIdentifier=foo&providedRedirectUri=http://localhost:30000');
+ $this->assertEquals($expected, $this->loginRedirectorController->authorize('MyClientId', 'MyState', 'code', 'http://localhost:30000'));
+ }
+
+ public function testAuthorizeNotForwardingUntrustedURIs(): void {
+ $client = new Client();
+ $client->setClientIdentifier('MyClientIdentifier');
+ $this->clientMapper
+ ->expects($this->once())
+ ->method('getByIdentifier')
+ ->with('MyClientId')
+ ->willReturn($client);
+ $this->session
+ ->expects($this->once())
+ ->method('set')
+ ->with('oauth.state', 'MyState');
+ $this->urlGenerator
+ ->expects($this->once())
+ ->method('linkToRouteAbsolute')
+ ->with(
+ 'core.ClientFlowLogin.showAuthPickerPage',
+ [
+ 'clientIdentifier' => 'MyClientIdentifier',
+ 'providedRedirectUri' => '',
+ ]
+ )
+ ->willReturn('https://example.com/?clientIdentifier=foo');
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueBool')
+ ->with('oauth2.enable_oc_clients', false)
+ ->willReturn(false);
+
+ $expected = new RedirectResponse('https://example.com/?clientIdentifier=foo');
+ $this->assertEquals($expected, $this->loginRedirectorController->authorize('MyClientId', 'MyState', 'code', 'http://untrusted-uri.com'));
+ }
+
+
+ public function testClientNotFound(): void {
$clientNotFound = new ClientNotFoundException('could not find client test123', 0);
$this->clientMapper
->expects($this->once())
diff --git a/apps/oauth2/tests/Controller/OauthApiControllerTest.php b/apps/oauth2/tests/Controller/OauthApiControllerTest.php
index 8977f6a2b66..53dd8549196 100644
--- a/apps/oauth2/tests/Controller/OauthApiControllerTest.php
+++ b/apps/oauth2/tests/Controller/OauthApiControllerTest.php
@@ -1,27 +1,8 @@
<?php
+
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Tests\Controller;
@@ -29,7 +10,6 @@ use OC\Authentication\Exceptions\ExpiredTokenException;
use OC\Authentication\Exceptions\InvalidTokenException;
use OC\Authentication\Token\IProvider as TokenProvider;
use OC\Authentication\Token\PublicKeyToken;
-use OC\Security\Bruteforce\Throttler;
use OCA\OAuth2\Controller\OauthApiController;
use OCA\OAuth2\Db\AccessToken;
use OCA\OAuth2\Db\AccessTokenMapper;
@@ -41,8 +21,10 @@ use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\IRequest;
+use OCP\Security\Bruteforce\IThrottler;
use OCP\Security\ICrypto;
use OCP\Security\ISecureRandom;
+use Psr\Log\LoggerInterface;
use Test\TestCase;
/* We have to use this to add a property to the mocked request and avoid warnings about dynamic properties on PHP>=8.2 */
@@ -65,8 +47,12 @@ class OauthApiControllerTest extends TestCase {
private $secureRandom;
/** @var ITimeFactory|\PHPUnit\Framework\MockObject\MockObject */
private $time;
- /** @var Throttler|\PHPUnit\Framework\MockObject\MockObject */
+ /** @var IThrottler|\PHPUnit\Framework\MockObject\MockObject */
private $throttler;
+ /** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */
+ private $logger;
+ /** @var ITimeFactory|\PHPUnit\Framework\MockObject\MockObject */
+ private $timeFactory;
/** @var OauthApiController */
private $oauthApiController;
@@ -80,7 +66,9 @@ class OauthApiControllerTest extends TestCase {
$this->tokenProvider = $this->createMock(TokenProvider::class);
$this->secureRandom = $this->createMock(ISecureRandom::class);
$this->time = $this->createMock(ITimeFactory::class);
- $this->throttler = $this->createMock(Throttler::class);
+ $this->throttler = $this->createMock(IThrottler::class);
+ $this->logger = $this->createMock(LoggerInterface::class);
+ $this->timeFactory = $this->createMock(ITimeFactory::class);
$this->oauthApiController = new OauthApiController(
'oauth2',
@@ -91,22 +79,26 @@ class OauthApiControllerTest extends TestCase {
$this->tokenProvider,
$this->secureRandom,
$this->time,
- $this->throttler
+ $this->logger,
+ $this->throttler,
+ $this->timeFactory
);
}
- public function testGetTokenInvalidGrantType() {
+ public function testGetTokenInvalidGrantType(): void {
$expected = new JSONResponse([
'error' => 'invalid_grant',
], Http::STATUS_BAD_REQUEST);
+ $expected->throttle(['invalid_grant' => 'foo']);
$this->assertEquals($expected, $this->oauthApiController->getToken('foo', null, null, null, null));
}
- public function testGetTokenInvalidCode() {
+ public function testGetTokenInvalidCode(): void {
$expected = new JSONResponse([
'error' => 'invalid_request',
], Http::STATUS_BAD_REQUEST);
+ $expected->throttle(['invalid_request' => 'token not found', 'code' => 'invalidcode']);
$this->accessTokenMapper->method('getByCode')
->with('invalidcode')
@@ -115,10 +107,94 @@ class OauthApiControllerTest extends TestCase {
$this->assertEquals($expected, $this->oauthApiController->getToken('authorization_code', 'invalidcode', null, null, null));
}
- public function testGetTokenInvalidRefreshToken() {
+ public function testGetTokenExpiredCode(): void {
+ $codeCreatedAt = 100;
+ $expiredSince = 123;
+
+ $expected = new JSONResponse([
+ 'error' => 'invalid_request',
+ ], Http::STATUS_BAD_REQUEST);
+ $expected->throttle(['invalid_request' => 'authorization_code_expired', 'expired_since' => $expiredSince]);
+
+ $accessToken = new AccessToken();
+ $accessToken->setClientId(42);
+ $accessToken->setCodeCreatedAt($codeCreatedAt);
+
+ $this->accessTokenMapper->method('getByCode')
+ ->with('validcode')
+ ->willReturn($accessToken);
+
+ $tsNow = $codeCreatedAt + OauthApiController::AUTHORIZATION_CODE_EXPIRES_AFTER + $expiredSince;
+ $dateNow = (new \DateTimeImmutable())->setTimestamp($tsNow);
+ $this->timeFactory->method('now')
+ ->willReturn($dateNow);
+
+ $this->assertEquals($expected, $this->oauthApiController->getToken('authorization_code', 'validcode', null, null, null));
+ }
+
+ public function testGetTokenWithCodeForActiveToken(): void {
+ // if a token has already delivered oauth tokens,
+ // it should not be possible to get a new oauth token from a valid authorization code
+ $codeCreatedAt = 100;
+
+ $expected = new JSONResponse([
+ 'error' => 'invalid_request',
+ ], Http::STATUS_BAD_REQUEST);
+ $expected->throttle(['invalid_request' => 'authorization_code_received_for_active_token']);
+
+ $accessToken = new AccessToken();
+ $accessToken->setClientId(42);
+ $accessToken->setCodeCreatedAt($codeCreatedAt);
+ $accessToken->setTokenCount(1);
+
+ $this->accessTokenMapper->method('getByCode')
+ ->with('validcode')
+ ->willReturn($accessToken);
+
+ $tsNow = $codeCreatedAt + 1;
+ $dateNow = (new \DateTimeImmutable())->setTimestamp($tsNow);
+ $this->timeFactory->method('now')
+ ->willReturn($dateNow);
+
+ $this->assertEquals($expected, $this->oauthApiController->getToken('authorization_code', 'validcode', null, null, null));
+ }
+
+ public function testGetTokenClientDoesNotExist(): void {
+ // In this test, the token's authorization code is valid and has not expired
+ // and we check what happens when the associated Oauth client does not exist
+ $codeCreatedAt = 100;
+
$expected = new JSONResponse([
'error' => 'invalid_request',
], Http::STATUS_BAD_REQUEST);
+ $expected->throttle(['invalid_request' => 'client not found', 'client_id' => 42]);
+
+ $accessToken = new AccessToken();
+ $accessToken->setClientId(42);
+ $accessToken->setCodeCreatedAt($codeCreatedAt);
+
+ $this->accessTokenMapper->method('getByCode')
+ ->with('validcode')
+ ->willReturn($accessToken);
+
+ // 'now' is before the token's authorization code expiration
+ $tsNow = $codeCreatedAt + OauthApiController::AUTHORIZATION_CODE_EXPIRES_AFTER - 1;
+ $dateNow = (new \DateTimeImmutable())->setTimestamp($tsNow);
+ $this->timeFactory->method('now')
+ ->willReturn($dateNow);
+
+ $this->clientMapper->method('getByUid')
+ ->with(42)
+ ->willThrowException(new ClientNotFoundException());
+
+ $this->assertEquals($expected, $this->oauthApiController->getToken('authorization_code', 'validcode', null, null, null));
+ }
+
+ public function testRefreshTokenInvalidRefreshToken(): void {
+ $expected = new JSONResponse([
+ 'error' => 'invalid_request',
+ ], Http::STATUS_BAD_REQUEST);
+ $expected->throttle(['invalid_request' => 'token not found', 'code' => 'invalidrefresh']);
$this->accessTokenMapper->method('getByCode')
->with('invalidrefresh')
@@ -127,10 +203,11 @@ class OauthApiControllerTest extends TestCase {
$this->assertEquals($expected, $this->oauthApiController->getToken('refresh_token', null, 'invalidrefresh', null, null));
}
- public function testGetTokenClientDoesNotExist() {
+ public function testRefreshTokenClientDoesNotExist(): void {
$expected = new JSONResponse([
'error' => 'invalid_request',
], Http::STATUS_BAD_REQUEST);
+ $expected->throttle(['invalid_request' => 'client not found', 'client_id' => 42]);
$accessToken = new AccessToken();
$accessToken->setClientId(42);
@@ -146,7 +223,7 @@ class OauthApiControllerTest extends TestCase {
$this->assertEquals($expected, $this->oauthApiController->getToken('refresh_token', null, 'validrefresh', null, null));
}
- public function invalidClientProvider() {
+ public static function invalidClientProvider() {
return [
['invalidClientId', 'invalidClientSecret'],
['clientId', 'invalidClientSecret'],
@@ -155,15 +232,16 @@ class OauthApiControllerTest extends TestCase {
}
/**
- * @dataProvider invalidClientProvider
*
* @param string $clientId
* @param string $clientSecret
*/
- public function testGetTokenInvalidClient($clientId, $clientSecret) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('invalidClientProvider')]
+ public function testRefreshTokenInvalidClient($clientId, $clientSecret): void {
$expected = new JSONResponse([
'error' => 'invalid_client',
], Http::STATUS_BAD_REQUEST);
+ $expected->throttle(['invalid_client' => 'client ID or secret does not match']);
$accessToken = new AccessToken();
$accessToken->setClientId(42);
@@ -172,9 +250,20 @@ class OauthApiControllerTest extends TestCase {
->with('validrefresh')
->willReturn($accessToken);
+ $this->crypto
+ ->method('calculateHMAC')
+ ->with($this->callback(function (string $text) {
+ return $text === 'clientSecret' || $text === 'invalidClientSecret';
+ }))
+ ->willReturnCallback(function (string $text) {
+ return $text === 'clientSecret'
+ ? 'hashedClientSecret'
+ : 'hashedInvalidClientSecret';
+ });
+
$client = new Client();
$client->setClientIdentifier('clientId');
- $client->setSecret('clientSecret');
+ $client->setSecret(bin2hex('hashedClientSecret'));
$this->clientMapper->method('getByUid')
->with(42)
->willReturn($client);
@@ -182,10 +271,11 @@ class OauthApiControllerTest extends TestCase {
$this->assertEquals($expected, $this->oauthApiController->getToken('refresh_token', null, 'validrefresh', $clientId, $clientSecret));
}
- public function testGetTokenInvalidAppToken() {
+ public function testRefreshTokenInvalidAppToken(): void {
$expected = new JSONResponse([
'error' => 'invalid_request',
], Http::STATUS_BAD_REQUEST);
+ $expected->throttle(['invalid_request' => 'token is invalid']);
$accessToken = new AccessToken();
$accessToken->setClientId(42);
@@ -198,16 +288,20 @@ class OauthApiControllerTest extends TestCase {
$client = new Client();
$client->setClientIdentifier('clientId');
- $client->setSecret('clientSecret');
+ $client->setSecret(bin2hex('hashedClientSecret'));
$this->clientMapper->method('getByUid')
->with(42)
->willReturn($client);
- $this->crypto->method('decrypt')
- ->with(
- 'encryptedToken',
- 'validrefresh'
- )->willReturn('decryptedToken');
+ $this->crypto
+ ->method('decrypt')
+ ->with('encryptedToken')
+ ->willReturn('decryptedToken');
+
+ $this->crypto
+ ->method('calculateHMAC')
+ ->with('clientSecret')
+ ->willReturn('hashedClientSecret');
$this->tokenProvider->method('getTokenById')
->with(1337)
@@ -220,7 +314,7 @@ class OauthApiControllerTest extends TestCase {
$this->assertEquals($expected, $this->oauthApiController->getToken('refresh_token', null, 'validrefresh', 'clientId', 'clientSecret'));
}
- public function testGetTokenValidAppToken() {
+ public function testRefreshTokenValidAppToken(): void {
$accessToken = new AccessToken();
$accessToken->setClientId(42);
$accessToken->setTokenId(1337);
@@ -232,16 +326,20 @@ class OauthApiControllerTest extends TestCase {
$client = new Client();
$client->setClientIdentifier('clientId');
- $client->setSecret('clientSecret');
+ $client->setSecret(bin2hex('hashedClientSecret'));
$this->clientMapper->method('getByUid')
->with(42)
->willReturn($client);
- $this->crypto->method('decrypt')
- ->with(
- 'encryptedToken',
- 'validrefresh'
- )->willReturn('decryptedToken');
+ $this->crypto
+ ->method('decrypt')
+ ->with('encryptedToken')
+ ->willReturn('decryptedToken');
+
+ $this->crypto
+ ->method('calculateHMAC')
+ ->with('clientSecret')
+ ->willReturn('hashedClientSecret');
$appToken = new PublicKeyToken();
$appToken->setUid('userId');
@@ -255,7 +353,7 @@ class OauthApiControllerTest extends TestCase {
$this->secureRandom->method('generate')
->willReturnCallback(function ($len) {
- return 'random'.$len;
+ return 'random' . $len;
});
$this->tokenProvider->expects($this->once())
@@ -285,8 +383,8 @@ class OauthApiControllerTest extends TestCase {
->method('update')
->with(
$this->callback(function (AccessToken $token) {
- return $token->getHashedCode() === hash('sha512', 'random128') &&
- $token->getEncryptedToken() === 'newEncryptedToken';
+ return $token->getHashedCode() === hash('sha512', 'random128')
+ && $token->getEncryptedToken() === 'newEncryptedToken';
})
);
@@ -312,7 +410,7 @@ class OauthApiControllerTest extends TestCase {
$this->assertEquals($expected, $this->oauthApiController->getToken('refresh_token', null, 'validrefresh', 'clientId', 'clientSecret'));
}
- public function testGetTokenValidAppTokenBasicAuth() {
+ public function testRefreshTokenValidAppTokenBasicAuth(): void {
$accessToken = new AccessToken();
$accessToken->setClientId(42);
$accessToken->setTokenId(1337);
@@ -324,16 +422,20 @@ class OauthApiControllerTest extends TestCase {
$client = new Client();
$client->setClientIdentifier('clientId');
- $client->setSecret('clientSecret');
+ $client->setSecret(bin2hex('hashedClientSecret'));
$this->clientMapper->method('getByUid')
->with(42)
->willReturn($client);
- $this->crypto->method('decrypt')
- ->with(
- 'encryptedToken',
- 'validrefresh'
- )->willReturn('decryptedToken');
+ $this->crypto
+ ->method('decrypt')
+ ->with('encryptedToken')
+ ->willReturn('decryptedToken');
+
+ $this->crypto
+ ->method('calculateHMAC')
+ ->with('clientSecret')
+ ->willReturn('hashedClientSecret');
$appToken = new PublicKeyToken();
$appToken->setUid('userId');
@@ -347,7 +449,7 @@ class OauthApiControllerTest extends TestCase {
$this->secureRandom->method('generate')
->willReturnCallback(function ($len) {
- return 'random'.$len;
+ return 'random' . $len;
});
$this->tokenProvider->expects($this->once())
@@ -377,8 +479,8 @@ class OauthApiControllerTest extends TestCase {
->method('update')
->with(
$this->callback(function (AccessToken $token) {
- return $token->getHashedCode() === hash('sha512', 'random128') &&
- $token->getEncryptedToken() === 'newEncryptedToken';
+ return $token->getHashedCode() === hash('sha512', 'random128')
+ && $token->getEncryptedToken() === 'newEncryptedToken';
})
);
@@ -407,7 +509,7 @@ class OauthApiControllerTest extends TestCase {
$this->assertEquals($expected, $this->oauthApiController->getToken('refresh_token', null, 'validrefresh', null, null));
}
- public function testGetTokenExpiredAppToken() {
+ public function testRefreshTokenExpiredAppToken(): void {
$accessToken = new AccessToken();
$accessToken->setClientId(42);
$accessToken->setTokenId(1337);
@@ -419,16 +521,20 @@ class OauthApiControllerTest extends TestCase {
$client = new Client();
$client->setClientIdentifier('clientId');
- $client->setSecret('clientSecret');
+ $client->setSecret(bin2hex('hashedClientSecret'));
$this->clientMapper->method('getByUid')
->with(42)
->willReturn($client);
- $this->crypto->method('decrypt')
- ->with(
- 'encryptedToken',
- 'validrefresh'
- )->willReturn('decryptedToken');
+ $this->crypto
+ ->method('decrypt')
+ ->with('encryptedToken')
+ ->willReturn('decryptedToken');
+
+ $this->crypto
+ ->method('calculateHMAC')
+ ->with('clientSecret')
+ ->willReturn('hashedClientSecret');
$appToken = new PublicKeyToken();
$appToken->setUid('userId');
@@ -442,7 +548,7 @@ class OauthApiControllerTest extends TestCase {
$this->secureRandom->method('generate')
->willReturnCallback(function ($len) {
- return 'random'.$len;
+ return 'random' . $len;
});
$this->tokenProvider->expects($this->once())
@@ -472,8 +578,8 @@ class OauthApiControllerTest extends TestCase {
->method('update')
->with(
$this->callback(function (AccessToken $token) {
- return $token->getHashedCode() === hash('sha512', 'random128') &&
- $token->getEncryptedToken() === 'newEncryptedToken';
+ return $token->getHashedCode() === hash('sha512', 'random128')
+ && $token->getEncryptedToken() === 'newEncryptedToken';
})
);
diff --git a/apps/oauth2/tests/Controller/SettingsControllerTest.php b/apps/oauth2/tests/Controller/SettingsControllerTest.php
index 216655190ae..030a220e3d7 100644
--- a/apps/oauth2/tests/Controller/SettingsControllerTest.php
+++ b/apps/oauth2/tests/Controller/SettingsControllerTest.php
@@ -1,28 +1,8 @@
<?php
+
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author rakekniven <mark.ziegler@rakekniven.de>
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Tests\Controller;
@@ -32,11 +12,19 @@ use OCA\OAuth2\Db\Client;
use OCA\OAuth2\Db\ClientMapper;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
+use OCP\Authentication\Token\IProvider as IAuthTokenProvider;
use OCP\IL10N;
use OCP\IRequest;
+use OCP\IUser;
+use OCP\IUserManager;
+use OCP\Security\ICrypto;
use OCP\Security\ISecureRandom;
+use OCP\Server;
use Test\TestCase;
+/**
+ * @group DB
+ */
class SettingsControllerTest extends TestCase {
/** @var IRequest|\PHPUnit\Framework\MockObject\MockObject */
private $request;
@@ -46,8 +34,16 @@ class SettingsControllerTest extends TestCase {
private $secureRandom;
/** @var AccessTokenMapper|\PHPUnit\Framework\MockObject\MockObject */
private $accessTokenMapper;
+ /** @var IAuthTokenProvider|\PHPUnit\Framework\MockObject\MockObject */
+ private $authTokenProvider;
+ /** @var IUserManager|\PHPUnit\Framework\MockObject\MockObject */
+ private $userManager;
/** @var SettingsController */
private $settingsController;
+ /** @var IL10N|\PHPUnit\Framework\MockObject\MockObject */
+ private $l;
+ /** @var ICrypto|\PHPUnit\Framework\MockObject\MockObject */
+ private $crypto;
protected function setUp(): void {
parent::setUp();
@@ -56,21 +52,27 @@ class SettingsControllerTest extends TestCase {
$this->clientMapper = $this->createMock(ClientMapper::class);
$this->secureRandom = $this->createMock(ISecureRandom::class);
$this->accessTokenMapper = $this->createMock(AccessTokenMapper::class);
- $l = $this->createMock(IL10N::class);
- $l->method('t')
+ $this->authTokenProvider = $this->createMock(IAuthTokenProvider::class);
+ $this->userManager = $this->createMock(IUserManager::class);
+ $this->crypto = $this->createMock(ICrypto::class);
+ $this->l = $this->createMock(IL10N::class);
+ $this->l->method('t')
->willReturnArgument(0);
-
$this->settingsController = new SettingsController(
'oauth2',
$this->request,
$this->clientMapper,
$this->secureRandom,
$this->accessTokenMapper,
- $l
+ $this->l,
+ $this->authTokenProvider,
+ $this->userManager,
+ $this->crypto
);
+
}
- public function testAddClient() {
+ public function testAddClient(): void {
$this->secureRandom
->expects($this->exactly(2))
->method('generate')
@@ -79,20 +81,25 @@ class SettingsControllerTest extends TestCase {
'MySecret',
'MyClientIdentifier');
+ $this->crypto
+ ->expects($this->once())
+ ->method('calculateHMAC')
+ ->willReturn('MyHashedSecret');
+
$client = new Client();
$client->setName('My Client Name');
$client->setRedirectUri('https://example.com/');
- $client->setSecret('MySecret');
+ $client->setSecret(bin2hex('MyHashedSecret'));
$client->setClientIdentifier('MyClientIdentifier');
$this->clientMapper
->expects($this->once())
->method('insert')
->with($this->callback(function (Client $c) {
- return $c->getName() === 'My Client Name' &&
- $c->getRedirectUri() === 'https://example.com/' &&
- $c->getSecret() === 'MySecret' &&
- $c->getClientIdentifier() === 'MyClientIdentifier';
+ return $c->getName() === 'My Client Name'
+ && $c->getRedirectUri() === 'https://example.com/'
+ && $c->getSecret() === bin2hex('MyHashedSecret')
+ && $c->getClientIdentifier() === 'MyClientIdentifier';
}))->willReturnCallback(function (Client $c) {
$c->setId(42);
return $c;
@@ -112,12 +119,32 @@ class SettingsControllerTest extends TestCase {
], $data);
}
- public function testDeleteClient() {
+ public function testDeleteClient(): void {
+
+ $userManager = Server::get(IUserManager::class);
+ // count other users in the db before adding our own
+ $count = 0;
+ $function = function (IUser $user) use (&$count): void {
+ if ($user->getLastLogin() > 0) {
+ $count++;
+ }
+ };
+ $userManager->callForAllUsers($function);
+ $user1 = $userManager->createUser('test101', 'test101');
+ $user1->updateLastLoginTimestamp();
+ $tokenProviderMock = $this->getMockBuilder(IAuthTokenProvider::class)->getMock();
+
+ // expect one call per user and ensure the correct client name
+ $tokenProviderMock
+ ->expects($this->exactly($count + 1))
+ ->method('invalidateTokensOfUser')
+ ->with($this->isType('string'), 'My Client Name');
+
$client = new Client();
$client->setId(123);
$client->setName('My Client Name');
$client->setRedirectUri('https://example.com/');
- $client->setSecret('MySecret');
+ $client->setSecret(bin2hex('MyHashedSecret'));
$client->setClientIdentifier('MyClientIdentifier');
$this->clientMapper
@@ -129,15 +156,30 @@ class SettingsControllerTest extends TestCase {
->method('deleteByClientId')
->with(123);
$this->clientMapper
+ ->expects($this->once())
->method('delete')
->with($client);
- $result = $this->settingsController->deleteClient(123);
+ $settingsController = new SettingsController(
+ 'oauth2',
+ $this->request,
+ $this->clientMapper,
+ $this->secureRandom,
+ $this->accessTokenMapper,
+ $this->l,
+ $tokenProviderMock,
+ $userManager,
+ $this->crypto
+ );
+
+ $result = $settingsController->deleteClient(123);
$this->assertInstanceOf(JSONResponse::class, $result);
$this->assertEquals([], $result->getData());
+
+ $user1->delete();
}
- public function testInvalidRedirectUri() {
+ public function testInvalidRedirectUri(): void {
$result = $this->settingsController->addClient('test', 'invalidurl');
$this->assertEquals(Http::STATUS_BAD_REQUEST, $result->getStatus());
diff --git a/apps/oauth2/tests/Db/AccessTokenMapperTest.php b/apps/oauth2/tests/Db/AccessTokenMapperTest.php
index 013eb72919a..41a79fe725b 100644
--- a/apps/oauth2/tests/Db/AccessTokenMapperTest.php
+++ b/apps/oauth2/tests/Db/AccessTokenMapperTest.php
@@ -1,30 +1,17 @@
<?php
+
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Tests\Db;
use OCA\OAuth2\Db\AccessToken;
use OCA\OAuth2\Db\AccessTokenMapper;
+use OCA\OAuth2\Exceptions\AccessTokenNotFoundException;
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\IDBConnection;
+use OCP\Server;
use Test\TestCase;
/**
@@ -36,10 +23,10 @@ class AccessTokenMapperTest extends TestCase {
protected function setUp(): void {
parent::setUp();
- $this->accessTokenMapper = new AccessTokenMapper(\OC::$server->getDatabaseConnection());
+ $this->accessTokenMapper = new AccessTokenMapper(Server::get(IDBConnection::class), Server::get(ITimeFactory::class));
}
- public function testGetByCode() {
+ public function testGetByCode(): void {
$this->accessTokenMapper->deleteByClientId(1234);
$token = new AccessToken();
$token->setClientId(1234);
@@ -54,9 +41,9 @@ class AccessTokenMapperTest extends TestCase {
$this->accessTokenMapper->delete($token);
}
-
- public function testDeleteByClientId() {
- $this->expectException(\OCA\OAuth2\Exceptions\AccessTokenNotFoundException::class);
+
+ public function testDeleteByClientId(): void {
+ $this->expectException(AccessTokenNotFoundException::class);
$this->accessTokenMapper->deleteByClientId(1234);
$token = new AccessToken();
diff --git a/apps/oauth2/tests/Db/ClientMapperTest.php b/apps/oauth2/tests/Db/ClientMapperTest.php
index fdc458fa301..2e8d20ad200 100644
--- a/apps/oauth2/tests/Db/ClientMapperTest.php
+++ b/apps/oauth2/tests/Db/ClientMapperTest.php
@@ -1,31 +1,16 @@
<?php
+
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Joas Schilling <coding@schilljs.com>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Tests\Db;
use OCA\OAuth2\Db\Client;
use OCA\OAuth2\Db\ClientMapper;
+use OCA\OAuth2\Exceptions\ClientNotFoundException;
+use OCP\IDBConnection;
+use OCP\Server;
use Test\TestCase;
/**
@@ -37,17 +22,17 @@ class ClientMapperTest extends TestCase {
protected function setUp(): void {
parent::setUp();
- $this->clientMapper = new ClientMapper(\OC::$server->getDatabaseConnection());
+ $this->clientMapper = new ClientMapper(Server::get(IDBConnection::class));
}
protected function tearDown(): void {
- $query = \OC::$server->getDatabaseConnection()->getQueryBuilder();
+ $query = Server::get(IDBConnection::class)->getQueryBuilder();
$query->delete('oauth2_clients')->execute();
parent::tearDown();
}
- public function testGetByIdentifier() {
+ public function testGetByIdentifier(): void {
$client = new Client();
$client->setClientIdentifier('MyAwesomeClientIdentifier');
$client->setName('Client Name');
@@ -58,13 +43,13 @@ class ClientMapperTest extends TestCase {
$this->assertEquals($client, $this->clientMapper->getByIdentifier('MyAwesomeClientIdentifier'));
}
- public function testGetByIdentifierNotExisting() {
- $this->expectException(\OCA\OAuth2\Exceptions\ClientNotFoundException::class);
+ public function testGetByIdentifierNotExisting(): void {
+ $this->expectException(ClientNotFoundException::class);
$this->clientMapper->getByIdentifier('MyTotallyNotExistingClient');
}
- public function testGetByUid() {
+ public function testGetByUid(): void {
$client = new Client();
$client->setClientIdentifier('MyNewClient');
$client->setName('Client Name');
@@ -75,13 +60,23 @@ class ClientMapperTest extends TestCase {
$this->assertEquals($client, $this->clientMapper->getByUid($client->getId()));
}
- public function testGetByUidNotExisting() {
- $this->expectException(\OCA\OAuth2\Exceptions\ClientNotFoundException::class);
+ public function testGetByUidNotExisting(): void {
+ $this->expectException(ClientNotFoundException::class);
$this->clientMapper->getByUid(1234);
}
- public function testGetClients() {
+ public function testGetClients(): void {
$this->assertSame('array', gettype($this->clientMapper->getClients()));
}
+
+ public function testInsertLongEncryptedSecret(): void {
+ $client = new Client();
+ $client->setClientIdentifier('MyNewClient');
+ $client->setName('Client Name');
+ $client->setRedirectUri('https://example.com/');
+ $client->setSecret('b81dc8e2dc178817bf28ca7b37265aa96559ca02e6dcdeb74b42221d096ed5ef63681e836ae0ba1077b5fb5e6c2fa7748c78463f66fe0110c8dcb8dd7eb0305b16d0cd993e2ae275879994a2abf88c68|e466d9befa6b0102341458e45ecd551a|013af9e277374483123437f180a3b0371a411ad4f34c451547909769181a7d7cc191f0f5c2de78376d124dd7751b8c9660aabdd913f5e071fc6b819ba2e3d919|3');
+ $this->clientMapper->insert($client);
+ $this->assertTrue(true);
+ }
}
diff --git a/apps/oauth2/tests/Settings/AdminTest.php b/apps/oauth2/tests/Settings/AdminTest.php
index fc5ebbb8365..0f08bb30276 100644
--- a/apps/oauth2/tests/Settings/AdminTest.php
+++ b/apps/oauth2/tests/Settings/AdminTest.php
@@ -1,25 +1,8 @@
<?php
+
/**
- * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
- *
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Roeland Jago Douma <roeland@famdouma.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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\OAuth2\Tests\Settings;
@@ -29,6 +12,7 @@ use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
use OCP\IURLGenerator;
use PHPUnit\Framework\MockObject\MockObject;
+use Psr\Log\LoggerInterface;
use Test\TestCase;
class AdminTest extends TestCase {
@@ -36,7 +20,7 @@ class AdminTest extends TestCase {
/** @var Admin|MockObject */
private $admin;
- /** @var IInitialStateService|MockObject */
+ /** @var IInitialState|MockObject */
private $initialState;
/** @var ClientMapper|MockObject */
@@ -48,10 +32,15 @@ class AdminTest extends TestCase {
$this->initialState = $this->createMock(IInitialState::class);
$this->clientMapper = $this->createMock(ClientMapper::class);
- $this->admin = new Admin($this->initialState, $this->clientMapper, $this->createMock(IURLGenerator::class));
+ $this->admin = new Admin(
+ $this->initialState,
+ $this->clientMapper,
+ $this->createMock(IURLGenerator::class),
+ $this->createMock(LoggerInterface::class)
+ );
}
- public function testGetForm() {
+ public function testGetForm(): void {
$expected = new TemplateResponse(
'oauth2',
'admin',
@@ -61,11 +50,11 @@ class AdminTest extends TestCase {
$this->assertEquals($expected, $this->admin->getForm());
}
- public function testGetSection() {
+ public function testGetSection(): void {
$this->assertSame('security', $this->admin->getSection());
}
- public function testGetPriority() {
+ public function testGetPriority(): void {
$this->assertSame(100, $this->admin->getPriority());
}
}