summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Evans <grknight@gentoo.org>2022-11-02 10:16:31 -0400
committerBrian Evans <grknight@gentoo.org>2022-11-02 10:16:31 -0400
commitc89423dc6927ba00b71f332ac6e32c1f31240a45 (patch)
treee2c4c83c7634fccde19a17d853bea8ddae2e5f33
parentLinkAttributes: Update to v0.5 (diff)
downloadextensions-c89423dc6927ba00b71f332ac6e32c1f31240a45.tar.gz
extensions-c89423dc6927ba00b71f332ac6e32c1f31240a45.tar.bz2
extensions-c89423dc6927ba00b71f332ac6e32c1f31240a45.zip
Update OAuth to master as of 2022-11-02
Signed-off-by: Brian Evans <grknight@gentoo.org>
-rw-r--r--OAuth/.eslintignore11
-rw-r--r--OAuth/.eslintrc.json20
-rw-r--r--OAuth/.phan/config.php5
-rw-r--r--OAuth/.phpcs.xml8
-rw-r--r--OAuth/Gruntfile.js21
-rw-r--r--OAuth/README.md3
-rw-r--r--OAuth/composer.json24
-rw-r--r--OAuth/examples/testClient.php4
-rw-r--r--OAuth/extension.json128
-rw-r--r--OAuth/i18n/ar.json8
-rw-r--r--OAuth/i18n/as.json13
-rw-r--r--OAuth/i18n/ast.json4
-rw-r--r--OAuth/i18n/az.json3
-rw-r--r--OAuth/i18n/ban.json48
-rw-r--r--OAuth/i18n/bcl.json10
-rw-r--r--OAuth/i18n/be-tarask.json2
-rw-r--r--OAuth/i18n/be.json28
-rw-r--r--OAuth/i18n/bg.json11
-rw-r--r--OAuth/i18n/bjn.json9
-rw-r--r--OAuth/i18n/blk.json13
-rw-r--r--OAuth/i18n/bn.json35
-rw-r--r--OAuth/i18n/br.json3
-rw-r--r--OAuth/i18n/bs.json4
-rw-r--r--OAuth/i18n/ca.json3
-rw-r--r--OAuth/i18n/ce.json48
-rw-r--r--OAuth/i18n/cs.json14
-rw-r--r--OAuth/i18n/da.json4
-rw-r--r--OAuth/i18n/de.json37
-rw-r--r--OAuth/i18n/diq.json1
-rw-r--r--OAuth/i18n/el.json1
-rw-r--r--OAuth/i18n/en-gb.json13
-rw-r--r--OAuth/i18n/en.json20
-rw-r--r--OAuth/i18n/es.json5
-rw-r--r--OAuth/i18n/et.json51
-rw-r--r--OAuth/i18n/fa.json30
-rw-r--r--OAuth/i18n/fi.json16
-rw-r--r--OAuth/i18n/fr.json342
-rw-r--r--OAuth/i18n/gl.json10
-rw-r--r--OAuth/i18n/he.json60
-rw-r--r--OAuth/i18n/hi.json6
-rw-r--r--OAuth/i18n/hr.json26
-rw-r--r--OAuth/i18n/ht.json8
-rw-r--r--OAuth/i18n/hu.json47
-rw-r--r--OAuth/i18n/ia.json55
-rw-r--r--OAuth/i18n/ie.json10
-rw-r--r--OAuth/i18n/inh.json2
-rw-r--r--OAuth/i18n/io.json63
-rw-r--r--OAuth/i18n/is.json4
-rw-r--r--OAuth/i18n/it.json5
-rw-r--r--OAuth/i18n/ja.json2
-rw-r--r--OAuth/i18n/kaa.json8
-rw-r--r--OAuth/i18n/ko.json50
-rw-r--r--OAuth/i18n/ksh.json1
-rw-r--r--OAuth/i18n/ku-latn.json2
-rw-r--r--OAuth/i18n/lb.json29
-rw-r--r--OAuth/i18n/lld.json2
-rw-r--r--OAuth/i18n/lmo.json8
-rw-r--r--OAuth/i18n/lt.json5
-rw-r--r--OAuth/i18n/mk.json24
-rw-r--r--OAuth/i18n/mr.json1
-rw-r--r--OAuth/i18n/mt.json8
-rw-r--r--OAuth/i18n/my.json4
-rw-r--r--OAuth/i18n/nah.json5
-rw-r--r--OAuth/i18n/nb.json16
-rw-r--r--OAuth/i18n/ne.json6
-rw-r--r--OAuth/i18n/nl-informal.json8
-rw-r--r--OAuth/i18n/nl.json8
-rw-r--r--OAuth/i18n/nn.json4
-rw-r--r--OAuth/i18n/oc.json1
-rw-r--r--OAuth/i18n/pam.json8
-rw-r--r--OAuth/i18n/pl.json25
-rw-r--r--OAuth/i18n/pnb.json15
-rw-r--r--OAuth/i18n/pt-br.json11
-rw-r--r--OAuth/i18n/pt.json84
-rw-r--r--OAuth/i18n/qqq.json32
-rw-r--r--OAuth/i18n/ro.json6
-rw-r--r--OAuth/i18n/ru.json5
-rw-r--r--OAuth/i18n/rue.json9
-rw-r--r--OAuth/i18n/scn.json35
-rw-r--r--OAuth/i18n/sco.json4
-rw-r--r--OAuth/i18n/sd.json37
-rw-r--r--OAuth/i18n/sh.json16
-rw-r--r--OAuth/i18n/sje.json12
-rw-r--r--OAuth/i18n/sl.json102
-rw-r--r--OAuth/i18n/smn.json14
-rw-r--r--OAuth/i18n/sms.json21
-rw-r--r--OAuth/i18n/sq.json3
-rw-r--r--OAuth/i18n/sr-ec.json35
-rw-r--r--OAuth/i18n/sr-el.json2
-rw-r--r--OAuth/i18n/sv.json54
-rw-r--r--OAuth/i18n/te.json4
-rw-r--r--OAuth/i18n/th.json31
-rw-r--r--OAuth/i18n/ti.json25
-rw-r--r--OAuth/i18n/tr.json30
-rw-r--r--OAuth/i18n/uk.json55
-rw-r--r--OAuth/i18n/uz.json15
-rw-r--r--OAuth/i18n/vi.json39
-rw-r--r--OAuth/i18n/yi.json2
-rw-r--r--OAuth/i18n/yrl.json24
-rw-r--r--OAuth/i18n/yue.json3
-rw-r--r--OAuth/i18n/zh-hans.json77
-rw-r--r--OAuth/i18n/zh-hant.json11
-rw-r--r--OAuth/maintenance/createOAuthConsumer.php21
-rw-r--r--OAuth/maintenance/migrateCentralWiki.php17
-rw-r--r--OAuth/maintenance/migrateCentralWikiLogs.php35
-rw-r--r--OAuth/maintenance/testOAuthConsumer.php21
-rw-r--r--OAuth/package-lock.json8416
-rw-r--r--OAuth/package.json12
-rw-r--r--OAuth/resources/modules/ext.MWOAuth.AuthorizeDialog.js36
-rw-r--r--OAuth/resources/modules/ext.MWOAuth.AuthorizeForm.css38
-rw-r--r--OAuth/resources/modules/ext.MWOAuth.AuthorizeForm.less59
-rw-r--r--OAuth/resources/modules/ext.MWOAuth.BasicStyles.css61
-rw-r--r--OAuth/resources/modules/ext.MWOAuth.BasicStyles.less55
-rw-r--r--OAuth/schema/OAuth.sql114
-rw-r--r--OAuth/schema/mysql/callback_is_prefix.sql1
-rw-r--r--OAuth/schema/mysql/developer_agreement.sql1
-rw-r--r--OAuth/schema/mysql/owner_only.sql1
-rw-r--r--OAuth/schema/mysql/patch-oauth_accepted_consumer-timestamp.sql2
-rw-r--r--OAuth/schema/mysql/patch-oauth_registered_consumer-timestamp.sql4
-rw-r--r--OAuth/schema/mysql/tables-generated.sql71
-rw-r--r--OAuth/schema/oauth2_access_tokens.sql6
-rw-r--r--OAuth/schema/oauth2_allowed_grants.sql2
-rw-r--r--OAuth/schema/oauth2_is_confidential.sql2
-rw-r--r--OAuth/schema/oauth_version_accepted.sql2
-rw-r--r--OAuth/schema/postgres/tables-generated.sql81
-rw-r--r--OAuth/schema/sqlite/callback_is_prefix.sql1
-rw-r--r--OAuth/schema/sqlite/developer_agreement.sql1
-rw-r--r--OAuth/schema/sqlite/owner_only.sql1
-rw-r--r--OAuth/schema/sqlite/patch-oauth_accepted_consumer-timestamp.sql17
-rw-r--r--OAuth/schema/sqlite/patch-oauth_registered_consumer-timestamp.sql17
-rw-r--r--OAuth/schema/sqlite/tables-generated.sql69
-rw-r--r--OAuth/schema/tables.json308
-rw-r--r--OAuth/src/AuthorizationProvider/AccessToken.php2
-rw-r--r--OAuth/src/AuthorizationProvider/AuthorizationProvider.php18
-rw-r--r--OAuth/src/AuthorizationProvider/Grant/AuthorizationCodeAccessTokens.php4
-rw-r--r--OAuth/src/AuthorizationProvider/Grant/AuthorizationCodeAuthorization.php8
-rw-r--r--OAuth/src/AuthorizationProvider/Grant/ClientCredentials.php4
-rw-r--r--OAuth/src/AuthorizationProvider/Grant/RefreshToken.php4
-rw-r--r--OAuth/src/AuthorizationProvider/IAccessTokenProvider.php4
-rw-r--r--OAuth/src/AuthorizationProvider/IAuthorizationProvider.php2
-rw-r--r--OAuth/src/AuthorizationServerFactory.php30
-rw-r--r--OAuth/src/Backend/AbuseFilterHookHandler.php78
-rw-r--r--OAuth/src/Backend/Consumer.php121
-rw-r--r--OAuth/src/Backend/ConsumerAcceptance.php25
-rw-r--r--OAuth/src/Backend/Hooks.php29
-rw-r--r--OAuth/src/Backend/MWOAuthDAO.php72
-rw-r--r--OAuth/src/Backend/MWOAuthDataStore.php92
-rw-r--r--OAuth/src/Backend/MWOAuthException.php9
-rw-r--r--OAuth/src/Backend/MWOAuthRequest.php17
-rw-r--r--OAuth/src/Backend/MWOAuthServer.php52
-rw-r--r--OAuth/src/Backend/MWOAuthSignatureMethod_RSA_SHA1.php10
-rw-r--r--OAuth/src/Backend/MWOAuthToken.php8
-rw-r--r--OAuth/src/Backend/OAuth1Consumer.php4
-rw-r--r--OAuth/src/Backend/UpdaterHooks.php53
-rw-r--r--OAuth/src/Backend/Utils.php164
-rw-r--r--OAuth/src/Control/ConsumerAcceptanceAccessControl.php13
-rw-r--r--OAuth/src/Control/ConsumerAcceptanceSubmitControl.php53
-rw-r--r--OAuth/src/Control/ConsumerAccessControl.php20
-rw-r--r--OAuth/src/Control/ConsumerSubmitControl.php178
-rw-r--r--OAuth/src/Control/DAOAccessControl.php7
-rw-r--r--OAuth/src/Control/SubmitControl.php31
-rw-r--r--OAuth/src/Entity/AccessTokenEntity.php19
-rw-r--r--OAuth/src/Entity/AuthCodeEntity.php4
-rw-r--r--OAuth/src/Entity/ClaimEntity.php20
-rw-r--r--OAuth/src/Entity/ClientEntity.php35
-rw-r--r--OAuth/src/Entity/MWClientEntityInterface.php15
-rw-r--r--OAuth/src/Entity/RefreshTokenEntity.php4
-rw-r--r--OAuth/src/Entity/ScopeEntity.php4
-rw-r--r--OAuth/src/Entity/UserEntity.php8
-rw-r--r--OAuth/src/Exception/ClientApprovalDenyException.php2
-rw-r--r--OAuth/src/Frontend/EchoOAuthStageChangePresentationModel.php10
-rw-r--r--OAuth/src/Frontend/OAuthLogFormatter.php5
-rw-r--r--OAuth/src/Frontend/Pagers/ListConsumersPager.php28
-rw-r--r--OAuth/src/Frontend/Pagers/ListMyConsumersPager.php14
-rw-r--r--OAuth/src/Frontend/Pagers/ManageConsumersPager.php14
-rw-r--r--OAuth/src/Frontend/Pagers/ManageMyGrantsPager.php19
-rw-r--r--OAuth/src/Frontend/SpecialPages/SpecialMWOAuth.php226
-rw-r--r--OAuth/src/Frontend/SpecialPages/SpecialMWOAuthConsumerRegistration.php787
-rw-r--r--OAuth/src/Frontend/SpecialPages/SpecialMWOAuthListConsumers.php99
-rw-r--r--OAuth/src/Frontend/SpecialPages/SpecialMWOAuthManageConsumers.php125
-rw-r--r--OAuth/src/Frontend/SpecialPages/SpecialMWOAuthManageMyGrants.php141
-rw-r--r--OAuth/src/Frontend/UIHooks.php45
-rw-r--r--OAuth/src/Frontend/UIUtils.php2
-rw-r--r--OAuth/src/HookRunner.php37
-rw-r--r--OAuth/src/Lib/OAuthConsumer.php2
-rw-r--r--OAuth/src/Lib/OAuthDataStore.php2
-rw-r--r--OAuth/src/Lib/OAuthException.php2
-rw-r--r--OAuth/src/Lib/OAuthRequest.php6
-rw-r--r--OAuth/src/Lib/OAuthServer.php8
-rw-r--r--OAuth/src/Lib/OAuthSignatureMethod.php8
-rw-r--r--OAuth/src/Lib/OAuthSignatureMethod_HMAC_SHA1.php6
-rw-r--r--OAuth/src/Lib/OAuthSignatureMethod_PLAINTEXT.php6
-rw-r--r--OAuth/src/Lib/OAuthSignatureMethod_RSA_SHA1.php10
-rw-r--r--OAuth/src/Lib/OAuthToken.php4
-rw-r--r--OAuth/src/Lib/OAuthUtil.php2
-rw-r--r--OAuth/src/Repository/AccessTokenRepository.php45
-rw-r--r--OAuth/src/Repository/AuthCodeRepository.php4
-rw-r--r--OAuth/src/Repository/CacheRepository.php6
-rw-r--r--OAuth/src/Repository/ClaimStore.php40
-rw-r--r--OAuth/src/Repository/ClientRepository.php6
-rw-r--r--OAuth/src/Repository/DatabaseRepository.php8
-rw-r--r--OAuth/src/Repository/Hook/OAuthClaimStoreGetClaimsHook.php21
-rw-r--r--OAuth/src/Repository/RefreshTokenRepository.php4
-rw-r--r--OAuth/src/Repository/ScopeRepository.php35
-rw-r--r--OAuth/src/ResourceServer.php23
-rw-r--r--OAuth/src/Response.php2
-rw-r--r--OAuth/src/Rest/Handler/AbstractClientHandler.php126
-rw-r--r--OAuth/src/Rest/Handler/AccessToken.php16
-rw-r--r--OAuth/src/Rest/Handler/AuthenticationHandler.php10
-rw-r--r--OAuth/src/Rest/Handler/Authorize.php27
-rw-r--r--OAuth/src/Rest/Handler/ListClients.php218
-rw-r--r--OAuth/src/Rest/Handler/RequestClient.php170
-rw-r--r--OAuth/src/Rest/Handler/ResetClientSecret.php82
-rw-r--r--OAuth/src/Rest/Handler/Resource.php29
-rw-r--r--OAuth/src/SessionProvider.php55
-rw-r--r--OAuth/src/Setup.php6
-rw-r--r--OAuth/src/UserStatementProvider.php46
-rw-r--r--OAuth/tests/phpunit/AuthorizationProviderTest.php33
-rw-r--r--OAuth/tests/phpunit/Backend/MWOAuthHooksTest.php7
-rw-r--r--OAuth/tests/phpunit/Backend/MWOAuthServerTest.php12
-rw-r--r--OAuth/tests/phpunit/Backend/StubConsumer.php3
-rw-r--r--OAuth/tests/phpunit/Entity/AccessTokenEntityTest.php40
-rw-r--r--OAuth/tests/phpunit/Entity/ClaimEntityTest.php44
-rw-r--r--OAuth/tests/phpunit/Entity/ClientEntityTest.php60
-rw-r--r--OAuth/tests/phpunit/Entity/Mock_ClientEntity.php6
-rw-r--r--OAuth/tests/phpunit/Entity/UserEntityTest.php11
-rw-r--r--OAuth/tests/phpunit/Lib/Mock_OAuthBaseStringRequest.php2
-rw-r--r--OAuth/tests/phpunit/Lib/Mock_OAuthDataStore.php8
-rw-r--r--OAuth/tests/phpunit/Lib/Mock_OAuthSignatureMethod_RSA_SHA1.php4
-rw-r--r--OAuth/tests/phpunit/Lib/OAuthConsumerTest.php5
-rw-r--r--OAuth/tests/phpunit/Lib/OAuthRequestTest.php20
-rw-r--r--OAuth/tests/phpunit/Lib/OAuthServerTest.php17
-rw-r--r--OAuth/tests/phpunit/Lib/OAuthSignatureMethodHmacSha1Test.php9
-rw-r--r--OAuth/tests/phpunit/Lib/OAuthSignatureMethodRsaSha1Test.php5
-rw-r--r--OAuth/tests/phpunit/Lib/OAuthTestUtils.php4
-rw-r--r--OAuth/tests/phpunit/Lib/OAuthTokenTest.php5
-rw-r--r--OAuth/tests/phpunit/Lib/OAuthUtilTest.php5
-rw-r--r--OAuth/tests/phpunit/Repository/AccessTokenRepositoryTest.php31
-rw-r--r--OAuth/tests/phpunit/Repository/AuthCodeRepositoryTest.php18
-rw-r--r--OAuth/tests/phpunit/Repository/ClaimStoreTest.php100
-rw-r--r--OAuth/tests/phpunit/Repository/ScopeRepositoryTest.php13
-rw-r--r--OAuth/tests/phpunit/Rest/AccessTokenEndpointTest.php26
-rw-r--r--OAuth/tests/phpunit/Rest/AuthorizationEndpointTest.php28
-rw-r--r--OAuth/tests/phpunit/Rest/EndpointTest.php132
-rw-r--r--OAuth/tests/phpunit/Rest/ListClientsEndpointTest.php186
-rw-r--r--OAuth/tests/phpunit/Rest/RequestClientEndpointTest.php347
-rw-r--r--OAuth/tests/phpunit/Rest/ResetClientSecretEndpointTest.php302
-rw-r--r--OAuth/tests/phpunit/Rest/testRoutes.json44
-rw-r--r--OAuth/tests/phpunit/SessionProviderTest.php49
-rw-r--r--OAuth/tests/phpunit/TestHandlerFactory.php29
250 files changed, 12843 insertions, 4378 deletions
diff --git a/OAuth/.eslintignore b/OAuth/.eslintignore
new file mode 100644
index 00000000..df482daf
--- /dev/null
+++ b/OAuth/.eslintignore
@@ -0,0 +1,11 @@
+# Upstream code
+/lib/
+
+# Build
+/vendor/
+/docs/
+
+# Language files written automatically by TranslateWiki
+/i18n/**/*.json
+!/i18n/**/en.json
+!/i18n/**/qqq.json
diff --git a/OAuth/.eslintrc.json b/OAuth/.eslintrc.json
index e2b5c47f..9680d3a9 100644
--- a/OAuth/.eslintrc.json
+++ b/OAuth/.eslintrc.json
@@ -1,16 +1,18 @@
{
"root": true,
"extends": [
- "wikimedia/client",
- "wikimedia/jquery"
+ "wikimedia/client-es5",
+ "wikimedia/jquery",
+ "wikimedia/mediawiki"
],
- "globals": {
- "mw": false,
- "OO": false
- },
"rules": {
"no-jquery/no-global-selector": "off",
- "no-jquery/no-sizzle": "off",
- "no-jquery/variable-pattern": "off"
- }
+ "no-jquery/no-sizzle": "off"
+ },
+ "overrides": [
+ {
+ "files": [ "Gruntfile.js" ],
+ "extends": [ "wikimedia/server" ]
+ }
+ ]
}
diff --git a/OAuth/.phan/config.php b/OAuth/.phan/config.php
index ed6dff6f..fdef21da 100644
--- a/OAuth/.phan/config.php
+++ b/OAuth/.phan/config.php
@@ -2,15 +2,13 @@
$cfg = require __DIR__ . '/../vendor/mediawiki/mediawiki-phan-config/src/config.php';
-$cfg['scalar_implicit_cast'] = true;
-$cfg['null_casts_as_any_type'] = true;
-
// Database->daoReadOnly and MWOAuthToken->oauth_callback_confirmed
$cfg['suppress_issue_types'][] = 'PhanUndeclaredProperty';
$cfg['directory_list'] = array_merge(
$cfg['directory_list'],
[
+ '../../extensions/AbuseFilter',
'../../extensions/Echo',
]
);
@@ -19,6 +17,7 @@ $cfg['exclude_analysis_directory_list'] = array_merge(
$cfg['exclude_analysis_directory_list'],
[
'src/Lib/',
+ '../../extensions/AbuseFilter',
'../../extensions/Echo',
]
);
diff --git a/OAuth/.phpcs.xml b/OAuth/.phpcs.xml
index be19ab61..c2763af1 100644
--- a/OAuth/.phpcs.xml
+++ b/OAuth/.phpcs.xml
@@ -5,14 +5,12 @@
<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationProtected"/>
<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPrivate"/>
<exclude name="Squiz.Classes.ValidClassName.NotCamelCaps" />
- <exclude name="MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName"/>
- <exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment"/>
+ <exclude name="MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName" />
<exclude name="MediaWiki.ControlStructures.AssignmentInControlStructures.AssignmentInControlStructures" />
- <exclude name="PSR12.Properties.ConstantVisibility.NotFound" />
</rule>
<file>.</file>
<arg name="extensions" value="php"/>
<arg name="encoding" value="UTF-8"/>
- <exclude-pattern type="relative">^src/lib/</exclude-pattern>
- <exclude-pattern type="relative">^tests/phpunit/lib/</exclude-pattern>
+ <exclude-pattern type="relative">^src/Lib/</exclude-pattern>
+ <exclude-pattern type="relative">^tests/phpunit/Lib/</exclude-pattern>
</ruleset>
diff --git a/OAuth/Gruntfile.js b/OAuth/Gruntfile.js
index 25c293fb..972e34cc 100644
--- a/OAuth/Gruntfile.js
+++ b/OAuth/Gruntfile.js
@@ -1,23 +1,24 @@
-/* eslint-env node */
+'use strict';
module.exports = function ( grunt ) {
- var conf = grunt.file.readJSON( 'extension.json' );
+ const conf = grunt.file.readJSON( 'extension.json' );
grunt.loadNpmTasks( 'grunt-banana-checker' );
grunt.loadNpmTasks( 'grunt-eslint' );
grunt.loadNpmTasks( 'grunt-stylelint' );
grunt.initConfig( {
- banana: conf.MessagesDirs,
+ banana: {
+ ...conf.MessagesDirs,
+ options: {
+ requireLowerCase: 'initial'
+ }
+ },
eslint: {
options: {
- extensions: [ '.js', '.json' ],
- cache: true
+ cache: true,
+ fix: grunt.option( 'fix' )
},
- all: [
- '**/*.js{,on}',
- '!node_modules/**',
- '!vendor/**'
- ]
+ all: [ '.' ]
},
stylelint: {
all: [
diff --git a/OAuth/README.md b/OAuth/README.md
new file mode 100644
index 00000000..f6b2ea11
--- /dev/null
+++ b/OAuth/README.md
@@ -0,0 +1,3 @@
+# Extension:OAuth
+
+For a full description see [Extension:OAuth on mediawiki.org](https://www.mediawiki.org/wiki/Extension:OAuth).
diff --git a/OAuth/composer.json b/OAuth/composer.json
index d18cd0d7..75ab9690 100644
--- a/OAuth/composer.json
+++ b/OAuth/composer.json
@@ -4,28 +4,36 @@
"description": "Allows usage of OAuth 1.0a and OAuth 2.0 for API authorization",
"license": "GPL-2.0-or-later",
"prefer-stable": true,
+ "repositories": [
+ {
+ "type": "git",
+ "url": "https://github.com/wikimedia/oauth2-server.git"
+ }
+ ],
"require": {
- "firebase/php-jwt": "5.2.0",
- "league/oauth2-server": "8.2.4"
+ "ext-openssl": "*",
+ "firebase/php-jwt": "^5.2.0",
+ "league/oauth2-server": "dev-v9.0.0-alpha#61d770dc284898ea2905d66e12f8f7e5f6664092 as 9.0.0"
},
"require-dev": {
- "mediawiki/mediawiki-codesniffer": "31.0.0",
- "mediawiki/mediawiki-phan-config": "0.10.2",
- "mediawiki/minus-x": "1.1.0",
+ "mediawiki/mediawiki-codesniffer": "38.0.0",
+ "mediawiki/mediawiki-phan-config": "0.11.1",
+ "mediawiki/minus-x": "1.1.1",
"php-parallel-lint/php-console-highlighter": "0.5.0",
- "php-parallel-lint/php-parallel-lint": "1.2.0",
+ "php-parallel-lint/php-parallel-lint": "1.3.1",
"wikimedia/testing-access-wrapper": "~1.0"
},
"scripts": {
"test": [
"parallel-lint . --exclude vendor --exclude node_modules",
- "phpcs -p -s",
+ "@phpcs",
"minus-x check ."
],
"fix": [
"minus-x fix .",
"phpcbf"
],
- "phan": "phan -d . --long-progress-bar"
+ "phan": "phan -d . --long-progress-bar",
+ "phpcs": "phpcs -sp --cache"
}
}
diff --git a/OAuth/examples/testClient.php b/OAuth/examples/testClient.php
index 0869257d..9bc46fbb 100644
--- a/OAuth/examples/testClient.php
+++ b/OAuth/examples/testClient.php
@@ -147,7 +147,7 @@ if ( !$data ) {
$token = json_decode( $data );
-// @codingStandardsIgnoreStart
+// phpcs:disable Generic.Files.LineLength
print <<<HELPTEXT
Response body should be a JSON object with three keys:
@@ -174,7 +174,7 @@ print <<<HELPTEXT
HELPTEXT;
-// @codingStandardsIgnoreEnd
+// phpcs:enable
// ACCESS TOKEN
print 'What was the "verification value" the MediaWiki installation gave?' . PHP_EOL;
diff --git a/OAuth/extension.json b/OAuth/extension.json
index c9d3dcee..5dab3f96 100644
--- a/OAuth/extension.json
+++ b/OAuth/extension.json
@@ -1,5 +1,6 @@
{
"name": "OAuth",
+ "version": "1.1.0",
"author": [
"Aaron Schulz",
"Chris Steipp",
@@ -12,10 +13,10 @@
"license-name": "GPL-2.0-or-later",
"type": "other",
"requires": {
- "MediaWiki": ">= 1.34.0"
+ "MediaWiki": ">= 1.38.0"
},
"ExtensionFunctions": [
- "MediaWiki\\Extensions\\OAuth\\Backend\\Hooks::onExtensionFunctions"
+ "MediaWiki\\Extension\\OAuth\\Backend\\Hooks::onExtensionFunctions"
],
"DefaultUserOptions": {
"echo-subscriptions-web-oauth-owner": true,
@@ -38,15 +39,31 @@
"mwoauthmanagemygrants"
],
"SessionProviders": {
- "MediaWiki\\Extensions\\OAuth\\SessionProvider": {
- "class": "MediaWiki\\Extensions\\OAuth\\SessionProvider",
+ "MediaWiki\\Extension\\OAuth\\SessionProvider": {
+ "class": "MediaWiki\\Extension\\OAuth\\SessionProvider",
"args": []
}
},
"SpecialPages": {
- "OAuth": "MediaWiki\\Extensions\\OAuth\\Frontend\\SpecialPages\\SpecialMWOAuth",
- "OAuthManageMyGrants": "MediaWiki\\Extensions\\OAuth\\Frontend\\SpecialPages\\SpecialMWOAuthManageMyGrants",
- "OAuthListConsumers": "MediaWiki\\Extensions\\OAuth\\Frontend\\SpecialPages\\SpecialMWOAuthListConsumers"
+ "OAuth": {
+ "class": "MediaWiki\\Extension\\OAuth\\Frontend\\SpecialPages\\SpecialMWOAuth",
+ "services": [
+ "GrantsLocalization"
+ ]
+ },
+ "OAuthManageMyGrants": {
+ "class": "MediaWiki\\Extension\\OAuth\\Frontend\\SpecialPages\\SpecialMWOAuthManageMyGrants",
+ "services": [
+ "GrantsInfo",
+ "GrantsLocalization"
+ ]
+ },
+ "OAuthListConsumers": {
+ "class": "MediaWiki\\Extension\\OAuth\\Frontend\\SpecialPages\\SpecialMWOAuthListConsumers",
+ "services": [
+ "GrantsLocalization"
+ ]
+ }
},
"MessagesDirs": {
"MWOAuth": [
@@ -57,16 +74,16 @@
"MWOAuthAliases": "MWOAuth.alias.php"
},
"AutoloadNamespaces": {
- "MediaWiki\\Extensions\\OAuth\\": "src/"
+ "MediaWiki\\Extension\\OAuth\\": "src/"
},
"TestAutoloadNamespaces": {
- "MediaWiki\\Extensions\\OAuth\\Tests\\": "tests/phpunit/"
+ "MediaWiki\\Extension\\OAuth\\Tests\\": "tests/phpunit/"
},
"ResourceModules": {
"ext.MWOAuth.styles": {
"styles": [
- "ext.MWOAuth.BasicStyles.css",
- "ext.MWOAuth.AuthorizeForm.css"
+ "ext.MWOAuth.BasicStyles.less",
+ "ext.MWOAuth.AuthorizeForm.less"
]
},
"ext.MWOAuth.AuthorizeDialog": {
@@ -74,7 +91,8 @@
"ext.MWOAuth.AuthorizeDialog.js"
],
"dependencies": [
- "jquery.ui"
+ "oojs-ui-core",
+ "oojs-ui-windows"
],
"messages": [
"mwoauth-desc"
@@ -85,25 +103,32 @@
"localBasePath": "resources/modules",
"remoteExtPath": "OAuth/resources/modules"
},
- "callback": "MediaWiki\\Extensions\\OAuth\\Backend\\Hooks::onRegistration",
+ "callback": "MediaWiki\\Extension\\OAuth\\Backend\\Hooks::onRegistration",
+ "HookHandlers": {
+ "abusefilter": {
+ "class": "MediaWiki\\Extension\\OAuth\\Backend\\AbuseFilterHookHandler"
+ }
+ },
"Hooks": {
- "ChangeTagCanCreate": "MediaWiki\\Extensions\\OAuth\\Backend\\Hooks::onChangeTagCanCreate",
- "MergeAccountFromTo": "MediaWiki\\Extensions\\OAuth\\Backend\\Hooks::onMergeAccountFromTo",
- "CentralAuthGlobalUserMerged": "MediaWiki\\Extensions\\OAuth\\Backend\\Hooks::onCentralAuthGlobalUserMerged",
- "LoadExtensionSchemaUpdates": "MediaWiki\\Extensions\\OAuth\\Backend\\UpdaterHooks::addSchemaUpdates",
- "GetPreferences": "MediaWiki\\Extensions\\OAuth\\Frontend\\UIHooks::onGetPreferences",
- "MessagesPreLoad": "MediaWiki\\Extensions\\OAuth\\Frontend\\UIHooks::onMessagesPreLoad",
- "SpecialPageAfterExecute": "MediaWiki\\Extensions\\OAuth\\Frontend\\UIHooks::onSpecialPageAfterExecute",
- "SpecialPageBeforeFormDisplay": "MediaWiki\\Extensions\\OAuth\\Frontend\\UIHooks::onSpecialPageBeforeFormDisplay",
- "BeforeCreateEchoEvent": "MediaWiki\\Extensions\\OAuth\\Frontend\\UIHooks::onBeforeCreateEchoEvent",
- "CentralAuthAbortCentralAuthToken": "MediaWiki\\Extensions\\OAuth\\Setup::onCentralAuthAbortCentralAuthToken",
- "TestCanonicalRedirect": "MediaWiki\\Extensions\\OAuth\\Setup::onTestCanonicalRedirect",
- "SetupAfterCache": "MediaWiki\\Extensions\\OAuth\\Backend\\Hooks::onSetupAfterCache",
- "ApiRsdServiceApis": "MediaWiki\\Extensions\\OAuth\\Backend\\Hooks::onApiRsdServiceApis",
- "SpecialPage_initList": "MediaWiki\\Extensions\\OAuth\\Frontend\\UIHooks::onSpecialPage_initList",
- "ListDefinedTags": "MediaWiki\\Extensions\\OAuth\\Backend\\Hooks::onListDefinedTags",
- "ChangeTagsListActive": "MediaWiki\\Extensions\\OAuth\\Backend\\Hooks::onChangeTagsListActive",
- "LoginFormValidErrorMessages": "MediaWiki\\Extensions\\OAuth\\Frontend\\UIHooks::onLoginFormValidErrorMessages"
+ "AbuseFilter-builder": "abusefilter",
+ "AbuseFilter-computeVariable": "abusefilter",
+ "AbuseFilter-generateUserVars": "abusefilter",
+ "ChangeTagCanCreate": "MediaWiki\\Extension\\OAuth\\Backend\\Hooks::onChangeTagCanCreate",
+ "MergeAccountFromTo": "MediaWiki\\Extension\\OAuth\\Backend\\Hooks::onMergeAccountFromTo",
+ "LoadExtensionSchemaUpdates": "MediaWiki\\Extension\\OAuth\\Backend\\UpdaterHooks::addSchemaUpdates",
+ "GetPreferences": "MediaWiki\\Extension\\OAuth\\Frontend\\UIHooks::onGetPreferences",
+ "MessagesPreLoad": "MediaWiki\\Extension\\OAuth\\Frontend\\UIHooks::onMessagesPreLoad",
+ "SpecialPageAfterExecute": "MediaWiki\\Extension\\OAuth\\Frontend\\UIHooks::onSpecialPageAfterExecute",
+ "SpecialPageBeforeFormDisplay": "MediaWiki\\Extension\\OAuth\\Frontend\\UIHooks::onSpecialPageBeforeFormDisplay",
+ "BeforeCreateEchoEvent": "MediaWiki\\Extension\\OAuth\\Frontend\\UIHooks::onBeforeCreateEchoEvent",
+ "CentralAuthAbortCentralAuthToken": "MediaWiki\\Extension\\OAuth\\Setup::onCentralAuthAbortCentralAuthToken",
+ "TestCanonicalRedirect": "MediaWiki\\Extension\\OAuth\\Setup::onTestCanonicalRedirect",
+ "SetupAfterCache": "MediaWiki\\Extension\\OAuth\\Backend\\Hooks::onSetupAfterCache",
+ "ApiRsdServiceApis": "MediaWiki\\Extension\\OAuth\\Backend\\Hooks::onApiRsdServiceApis",
+ "SpecialPage_initList": "MediaWiki\\Extension\\OAuth\\Frontend\\UIHooks::onSpecialPage_initList",
+ "ListDefinedTags": "MediaWiki\\Extension\\OAuth\\Backend\\Hooks::onListDefinedTags",
+ "ChangeTagsListActive": "MediaWiki\\Extension\\OAuth\\Backend\\Hooks::onChangeTagsListActive",
+ "LoginFormValidErrorMessages": "MediaWiki\\Extension\\OAuth\\Frontend\\UIHooks::onLoginFormValidErrorMessages"
},
"ConfigRegistry": {
"mwoauth": "GlobalVarConfig::newInstance"
@@ -119,7 +144,7 @@
},
"MWOAuthSharedUserSource": {
"value": null,
- "description": "Source of shared user IDs, if enabled. If CentralIdLookup is available, this is the $providerId for CentralIdLookup::factory(). Generally null would be what you want, to use the default provider. If that class is not available or the named provider is not found, this is\n * passed to the 'OAuthGetUserNamesFromCentralIds', 'OAuthGetLocalUserFromCentralId', 'OAuthGetCentralIdFromLocalUser', and 'OAuthGetCentralIdFromUserName' hooks. This has no effect if $wgMWOAuthSharedUserIDs is set to false."
+ "description": "Source of shared user IDs, if enabled. If CentralIdLookup is available, this is the $providerId for CentralIdLookupFactory::getLookup(). Generally null would be what you want, to use the default provider. If that class is not available or the named provider is not found, this is\n * passed to the 'OAuthGetUserNamesFromCentralIds', 'OAuthGetLocalUserFromCentralId', 'OAuthGetCentralIdFromLocalUser', and 'OAuthGetCentralIdFromUserName' hooks. This has no effect if $wgMWOAuthSharedUserIDs is set to false."
},
"MWOAuthRequestExpirationAge": {
"value": 2592000,
@@ -142,7 +167,12 @@
"description": "User groups to notify about new consumers that need to be reviewed"
},
"MWOAuthSessionCacheType": {
- "value": null
+ "value": null,
+ "description": "The cache type used for most temporary data storage. An index into $wgObjectCaches. The default is $wgSessionCacheType."
+ },
+ "MWOAuthNonceCacheType": {
+ "value": null,
+ "description": "The cache type used for OAuth 1.0 nonces. An index into $wgObjectCaches. The default is $wgMWOAuthSessionCacheType."
},
"OAuthSecretKey": {
"value": null,
@@ -177,19 +207,47 @@
"value": "PT1M"
}
},
+ "GrantPermissions": {
+ "oauthmanageownclient": {
+ "mwoauthproposeconsumer": true,
+ "mwoauthupdateownconsumer": true,
+ "mwoauthmanagemygrants": true
+ }
+ },
+ "GrantPermissionGroups": {
+ "oauthmanageownclient": "administration"
+ },
"RestRoutes": [
{
"path": "/oauth2/authorize",
- "factory": "MediaWiki\\Extensions\\OAuth\\Rest\\Handler\\Authorize::factory"
+ "factory": "MediaWiki\\Extension\\OAuth\\Rest\\Handler\\Authorize::factory"
},
{
"path": "/oauth2/access_token",
- "factory": "MediaWiki\\Extensions\\OAuth\\Rest\\Handler\\AccessToken::factory",
+ "factory": "MediaWiki\\Extension\\OAuth\\Rest\\Handler\\AccessToken::factory",
"method": "POST"
},
{
"path": "/oauth2/resource/{type}",
- "factory": "MediaWiki\\Extensions\\OAuth\\Rest\\Handler\\Resource::factory"
+ "factory": "MediaWiki\\Extension\\OAuth\\Rest\\Handler\\Resource::factory"
+ },
+ {
+ "path": "/oauth2/client",
+ "class": "MediaWiki\\Extension\\OAuth\\Rest\\Handler\\RequestClient",
+ "method": "POST"
+ },
+ {
+ "path": "/oauth2/client/{client_key}/reset_secret",
+ "class": "MediaWiki\\Extension\\OAuth\\Rest\\Handler\\ResetClientSecret",
+ "method": "POST"
+ },
+ {
+ "path": "/oauth2/client",
+ "class": "MediaWiki\\Extension\\OAuth\\Rest\\Handler\\ListClients",
+ "services": [
+ "DBLoadBalancer"
+ ],
+ "method": "GET"
}
],
"load_composer_autoloader": true,
diff --git a/OAuth/i18n/ar.json b/OAuth/i18n/ar.json
index 1555f91a..d3943df4 100644
--- a/OAuth/i18n/ar.json
+++ b/OAuth/i18n/ar.json
@@ -10,7 +10,8 @@
"ديفيد",
"علاء",
"محمد أحمد عبد الفتاح",
- "مشعل الحربي"
+ "مشعل الحربي",
+ "منصةشليلة"
]
},
"oauth": "أو أوث",
@@ -73,12 +74,11 @@
"mwoauth-consumer-stage-suppressed": "المخفية",
"oauthconsumerregistration": "تسجيل مستهلك OAuth",
"mwoauthconsumerregistration-navigation": "تصفح:",
- "mwoauthconsumerregistration-propose": "اقتراح مستهلك جديد",
"mwoauthconsumerregistration-list": "قائمة المستهلكين الخاصة بي",
"mwoauthconsumerregistration-main": "الرئيسي",
- "mwoauthconsumerregistration-propose-text": "يجب على المطورين استخدام النموذج أدناه لاقتراح مستهلك OAuth جديد (راجع [//www.mediawiki.org/wiki/Extension:OAuth توثيق التمديد] لمزيد من التفاصيل)، بعد إرسال هذا النموذج، ستتلقى رمزا سيستخدمه تطبيقك لتعريف نفسه بميدياويكي، سيحتاج إداري OAuth إلى الموافقة على طلب اشتراكك قبل تفويضه من قبل مستخدمين آخرين.\n\nبعض التوصيات والملاحظات: \n* حاول استخدام عدد قليل من المنح قدر الإمكان، تجنب المنح التي ليست مطلوبة فعليا الآن. \n* تكون الإصدارات على شكل \"major.minor.release\" (الخياران الآخران اختياريان) وتزداد الحاجة إلى إجراء تغييرات على المنحة. \n* يُرجَى تقديم مفتاح RSA عام (بتنسيق PEM) إذا أمكن، وإلا يجب استخدام رمز سري (أقل أمانا).\n* يمكنك استخدام معرف مشروع لتقييد المستهلك إلى مشروع واحد في هذا الموقع (استخدم \"*\" لجميع المشاريع).",
+ "mwoauthconsumerregistration-propose-text": "يمكنك:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|Propose an OAuth 1.0a consumer]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Propose an OAuth 2.0 client]].",
"mwoauthconsumerregistration-update-text": "استخدم النموذج أدناه لتحديث جوانب عميل OAuth الذي تتحكم فيه.\n\nجميع القيم هنا ستستبدل أي قيم سابقة، لا تترك حقولا فارغة إلا إذا كنت تنوي مسح هذه القيم.",
- "mwoauthconsumerregistration-maintext": "تهدف هذه الصفحة إلى السماح لمطوري البرامج باقتراح وتحديث تطبيقات مستهلكي OAuth في سجل هذا الموقع. \n\nمن هنا، يمكنك:\n* [[Special:OAuthConsumerRegistration/propose|طلب رمز مميز لمستهلك جديد]].\n* [[Special:OAuthConsumerRegistration/list|إدارة عملائك الحاليين]].",
+ "mwoauthconsumerregistration-maintext": "هذه الصفحة مخصصة للسماح للمطورين باقتراح وتحديث تطبيقات عملاء OAuth في سجل هذا الموقع. من هنا ، يمكنك:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|Request a token for a new OAuth 1.0a consumer]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Request a token for a new OAuth 2.0 client]].\n* [[Special:OAuthConsumerRegistration/list|Manage your existing consumers]].\n\nFor more information about OAuth, please see the [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth extension documentation].",
"mwoauthconsumerregistration-propose-legend": "تطبيق مستهلك جديد لـOAuth",
"mwoauthconsumerregistration-update-legend": "تحديث تطبيق مستهلك OAuth",
"mwoauthconsumerregistration-propose-submit": "اقتراح مستهلك",
diff --git a/OAuth/i18n/as.json b/OAuth/i18n/as.json
index e9541bee..a6b57266 100644
--- a/OAuth/i18n/as.json
+++ b/OAuth/i18n/as.json
@@ -2,10 +2,17 @@
"@metadata": {
"authors": [
"Gitartha.bordoloi",
+ "Mohsin Ali",
"Simbu123"
]
},
- "mwoauth-prefs-managegrants": "সংযুক্ত এপ্লিকেছনসমূহৰ",
- "mwoauth-prefs-managegrantslink": "সংযুক্ত $1 {{PLURAL:$1|এপ্লিকেছনৰ|এপ্লিকেছনসমূহৰ}} পৰিচালনা কৰক",
- "oauthmanagemygrants": "সংযোজিত এপ্লিকেছনসমূহৰ ব্যৱস্থাপনা কৰক"
+ "mwoauth-prefs-managegrants": "সংযুক্ত এপ্লিকেছনসমূহ:",
+ "mwoauth-prefs-managegrantslink": "{{PLURAL:$1|এটা সংযুক্ত এপ্লিকেছন|$1টা সংযুক্ত এপ্লিকেছন|0=সংযুক্ত এপ্লিকেছনসমূহ}} পৰিচালনা কৰক",
+ "mwoauthconsumerregistration-main": "মুখ্য",
+ "mwoauthmanageconsumers-main": "মুখ্য",
+ "oauthmanagemygrants": "সংযোজিত এপ্লিকেছনসমূহৰ ব্যৱস্থাপনা কৰক",
+ "grant-oauthmanageownclient": "আপোনাৰ OAuth ক্লায়েণ্ট পৰিচালনা কৰক",
+ "mwoauth-consumer-user-mismatch": "আপুনি সেইবোৰ ক্লায়েণ্টৰ ওপৰত কাৰ্য্য কৰিব নোৱাৰে যিবোৰ আপোনাৰ নহয়",
+ "mwoauth-consumer-deleted-error": "মচি পেলোৱা ক্লায়েণ্টৰ ওপৰত আপুনি কাৰ্য্য কৰিব নোৱাৰে",
+ "mwoauth-consumer-submit-error": "এগৰাকী গ্ৰাহকক সাঁচি থওঁতে কিবা ত্ৰুটি ঘটিছে"
}
diff --git a/OAuth/i18n/ast.json b/OAuth/i18n/ast.json
index d0537902..26e437df 100644
--- a/OAuth/i18n/ast.json
+++ b/OAuth/i18n/ast.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Fitoschido",
"Xuacu"
]
},
@@ -21,7 +22,7 @@
"mwoauth-consumer-version": "Versión de consumidor:",
"mwoauth-consumer-user": "Editorial:",
"mwoauth-consumer-stage": "Estáu actual:",
- "mwoauth-consumer-email": "Direición de corréu-e de contautu:",
+ "mwoauth-consumer-email": "Señes electróniques de contautu:",
"mwoauth-consumer-email-help": "Visible namái pa los qu'aprueben consumidores nuevos",
"mwoauth-consumer-owner-only-label": "Sólo el propietariu:",
"mwoauth-consumer-owner-only": "Esti consumidor ye sólo pa usar por $1.",
@@ -64,7 +65,6 @@
"mwoauth-consumer-stage-suppressed": "suprimíu",
"oauthconsumerregistration": "Rexistru de consumidor d'OAuth",
"mwoauthconsumerregistration-navigation": "Navegación:",
- "mwoauthconsumerregistration-propose": "Proponer un consumidor nuevu",
"mwoauthconsumerregistration-list": "La mio llista de consumidores",
"mwoauthconsumerregistration-main": "Principal",
"mwoauthconsumerregistration-propose-text": "Los desendolcadores tendríen d'usar el formulariu de más abaxo pa proponer un nuevu consumidor d'OAuth (ver la [//www.mediawiki.org/wiki/Extension:OAuth documentación de la estensión] pa más detalles). Dempués d'unviar esti formulariu, recibirás un pase qu'usará la aplicación pa identificase con MediaWiki. Un alministrador d'OAuth tendrá d'aprobar la aplicación enantes de qu'otros usuarios puedan autorizala.\n\nDelles recomendaciones y comentarios:\n* Intenta usar les mínimes concesiones posibles. Evita les concesiones que nun se necesiten realmente nesti momentu.\n* Les versiones tienen la forma \"mayor.menor.versión\" (les dos últimes son opcionales) y s'incrementen según se necesiten cambios na concesión.\n* Ufre una clave pública RSA (en formatu PEM) si ye posible; d'otra manera tendrá d'usase un pase secretu (menos seguru).\n* Usa'l campu JSON de torgues pa llendar l'accesu d'esti consumidor a direiciones IP d'esos rangos CIDR.\n* Puedes usar una ID de proyeutu pa restrinxir el consumidor a un único proyeutu d'esti sitiu (usa \"*\" pa tolos proyeutos).\n* La direición de corréu dada tien de casar cola de la so cuenta (que tien de tar confirmada).",
diff --git a/OAuth/i18n/az.json b/OAuth/i18n/az.json
index 5c1dd441..11de7505 100644
--- a/OAuth/i18n/az.json
+++ b/OAuth/i18n/az.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "NMW03",
"Serkanland",
"Wertuose"
]
@@ -11,7 +12,7 @@
"mwoauth-field-hidden": "(bu məlumat gizlədilib)",
"mwoauth-field-private": "(bu məlumat konfidensialdır)",
"mwoauth-prefs-managegrants": "Əlaqələndirilmiş tətbiqlər:",
- "mwoauth-prefs-managegrantslink": "$1 qoşulu tətbiqi idarə et",
+ "mwoauth-prefs-managegrantslink": "{{PLURAL:$1|$1 qoşulu tətbiqi|0=Qoşulu tətbiqləri}} idarə et",
"mwoauth-consumer-stage-disabled": "söndürülüb",
"mwoauthconsumerregistration-stage": "Vəziyyəti",
"mwoauthconsumerregistration-lastchange": "Son redaktə",
diff --git a/OAuth/i18n/ban.json b/OAuth/i18n/ban.json
new file mode 100644
index 00000000..3a9fd5be
--- /dev/null
+++ b/OAuth/i18n/ban.json
@@ -0,0 +1,48 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chinamoonroll",
+ "Joseagush"
+ ]
+ },
+ "mwoauth-prefs-managegrants": "Aplikasi kahubung:",
+ "mwoauth-consumer-allwikis": "Makasami proyek ring situs puniki",
+ "mwoauth-consumer-key": "Sereg konsumén:",
+ "mwoauth-consumer-name": "Aran aplikasi:",
+ "mwoauth-consumer-version": "Vérsi konsumén:",
+ "mwoauth-consumer-user": "Pawedar:",
+ "mwoauth-consumer-stage": "Status mangkin:",
+ "mwoauth-consumer-email": "Kontak alamat rerepél:",
+ "mwoauth-consumer-description": "Pidarta aplikasi:",
+ "mwoauth-consumer-reason": "Hawanan:",
+ "mwoauth-consumer-stage-proposed": "proposal",
+ "mwoauth-consumer-stage-rejected": "katolak",
+ "mwoauth-consumer-stage-expired": "kadaluwarsa",
+ "mwoauth-consumer-stage-approved": "kacumpu",
+ "mwoauth-consumer-stage-disabled": "kapademang",
+ "mwoauth-consumer-stage-suppressed": "mati",
+ "mwoauthconsumerregistration-navigation": "Navigasi:",
+ "mwoauthconsumerregistration-main": "Utama",
+ "mwoauthconsumerregistration-name": "Konsumer",
+ "mwoauthconsumerregistration-user": "Pawedar",
+ "mwoauthconsumerregistration-description": "Déskripsi",
+ "mwoauthconsumerregistration-email": "Kontak rerepél",
+ "mwoauthconsumerregistration-consumerkey": "Sereg konsumén",
+ "mwoauthconsumerregistration-stage": "Status",
+ "mwoauthconsumerregistration-lastchange": "Gentosan ungkur",
+ "mwoauthmanageconsumers-main": "Utama",
+ "oauthlistconsumers": "Lis aplikasi OAuth",
+ "mwoauthlistconsumers-version": "Vérsi konsumén",
+ "mwoauth-consumer-stage-any": "makasami",
+ "mwoauthlistconsumers-status-proposed": "proposal",
+ "mwoauthlistconsumers-status-approved": "kacumpu",
+ "mwoauthlistconsumers-status-disabled": "kapademang",
+ "mwoauthlistconsumers-status-rejected": "katolak",
+ "mwoauthlistconsumers-status-expired": "kadaluwarsa",
+ "mwoauthlistconsumers-navigation": "Navigasi",
+ "mwoauthmanagemygrants-grantsallowed": "Aksés sané kalugra",
+ "mwoauthmanagemygrants-applicablegrantsallowed": "Hak sané kalugra:",
+ "mwoauthmanagemygrants-action": "Gentos status:",
+ "echo-category-title-oauth-owner": "Pangembangan OAuth",
+ "mwoauth-oauth-version": "Vérsi protokol OAuth"
+}
diff --git a/OAuth/i18n/bcl.json b/OAuth/i18n/bcl.json
deleted file mode 100644
index b97b6ed5..00000000
--- a/OAuth/i18n/bcl.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "@metadata": {
- "authors": [
- "Geopoet"
- ]
- },
- "mwoauth-grant-editmycssjs": "Liwaton an saimong paragamit CSS/JavaScript",
- "mwoauth-grant-editmyoptions": "Liwaton an saimong paragamit na mga kamuyahan",
- "mwoauth-grant-viewdeleted": "Tanawon an pinagpurang mga sagunson asin pahina"
-}
diff --git a/OAuth/i18n/be-tarask.json b/OAuth/i18n/be-tarask.json
index 8ba45755..a066d88f 100644
--- a/OAuth/i18n/be-tarask.json
+++ b/OAuth/i18n/be-tarask.json
@@ -10,6 +10,8 @@
"mwoauth-consumer-allwikis": "Усе праекты на гэтым сайце",
"mwoauth-consumer-name": "Назва праграмы:",
"mwoauth-consumer-stage": "Актуальны статус:",
+ "oauthconsumerregistration": "Рэгістрацыя спажыўца OAuth",
+ "oauthmanageconsumers": "Кіраваньне спажыўцамі OAuth",
"oauthlistconsumers": "Сьпіс праграмаў OAuth",
"mwoauthlistconsumers-legend": "Прагляд OAuth-праграмаў",
"oauthmanagemygrants": "Кіраваньне падключанымі праграмамі",
diff --git a/OAuth/i18n/be.json b/OAuth/i18n/be.json
index f227094e..a48f2092 100644
--- a/OAuth/i18n/be.json
+++ b/OAuth/i18n/be.json
@@ -1,14 +1,38 @@
{
"@metadata": {
"authors": [
- "Artsiom91"
+ "Artsiom91",
+ "No Sleep till Krupki",
+ "Vlad5250"
]
},
+ "mwoauth-desc": "Дазваляе ўжываць OAuth 1.0a і OAuth 2.0 для API аўтарызацыі",
"mwoauth-prefs-managegrants": "Падключаныя дадаткі:",
"mwoauth-prefs-managegrantslink": "Кіраванне {{PLURAL:$1|$1 падключаным дадаткам|$1 падключанымі дадаткамі|0=падключанымі дадаткамі}}",
+ "oauthmanageconsumers": "Кіраванне спажыўцамі OAuth",
+ "mwoauthmanageconsumers-main": "Галоўная",
+ "mwoauthmanageconsumers-confirm-legend": "Кіраванне спажыўцом OAuth",
+ "mwoauthmanageconsumers-action": "Змяніць статус:",
"oauthlistconsumers": "Спіс OAuth-дадаткаў",
"oauthmanagemygrants": "Кіраванне падключанымі дадаткамі",
"mwoauthmanagemygrants-confirm-legend": "Кіраванне падключаным дадаткам",
+ "mwoauth-form-description-allwikis": "Дзень добры, $1!\n\nДля таго, каб завяршыць ваш запыт, «$2» патрабуецца дазвол ад вашага імя на выкананне наступных дзеянняў ва ўсіх праектах гэтага сайта:\n\n$4",
+ "mwoauth-form-button-approve": "Дазволіць",
+ "mwoauth-form-button-cancel": "Адмяніць",
+ "right-mwoauthproposeconsumer": "Прапанаванне новых спажыўцоў OAuth",
+ "right-mwoauthupdateownconsumer": "Абнаўленне спажыўцоў OAuth, якімі вы кіруеце",
+ "right-mwoauthmanageconsumer": "Кіраванне спажыўцамі OAuth",
+ "right-mwoauthsuppress": "Падаўленне спажыўцоў OAuth",
+ "right-mwoauthviewsuppressed": "Прагляд падаўленых спажыўцоў OAuth",
+ "right-mwoauthviewprivate": "Прагляд прыватных дадзеных OAuth",
+ "right-mwoauthmanagemygrants": "Кіраванне грантамі OAuth",
+ "action-mwoauthmanageconsumer": "кіраваць спажыўцамі OAuth",
+ "action-mwoauthsuppress": "падаўляць спажыўцоў OAuth",
+ "action-mwoauthmanagemygrants": "кіраваць сваімі грантамі OAuth",
+ "action-mwoauthproposeconsumer": "прапаноўваць новых спажыўцоў OAuth",
+ "action-mwoauthupdateownconsumer": "абнавіць спажыўцоў OAuth, якімі вы кіруеце",
"echo-category-title-oauth-owner": "Распрацоўка OAuth",
- "echo-pref-tooltip-oauth-owner": "Паведамляць мне пра падзеі, звязаныя са створанымі мной дадаткамі OAuth."
+ "echo-pref-tooltip-oauth-owner": "Паведамляць мне пра падзеі, звязаныя са створанымі мной дадаткамі OAuth.",
+ "echo-category-title-oauth-admin": "Адміністратар OAuth",
+ "grant-oauthmanageownclient": "Кіраваць сваімі кліентамі OAuth"
}
diff --git a/OAuth/i18n/bg.json b/OAuth/i18n/bg.json
index ef267296..cf4fc614 100644
--- a/OAuth/i18n/bg.json
+++ b/OAuth/i18n/bg.json
@@ -12,6 +12,8 @@
},
"mwoauth-desc": "Позволява употреба на OAuth 1.0а и OAuth 2.0 за удостоверяване за API",
"mwoauth-verified": "Приложението има права за осъществяване на достъп до МедияУики от Ваше име.\n\nЗа да завършите процеса, предоставете тази потвърждаваща стойност на приложението: '''$1'''",
+ "mwoauth-field-hidden": "(тази информация е скрита)",
+ "mwoauth-field-private": "(тази информация е лична)",
"mwoauth-prefs-managegrants": "Свързани приложения:",
"mwoauth-prefs-managegrantslink": "Управление на {{PLURAL:$1|$1 свързано приложение|$1 свързани приложения|0=свързани приложения}}",
"mwoauth-consumer-allwikis": "Всички проекти на този сайт",
@@ -20,6 +22,7 @@
"mwoauth-consumer-version": "Версия на клиента:",
"mwoauth-consumer-user": "Издател:",
"mwoauth-consumer-stage": "Настоящ статут:",
+ "mwoauth-consumer-owner-only-label": "Само за собственик:",
"mwoauth-consumer-description": "Описание на приложението:",
"mwoauth-consumer-grantsneeded": "Приложими разрешения:",
"mwoauth-consumer-required-grant": "Приложимо към клиента",
@@ -37,7 +40,6 @@
"mwoauth-consumer-stage-suppressed": "потиснато",
"oauthconsumerregistration": "Регистрация на клиент на OAuth",
"mwoauthconsumerregistration-navigation": "Навигация:",
- "mwoauthconsumerregistration-propose": "Предложи нов клиент",
"mwoauthconsumerregistration-list": "Списък на мои клиенти",
"mwoauthconsumerregistration-main": "Главна",
"mwoauthconsumerregistration-propose-legend": "Ново клиентско приложение за OAuth",
@@ -150,6 +152,13 @@
"right-mwoauthviewsuppressed": "Преглед на потиснати клиенти на OAuth",
"right-mwoauthviewprivate": "Преглед на личните данни за OAuth",
"right-mwoauthmanagemygrants": "Управление на разрешения за OAuth",
+ "action-mwoauthmanageconsumer": "управление на клиенти на OAuth",
+ "action-mwoauthsuppress": "потискане на клиенти на OAuth",
+ "action-mwoauthmanagemygrants": "управление на собствените разрешения за OAuth",
+ "action-mwoauthproposeconsumer": "предлагане на нови клиенти на OAuth",
+ "action-mwoauthupdateownconsumer": "промяна на управляваните от Вас клиенти на OAuth",
+ "action-mwoauthviewprivate": "преглед на личните данни за OAuth",
+ "action-mwoauthviewsuppressed": "преглед на потиснати клиенти на OAuth",
"echo-category-title-oauth-owner": "Разработка на OAuth",
"echo-pref-tooltip-oauth-owner": "Известяване, когато има ново събитие свързано приложенията използващи OAuth, които съм разработил.",
"echo-category-title-oauth-admin": "Администратор на OAuth",
diff --git a/OAuth/i18n/bjn.json b/OAuth/i18n/bjn.json
new file mode 100644
index 00000000..0ddff7af
--- /dev/null
+++ b/OAuth/i18n/bjn.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ezagren"
+ ]
+ },
+ "echo-pref-tooltip-oauth-owner": "Padahi ulun pasal acara nang tarait lawan aplikasi OAuth nang sudah ulun ulah.",
+ "echo-pref-tooltip-oauth-admin": "Padahi ulun pasal acara nang tarait lawan paninjauan aplikasi OAuth."
+}
diff --git a/OAuth/i18n/blk.json b/OAuth/i18n/blk.json
new file mode 100644
index 00000000..ce1e3f18
--- /dev/null
+++ b/OAuth/i18n/blk.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ninjastrikers",
+ "咽頭べさ"
+ ]
+ },
+ "mwoauth-prefs-managegrants": "ဆွိုက်ခါꩻဒါႏ သော့ဝွဲးအပ်ဖုံႏ:",
+ "mwoauth-prefs-managegrantslink": "စီႏမံႏဖန်းဖြယ် ဆွိုက်ခါꩻဒါႏ သော့ဝွဲး {{PLURAL:$1|အပလီကေးသိဥ်း|အပလီကေးသိဥ်းဖုံႏ}} $1 ဗာႏတာႏ",
+ "oauthmanagemygrants": "စီႏမံႏဖန်းဖြယ် ဆွိုက်ခါꩻဒါႏ သော့ဝွဲးအပလီကေးသိဥ်းဖုံႏ",
+ "mwoauthmanagemygrants-showlist": "ဆွိုက်ခါꩻဒါႏ သော့ဝွဲးအပလီကေးသိဥ်းစာႏရင်ꩻ",
+ "mwoauthdatastore-request-token-not-found": "သꩻဟဝ်တဝ်းသွူ၊ ဆွိုက်သော့ဝွဲးအပလီကေးသိဉ်းကျာꩻ ထွာထိုꩻအမာႏတစွိုးစွိုး။ ထန်ႏသဲင်ꩻချာထွူ ကျိုꩻစာꩻဆွိုက်ချာယင်း နာꩻအကောက်နေား၊ တဝ်းလဲ့ သွုပ်ဆွိုက်သွော့ သော့ဝွဲးအပလီကေးသိဉ်းဗွေႏသား။ \n\n<span class=\"plainlinks mw-mwoautherror-details\">OAuth token မော့ꩻတဝ်း၊ $1</span>"
+}
diff --git a/OAuth/i18n/bn.json b/OAuth/i18n/bn.json
index f57e6eec..a2c1ed4c 100644
--- a/OAuth/i18n/bn.json
+++ b/OAuth/i18n/bn.json
@@ -3,6 +3,7 @@
"authors": [
"Aftab1995",
"Aftabuzzaman",
+ "Ahmad Kanik",
"Elias Ahmmad",
"Gitartha.bordoloi",
"Nokib Sarkar",
@@ -10,6 +11,7 @@
"আফতাবুজ্জামান"
]
},
+ "oauth": "ওআউথ",
"mwoauth-desc": "API অনুমোদনের জন্য OAuth 1.0a ও OAuth 2.0 ব্যবহার করার অনুমতি দেয়",
"mwoauth-invalid-field-generic": "অবৈধ মান দেয়া হয়েছে",
"mwoauth-field-hidden": "(এই তথ্য গোপন করা)",
@@ -19,7 +21,7 @@
"mwoauth-consumer-allwikis": "এই সাইটের সব প্রকল্প",
"mwoauth-consumer-key": "ভোক্তার চাবি:",
"mwoauth-consumer-name": "অ্যাপ্লিকেশনের নাম:",
- "mwoauth-consumer-version": "ভোক্তার সংস্করণ:",
+ "mwoauth-consumer-version": "ভোক্তা সংস্করণ:",
"mwoauth-consumer-user": "প্রকাশক:",
"mwoauth-consumer-stage": "বর্তমান অবস্থা:",
"mwoauth-consumer-email": "যোগাযোগের ইমেল ঠিকানা:",
@@ -27,13 +29,16 @@
"mwoauth-consumer-owner-only-label": "শুধুমাত্র মালিক:",
"mwoauth-consumer-description": "অ্যাপ্লিকেশনের বিবরণ:",
"mwoauth-consumer-callbackurl": "\"কলব্যাক\" ওআউথের URL:",
+ "mwoauth-consumer-callbackurl-warning": "(ওয়াইল্ডকার্ড পোর্ট)",
"mwoauth-consumer-callbackisprefix": "অনুরোধে ভোক্তাকে একটি কলব্যাক নির্দিষ্ট করার অনুমতি দেয় এবং একটি প্রয়োজনীয় উপসর্গ হিসাবে উপরের \"কলব্যাক\" URL ব্যবহার করে।",
"mwoauth-consumer-grantsneeded": "প্রয়োগযোগ্য মঞ্জুরি:",
+ "mwoauth-consumer-wiki": "প্রযোজ্য প্রকল্প:",
"mwoauth-consumer-wiki-thiswiki": "বর্তমান প্রকল্প ($1)",
"mwoauth-consumer-restrictions": "ব্যবহারের সীমাবদ্ধতা:",
"mwoauth-consumer-restrictions-json": "ব্যবহারের সীমাবদ্ধতা (JSON):",
"mwoauth-consumer-rsakey": "পাবলিক RSA চাবি (ঐচ্ছিক):",
"mwoauth-consumer-rsakey-help": "RSA-SHA1ভস্বাক্ষর পদ্ধতি ব্যবহার করার জন্য একটি পাবলিক চাবি লিখুন। এলোমেলো গোপনসহ HMAC-SHA ব্যবহার করার জন্য খালি রাখুন। আপনি যদি নিশ্চিত না হন কোনটি ব্যবহার করবেন, তাহলে এটি ফাঁকা রাখুন।",
+ "mwoauth-consumer-accesstoken": "প্রশাশিকারের টোকেন:",
"mwoauth-consumer-reason": "কারণ:",
"mwoauth-consumer-email-unconfirmed": "আপনার অ্যাকাউন্টের ইমেল ঠিকানা এখনো নিশ্চিত করা হয় নি।",
"mwoauth-consumer-stage-proposed": "প্রস্তাবিত",
@@ -43,6 +48,7 @@
"mwoauth-consumer-stage-disabled": "নিস্ক্রিয়",
"mwoauth-consumer-stage-suppressed": "নিরুদ্ধ",
"mwoauthconsumerregistration-navigation": "পরিভ্রমণ:",
+ "mwoauthconsumerregistration-list": "আমার ক্লায়েন্ট তালিকা",
"mwoauthconsumerregistration-main": "প্রধান",
"mwoauthconsumerregistration-name": "ভোক্তা",
"mwoauthconsumerregistration-user": "প্রকাশক",
@@ -55,7 +61,16 @@
"mwoauthconsumerregistration-resetsecretkey": "একটি নতুন মানে গোপন চাবিটি পুনঃস্থাপন করুন",
"mwoauthconsumerregistration-need-emailconfirmed": "আপনাকে OAuth অ্যাপ্লিকেশন তৈরি করার আগে আপনার ই-মেইল ঠিকানা অবশ্যই নিশ্চিত করতে হবে। দয়া করে [[Special:Preferences|ব্যবহারকারীর পছন্দের]] মাধ্যমে আপনার ই-মেইল ঠিকানাটি বসান এবং যাচাই করুন।",
"mwoauthmanageconsumers-type": "সারি:",
+ "mwoauthmanageconsumers-showproposed": "প্রস্তাবিত অনুরোধ",
+ "mwoauthmanageconsumers-showrejected": "প্রত্যাখ্যাত অনুরোধ",
+ "mwoauthmanageconsumers-showexpired": "মেয়াদোত্তীর্ণ অনুরোধ",
+ "mwoauthmanageconsumers-linkproposed": "প্রস্তাবিত অনুরোধ",
+ "mwoauthmanageconsumers-linkrejected": "প্রত্যাখ্যাত অনুরোধ",
+ "mwoauthmanageconsumers-linkexpired": "মেয়াদোত্তীর্ণ অনুরোধ",
+ "mwoauthmanageconsumers-linkapproved": "অনুমোদিত অনুরোধ",
+ "mwoauthmanageconsumers-linkdisabled": "নিষ্ক্রিয় অনুরোধ",
"mwoauthmanageconsumers-main": "প্রধান",
+ "mwoauthmanageconsumers-maintext": "এই পাতাটি ওআউথ (http://oauth.net দেখুন) গ্রাহকদের আবেদনের অনুরোধগুলি পরিচালনা এবং প্রতিষ্ঠিত ওআউথ গ্রাহকদের পরিচালনার জন্য।",
"mwoauthmanageconsumers-name": "ভোক্তা",
"mwoauthmanageconsumers-user": "প্রকাশক",
"mwoauthmanageconsumers-description": "বিবরণ",
@@ -66,16 +81,19 @@
"mwoauthmanageconsumers-action": "অবস্থা পরিবর্তন:",
"mwoauthmanageconsumers-approve": "অনুমোদিত",
"mwoauthmanageconsumers-reject": "প্রত্যাখ্যাত",
- "mwoauthmanageconsumers-disable": "নিস্ক্রিয়",
+ "mwoauthmanageconsumers-disable": "নিষ্ক্রিয়",
"mwoauthmanageconsumers-reenable": "অনুমোদিত",
"mwoauthmanageconsumers-reason": "কারণ:",
"oauthlistconsumers": "ওআউথ অ্যাপ্লিকেশনের তালিকা",
"mwoauthlistconsumers-legend": "ওআউথ অ্যাপ্লিকেশন ব্রাউজ করুন",
"mwoauthlistconsumers-view": "বিস্তারিত",
- "mwoauthlistconsumers-name": "অ্যাপলিকেশনের নাম",
+ "mwoauthlistconsumers-name": "অ্যাপ্লিকেশনের নাম",
"mwoauthlistconsumers-version": "ভোক্তার সংস্করণ",
"mwoauthlistconsumers-user": "প্রকাশক",
"mwoauthlistconsumers-description": "বিবরণ",
+ "mwoauthlistconsumers-callbackurl": "ওআউথ \"কলব্যাক ইউআরএল\"",
+ "mwoauthlistconsumers-grants": "প্রযোজ্য অনুমতি",
+ "mwoauthlistconsumers-basicgrantsonly": "(শুধুমাত্র মৌলিক প্রবেশাধিকার)",
"mwoauthlistconsumers-status": "অবস্থা",
"mwoauth-consumer-stage-any": "যেকোন",
"mwoauthlistconsumers-status-proposed": "প্রস্তাবিত",
@@ -83,6 +101,8 @@
"mwoauthlistconsumers-status-disabled": "নিস্ক্রিয়",
"mwoauthlistconsumers-status-rejected": "প্রত্যাখ্যাত",
"mwoauthlistconsumers-status-expired": "মেয়াদোত্তীর্ণ",
+ "mwoauthlistconsumers-navigation": "পরিভ্রমণ:",
+ "mwoauthlistconsumers-grants-link": "অনুমোদন পরিচালনা করুন",
"mwoauthlistconsumers-rclink": "এই অ্যাপ্লিকেশন দ্বারা সাম্প্রতিক পরিবর্তনগুলি",
"oauthmanagemygrants": "সংযুক্ত অ্যাপ্লিকেশন পরিচালনা",
"mwoauthmanagemygrants-text": "এই পাতাটি যে অ্যাপ্লিকেশনগুলি আপনার অ্যাকাউন্ট ব্যবহার করতে পারে তা তালিকাবদ্ধ করে। এই জাতীয় যে কোনও অ্যাপ্লিকেশনের প্রবেশের পরিধি, আপনি যখন অ্যাপ্লিকেশনটিকে আপনার পক্ষ থেকে কাজ করার অনুমতি দিয়েছিলেন তখন আপনি এটিকে যে অনুমতি দিয়েছিলেন তার উপর সীমাবদ্ধ। আপনি যদি আলাদাভাবে বিভিন্ন সহপ্রকল্পগুলিতে আপনার পক্ষ থেকে প্রবেশের জন্য কোনও অ্যাপ্লিকেশনকে অনুমোদন দিয়ে থাকেন, তবে নীচে প্রতিটি প্রকল্পের জন্য আপনি পৃথক কনফিগারেশন দেখতে পাবেন।\n\nসংযুক্ত অ্যাপ্লিকেশনগুলি OAuth প্রোটোকল ব্যবহার করে আপনার অ্যাকাউন্টে প্রবেশ করে। <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth সংযুক্ত অ্যাপ্লিকেশনগুলি সম্পর্কে আরও জানুন])</span>",
@@ -93,10 +113,14 @@
"mwoauthmanagemygrants-description": "বিবরণ",
"mwoauthmanagemygrants-wikiallowed": "প্রকল্পে অনুমোদিত:",
"mwoauthmanagemygrants-grants": "প্রয়োগযোগ্য মঞ্জুরি",
- "mwoauthmanagemygrants-review": "প্রবেশাধিকার পরিচালনা করুন",
+ "mwoauthmanagemygrants-grantsallowed": "অনুমোদিত অনুমোদন",
+ "mwoauthmanagemygrants-applicablegrantsallowed": "প্রযোজ্য অনুমোদিত অনুমোদন:",
+ "mwoauthmanagemygrants-review": "প্রবেশাধিকার পরিবর্তন করুন",
"mwoauthmanagemygrants-revoke": "প্রবেশাধিকার প্রত্যাহার করুন",
"mwoauthmanagemygrants-grantaccept": "মঞ্জুর",
+ "mwoauthmanagemygrants-update-text": "আপনার পক্ষে কাজ করার জন্য কোনও অ্যাপ্লিকেশনকে দেওয়া অনুমতিগুলি পরিবর্তন করতে নিচের ফরমটি ব্যবহার করুন।",
"mwoauthmanagemygrants-confirm-legend": "সংযুক্ত অ্যাপ্লিকেশন পরিচালনা করুন",
+ "mwoauthmanagemygrants-update": "অনুমোদন হালনাগাদ করুন",
"mwoauthmanagemygrants-action": "অবস্থা পরিবর্তন করুন:",
"mwoauthmanagemygrants-editslink": "এই অ্যাপ্লিকেশন দ্বারা {{GENDER:$1|আপনার}} সম্পাদনাগুলি",
"mwoauthmanagemygrants-actionslink": "এই অ্যাপ্লিকেশন দ্বারা {{GENDER:$1|আপনার}} কার্যগুলি",
@@ -110,6 +134,7 @@
"mwoauth-form-button-cancel": "বাতিল",
"mwoauth-error": "অ্যাপ্লিকেশন সংযোগ ত্রুটি",
"mwoauth-grants-heading": "অনুরোধকৃত অনুমতি:",
+ "grant-mwoauth-authonly": "শুধু ব্যবহারকারী পরিচয় যাচাইকরণ। পাতা পড়ার বা ব্যবহারকারীর হয়ে কাজ করার সক্ষমতা থাকবে না",
"grant-mwoauth-authonlyprivate": "শুধুমাত্র প্রকৃত নাম ও ই-মেইল ঠিকানায় প্রবেশাধিকারসহ ব্যবহারকারী পরিচয় যাচাই করে, ব্যবহারকারীর পক্ষে পড়া বা কাজ করার ক্ষমতা নেই।",
"echo-category-title-oauth-owner": "OAuth উন্নয়ন",
"echo-category-title-oauth-admin": "OAuth প্রশাসক",
@@ -121,5 +146,7 @@
"notification-oauth-app-disable-primary-link": "অ্যাপ দেখুন",
"notification-oauth-app-reenable-primary-link": "অ্যাপ দেখুন",
"notification-oauth-app-body": "কারণ: $1",
+ "mwoauth-oauth-version": "ওআউথ প্রোটোকল সংস্করণ",
+ "mwoauth-oauth2-granttype-client-credentials": "ক্লায়েন্ট শংসাপত্র",
"mwoauthconsumer-application-view": "এই অ্যাপ্লিকেশনটি দেখুন"
}
diff --git a/OAuth/i18n/br.json b/OAuth/i18n/br.json
index a80e745b..36660737 100644
--- a/OAuth/i18n/br.json
+++ b/OAuth/i18n/br.json
@@ -9,7 +9,7 @@
"mwoauth-field-hidden": "(kuzhet eo an titour-mañ)",
"mwoauth-field-private": "(prevez eo an titour-mañ)",
"mwoauth-prefs-managegrants": "Arloadoù kevreet :",
- "mwoauth-prefs-managegrantslink": "Merañ $1 arload kevreet",
+ "mwoauth-prefs-managegrantslink": "Merañ {{PLURAL:$1|$1 arload kevreet}}",
"mwoauth-consumer-allwikis": "An holl raktresoù war al lec'hienn-mañ",
"mwoauth-consumer-key": "Alc'hwez bevezer :",
"mwoauth-consumer-name": "Anv an arload :",
@@ -32,7 +32,6 @@
"mwoauth-consumer-stage-disabled": "diweredekaet",
"mwoauth-consumer-stage-suppressed": "lamet",
"mwoauthconsumerregistration-navigation": "Merdeiñ :",
- "mwoauthconsumerregistration-propose": "Kinnig ur bevezer nevez",
"mwoauthconsumerregistration-list": "Ma roll bevezerien",
"mwoauthconsumerregistration-propose-submit": "Kinnig ur bevezer",
"mwoauthconsumerregistration-update-submit": "Hizivaat ur bevezer",
diff --git a/OAuth/i18n/bs.json b/OAuth/i18n/bs.json
index 52734885..b7703550 100644
--- a/OAuth/i18n/bs.json
+++ b/OAuth/i18n/bs.json
@@ -1,7 +1,8 @@
{
"@metadata": {
"authors": [
- "Srdjan m"
+ "Srdjan m",
+ "Srđan"
]
},
"mwoauth-desc": "Omogućava upotrebu OAutha 1.0a za autentifikaciju API-a",
@@ -30,6 +31,7 @@
"mwoauthmanagemygrants-action": "Izmijeni status:",
"mwoauthmanagemygrants-basic-tooltip": "Zašto ne mogu promijeniti ovu dozvolu? Ova dozvola daje povezanoj aplikaciji osnovno dopuštenje koje joj je neophodno za ispravni rad. Ako ne želite da aplikacija ima ova prava, poništite joj prava pristupa.",
"mwoauth-form-description-onewiki": "Zdravo, $1,\n\nDa bi se mogao ispuniti Vaš zahtjev, aplikaciji '''$2''' potrebna je dozvola da vrši sljedeće radnje u Vaše ime na ''$4'':\n\n$5",
+ "mwoauth-form-description-allwikis-nogrants": "Zdravo, $1,\n\nDa se Vaš zahtjev može ispuniti, '''$2''' traži dozvolu za pristup informacijama na svim projektima ovog sajta u Vaše ime. Nikakve izmjene neće biti napravljene s Vašim računom.",
"mwoauth-form-button-approve": "Dozvoli",
"mwoauth-form-button-cancel": "Otkaži",
"mwoauth-acceptance-cancelled": "Odlučili ste da aplikaciji \"$1\" ne dozvolite pristup računu. \"$1\" može raditi samo ako mu date dozvolu. Možete se vratiti na \"$1\" ili [[Special:OAuthManageMyGrants|upravljati]] povezanim aplikacijama.",
diff --git a/OAuth/i18n/ca.json b/OAuth/i18n/ca.json
index 3cc70493..23aac65c 100644
--- a/OAuth/i18n/ca.json
+++ b/OAuth/i18n/ca.json
@@ -2,12 +2,13 @@
"@metadata": {
"authors": [
"Fitoschido",
+ "Jmarchn",
"Pginer",
"Townie"
]
},
"mwoauth-prefs-managegrants": "Aplicacions connectades:",
- "mwoauth-prefs-managegrantslink": "Gestiona $1 {{PLURAL:$1|aplicació connectada|aplicacions connectades}}",
+ "mwoauth-prefs-managegrantslink": "Gestiona {{PLURAL:$1|$1 aplicació connectada|$1 aplicacions connectades|0=aplicacions connectades}}",
"mwoauth-consumer-allwikis": "Tots els projectes d’aquest lloc",
"mwoauth-consumer-name": "Nom de l’aplicació:",
"mwoauthconsumerregistration-navigation": "Navegació:",
diff --git a/OAuth/i18n/ce.json b/OAuth/i18n/ce.json
index ac2adcd6..d36873a3 100644
--- a/OAuth/i18n/ce.json
+++ b/OAuth/i18n/ce.json
@@ -6,7 +6,7 @@
]
},
"mwoauth-desc": "OAuth 1.0a лелича йиш хуьлуьйту API чудаха",
- "mwoauth-db-readonly": "OAuth хаамийн базан хана блоктоьха. Масийтта минот яьлча ху хьажа.",
+ "mwoauth-db-readonly": "OAuth хаамийн базан хана блоктоьхна. Масийтта минот йаьлча йуха хьажа.",
"mwoauth-missing-field": "МаьӀна дац «$1»",
"mwoauth-invalid-field": "Магийна доцу маьӀна «$1»",
"mwoauth-invalid-field-generic": "ТӀе цакхочу маьӀна",
@@ -19,11 +19,11 @@
"mwoauth-consumer-name": "ТӀетохаран цӀе:",
"mwoauth-consumer-version": "Клиентан верси:",
"mwoauth-consumer-user": "Арахецархо:",
- "mwoauth-consumer-stage": "Карара хьал:",
+ "mwoauth-consumer-stage": "Карара статус:",
"mwoauth-consumer-email": "Контактан электронан поштан адрес:",
"mwoauth-consumer-owner-only-label": "Йолчуьна бен:",
"mwoauth-consumer-description": "Цуьнах лаьцна:",
- "mwoauth-consumer-callbackurl": "«URL-адрес юха кхайкхаман» OAuth:",
+ "mwoauth-consumer-callbackurl": "«URL-адрес йуха кхайкхаман» OAuth:",
"mwoauth-consumer-granttypes": "Йоьхуш йолу бакъонаш:",
"mwoauth-consumer-grantsneeded": "Лелош йолу гранташ:",
"mwoauth-consumer-required-grant": "Клиентан лело мега",
@@ -33,16 +33,16 @@
"mwoauth-consumer-restrictions-json": "Лелоран (JSON) доза тохар:",
"mwoauth-consumer-rsakey": "Гуш долу RSA-догӀа (тӀехь дац):",
"mwoauth-consumer-secretkey": "Клиентан къайлаха догӀа:",
- "mwoauth-consumer-accesstoken": "Код (токен) тӀекхочуш ю:",
+ "mwoauth-consumer-accesstoken": "Код (токен) тӀекхочуш йу:",
"mwoauth-consumer-reason": "Бахьана:",
"mwoauth-consumer-email-unconfirmed": "Хьан электроннан поштан адрес хӀинца а бакъдина дац.",
"mwoauth-consumer-stage-proposed": "кховдийна",
- "mwoauth-consumer-stage-rejected": "дӀаяйина",
+ "mwoauth-consumer-stage-rejected": "дӀайайина",
"mwoauth-consumer-stage-expired": "чекхъяла",
"mwoauth-consumer-stage-approved": "бакъйина",
"mwoauth-consumer-stage-disabled": "дӀадайина",
"mwoauth-consumer-stage-suppressed": "дохина",
- "oauthconsumerregistration": "Клиентан OAuth дӀаяздар кхоллар",
+ "oauthconsumerregistration": "OAuth клиентан регистраци",
"mwoauthconsumerregistration-navigation": "Навигациː",
"mwoauthconsumerregistration-main": "Коьрта",
"mwoauthconsumerregistration-name": "Клиент",
@@ -50,7 +50,7 @@
"mwoauthconsumerregistration-description": "Цуьнах лаьцна",
"mwoauthconsumerregistration-email": "Контактан электронан поштан адрес",
"mwoauthconsumerregistration-consumerkey": "Клиентан идентификатор",
- "mwoauthconsumerregistration-stage": "Хьал",
+ "mwoauthconsumerregistration-stage": "Cтатус",
"mwoauthconsumerregistration-lastchange": "ТӀаьххьара хийцамаш",
"mwoauthconsumerregistration-manage": "урхалладар",
"mwoauthmanageconsumers-type": "РогӀеш:",
@@ -70,9 +70,9 @@
"mwoauthmanageconsumers-consumerkey": "Клиентан идентификатор",
"mwoauthmanageconsumers-lastchange": "ТӀаьххьара хийцамаш",
"mwoauthmanageconsumers-review": "гар/урхалладар",
- "mwoauthmanageconsumers-action": "Хийца хьал:",
+ "mwoauthmanageconsumers-action": "Хийца статус:",
"mwoauthmanageconsumers-approve": "Магийна",
- "mwoauthmanageconsumers-reject": "ДӀаяйина",
+ "mwoauthmanageconsumers-reject": "ДӀайайина",
"mwoauthmanageconsumers-disable": "ДӀадайина",
"mwoauthmanageconsumers-reenable": "Магийна",
"mwoauthmanageconsumers-reason": "Бахьана:",
@@ -84,21 +84,21 @@
"mwoauthlistconsumers-user": "Арахецархо",
"mwoauthlistconsumers-description": "Цуьнах лаьцна",
"mwoauthlistconsumers-wiki": "Проектан лело мега",
- "mwoauthlistconsumers-callbackurl": "«URL-адрес юха кхайкхаман» OAuth:",
+ "mwoauthlistconsumers-callbackurl": "«URL-адрес йуха кхайкхаман» OAuth:",
"mwoauthlistconsumers-grants": "Лелош йолу шоралаш:",
"mwoauthlistconsumers-basicgrantsonly": "(базан тӀекхачар бен)",
- "mwoauthlistconsumers-status": "Хьал",
+ "mwoauthlistconsumers-status": "Cтатус",
"mwoauth-consumer-stage-any": "муьлха",
"mwoauthlistconsumers-status-proposed": "кховдийна",
"mwoauthlistconsumers-status-approved": "магийна",
- "mwoauthlistconsumers-status-disabled": "юхатоьхна",
- "mwoauthlistconsumers-status-rejected": "юхатоьхна",
+ "mwoauthlistconsumers-status-disabled": "йухатоьхна",
+ "mwoauthlistconsumers-status-rejected": "йухатоьхна",
"mwoauthlistconsumers-status-expired": "чекхъяла",
"oauthmanagemygrants": "ТӀетесна тӀетохаршан урхалладар",
- "mwoauthmanagemygrants-text": "ХӀокху агӀонгахь гойтуш ю хьан декъашхочун дӀаяздар лело йиш йолу тӀетохарш. ХӀора тӀетохар шордаро дихкина ду. Ахьа тӀетохаран дӀаяздар леладан бакъо елехь хьа йиш ю лахахь царна урхалла дан\n\nТӀетесна тӀетохаршна болх бан ло OAuth протоколан гӀоьнца. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Хьажа кхин тӀе тӀетесна йолу тӀетохаршах лаьца])</span>",
+ "mwoauthmanagemygrants-text": "ХӀокху агӀонгахь гойтуш йу хьан аккаунт лело йиш йолу тӀетохарш. ХӀора тӀетохар шордаро дихкина ду. Ахьа тӀетохаран агӀо лелайан бакъо йелехь хьа йиш йу лахахь царна урхалла дан\n\nТӀетесна тӀетохаршна болх бан ло OAuth протоколан гӀоьнца. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Хьажа кхин тӀе тӀетесна йолу тӀетохаршах лаьца])</span>",
"mwoauthmanagemygrants-navigation": "Навигациː",
"mwoauthmanagemygrants-showlist": "ТӀетесна тӀетохаршан могӀа",
- "mwoauthmanagemygrants-none": "Хьан декъашхочун дӀаяздаран хӀинца яц тӀетесна тӀетохарш.",
+ "mwoauthmanagemygrants-none": "Хьан аккаунтан хӀинца йац тӀетесна тӀетохарш.",
"mwoauthmanagemygrants-user": "Арахецархо",
"mwoauthmanagemygrants-description": "Цуьнах лаьцна",
"mwoauthmanagemygrants-wikiallowed": "Магийна проектехь:",
@@ -106,15 +106,25 @@
"mwoauthmanagemygrants-review": "тӀекхачарна урхалладар",
"mwoauthmanagemygrants-revoke": "тӀекхачар дохо",
"mwoauthmanagemygrants-grantaccept": "Магийна",
- "mwoauthmanagemygrants-update-text": "Лелае лахара форма, тӀетохарш хьай цӀарца дешдерг маго.",
- "mwoauthmanagemygrants-revoke-text": "Лелае лахара форма, хьайн цӀарца болх беш йолу тӀетохарш саца ян.",
+ "mwoauthmanagemygrants-update-text": "Лелайе лахара форма, тӀетохарш хьай цӀарца дешдерг маго.",
+ "mwoauthmanagemygrants-revoke-text": "Лелайе лахара форма, хьайн цӀарца болх беш йолу тӀетохарш саца йан.",
"mwoauthmanagemygrants-confirm-legend": "ТӀетесна тӀетохаршан урхалладар",
"mwoauthmanagemygrants-update": "Карладаха магийнарш",
"mwoauthmanagemygrants-renounce": "ДӀахадае авторизаци",
- "mwoauth-form-description-allwikis-nogrants": "Маршалла $1,\n\n'''$2''' хьан цӀарца больхбан хьан дӀаяздаран чугӀо.",
+ "mwoauth-form-description-allwikis": "Маршалла, $1!\n\nХьан дехар кхочушдан «$2», хьан цӀарах бакъо йеза, рогӀехь дерг йерриге проектан сайташкахь:\n\n$4",
+ "mwoauth-form-description-onewiki": "Маршалла $1!\n\nХьан дехар «$2» «$4» проектехь чекхдакха, хьан цӀарах бакъо йеза:\n\n$5",
+ "mwoauth-form-description-allwikis-nogrants": "Маршалла, $1!\n\nХьан дехар «$2» чекхдаккха, йерриге проектан сайтех информацина тӀекхача оьшу хьан цӀарах бакъо. Хьан аккаунтан тӀехь цхьа хийцамаш бира бац.",
+ "mwoauth-form-description-onewiki-nogrants": "Маршалла, $1!\n\nХьан дехар «$2» чекхдаккха, «$4 проектехь информацина тӀекхача оьшу хьан цӀарах бакъо. Хьан аккаунтан тӀехь цхьа хийцамаш бира бац.",
+ "mwoauth-form-description-allwikis-privateinfo": "Маршалла, $1!\n\nХьан дехар чекхдаккха, '''$2''' программина оьшу бакъо хьох лаьцна информацина тӀекхача, хьан бакъалла цӀе а, электронан поштан адресна а, кху сайт тӀера йерриге проекташкахь. Хьан аккаунтан тӀехь цхьа хийцамаш бира бац.",
+ "mwoauth-form-description-onewiki-privateinfo": "Маршалла, $1!\n\nХьан дехар чекхдаккха, '''$2''' программина оьшу бакъо «$4» проектехь хьох лаьцна информацина тӀекхача, хьан бакъалла цӀе а, электронан поштан адресна а. Хьан аккаунтан тӀехь цхьа хийцамаш бира бац.",
+ "mwoauth-form-description-allwikis-privateinfo-norealname": "Маршалла, $1!\n\nХьан дехар чекхдаккха, '''$2''' программина оьшу бакъо хьох лаьцна информацина тӀекхача, электронан поштан адресна а, кху сайт тӀера йерриге проекташкахь. Хьан аккаунтан тӀехь цхьа хийцамаш бира бац.",
+ "mwoauth-form-description-onewiki-privateinfo-norealname": "Маршалла, $1!\n\nХьан дехар чекхдаккха, '''$2''' программина оьшу бакъо «$4» проектехь хьох лаьцна информацина тӀекхача, электронан поштан адресна а. Хьан аккаунтан тӀехь цхьа хийцамаш бира бац.",
"mwoauth-form-button-approve": "Магаде",
"mwoauth-form-button-cancel": "Цаоьшу",
"mwoauth-grants-heading": "Магийтар деха:",
- "mwoauth-callback-not-oob": "oauth_callback хӀоттина хила еза «oob» маьӀна а долуш (регистр лоруш)",
+ "mwoauth-listgrants-extra-summary": "== OAuth лело ша-тайпа бакъоялар ==\nХӀара бакъояларш леррина ду OAuth клиенташна.",
+ "mwoauth-callback-not-oob": "oauth_callback хӀоттина хила йеза «oob» маьӀна а долуш (регистр лоруш)",
+ "echo-category-title-oauth-owner": "OAuth-тойар",
+ "echo-pref-tooltip-oauth-owner": "Аса кхоьллинчу OAuth-программах хиллачух соьга хаамбе.",
"notification-oauth-app-body": "Бахьана: $1"
}
diff --git a/OAuth/i18n/cs.json b/OAuth/i18n/cs.json
index 10b5719f..596e1ecf 100644
--- a/OAuth/i18n/cs.json
+++ b/OAuth/i18n/cs.json
@@ -12,7 +12,7 @@
"Tchoř"
]
},
- "mwoauth-desc": "Umožňuje využití OAuth 1.0a pro autorizaci přístupu k API",
+ "mwoauth-desc": "Umožňuje využití OAuth 1.0a a OAuth 2.0 pro autorizaci přístupu k API",
"mwoauth-verified": "Tato aplikace má nyní oprávnění přistupovat k MediaWiki vaším jménem.\n\nPro dokončení procesu poskytněte aplikaci tuto ověřovací hodnotu: '''$1'''",
"mwoauth-db-readonly": "Databáze OAuth je dočasně uzamčena. Zkuste to prosím znovu za několik minut.",
"mwoauth-missing-field": "Chybějící hodnota pole „$1“",
@@ -71,12 +71,13 @@
"mwoauth-consumer-stage-suppressed": "utajený",
"oauthconsumerregistration": "Registrace konzumenta OAuth",
"mwoauthconsumerregistration-navigation": "Navigace:",
- "mwoauthconsumerregistration-propose": "Navrhnout nového konzumenta",
"mwoauthconsumerregistration-list": "Seznam mých konzumentů",
"mwoauthconsumerregistration-main": "Hlavní",
- "mwoauthconsumerregistration-propose-text": "Vývojáři by měli používat níže zobrazený formulář k navržení nového konzumenta OAuth (podrobnosti najdete v [//www.mediawiki.org/wiki/Extension:OAuth?uselang=cs dokumentaci rozšíření]). Po odeslání tohoto formuláře obdržíte token, pomocí kterého se vaše aplikace bude identifikovat MediaWiki. Předtím, než budou moci ostatní uživatelé autorizovat vaši aplikaci, bude ji muset schválit některý správce OAuth.\n\nNěkolik doporučení a poznámek:\n* Snažte se používat co nejméně oprávnění. Vyhněte se těm, která ve skutečnosti zatím nepotřebujete.\n* Verze má tvar „major.minor.release“ (poslední dvě části jsou nepovinné) a zvyšuje se, když jsou potřeba změny oprávnění.\n* Pokud je to možné, poskytněte veřejný klíč RSA (ve formátu PEM), jinak se musí používat (méně bezpečný) tajný token.\n* Pomocí ID wiki můžete omezit tohoto konzumenta na jediný projekt na tomto serveru (pro všechny projekty uveďte „*“).",
+ "mwoauthconsumerregistration-propose-text": "Vývojáři by měli používat níže zobrazený formulář k navržení nového konzumenta OAuth (podrobnosti najdete v [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth?uselang=cs dokumentaci rozšíření]). Po odeslání tohoto formuláře obdržíte token, pomocí kterého se vaše aplikace bude identifikovat MediaWiki. Předtím, než budou moci ostatní uživatelé autorizovat vaši aplikaci, bude ji muset schválit některý správce OAuth.\n\nNěkolik doporučení a poznámek:\n* Snažte se používat co nejméně oprávnění. Vyhněte se těm, která ve skutečnosti zatím nepotřebujete.\n* Verze má tvar „major.minor.release“ (poslední dvě části jsou nepovinné) a zvyšuje se, když jsou potřeba změny oprávnění.\n* Pokud je to možné, poskytněte veřejný klíč RSA (ve formátu PEM), jinak se musí používat (méně bezpečný) tajný token.\n* Pomocí ID wiki můžete omezit tohoto konzumenta na jediný projekt na tomto serveru (pro všechny projekty uveďte „*“).",
+ "mwoauthconsumerregistration-propose-text-oauth1a": "Vývojáři by měli používat níže zobrazený formulář k navržení nového konzumenta OAuth 1.0a (podrobnosti najdete v [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth?uselang=cs dokumentaci rozšíření]). Po odeslání tohoto formuláře obdržíte token, pomocí kterého se vaše aplikace bude identifikovat MediaWiki. Předtím, než budou moci ostatní uživatelé autorizovat vaši aplikaci, ji bude muset schválit některý správce OAuth.\n\nNěkolik doporučení a poznámek:\n* Snažte se používat co nejméně oprávnění. Vyhněte se těm, která ve skutečnosti zatím nepotřebujete.\n* Verze má tvar „major.minor.release“ (poslední dvě části jsou nepovinné) a zvyšuje se, když jsou potřeba změny oprávnění.\n* Pokud je to možné, poskytněte veřejný klíč RSA (ve formátu PEM), jinak se musí používat (méně bezpečný) tajný token.\n* Pomocí ID wiki můžete omezit tohoto konzumenta na jediný projekt na tomto serveru (pro všechny projekty uveďte „*“).",
+ "mwoauthconsumerregistration-propose-text-oauth2": "Vývojáři by měli používat níže zobrazený formulář k navržení nového konzumenta OAuth 2.0 (podrobnosti najdete v [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth?uselang=cs dokumentaci rozšíření]). Po odeslání tohoto formuláře obdržíte token, pomocí kterého se vaše aplikace bude identifikovat MediaWiki. Předtím, než budou moci ostatní uživatelé autorizovat vaši aplikaci, ji bude muset schválit některý správce OAuth.\n\nNěkolik doporučení a poznámek:\n* Snažte se používat co nejméně oprávnění. Vyhněte se těm, která ve skutečnosti zatím nepotřebujete.\n* Verze má tvar „major.minor.release“ (poslední dvě části jsou nepovinné) a zvyšuje se, když jsou potřeba změny oprávnění.\n* Pomocí ID wiki můžete omezit tohoto konzumenta na jediný projekt na tomto serveru (pro všechny projekty uveďte „*“).",
"mwoauthconsumerregistration-update-text": "Pomocí níže uvedeného formuláře můžete změnit vlastnosti konzumenta OAuth, kterého spravujete.\n\nVšechny uvedené hodnoty přepíšou ty původní. Neponechávejte žádná pole prázdná, pokud nechcete jejich hodnoty smazat.",
- "mwoauthconsumerregistration-maintext": "Tato stránka slouží k navrhování a změnám konzumentských aplikací OAuth (vizte http://oauth.net) v registru tohoto serveru.\n\nMůžete zde [[Special:OAuthConsumerRegistration/propose|navrhnout nového konzumenta]] nebo [[Special:OAuthConsumerRegistration/list|spravovat své existující konzumenty]].",
+ "mwoauthconsumerregistration-maintext": "Tato stránka slouží k navrhování a změnám konzumentských aplikací OAuth v registru tohoto serveru.\n\nMůžete zde [[Special:OAuthConsumerRegistration/propose|navrhnout nového konzumenta]] nebo [[Special:OAuthConsumerRegistration/list|spravovat své existující konzumenty]].\n\nVíce informací o OAuth najdete v [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth dokumentaci rozšíření].",
"mwoauthconsumerregistration-propose-legend": "Nová konzumentská aplikace OAuth",
"mwoauthconsumerregistration-update-legend": "Změna konzumentské aplikace OAuth",
"mwoauthconsumerregistration-propose-submit": "Navrhnout konzumenta",
@@ -267,11 +268,12 @@
"action-mwoauthviewprivate": "prohlížet si soukromé údaje OAuth",
"action-mwoauthviewsuppressed": "prohlížet si utajené konzumenty OAuth",
"mwoauth-tag-reserved": "Značky začínající <code>OAuth CID:</code> jsou vyhrazeny pro OAuth.",
- "mwoauth-botpasswords-note": "<strong>Poznámka:</strong> <span class=\"plainlinks\">[$1 OAuth]</span> je bezpečnější než hesla robotů a měl by být preferován, kdykoliv to robot preferuje.",
+ "mwoauth-botpasswords-note": "<strong>Poznámka:</strong> <span class=\"plainlinks\">[$1 OAuth]</span> je bezpečnější než hesla robotů a měl by být preferován, kdykoliv to robot podporuje.",
"mwoauth-api-module-disabled": "Modul „$1“ není dostupný prostřednictvím OAuth.",
"echo-category-title-oauth-owner": "vývoj OAuth",
"echo-pref-tooltip-oauth-owner": "Upozorněte mě na události týkající aplikací OAuth, které jsem {{GENDER:|vytvořil|vytvořila}}.",
"echo-category-title-oauth-admin": "správu OAuth",
"echo-pref-tooltip-oauth-admin": "Upozorněte mě na události týkající se schvalování aplikací OAuth.",
- "notification-oauth-app-body": "Zdůvodnění: $1"
+ "notification-oauth-app-body": "Zdůvodnění: $1",
+ "grant-oauthmanageownclient": "Spravovat vaše OAuth klienty"
}
diff --git a/OAuth/i18n/da.json b/OAuth/i18n/da.json
index 94877d8e..8920df22 100644
--- a/OAuth/i18n/da.json
+++ b/OAuth/i18n/da.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"Knud Winckelmann",
+ "KnudW",
"Kranix",
"Saederup92",
"Sarrus",
@@ -61,6 +62,9 @@
"mwoauthmanagemygrants-editslink": "{{GENDER:$1|Dine}} redigeringer via denne applikation",
"mwoauthmanagemygrants-actionslink": "{{GENDER:$1|Dine}} handlinger via denne applikation",
"mwoauthdatastore-bad-source-ip": "Forespørgslen kom fra en ugyldig IP-adresse.",
+ "mwoauth-form-description-allwikis": "Hej $1,\n\nFor at kunne imødekomme din anmodning, behøver '''$2''' tilladelse til at udføre følgende handlinger på dine vegne på alle projekter:\n\n$4",
+ "mwoauth-form-description-onewiki": "Hej $1,\n\nFor at kunne imødekomme din anmodning, behøver '''$2''' tilladelse til at udføre følgende handlinger på dine vegne på ''$4'':\n\n$5",
+ "mwoauth-form-description-onewiki-nogrants": "Hej $1,\n\nFor at kunne udføre din anmodning, skal '''$2''' have tilladelse til at tilgå information på ''$4'' på dine vegne. Der vil ikke ske nogen ændringer af din brugerkonto.",
"mwoauth-form-button-approve": "Tillad",
"mwoauth-form-button-cancel": "Annullér",
"notification-oauth-app-body": "Begrundelse: $1"
diff --git a/OAuth/i18n/de.json b/OAuth/i18n/de.json
index 5d06037a..b7e236df 100644
--- a/OAuth/i18n/de.json
+++ b/OAuth/i18n/de.json
@@ -1,13 +1,21 @@
{
"@metadata": {
"authors": [
+ "Amire80",
+ "Brettchenweber",
"ChrisiPK",
+ "Gebu",
+ "Johannnes89",
"Kghbln",
"Killarnee",
+ "McDutchie",
"Metalhead64",
+ "Robby",
"Se4598",
+ "Talex42",
"Umherirrender",
- "Wnme"
+ "Wnme",
+ "Zabe"
]
},
"mwoauth-desc": "Ermöglicht die Nutzung von OAuth 1.0a und OAuth 2.0 zur API-Autorisierung",
@@ -33,6 +41,7 @@
"mwoauth-consumer-owner-only-help": "Die Auswahl dieser Option verursacht die automatische Bestätigung und Akzeptierung des Verbrauchers für die Verwendung durch $1. Er wird für andere Benutzer nicht nutzbar sein und der übliche Autorisierungsablauf wird nicht funktionieren. Aufgenommene Aktionen mit diesem Verbraucher werden nicht markiert.",
"mwoauth-consumer-description": "Anwendungsbeschreibung:",
"mwoauth-consumer-callbackurl": "OAuth-Callback-URL:",
+ "mwoauth-consumer-callbackurl-warning": "(Wildcard-Port)",
"mwoauth-consumer-callbackisprefix": "Dem Verbraucher die Angabe eines Callbacks in Anfragen ermöglichen und die obige Callback-URL als ein erforderliches Präfix verwenden.",
"mwoauth-consumer-granttypes": "Typen der angefragten Berechtigungen:",
"mwoauth-consumer-grantsneeded": "Anwendbare Berechtigungen:",
@@ -69,12 +78,11 @@
"mwoauth-consumer-stage-suppressed": "unterdrückt",
"oauthconsumerregistration": "OAuth-Anwendungsregistrierung",
"mwoauthconsumerregistration-navigation": "Navigation:",
- "mwoauthconsumerregistration-propose": "Neuen Verbraucher planen",
"mwoauthconsumerregistration-list": "Meine Verbraucherliste",
"mwoauthconsumerregistration-main": "Start",
- "mwoauthconsumerregistration-propose-text": "Entwickler sollten das unten stehende Formular benutzen, um einen neuen OAuth-Verbraucher zu planen (siehe die [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth Erweiterungsdokumentation] für Einzelheiten). Nach dem Abschicken dieses Formulars erhältst du einen Token, der von deiner Anwendung zur Identifizierung für MediaWiki verwendet wird. Ein OAuth-Administrator muss deine Anwendung bestätigen, bevor sie von anderen Benutzern autorisiert werden kann.\n\nHier einige Empfehlungen und Bemerkungen:\n* Versuche, so wenig Berechtigungen wie möglich zu verwenden. Vermeide Berechtigungen, die in Wirklichkeit nicht benötigt werden.\n* Versionen haben die Form „Hauptversion.Nebenversion.Release“ (die letzten zwei sind optional) und steigen mit der Notwendigkeit von Berechtigungsänderungen an.\n* Bitte gib einen öffentlichen RSA-Schlüssel an (im PEM-Format), falls möglich. Anderenfalls muss ein wenig sicherer Geheimtoken benutzt werden.\n* Du kannst eine Projektkennung verwenden, um den Verbraucher auf ein einzelnes Projekt auf dieser Website zu beschränken (verwende „*“ für alle Projekte).",
+ "mwoauthconsumerregistration-propose-text": "Du kannst:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|Einen OAuth 1.0a-Konsumenten vorschlagen]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Einen OAuth 2.0-Client vorschlagen]].",
"mwoauthconsumerregistration-update-text": "Verwende das unten stehende Formular, um Aspekte eines von dir kontrollierten OAuth-Verbrauchers zu aktualisieren.\n\nAlle Werte hier überschreiben alle vorherigen. Hinterlasse keine leeren Felder, außer du beabsichtigst, diese Werte zu löschen.",
- "mwoauthconsumerregistration-maintext": "Diese Seite dient zum Vorschlagen und Aktualisieren von OAuth-Anwendungen in der Websiteregistrierung durch Entwickler.\n\nDu kannst hier\n* [[Special:OAuthConsumerRegistration/propose|einen Token für eine neue Anwendung anfordern]] oder\n* [[Special:OAuthConsumerRegistration/list|deine vorhandenen Anwendungen verwalten]].\n\nFür mehr Informationen über OAuth, siehe die [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth Erweiterungsdokumentation].",
+ "mwoauthconsumerregistration-maintext": "Diese Seite dient zum Vorschlagen und Aktualisieren von OAuth-Anwendungen in der Websiteregistrierung durch Entwickler.\n\nDu kannst hier\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|einen Token für eine neue OAuth 1.0a-Anwendung anfordern]]\n*[[Special:OAuthConsumerRegistration/propose/oauth2|einen Token für eine neue OAuth 2.0-Anwendung anfordern]]\n* [[Special:OAuthConsumerRegistration/list|deine vorhandenen Anwendungen verwalten]].\n\nFür mehr Informationen über OAuth, siehe die [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth Erweiterungsdokumentation].",
"mwoauthconsumerregistration-propose-legend": "Neue OAuth-Verbraucheranwendung",
"mwoauthconsumerregistration-update-legend": "OAuth-Verbraucheranwendung aktualisieren",
"mwoauthconsumerregistration-propose-submit": "Verbraucher planen",
@@ -165,6 +173,7 @@
"mwoauthlistconsumers-status-rejected": "abgelehnt",
"mwoauthlistconsumers-status-expired": "abgelaufen",
"mwoauthlistconsumers-navigation": "Navigation:",
+ "mwoauthlistconsumers-update-link": "Verbraucher aktualisieren",
"mwoauthlistconsumers-grants-link": "Rechte verwalten",
"mwoauthlistconsumers-rclink": "Letzte Änderungen durch diese Anwendung",
"oauthmanagemygrants": "Verbundene Anwendungen verwalten",
@@ -211,7 +220,7 @@
"log-action-filter-mwoauthconsumer-update": "OAuth-Verbraucheraktualisierung",
"mwoauthconsumer-consumer-logpage": "OAuth-Anwendungs-Logbuch",
"mwoauthconsumer-consumer-logpagetext": "Logbuch von Bestätigungen, Ablehnungen und Deaktivierungen registrierter OAuth-Verbraucher.",
- "mwoauth-bad-request-missing-params": "Leider ist etwas mit der Konfiguration dieser verbundenen Anwendung schief gelaufen. <span class=\"plainlinks\">[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Kontaktiere den Support]</span>, um Hilfe bei der Behebung zu erhalten.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Fehlende Parameter, $1</span>",
+ "mwoauth-bad-request-missing-params": "Leider ist etwas mit der Konfiguration dieser verbundenen Anwendung schief gelaufen. Kontaktiere den Entwickler der Anwendung.\n\n<span class=\"plainlinks mw-mwoautherror-details\">OAuth fehlende Parameter, $1</span>",
"mwoauth-bad-request-invalid-action": "Leider ist etwas schief gelaufen. Du wirst den Anwendungsautor kontaktieren müssen, um Hilfe für dieses Problem zu erhalten.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Unbekannte URL, $1</span>",
"mwoauth-bad-request-invalid-action-contact": "Leider ist etwas schief gelaufen. Du wirst den Anwendungsautor [$1 kontaktieren] müssen, um Hilfe für dieses Problem zu erhalten.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Unbekannte URL, $2</span>",
"mwoauthdatastore-access-token-not-found": "Für diesen Autorisierungstoken wurde keine bestätigte Berechtigung gefunden",
@@ -248,6 +257,7 @@
"mwoauth-form-button-approve": "Erlauben",
"mwoauth-form-button-cancel": "Abbrechen",
"mwoauth-error": "Anwendungsverbindungsfehler",
+ "mwoauth-error-missing-callback-url-non-owner": "callback_url ist für Nicht-Eigentümer-Clients erforderlich",
"mwoauth-grants-heading": "Angeforderte Berechtigungen:",
"mwoauth-grants-nogrants": "Die Anwendung hat keine Berechtigungen beantragt.",
"mwoauth-acceptance-cancelled": "Du hast dich entschieden, dass $1 nicht auf dein Benutzerkonto zugreifen darf. $1 wird nicht laufen, bis du den Zugriff erlaubt hast. Du kannst zu $1 zurückgehen oder deine verbundenen Anwendungen [[Special:OAuthManageMyGrants|verwalten]].",
@@ -298,5 +308,20 @@
"notification-oauth-app-disable-primary-link": "Anwendung ansehen",
"notification-oauth-app-reenable-primary-link": "Anwendung ansehen",
"notification-oauth-app-body": "Grund: $1",
- "mwoauth-oauth2-granttype-auth-code": "Autorisierungscode"
+ "mwoauth-oauth-version": "OAuth-Protokoll-Version",
+ "mwoauth-oauth2-granttype-auth-code": "Autorisierungscode",
+ "mwoauth-oauth-unsupported-version": "Dieser Endpunkt ist für OAuth-Version $1 nicht zulässig",
+ "mwoauth-oauth2-unable-to-retrieve-access-token": "Zugriffstoken konnte nicht abgerufen werden: $1",
+ "mwoauth-oauth2-error-server-error": "Der Autorisierungsserver ist auf eine unerwartete Bedingung gestoßen, die ihn daran hinderte, die Anfrage zu erfüllen.",
+ "mwoauth-oauth2-error-invalid-request": "In der Anfrage fehlt ein erforderlicher Parameter, sie enthält einen ungültigen Parameterwert, sie enthält einen Parameter mehr als einmal oder ist anderweitig fehlerhaft.",
+ "mwoauth-oauth2-error-unauthorized-client": "Der Client ist nicht berechtigt, einen Autorisierungscode mit dieser Methode anzufordern.",
+ "mwoauth-oauth2-error-access-denied": "Der Eigentümer der Ressource oder der Autorisierungsserver hat die Anfrage abgelehnt.",
+ "mwoauth-oauth2-error-unsupported-response-type": "Der Autorisierungsserver unterstützt die Erlangung eines Autorisierungscodes mit dieser Methode nicht.",
+ "mwoauth-oauth2-error-invalid-scope": "Der angefragte Bereich ist ungültig, unbekannt oder fehlerhaft.",
+ "mwoauth-oauth2-error-temporarily-unavailable": "Der Autorisierungsserver ist derzeit nicht in der Lage, die Anfrage zu bearbeiten, da der Server vorübergehend überlastet ist oder gewartet wird.",
+ "mwoauth-oauth2-error-request-not-verified": "Versuch, geprüfte Eigenschaften abzurufen, bevor die Anfrage verifiziert wurde",
+ "mwoauth-oauth2-invalid-access-token": "Ungültiges Zugriffstoken",
+ "mwoauth-login-required-reason": "Sie müssen sich in Ihr {{SITENAME}}-Konto einloggen, um Anwendungen zu erlauben, darauf zuzugreifen.",
+ "mwoauthconsumer-application-view": "Anwendung anzeigen",
+ "mwoauth-consumer-deleted-error": "Du kannst keine Aktionen für gelöschte Clients durchführen"
}
diff --git a/OAuth/i18n/diq.json b/OAuth/i18n/diq.json
index 0ca63c1d..a647d307 100644
--- a/OAuth/i18n/diq.json
+++ b/OAuth/i18n/diq.json
@@ -10,6 +10,7 @@
"mwoauth-prefs-managegrants": "Gıre bıyayey Aplikasyoni",
"mwoauth-prefs-managegrantslink": "$1 ya greyın {{PLURAL:$1|dezgi|dezgan}} idare ke",
"mwoauth-consumer-user": "Weşanayoğ:",
+ "mwoauth-consumer-callbackurl-warning": "(Wildcard-Port)",
"mwoauth-consumer-stage-disabled": "astengın",
"mwoauthconsumerregistration-main": "Ser",
"mwoauthconsumerregistration-user": "Weşanayoğ",
diff --git a/OAuth/i18n/el.json b/OAuth/i18n/el.json
index 21d58041..0a5eba8d 100644
--- a/OAuth/i18n/el.json
+++ b/OAuth/i18n/el.json
@@ -3,6 +3,7 @@
"authors": [
"Geraki",
"Indoril",
+ "NikosLikomitros",
"Nikosgranturismogt",
"Protnet"
]
diff --git a/OAuth/i18n/en-gb.json b/OAuth/i18n/en-gb.json
index f77a3d6d..de62264e 100644
--- a/OAuth/i18n/en-gb.json
+++ b/OAuth/i18n/en-gb.json
@@ -1,13 +1,14 @@
{
"@metadata": {
"authors": [
+ "Bjh21",
"Reedy",
"Samwilson",
"Shirayuki"
]
},
"mwoauth-desc": "Allows usage of OAuth 1.0a and OAuth 2.0 for API authorisation",
- "mwoauthconsumerregistration-propose-text": "Developers should use the form below to propose a new OAuth consumer (see the [//www.mediawiki.org/wiki/Extension:OAuth extension documentation] for more details). After submitting this form, you will receive a token that your application will use to identify itself to MediaWiki. An OAuth administrator will need to approve your application before it can be authorised by other users.\n\nA few recommendations and remarks:\n* Try to use as few grants as possible. Avoid grants that are not actually needed now.\n* Versions are of the form \"major.minor.release\" (the last two being optional) and increase as grant changes are needed.\n* Please provide a public RSA key (in PEM format) if possible; otherwise a (less secure) secret token will have to be used.\n* You can use a project ID to restrict the consumer to a single project on this site (use \"*\" for all projects).",
+ "mwoauthconsumerregistration-propose-text": "Developers should use the form below to propose a new OAuth consumer (see the [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth extension documentation] for more details). After submitting this form, you will receive a token that your application will use to identify itself to MediaWiki. An OAuth administrator will need to approve your application before it can be authorised by other users.\n\nA few recommendations and remarks:\n* Try to use as few grants as possible. Avoid grants that are not actually needed now.\n* Versions are of the form \"major.minor.release\" (the last two being optional) and increase as grant changes are needed.\n* Please provide a public RSA key (in PEM format) if possible; otherwise a (less secure) secret token will have to be used.\n* You can use a project ID to restrict the consumer to a single project on this site (use \"*\" for all projects).",
"mwoauthmanagemygrants-text": "This page lists any applications that can use your account. For any such application, the scope of its access is limited by the permissions that you granted to the application when you authorised it to act on your behalf. If you separately authorised an application to access different \"sister\" projects on your behalf, then you will see separate configuration for each such project below.\n\nConnected applications access your account by using the OAuth protocol. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Learn more about connected applications])</span>",
"mwoauthmanagemygrants-renounce": "Deauthorise",
"mwoauthdatastore-access-token-not-found": "No approved grant was found for that authorisation token",
@@ -16,7 +17,13 @@
"mwoauth-invalid-authorization-wrong-wiki": "The authorisation headers in your request are not valid for $1",
"mwoauth-invalid-authorization-invalid-user": "The authorisation headers in your request are for a user that does not exist here",
"mwoauth-invalid-authorization-wrong-user": "The authorisation headers in your request are for a different user",
- "mwoauth-invalid-authorization-not-approved": "The app that you are trying to connect seems to be set up incorrectly. Contact the author of \"$1\" for help.",
"mwoauth-invalid-authorization-blocked-user": "The authorisation headers in your request are for a user who is blocked",
- "mwoauth-acceptance-cancelled": "You have chosen not to allow \"$1\" to access your account. \"$1\" will not work unless you allow it access. You can go back to \"$1\" or [[Special:OAuthManageMyGrants|manage]] your connected apps."
+ "mwoauth-granttype-normal": "Request authorisation for specific permissions.",
+ "mwoauth-oauth2-granttype-auth-code": "Authorisation code",
+ "mwoauth-oauth2-error-server-error": "The authorisation server encountered an unexpected condition that prevented it from fulfilling the request.",
+ "mwoauth-oauth2-error-unauthorized-client": "The client is not authorised to request an authorisation code using this method.",
+ "mwoauth-oauth2-error-access-denied": "The resource owner or authorisation server denied the request.",
+ "mwoauth-oauth2-error-unsupported-response-type": "The authorisation server does not support obtaining an authorisation code using this method.",
+ "mwoauth-oauth2-error-temporarily-unavailable": "The authorisation server is currently unable to handle the request due to a temporary overloading or maintenance of the server.",
+ "mwoauth-login-required-reason": "You need to log into your {{SITENAME}} account to authorise applications to access it."
}
diff --git a/OAuth/i18n/en.json b/OAuth/i18n/en.json
index a591ea01..7d5819e5 100644
--- a/OAuth/i18n/en.json
+++ b/OAuth/i18n/en.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": []
},
+ "abusefilter-edit-builder-vars-oauth-consumer": "OAuth consumer used to perform this change",
"oauth": "OAuth",
"mwoauth-desc": "Allows usage of OAuth 1.0a and OAuth 2.0 for API authorization",
"mwoauth-nosubpage-explanation": "OAuth is a mechanism which allows external applications to identify a {{SITENAME}} user or act on their behalf, after receiving permission from that user.\n\nFor this page to do something, more parameters are required. If you were sent here from an external application, that was probably due to an error in that application; you should contact the author.",
@@ -10,6 +11,7 @@
"mwoauth-missing-field": "Missing value for \"$1\" field",
"mwoauth-invalid-field": "Invalid value provided for \"$1\" field",
"mwoauth-invalid-field-generic": "Invalid value provided",
+ "mwoauth-invalid-field-oauth2GrantTypes": "OAuth 2 apps must specify at least one grant type",
"mwoauth-field-hidden": "(this information is hidden)",
"mwoauth-field-private": "(this information is private)",
"mwoauth-prefs-managegrants": "Connected apps:",
@@ -27,6 +29,8 @@
"mwoauth-consumer-owner-only-help": "Selecting this option will cause the consumer to be automatically approved and accepted for use by $1. It will not be usable by any other user, and the usual authorization flow will not function. Actions taken using this consumer will not be tagged.",
"mwoauth-consumer-description": "Application description:",
"mwoauth-consumer-callbackurl": "OAuth \"callback\" URL:",
+ "mwoauth-consumer-callbackurl-help": "Unlike OAuth 1.0a, this URL is exactly matched",
+ "mwoauth-consumer-callbackurl-warning": "(wildcard port)",
"mwoauth-consumer-callbackisprefix": "Allow consumer to specify a callback in requests and use \"callback\" URL above as a required prefix.",
"mwoauth-consumer-granttypes": "Types of grants being requested:",
"mwoauth-consumer-grantsneeded": "Applicable grants:",
@@ -63,12 +67,15 @@
"mwoauth-consumer-stage-suppressed": "suppressed",
"oauthconsumerregistration": "OAuth consumer registration",
"mwoauthconsumerregistration-navigation": "Navigation:",
- "mwoauthconsumerregistration-propose": "Propose new consumer",
+ "mwoauthconsumerregistration-propose-oauth1a": "Propose new OAuth 1.0a consumer",
+ "mwoauthconsumerregistration-propose-oauth2": "Propose new OAuth 2.0 client",
"mwoauthconsumerregistration-list": "My consumer list",
"mwoauthconsumerregistration-main": "Main",
- "mwoauthconsumerregistration-propose-text": "Developers should use the form below to propose a new OAuth consumer (see the [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth extension documentation] for more details). After submitting this form, you will receive a token that your application will use to identify itself to MediaWiki. An OAuth administrator will need to approve your application before it can be authorized by other users.\n\nA few recommendations and remarks:\n* Try to use as few grants as possible. Avoid grants that are not actually needed now.\n* Versions are of the form \"major.minor.release\" (the last two being optional) and increase as grant changes are needed.\n* Please provide a public RSA key (in PEM format) if possible; otherwise a (less secure) secret token will have to be used.\n* You can use a project ID to restrict the consumer to a single project on this site (use \"*\" for all projects).",
+ "mwoauthconsumerregistration-propose-text": "You can:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|Propose an OAuth 1.0a consumer]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Propose an OAuth 2.0 client]].",
+ "mwoauthconsumerregistration-propose-text-oauth1a": "Developers should use the form below to propose a new OAuth 1.0a consumer (see the [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth extension documentation] for more details). After submitting this form, you will receive a token that your application will use to identify itself to MediaWiki. An OAuth administrator will need to approve your application before it can be authorized by other users.\n\nA few recommendations and remarks:\n* Try to use as few grants as possible. Avoid grants that are not actually needed now.\n* Versions are of the form \"major.minor.release\" (the last two being optional) and increase as grant changes are needed.\n* Please provide a public RSA key (in PEM format) if possible; otherwise a (less secure) secret token will have to be used.\n* You can use a project ID to restrict the consumer to a single project on this site (use \"*\" for all projects).",
+ "mwoauthconsumerregistration-propose-text-oauth2": "Developers should use the form below to request a token for a new OAuth 2.0 client (see the [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth extension documentation] for more details). After submitting this form, you will receive a token that your application will use to identify itself to MediaWiki. An OAuth administrator will need to approve your application before it can be authorized by other users.\n\nA few recommendations and remarks:\n* Try to use as few scopes as possible. Avoid scopes that are not actually needed now.\n* Versions are of the form \"major.minor.release\" (the last two being optional) and increase as scope changes are needed.\n* You can use a project ID to restrict the consumer to a single project on this site (use \"*\" for all projects).",
"mwoauthconsumerregistration-update-text": "Use the form below to update aspects of an OAuth consumer you control.\n\nAll values here will overwrite any previous ones. Do not leave blank fields unless you intend to clear those values.",
- "mwoauthconsumerregistration-maintext": "This page is for letting developers propose and update OAuth consumer applications in this site's registry.\n\nFrom here, you can:\n* [[Special:OAuthConsumerRegistration/propose|Request a token for a new consumer]].\n* [[Special:OAuthConsumerRegistration/list|Manage your existing consumers]].\n\nFor more information about OAuth, please see the [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth extension documentation].",
+ "mwoauthconsumerregistration-maintext": "This page is for letting developers propose and update OAuth consumer applications in this site's registry.\n\nFrom here, you can:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|Request a token for a new OAuth 1.0a consumer]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Request a token for a new OAuth 2.0 client]].\n* [[Special:OAuthConsumerRegistration/list|Manage your existing consumers]].\n\nFor more information about OAuth, please see the [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth extension documentation].",
"mwoauthconsumerregistration-propose-legend": "New OAuth consumer application",
"mwoauthconsumerregistration-update-legend": "Update OAuth consumer application",
"mwoauthconsumerregistration-propose-submit": "Propose consumer",
@@ -247,6 +254,7 @@
"mwoauth-form-button-approve": "Allow",
"mwoauth-form-button-cancel": "Cancel",
"mwoauth-error": "Application Connection Error",
+ "mwoauth-error-missing-callback-url-non-owner": "callback_url is required for non-owner-only clients",
"mwoauth-grants-heading": "Requested permissions:",
"mwoauth-grants-nogrants": "The application has not requested any permissions.",
"mwoauth-acceptance-cancelled": "You have chosen not to allow \"$1\" to access your account. \"$1\" will not work unless you allow it access. You can go back to \"$1\" or [[Special:OAuthManageMyGrants|manage]] your connected apps.",
@@ -326,5 +334,9 @@
"mwoauth-consumer-access-no-user": "Consumer approval must be bound to a valid user, user with ID 0 given",
"mwoauth-login-required-reason": "You need to log into your {{SITENAME}} account to authorize applications to access it.",
"mwoauthconsumer-consumer-view": "View this consumer",
- "mwoauthconsumer-application-view": "View this application"
+ "mwoauthconsumer-application-view": "View this application",
+ "grant-oauthmanageownclient": "Manage your OAuth clients",
+ "mwoauth-consumer-user-mismatch": "You cannot perform actions on clients that do not belong to you",
+ "mwoauth-consumer-deleted-error": "You cannot perform actions on deleted clients",
+ "mwoauth-consumer-submit-error": "An error occurred while saving a consumer"
}
diff --git a/OAuth/i18n/es.json b/OAuth/i18n/es.json
index 16ebce29..11e00de4 100644
--- a/OAuth/i18n/es.json
+++ b/OAuth/i18n/es.json
@@ -14,6 +14,7 @@
"MarcoAurelio",
"Matiia",
"Ovruni",
+ "Rodney Araujo",
"Ryo567",
"Tiberius1701"
]
@@ -39,6 +40,7 @@
"mwoauth-consumer-owner-only": "Este consumidor es exclusivo para $1.",
"mwoauth-consumer-description": "Descripción de la aplicación:",
"mwoauth-consumer-callbackurl": "URL de devolución de llamada de OAuth:",
+ "mwoauth-consumer-callbackurl-warning": "(puerto comodín)",
"mwoauth-consumer-granttypes": "Tipo de subvenciones que se solicitan:",
"mwoauth-consumer-wiki-thiswiki": "Proyecto actual ($1)",
"mwoauth-consumer-restrictions": "Restricciones de uso:",
@@ -63,7 +65,6 @@
"mwoauth-consumer-stage-disabled": "desactivado",
"mwoauth-consumer-stage-suppressed": "suprimido",
"mwoauthconsumerregistration-navigation": "Navegación:",
- "mwoauthconsumerregistration-propose": "Proponer nuevo consumidor",
"mwoauthconsumerregistration-list": "Mi lista de consumidores",
"mwoauthconsumerregistration-main": "Principal",
"mwoauthconsumerregistration-propose-submit": "Proponer consumidor",
@@ -137,6 +138,8 @@
"mwoauthlistconsumers-status-disabled": "desactivado",
"mwoauthlistconsumers-status-rejected": "rechazado",
"mwoauthlistconsumers-status-expired": "caducado",
+ "mwoauthlistconsumers-navigation": "Navegación:",
+ "mwoauthlistconsumers-grants-link": "Gestionar aplicaciones conectadas",
"mwoauthlistconsumers-rclink": "Cambios recientes por esta aplicación",
"oauthmanagemygrants": "Gestionar aplicaciones conectadas",
"mwoauthmanagemygrants-text": "Esta página muestra las aplicaciones que pueden utilizar tu cuenta. Para cualquier aplicación, el alcance de su acceso está limitado por los permisos que se le otorgaron al momento de autorizarla. Si has autorizado una aplicación para que acceda a varios proyectos en tu nombre, verás ajustes separados a continuación por cada uno de los proyectos.\n\nLas aplicaciones conectadas acceden a tu cuenta mediante el protocolo OAuth. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Más información sobre las aplicaciones conectadas])</span>",
diff --git a/OAuth/i18n/et.json b/OAuth/i18n/et.json
index 09c24ff1..fdc749b9 100644
--- a/OAuth/i18n/et.json
+++ b/OAuth/i18n/et.json
@@ -2,10 +2,13 @@
"@metadata": {
"authors": [
"Boxmein",
+ "Cumbril",
"Pikne"
]
},
+ "abusefilter-edit-builder-vars-oauth-consumer": "OAuthi tarvitus, mida muudatuse tegemisel kasutatakse",
"mwoauth-desc": "Võimaldab kasutada OAuthi versioone 1.0a ja 2.0 API-volitamiseks.",
+ "mwoauth-nosubpage-explanation": "OAuth on mehhanism, mis võimaldab välistel rakendustel {{GRAMMAR:genitive|{{SITENAME}}}} kasutaja identida või toimida tema nimel, kui see kasutaja annab selleks loa.\n\nSelleks et see lehekülg midagi teeks, on vaja rohkem parameetreid. Kui väline rakendus suunas sind siia, siis on selles rakenduses tõenäoliselt viga. Peaksid võtma ühendust rakenduse autoriga.",
"mwoauth-prefs-managegrants": "Ühendatud rakendused:",
"mwoauth-prefs-managegrantslink": "Halda {{PLURAL:$1|üht ühendatud rakendust|$1 ühendatud rakendust|0=ühendatud rakendusi}}",
"mwoauth-consumer-allwikis": "Kõigis selle võrgukoha projektides",
@@ -19,8 +22,9 @@
"mwoauth-consumer-owner-only": "Seda tarvitust kasutab ainult $1.",
"mwoauth-consumer-owner-only-help": "Selle valiku korral kiidetakse tarvitus automaatselt heaks ja selle kasutamine lubatakse kasutajale $1. Teised kasutajad seda kasutada ei saa ja harilik volitamisvoog ei toimi. Selle tarvitusega sooritatud toiminguid ei märgistata.",
"mwoauth-consumer-description": "Rakenduse kirjeldus:",
- "mwoauth-consumer-callbackurl": "OAuthi tagasisuunamis-URL:",
- "mwoauth-consumer-callbackisprefix": "Luba määrata tarvituses tagasihelistamine ja kasuta nõutava eesliitena ülaltoodud tagasihelistamis-URL-i.",
+ "mwoauth-consumer-callbackurl": "OAuthi tagasiaadress:",
+ "mwoauth-consumer-callbackurl-help": "Erinevalt OAuth 1.0a-st on siin tegu täpse URL-iga.",
+ "mwoauth-consumer-callbackisprefix": "Luba määrata tarvituse päringutes tagasikutse ja kasuta kohustusliku eesliitena ülaltoodud tagasiaadressi.",
"mwoauth-consumer-granttypes": "Taotlen järgmist tüüpi volitusi:",
"mwoauth-consumer-grantsneeded": "Rakendatavad volitused:",
"mwoauth-consumer-required-grant": "Tarvituse suhtes rakendatav",
@@ -34,29 +38,33 @@
"mwoauth-consumer-developer-agreement": "Selle rakenduse esitamisel oled teadlik, et meil on õigus keelata sinu rakendus, õigus selle juurdepääsu sellele saidile piirata või juurdepääs eemaldada ning õigus toimida mis tahes muul meie meelest sobival moel, kui meile tundub, et sina või sinu rakendus rikuvad mis tahes reegleid, juhtnööre või selle saidi juhtpõhimõtteid. Me võime selle rakenduse staatust igal ajal oma äranägemise järgi ja ette teatamata muuta. Kui jätkad OAuthi kasutamist, siis tuleb sul neid muudatusi tunnistada.",
"mwoauth-invalid-access-token": "Antud võtmega juurdepääsutõend puudub.",
"mwoauth-consumer-grantshelp": "Iga volitus võimaldab juurdepääsu loetletud õigustele, mis on kasutajakontol juba olemas. Lisateavet leiad [[Special:ListGrants|volituste tabelist]].",
- "mwoauth-consumer-stage-proposed": "ettepanek",
+ "mwoauth-consumer-stage-proposed": "esitatud",
"mwoauth-consumer-stage-rejected": "tagasilükatud",
"mwoauth-consumer-stage-expired": "iganenud",
"mwoauth-consumer-stage-approved": "kinnitatud",
"mwoauth-consumer-stage-disabled": "keelatud",
"oauthconsumerregistration": "OAuthi tarvituse registreerimine",
"mwoauthconsumerregistration-navigation": "Navigeerimine:",
- "mwoauthconsumerregistration-propose": "uue tarvituse ettepanek",
+ "mwoauthconsumerregistration-propose-oauth1a": "esita uus OAuth 1.0a tarvitus",
+ "mwoauthconsumerregistration-propose-oauth2": "esita uus OAuth 2.0 klient",
"mwoauthconsumerregistration-list": "minu tarvituste loend",
"mwoauthconsumerregistration-main": "pealeht",
- "mwoauthconsumerregistration-propose-text": "Uue OAuthi tarvituse kohta ettepaneku tegemiseks peaks arendajad kasutama allpool olevat vormi (loe üksikasju [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth tarkvaralisa dokumentatsioonist]). Pärast selle vormi esitamist saad tõendi, mida sinu rakendus kasutab MediaWiki tarkvaras identimiseks. Enne kui teised kasutajad saavad sinu rakendust volitamiseks kasutada, peab OAuthi administraator selle heaks kiitma.\n\nMõned soovitused ja märkused:\n* Proovi kasutada nii vähe volitusi kui võimalik. Väldi volitusi, mida pole tegelikult vaja.\n* Versioonid on kujul \"peaversioon.kõrvalversioon.väljaanne\" (viimased kaks on valikulised). Need kasvavad, kui volitusi on vaja muuta.\n* Palun too ära avalik RSA-võti (PEM-vormingus), kui võimalik. Vastasel juhul tuleb kasutada salajast tõendit, mis on vähem turvaline.\n* Saad kasutada projekti identifikaatorit, et piirata tarvitus selle saidi ühele projektile (kõigi projektide jaoks kirjuta \"*\").",
- "mwoauthconsumerregistration-maintext": "See lehekülg võimaldab arendajatel teha ettepanekuid OAuthi tarvitavate rakenduste registreerimiseks siin saidil. Samuti saavad arendajad siin leheküljel registreeritud rakendusi uuendada.\n\nSaad siin\n* [[Special:OAuthConsumerRegistration/propose|taotleda luba uuele tarvitusele]] ja\n* [[Special:OAuthConsumerRegistration/list|hallata enda olemasolevaid tarvitusi]].\n\nLisateavet OAuthi kohta leiad [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth tarkvaralisa dokumentatsioonist].",
+ "mwoauthconsumerregistration-propose-text": "Saad\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|esitada OAuth 1.0a tarvituse]] või\n* [[Special:OAuthConsumerRegistration/propose/oauth2|esitada OAuth 2.0 kliendi]].",
+ "mwoauthconsumerregistration-propose-text-oauth1a": "Uue OAuth 1.0a tarvituse kohta ettepaneku tegemiseks peaks arendajad kasutama allpool olevat vormi (loe üksikasju [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth tarkvaralisa dokumentatsioonist]). Pärast selle vormi esitamist saad tõendi, mida sinu rakendus kasutab MediaWiki tarkvaras identimiseks. Enne kui teised kasutajad saavad sinu rakendust volitamiseks kasutada, peab OAuthi administraator selle heaks kiitma.\n\nMõned soovitused ja märkused:\n* Proovi kasutada nii vähe volitusi kui võimalik. Väldi volitusi, mida pole tegelikult vaja.\n* Versioonid on kujul \"peaversioon.kõrvalversioon.väljaanne\" (viimased kaks on valikulised). Need suurenevad, kui volitusi on vaja muuta.\n* Palun too ära avalik RSA-võti (PEM-vormingus), kui võimalik. Vastasel juhul tuleb kasutada salajast tõendit, mis on vähem turvaline.\n* Saad kasutada projekti identifikaatorit, et piirata tarvitus selle saidi ühele projektile (kõigi projektide jaoks kirjuta \"*\").",
+ "mwoauthconsumerregistration-propose-text-oauth2": "Uue OAuth 2.0 kliendi kohta ettepaneku tegemiseks peaks arendajad kasutama allpool olevat vormi (loe üksikasju [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth tarkvaralisa dokumentatsioonist]). Pärast selle vormi esitamist saad tõendi, mida sinu rakendus kasutab MediaWiki tarkvaras identimiseks. Enne kui teised kasutajad saavad sinu rakendust volitamiseks kasutada, peab OAuthi administraator selle heaks kiitma.\n\nMõned soovitused ja märkused:\n* Proovi kasutada nii vähe ulatusi kui võimalik. Väldi ulatusi, mida pole tegelikult vaja.\n* Versioonid on kujul \"peaversioon.kõrvalversioon.väljaanne\" (viimased kaks on valikulised). Need suurenevad, kui ulatusi on vaja muuta.\n* Saad kasutada projekti identifikaatorit, et piirata tarvitus selle saidi ühele projektile (kõigi projektide jaoks kirjuta \"*\").",
+ "mwoauthconsumerregistration-maintext": "See lehekülg võimaldab arendajatel teha ettepanekuid OAuthi tarvitavate rakenduste registreerimiseks siin saidil. Samuti saavad arendajad siin leheküljel registreeritud rakendusi uuendada.\n\nSaad siin\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|taotleda luba uuele OAuth 1.0a tarvitusele]],\n* [[Special:OAuthConsumerRegistration/propose/oauth2|taotleda luba uuele OAuth 2.0 kliendile]] või\n* [[Special:OAuthConsumerRegistration/list|hallata enda olemasolevaid tarvitusi]].\n\nLisateavet OAuthi kohta leiad [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth tarkvaralisa dokumentatsioonist].",
"mwoauthconsumerregistration-propose-legend": "Uus OAuthi tarvitav rakendus",
"mwoauthconsumerregistration-update-legend": "OAuthi tarvitava rakenduse uuendamine",
- "mwoauthconsumerregistration-propose-submit": "Tee tarvituse ettepanek",
+ "mwoauthconsumerregistration-propose-submit": "Esita tarvitus",
"mwoauthconsumerregistration-update-submit": "Uuenda tarvitust",
"mwoauthconsumerregistration-none": "Sa ei halda ühtegi OAuthi tarvitust.",
"oauthmanageconsumers": "OAuthi tarvituste haldamine",
"mwoauthmanageconsumers-type": "Järjekorrad:",
- "mwoauthmanageconsumers-showproposed": "ettepaneku staatuses taotlused",
+ "mwoauthmanageconsumers-showproposed": "esitatud taotlused",
"mwoauthmanageconsumers-showrejected": "tagasi lükatud taotlused",
"mwoauthmanageconsumers-showexpired": "iganenud taotlused",
"mwoauthmanageconsumers-main": "pealeht",
+ "mwoauthmanageconsumers-review": "vaata üle ja halda",
"mwoauthmanageconsumers-confirm-legend": "OAuthi tarvituse haldamine",
"mwoauthmanageconsumers-action": "Staatuse muutmine:",
"mwoauthmanageconsumers-approve": "Heaks kiidetud",
@@ -70,17 +78,21 @@
"mwoauthlistconsumers-user": "Väljaandja",
"mwoauthlistconsumers-description": "Kirjeldus",
"mwoauthlistconsumers-wiki": "Rakendamise projekt",
- "mwoauthlistconsumers-callbackurl": "Rakenduse internetiaadress",
- "mwoauthlistconsumers-callbackisprefix": "Luba määrata tarvituses tagasihelistamine ja kasuta nõutava eesliitena ülaltoodud tagasihelistamis-URL-i.",
+ "mwoauthlistconsumers-callbackurl": "OAuthi tagasiaadress",
+ "mwoauthlistconsumers-callbackisprefix": "Luba määrata tarvituse päringutes tagasikutse ja kasuta kohustusliku eesliitena ülaltoodud tagasiaadressi.",
"mwoauthlistconsumers-grants": "Rakendatavad volitused",
"mwoauthlistconsumers-basicgrantsonly": "(ainult põhijuurdepääs)",
"mwoauthlistconsumers-status": "Olek",
"mwoauth-consumer-stage-any": "ükskõik",
- "mwoauthlistconsumers-status-proposed": "ettepanek",
+ "mwoauthlistconsumers-status-proposed": "esitatud",
"mwoauthlistconsumers-status-approved": "kinnitatud",
"mwoauthlistconsumers-status-disabled": "keelatud",
"mwoauthlistconsumers-status-rejected": "tagasilükatud",
"mwoauthlistconsumers-status-expired": "iganenud",
+ "mwoauthlistconsumers-navigation": "Navigeerimine:",
+ "mwoauthlistconsumers-update-link": "uuenda tarvitust",
+ "mwoauthlistconsumers-manage-link": "halda tarvitust",
+ "mwoauthlistconsumers-grants-link": "halda volitusi",
"mwoauthlistconsumers-rclink": "Selle rakendusega tehtud viimased muudatused",
"oauthmanagemygrants": "Ühendatud rakenduste haldamine",
"mwoauthmanagemygrants-text": "Siin leheküljel on loetletud kõik rakendused, mida ühenduses sinu kontoga saab kasutada. Kõigi nende rakendamise ulatus on piiratud volitustega, mille rakendusega sidusid, kui nõustusid seda enda nimel kasutama. Kui volitasid rakenduse enda nimel kasutuse eri sõsarprojektides eraldi, näed allpool iga projekti jaoks eraldi häälestust.\n\nRakendused kasutavad ühenduseks sinu kontoga OAuthi protokolli. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Lisateave ühendatud rakenduste kohta])</span>",
@@ -102,9 +114,10 @@
"mwoauthmanagemygrants-success-update": "Sinu eelistused selle rakenduse jaoks on uuendatud.",
"mwoauthmanagemygrants-success-renounce": "Selle rakenduse juurdepääs sinu kontole on tühistatud.",
"mwoauthmanagemygrants-basic-tooltip": "Miks ma ei saa seda volitust uuendada? Sellega on ühendatud rakendusele antud põhilised õigused, mida on vaja, et rakendus õigesti toimiks. Kui sa ei taha, et ühendatud rakendusel oleks need õigused, siis peaksid tühistama selle rakenduse juurdepääsu.",
+ "mwoauthmanagemygrants-authonly-tooltip": "Miks ma ei saa seda volitust uuendada? Kui sa ei taha, et ühendatud rakendusel oleks need õigused, siis peaksid tühistama selle rakenduse juurdepääsu.",
"mwoauthmanagemygrants-editslink": "{{GENDER:$1|Sinu}} muudatused selle rakendusega",
"mwoauthmanagemygrants-actionslink": "{{GENDER:$1|Sinu}} toimingud selle rakendusega",
- "logentry-mwoauthconsumer-propose": "$1 {{GENDER:$2|tegi ettepaneku}} OAuthi tarvituse kohta (tarvituse võti $4)",
+ "logentry-mwoauthconsumer-propose": "$1 {{GENDER:$2|esitas}} OAuthi tarvituse (tarvituse võti $4)",
"logentry-mwoauthconsumer-update": "$1 {{GENDER:$2|uuendas}} OAuthi tarvitust (tarvituse võti $4)",
"logentry-mwoauthconsumer-approve": "$1 {{GENDER:$2|kiitis heaks}} kasutaja $3 OAuthi tarvituse (tarvituse võti $4)",
"logentry-mwoauthconsumer-reject": "$1 {{GENDER:$2|lükkas tagasi}} kasutaja $3 OAuthi tarvituse (tarvituse võti $4)",
@@ -144,13 +157,13 @@
"echo-pref-tooltip-oauth-owner": "Teavita mind sündmustest, mis on seotud OAuthi rakendustega, mille olen koostanud.",
"echo-category-title-oauth-admin": "OAuthi haldus",
"echo-pref-tooltip-oauth-admin": "Teavita mind sündmustest, mis on seotud OAuthi rakenduste ülevaatusega.",
- "notification-oauth-app-propose-title": "$1 {{GENDER:$1|tegi ettepaneku}} uue OAuthi rakenduse kohta: $2",
+ "notification-oauth-app-propose-title": "$1 {{GENDER:$1|esitas}} uue OAuthi rakenduse: $2",
"notification-oauth-app-update-title": "$1 {{GENDER:$1|uuendas}} OAuthi rakendust $2",
"notification-oauth-app-approve-title": "$1 {{GENDER:$1|kiitis heaks}} {{GENDER:$3|sinu}} OAuthi rakenduse ($2)",
"notification-oauth-app-reject-title": "$1 {{GENDER:$1|lükkas tagasi}} {{GENDER:$3|sinu}} OAuthi rakenduse ($2)",
"notification-oauth-app-disable-title": "$1 {{GENDER:$1|keelas}} {{GENDER:$3|sinu}} OAuthi rakenduse ($2)",
"notification-oauth-app-reenable-title": "$1 {{GENDER:$1|lubas uuesti}} {{GENDER:$3|sinu}} OAuthi rakenduse ($2)",
- "notification-oauth-app-propose-subject": "$1 {{GENDER:$1|tegi ettepaneku}} uue OAuthi rakenduse kohta saidil {{SITENAME}}",
+ "notification-oauth-app-propose-subject": "$1 {{GENDER:$1|esitas}} uue OAuthi rakenduse saidil {{SITENAME}}",
"notification-oauth-app-update-subject": "$1 {{GENDER:$1|uuendas}} OAuthi rakendust saidil {{SITENAME}}",
"notification-oauth-app-approve-subject": "$1 {{GENDER:$1|kiitis heaks}} {{GENDER:$3|sinu}} OAuthi rakenduse saidil {{SITENAME}}",
"notification-oauth-app-reject-subject": "$1 {{GENDER:$1|lükkas tagasi}} {{GENDER:$3|sinu}} OAuthi rakenduse saidil {{SITENAME}}",
@@ -164,5 +177,13 @@
"notification-oauth-app-reenable-primary-link": "Vaata rakendust",
"notification-oauth-app-body": "Põhjus: $1",
"mwoauth-oauth-version": "OAuthi protokolli versioon:",
- "mwoauthconsumer-application-view": "vaata seda rakendust"
+ "mwoauth-oauth2-is-confidential": "Klient on konfidentsiaalne",
+ "mwoauth-oauth2-is-confidential-help": "Konfidentsiaalne klient on rakendus, mis võimaldab hoida kliendi parooli maailma eest salajas. Mittekonfidentsiaalsed kliendid on vähem turvalised.",
+ "mwoauth-oauth2-granttypes": "Lubatud OAuth2 volituste tüübid",
+ "mwoauth-oauth2-granttype-auth-code": "Volitamiskood",
+ "mwoauth-oauth2-granttype-refresh-token": "Uuendamisluba",
+ "mwoauth-oauth2-granttype-client-credentials": "Kliendi autentimisandmed",
+ "mwoauth-login-required-reason": "Rakenduse juurdepääsu volitamiseks tuleb saidi {{SITENAME}} kontoga sisse logida.",
+ "mwoauthconsumer-application-view": "vaata seda rakendust",
+ "grant-oauthmanageownclient": "Enda OAuthi-klientide haldamine"
}
diff --git a/OAuth/i18n/fa.json b/OAuth/i18n/fa.json
index fdf54256..5eb17210 100644
--- a/OAuth/i18n/fa.json
+++ b/OAuth/i18n/fa.json
@@ -4,12 +4,14 @@
"Ahmad252",
"Alirezaaa",
"Armin1392",
+ "Beginneruser",
"Calak",
"Dalba",
"Ebraminio",
"FarsiNevis",
"Hosseinblue",
"Huji",
+ "Jeeputer",
"Ladsgroup",
"Mardetanha",
"Mjbmr",
@@ -19,8 +21,7 @@
"Taha"
]
},
- "oauth": "OAuth",
- "mwoauth-desc": "اجازهٔ استفاده از رابط برنامه‌نویسی هویت‌سنجی OAuth ۱.۰ را می‌دهد",
+ "mwoauth-desc": "اجازهٔ استفاده از رابط برنامه‌نویسی هویت‌سنجی OAuth ۱٫۰آ و OAuth ۲٫۰ را می‌دهد",
"mwoauth-verified": "این برنامه اجازهٔ دسترسی به مدیاویکی از طرف شما را دارد.\n\nبرای تکمیل این فرایند، مقدار تأیید را برای برنامه فراهم کنید: '''$1'''",
"mwoauth-db-readonly": "دیتابیس OAuth موقتا قفل شده‌است. لطفا چند دقیقه دیگر تلاش کنید.",
"mwoauth-missing-field": "مقدار ناموجود برای مورد \"$1\"",
@@ -51,7 +52,7 @@
"mwoauth-consumer-accesstoken": "رمز دسترسی:",
"mwoauth-consumer-reason": "دلیل:",
"mwoauth-consumer-email-unconfirmed": "نشانی ایمیل شما هنوز تأیید نشده است.",
- "mwoauth-consumer-email-mismatched": "آدرس ایمیل ارائه شده باید با حساب کاربریتان مطابقت داشته باشد.",
+ "mwoauth-consumer-email-mismatched": "آدرس ایمیل ارائه شده باید با حسابتان مطابقت داشته باشد.",
"mwoauth-consumer-alreadyexists": "مصرف‌کنندگان با این ترکیب ناشر/نام/نسخه در حال حاضر وجود دارد",
"mwoauth-consumer-alreadyexistsversion": "مصرف‌کننده‌ای با این ترکیب نام/منتشرکننده با نسخه‌ای برابر یا بالاتر در حال حاضر موجود است («$1»)",
"mwoauth-consumer-not-accepted": "اطلاعات یک درخواست معلق مصرف‌کننده را نمی‌توان روزآمد کرد",
@@ -63,7 +64,7 @@
"mwoauth-invalid-access-token": "نشان عدم دسترسی با کلید داده موجود است.",
"mwoauth-invalid-access-wrongwiki": "مصرف‌کننده فقط می‌تواند در پروژه «$1» استفاده شود.",
"mwoauth-consumer-conflict": "یک نفر خصوصیات این مصرف‌کننده را از زمانی که شما دیدید، تغییر داده است. لطفاً دوباره تلاش کنید. شاید لازم باشد سیاهه تغییرات را مشاهده کنید.",
- "mwoauth-consumer-grantshelp": "هر اعطا امکان دسترسی به فهرست دسترسی‌های کاربران را می دهد. برای اطلاعات بیشتر [[Special:ListGrants|جدول اعطاها]] را مشاهده کنید.",
+ "mwoauth-consumer-grantshelp": "هر اعطا امکان امتیاز به فهرست امتیازات یک حساب کاربری را می دهد. برای اطلاعات بیشتر [[Special:ListGrants|جدول اعطاها]] را مشاهده کنید.",
"mwoauth-consumer-stage-proposed": "پیشنهاد شده",
"mwoauth-consumer-stage-rejected": "رد شده",
"mwoauth-consumer-stage-expired": "منقضی شده",
@@ -72,11 +73,10 @@
"mwoauth-consumer-stage-suppressed": "توقیف شد",
"oauthconsumerregistration": "ثبت نام OAuth مصرف‌کننده",
"mwoauthconsumerregistration-navigation": "ناوبری:",
- "mwoauthconsumerregistration-propose": "پیشنهاد مصرف کننده تازه",
"mwoauthconsumerregistration-list": "فهرست مصرف‌کننده من",
"mwoauthconsumerregistration-main": "اصلی",
"mwoauthconsumerregistration-propose-text": "توسعه‌دهندگان باید از فرم زیر برای پاسخ به یک مصرف‌کنندهٔ جدید اُآت استفاده کنند (مشاهدهٔ [//www.mediawiki.org/wiki/Extension:OAuth extension documentation] برای جزئیات بیشتر). پس از ارائهٔ این فرم، شما نشانه‌ای دریافت خواهید کرد که درخواست شما برای شناسایی خود به مدیاویکی مورد استفاده قرار خواهد گرفت. سرپرست اُآت نیاز به تأیید درخواست شما دارد قبل از اینکه بتواند توسط کاربران دیگر تصویب شود.\nچند توصیه و اظهار:\n*سعی به استفاده ممکن به اندازهٔ کمک‌های مالی اندک. اجتناب از کمک‌هایی که اکنون در حقیقت مورد نیاز نیستند.\n*نسخه‌ها فرم \"اصلی،فرعی،آزاد\" هستند (آخرین دو اختیاری بودن) و افزایش به اندازهٔ تغییرات کمک مورد نیاز هستند.\n*لطفاً یک کلید عمومی آر‌اس‌ای (در فرمت پی‌ای‌ام) اگر ممکن است ارائه کنید؛ در غیر این‌ صورت یک نشانهٔ سری (امنیت کمتر) باید مورد استفاده قرار گیرد.\n*شما می‌توانید از یک شناسهٔ پروژه برای محدود کردن مصرف‌کننده به یک پروژه‌ٔ تک در این سایت استفاده کنید (برای همهٔ پروژه‌ها از \"*\" استفاده کنید).",
- "mwoauthconsumerregistration-update-text": "فرم زیر را برای بروزرسانی جوانب مصرف‌کنندگان OAuth که شما کنترل می‌کنید، استفاده کنید.\n\nهمه مقادیر برروی مقادیر گذشته ذخیره می‌شوند. هیچ مقداری را خالی نگذارید مگر اینکه قصد پاک کردن آن مقادیر را داشته باشید.",
+ "mwoauthconsumerregistration-update-text": "فرم زیر را برای به‌روزرسانی جوانب مصرف‌کنندگان OAuth که شما کنترل می‌کنید، استفاده کنید.\n\nهمه مقادیر برروی مقادیر گذشته ذخیره می‌شوند. هیچ مقداری را خالی نگذارید مگر اینکه قصد پاک کردن آن مقادیر را داشته باشید.",
"mwoauthconsumerregistration-maintext": "این صفحه برای اجازه‌دادن به اهداف توسعه‌دهندگان است و به‌روز رسانی درخواست‌های مصرف‌کنندهٔ OAuth در ثبت این وب‌گاه است.\nاز اینجا، شما می‌توانید:\n* [[Special:OAuthConsumerRegistration/propose|درخوایت یک نشانهٔ برای مصرف‌کنندهٔ جدید]].\n* [[Special:OAuthConsumerRegistration/list|مدیریت مصرف‌کنندگان موجود خود]].\nبرای اطلاعات بیشتر دربارهٔ‌ OAuth، لطفاً [//www.mediawiki.org/wiki/Extension:OAuth extension documentation] را مشاهده کنید.",
"mwoauthconsumerregistration-propose-legend": "برنامهٔ مصرف‌کننده تازه OAuth",
"mwoauthconsumerregistration-update-legend": "روزآمدسازی برنامهٔ مصرف‌کنندهٔ OAuth",
@@ -163,11 +163,12 @@
"mwoauthlistconsumers-status-disabled": "غیرفعال شد",
"mwoauthlistconsumers-status-rejected": "رد شده",
"mwoauthlistconsumers-status-expired": "منقضی شده",
+ "mwoauthlistconsumers-rclink": "تغییرات اخیر با استفاده از این نرم‌افزار",
"oauthmanagemygrants": "مدیریت برنامه‌های کاربردی متصل",
"mwoauthmanagemygrants-text": "در این صفحه فهرست همه برنامه‌های کاربردیی که از کاربری شما می‌تواند برای ویرایش استفاده کند فهرست شده‌است. هدف از اجازه‌ای که به برنامه داده‌اید که به جای شما ویرایش کند، محدودسازی دامنه عملکرد آن برنامه به جای شما است. اگر به صورت جداگانه برای پروژه‌های خواهر دسترسی به برنامه‌های کاربردی داده‌اید، تنظیمات دسترسی‌ها را به صورت مجزا در پائین مشاهده خواهید کرد.\n\n\nارتباط با کاربری شما بر پایه پروتکل OAuth است.<span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth یادگیری بیشتر در مورد برنامه های کاربردی متصل])</span>",
"mwoauthmanagemygrants-navigation": "ناوبری:",
"mwoauthmanagemygrants-showlist": "فهرست برنامه‌های متصل",
- "mwoauthmanagemygrants-none": "هیچ برنامه‌ای به حسابتان متصل نیست.",
+ "mwoauthmanagemygrants-none": "هیچ برنامۀ متصل به حسابتان وجود ندارد.",
"mwoauthmanagemygrants-user": "ناشر:",
"mwoauthmanagemygrants-description": "توضیحات",
"mwoauthmanagemygrants-wikiallowed": "مجاز در پروژه:",
@@ -180,13 +181,15 @@
"mwoauthmanagemygrants-update-text": "استفاده از فرم زیر برای تغییر مجوز‌های اعطا شده به برنامه برای عمل از طرف شما.",
"mwoauthmanagemygrants-revoke-text": "استفاده از فرم زیر برای لغو دسترسی برای درخواست به عمل از طرف شما.",
"mwoauthmanagemygrants-confirm-legend": "مدیریت برنامه‌های متصل",
- "mwoauthmanagemygrants-update": "اعطای بارگذاری",
+ "mwoauthmanagemygrants-update": "به‌روزرسانی اعطا",
"mwoauthmanagemygrants-renounce": "برداشتن ثبت",
"mwoauthmanagemygrants-action": "تغییر وضعیت:",
"mwoauthmanagemygrants-confirm-submit": "به‌روزرسانی وضعیت رمز دسترسی",
"mwoauthmanagemygrants-success-update": "ترجیحات شما در خصوص این برنامهٔ کاربردی، روزآمد شد.",
"mwoauthmanagemygrants-success-renounce": "رمز دسترسی برای این مصرف‌کننده حذف شد.",
"mwoauthmanagemygrants-basic-tooltip": "چرا من نمی‌توانم این کمک را به روز کنم؟ این کمک به درخواست متصل شما مجوزهای اساسی می‌دهد که نیاز به عملکرد مناسب می‌دهد. اگز شما این درخواست متصل را برای داشتن این حقوق نمی‌خواهید، شما باید دسترسی برنامه را لغو کنید.",
+ "mwoauthmanagemygrants-editslink": "ویرایش‌های {{GENDER:$1|شما}} با استفاده از این نرم‌افزار",
+ "mwoauthmanagemygrants-actionslink": "کنش‌های {{GENDER:$1|شما}} با استفاده از این نرم‌افزار",
"logentry-mwoauthconsumer-propose": "$1 {{GENDER:$2|پیشنهاد }} یک مصرف‌کننده OAuth داد (کد مصرف‌کننده $4)",
"logentry-mwoauthconsumer-update": "$1 یک مصرف‌کنندهٔ OAuth (با کد مصرف‌کنندهٔ $4) را روزآمد {{GENDER:$2|کرد}}",
"logentry-mwoauthconsumer-approve": "$1 یک مصرف‌کننده OAuth برای $3 {{GENDER:$2|تأیید کرد}} (کد مصرف‌کننده $4)",
@@ -219,7 +222,7 @@
"mwoauth-invalid-authorization-blocked-user": "سرایندهای اصالت‌سنجیِ درخواست شما متعلق به کاربری بسته‌شده است",
"mwoauth-form-description-allwikis": "درود $1،\n\n'''$2''' خواهان انجام این اعمال از طرف شما در همهٔ پروژه‌های این وبگاه است:\n\n$4",
"mwoauth-form-description-onewiki": "درود $1،\n\n'''$2''' خواهان انجام این اعمال از طرف شما در ''$4'' است:\n\n$5",
- "mwoauth-form-description-allwikis-nogrants": "درود $1،\n\n'''$2''' خواهان اخذ دسترسی اولیه‌ای از طرف شما در همهٔ پروژه‌های این وبگاه است.",
+ "mwoauth-form-description-allwikis-nogrants": "درود $1،\n\nبه منطور تکمیل درخواست شما، '''$2''' خواهان اخذ دسترسی اولیه‌ای از طرف شما در همهٔ پروژه‌های این وبگاه است.\nهیج تغییری برای حساب شما رخ نخواهد داد.",
"mwoauth-form-description-onewiki-nogrants": "درود $1،\n\n'''$2''' خواهان اخذ دسترسی اولیه‌ای از طرف شما در ''$4'' است.",
"mwoauth-form-button-approve": "پذیرفتن",
"mwoauth-form-button-cancel": "انصراف",
@@ -227,6 +230,9 @@
"mwoauth-grants-heading": "دسترسی‌های درخواست شده:",
"mwoauth-grants-nogrants": "برنامه نیازمند هیچ دسترسی نخواسته است.",
"mwoauth-acceptance-cancelled": "شما انتخاب کرده‌اید که به \"$1\" برای دسترسی به حساب شما اجازه ندهید. \"$1\" کار نخواهد کرد مگر اینکه اجازهٔ دسترسی دهید. شما می‌توانید به \"$1\" بازگردید یا [[Special:OAuthManageMyGrants|مدیریت]] برنامه‌های متصل خود.",
+ "grant-mwoauth-authonly": "تنها اعتبارسنجی هویت کاربر، فاقد قابلیت خواندن صفحه‌ها یا عمل به نیابت از کاربر.",
+ "grant-mwoauth-authonlyprivate": "تنها اعتبارسنجی هویت کاربر به‌همراه دسترسی به نام واقعی و نشانی ایمیل، فاقد قابلیت خواندن صفحه‌ها یا عمل به نیابت از کاربر.",
+ "mwoauth-listgrants-extra-summary": "== اختیارات ویژهٔ OAuth ==\n\nاین اختیارهای اضافی قابل اعطا به مصرف‌کنندگان OAuth است.",
"mwoauth-oauth-exception": "خطایی در پروتکل OAuth رخ داد :$1",
"mwoauth-callback-not-oob": "oauth_callback باید تنظیم شود، و باید به \"اوب\" تنظیم شود (حساس به مورد)",
"right-mwoauthproposeconsumer": "پیشنهاد مصرف‌کننده جدید OAuth",
@@ -235,7 +241,7 @@
"right-mwoauthsuppress": "توقیف مصرف‌کنندهٔ OAuth",
"right-mwoauthviewsuppressed": "مشاهده مصرف‌کننده‌های OAuth توقیف‌شده",
"right-mwoauthviewprivate": "مشاهدهٔ داده‌های شخصی OAuth",
- "right-mwoauthmanagemygrants": "مدیریت OAuthهای اعطاشده",
+ "right-mwoauthmanagemygrants": "مدیریت اعطاهای OAuth",
"action-mwoauthmanageconsumer": "مدیریت مصرف‌کننده‌های OAuth",
"action-mwoauthmanagemygrants": "مدیریت اعطاشده‌های OAuth شما",
"action-mwoauthproposeconsumer": "پیشنهاد مصرف‌کنندهٔ جدید OAuth",
@@ -251,5 +257,7 @@
"notification-oauth-app-reject-primary-link": "نمایش برنامه",
"notification-oauth-app-disable-primary-link": "نمایش برنامه",
"notification-oauth-app-reenable-primary-link": "نمایش برنامه",
- "notification-oauth-app-body": "دلیل: $1"
+ "notification-oauth-app-body": "دلیل: $1",
+ "mwoauth-oauth-version": "نسخهٔ پروتکل OAuth",
+ "grant-oauthmanageownclient": "مدیریت مشتری‌های OAuth شما"
}
diff --git a/OAuth/i18n/fi.json b/OAuth/i18n/fi.json
index 3ee5888a..64f5f015 100644
--- a/OAuth/i18n/fi.json
+++ b/OAuth/i18n/fi.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"01miki10",
+ "Kyykaarme",
"Nike",
"Pxos",
"Pyscowicz",
@@ -30,7 +31,6 @@
"mwoauth-consumer-stage-suppressed": "häivytetty",
"oauthconsumerregistration": "OAuth asiakasrekisteröinti",
"mwoauthconsumerregistration-navigation": "Valikko:",
- "mwoauthconsumerregistration-propose": "Ehdota uutta asiakasta",
"mwoauthconsumerregistration-list": "Asiakaslistani",
"mwoauthconsumerregistration-update-submit": "Päivitä asiakas",
"mwoauthconsumerregistration-user": "Julkaisija",
@@ -59,14 +59,28 @@
"mwoauthlistconsumers-status-rejected": "hylätty",
"mwoauthlistconsumers-status-expired": "vanhentunut",
"oauthmanagemygrants": "Liitettyjen sovellusten hallinnointi",
+ "mwoauthmanagemygrants-text": "Tällä sivulla on listattuna kaikki sovellukset, jotka voivat käyttää käyttäjätiliäsi. Jokaisen sovelluksen käyttöoikeuksien laajuus on rajoitettu sen mukaan, mitä oikeuksia annoit sille, kun valtuutit sen toimimaan puolestasi. Jos annoit sovellukselle erikseen oikeuden toimia puolestasi eri sisarprojekteissa, näet alla kullekin projektille omat määritykset. \n\nLiitetyt sovellukset käyttävät tiliäsi OAuth-protokollan avulla. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Lue lisää liitetyistä sovelluksista])</span>",
"mwoauthmanagemygrants-navigation": "Valikko:",
"mwoauthmanagemygrants-showlist": "Liitettyjen sovellusten luettelo",
"mwoauthmanagemygrants-none": "Yhtään sovellusta ei ole liitetty tunnukseesi.",
"mwoauthmanagemygrants-user": "Julkaisija:",
"mwoauthmanagemygrants-description": "Kuvaus",
"mwoauthmanagemygrants-wikiallowed": "Sallittu projektissa:",
+ "mwoauthmanagemygrants-review": "hallitse oikeuksia",
+ "mwoauthmanagemygrants-revoke": "poista oikeudet",
+ "mwoauthmanagemygrants-grantaccept": "Myönnetty",
+ "mwoauthmanagemygrants-update-text": "Alla olevalla lomakkeella voit muuuttaa sovellukselle myönnettyjä oikeuksia toimia puolestasi.",
+ "mwoauthmanagemygrants-revoke-text": "Alla olevalla lomakkeella voit poistaa sovellukselta oikeuden toimia puolestasi.",
+ "mwoauthmanagemygrants-confirm-legend": "Hallitse liitettyä sovellusta",
+ "mwoauthmanagemygrants-update": "Päivitä luvat",
+ "mwoauthmanagemygrants-renounce": "Poista oikeudet",
"mwoauthmanagemygrants-action": "Muuta tilaa:",
"mwoauthmanagemygrants-confirm-submit": "Päivitä käyttöoikeuspoletin tila",
+ "mwoauthmanagemygrants-success-update": "Asetuksesi tälle sovellukselle on päivitetty.",
+ "mwoauthmanagemygrants-success-renounce": "Sovelluksen käyttöoikeus tilillesi on poistettu.",
+ "mwoauthmanagemygrants-basic-tooltip": "Miksi en voi päivittää tätä lupaa? Tämä lupa antaa liitetylle sovellukselle perusoikeudet, joita se tarvitsee toimiakseen oikein. Jos et halua tällä liitetyllä sovelluksella olevan näitä oikeuksia, sinun tulee poistaa sovelluksen valtuutus.",
+ "mwoauthmanagemygrants-authonly-tooltip": "Miksi en voi päivittää tätä lupaa? Jos et halua tällä liitetyllä sovelluksella olevan tätä oikeutta, sinun tulee poistaa sovelluksen valtuutus.",
+ "mwoauthmanagemygrants-editslink": "{{GENDER:$1|Muokkauksesi}} tämän sovelluksen kautta",
"mwoauth-form-description-allwikis": "Hei $1,\n\n'''$2''' haluaisi tehdä seuraavat toiminnot puolestasi kaikissa tämän sivuston projekteissa:\n\n$4",
"mwoauth-form-description-onewiki": "Hei $1,\n\n'''$2''' haluaisi tehdä seuraavat toiminnot puolestasi sivustolla ''$4'':\n\n$5",
"mwoauth-form-description-allwikis-nogrants": "Hei $1,\n\nPyynnön suorittamiseksi, '''$2''' tarvitsee luvan päästäkseen puolestasi kaikkien tämän sivuston projektien tietoihin. Tililläsi ei tehdä muutoksia.",
diff --git a/OAuth/i18n/fr.json b/OAuth/i18n/fr.json
index 8239445a..ca94714a 100644
--- a/OAuth/i18n/fr.json
+++ b/OAuth/i18n/fr.json
@@ -5,6 +5,7 @@
"Dr Brains",
"Eneelk",
"Fitoschido",
+ "Florian COLLIN",
"Gomoko",
"Jean-Frédéric",
"Linedwell",
@@ -22,58 +23,63 @@
"Wyz"
]
},
- "mwoauth-desc": "Autorise l’utilisation de OAuth 1.0a et 2.0 pour l’authentification de l’API",
+ "abusefilter-edit-builder-vars-oauth-consumer": "Consommateur OAuth utilisé pour effectuer cette modification",
+ "oauth": "OAuth",
+ "mwoauth-desc": "Autorise l’utilisation de OAuth 1.0a et 2.0 pour l’authentification de l’API.",
"mwoauth-nosubpage-explanation": "OAuth est un mécanisme qui permet aux applications externes d’identifier un utilisateur de {{SITENAME}} ou d’agir en son nom après avoir reçu la permission de cet utilisateur.\n\nPour que cette page fasse quelque chose, d’autres paramètres sont nécessaires. Si vous avez été redirigé ici par une application externe, il s’agit probablement d’une erreur de cette application; veuillez en contacter l’auteur.",
- "mwoauth-verified": "L’application peut maintenant accéder à MediaWiki en votre nom.\n\nPour terminer le processus, veuillez fournir cette valeur de vérification à l’application : '''$1'''",
- "mwoauth-db-readonly": "La base de données OAuth est temporairement verrouillée. Veuillez réessayer dans quelques minutes.",
- "mwoauth-missing-field": "Valeur manquante pour le champ « $1 »",
- "mwoauth-invalid-field": "Valeur invalide fournie pour le champ « $1 »",
+ "mwoauth-verified": "L’application peut maintenant accéder à MediaWiki en votre nom.\n\nPour terminer le processus, veuillez fournir cette valeur de vérification à l’application : '''$1'''",
+ "mwoauth-db-readonly": "La base de données OAuth est temporairement verrouillée. Veuillez essayer à nouveau dans quelques minutes.",
+ "mwoauth-missing-field": "Valeur manquante pour le champ « $1 »",
+ "mwoauth-invalid-field": "Valeur invalide fournie pour le champ « $1 »",
"mwoauth-invalid-field-generic": "Valeur non valide fournie",
+ "mwoauth-invalid-field-oauth2GrantTypes": "Les applis OAuth 2 doivent spécifier au moins un type d’accord.",
"mwoauth-field-hidden": "(cette information est masquée)",
"mwoauth-field-private": "(cette information est privée)",
- "mwoauth-prefs-managegrants": "Applications connectées :",
- "mwoauth-prefs-managegrantslink": "Gérer {{PLURAL:$1|$1 application connectée|$1 applications connectées|0=les applications connectées}}",
+ "mwoauth-prefs-managegrants": "Applications connectées :",
+ "mwoauth-prefs-managegrantslink": "Gérer {{PLURAL:$1|$1|0=les}} application{{PLURAL:$1||s|0=s}} connectée{{PLURAL:$1||s|0=s}}",
"mwoauth-consumer-allwikis": "Tous les projets sur ce site",
- "mwoauth-consumer-key": "Clé du consommateur :",
- "mwoauth-consumer-name": "Nom de l'application :",
- "mwoauth-consumer-version": "Version du consommateur :",
- "mwoauth-consumer-user": "Éditeur :",
- "mwoauth-consumer-stage": "Statut actuel :",
- "mwoauth-consumer-email": "Adresse de courriel de contact :",
+ "mwoauth-consumer-key": "Clé du consommateur :",
+ "mwoauth-consumer-name": "Nom de l’application :",
+ "mwoauth-consumer-version": "Version du consommateur :",
+ "mwoauth-consumer-user": "Éditeur :",
+ "mwoauth-consumer-stage": "Statut actuel :",
+ "mwoauth-consumer-email": "Adresse de courriel de contact :",
"mwoauth-consumer-email-help": "Visible uniquement par les personnes qui approuvent les nouveaux consommateurs",
- "mwoauth-consumer-owner-only-label": "Réservé au propriétaire :",
+ "mwoauth-consumer-owner-only-label": "Réservé au propriétaire :",
"mwoauth-consumer-owner-only": "Réserver l’utilisation de ce consommateur à $1.",
"mwoauth-consumer-owner-only-help": "Si cette option est sélectionnée, le consommateur sera automatiquement approuvé et son utilisation par $1 sera acceptée. Il ne sera utilisable par aucun autre utilisateur et le processus d’autorisation habituel ne fonctionnera pas. Les actions effectuées en utilisant ce consommateur ne seront pas balisées.",
- "mwoauth-consumer-description": "Description de l'application :",
- "mwoauth-consumer-callbackurl": "URL de « rappel » pour OAuth :",
- "mwoauth-consumer-callbackisprefix": "Permettre au consommateur de spécifier un rappel dans les requêtes et utiliser l’URL de « rappel » ci-dessus comme préfixe obligatoire.",
- "mwoauth-consumer-granttypes": "Types d’autorisation demandés :",
- "mwoauth-consumer-grantsneeded": "Autorisations possibles :",
+ "mwoauth-consumer-description": "Description de l’application :",
+ "mwoauth-consumer-callbackurl": "URL de « rappel » pour OAuth :",
+ "mwoauth-consumer-callbackurl-help": "À la différence de OAuth 1.0a, cet URL correspond exactement.",
+ "mwoauth-consumer-callbackurl-warning": "(port générique)",
+ "mwoauth-consumer-callbackisprefix": "Permettre au consommateur de spécifier un rappel dans les requêtes et utiliser l’URL de « rappel » ci-dessus comme préfixe obligatoire.",
+ "mwoauth-consumer-granttypes": "Types d’autorisation demandés :",
+ "mwoauth-consumer-grantsneeded": "Autorisations possibles :",
"mwoauth-consumer-required-grant": "Applicable au consommateur",
- "mwoauth-consumer-wiki": "Projet applicable :",
+ "mwoauth-consumer-wiki": "Projet applicable :",
"mwoauth-consumer-wiki-thiswiki": "Projet actuel ($1)",
- "mwoauth-consumer-restrictions": "Limitations d’utilisation :",
- "mwoauth-consumer-restrictions-json": "Limitations d’utilisation (JSON) :",
- "mwoauth-consumer-rsakey": "Clé RSA publique (facultatif) :",
- "mwoauth-consumer-rsakey-help": "Saisir une clé publique pour utiliser la méthode de signature RSA-SHA1. Laisser vide pour utiliser HMAC-SHA1 avec un motif secret aléatoire. Si vous n’êtes pas sûr du choix, laisser vide.",
- "mwoauth-consumer-secretkey": "Jeton secret du consommateur :",
- "mwoauth-consumer-accesstoken": "Jeton d’accès :",
- "mwoauth-consumer-reason": "Motif :",
+ "mwoauth-consumer-restrictions": "Limitations d’utilisation :",
+ "mwoauth-consumer-restrictions-json": "Limitations d’utilisation (JSON) :",
+ "mwoauth-consumer-rsakey": "Clé RSA publique (facultatif) :",
+ "mwoauth-consumer-rsakey-help": "Saisir une clé publique pour utiliser la méthode de signature RSA-SHA1. Laisser vide pour utiliser HMAC-SHA1 avec un motif secret aléatoire. Si vous n’êtes pas sûr{{GENDER:||e}} du choix, laisser ce champ vide.",
+ "mwoauth-consumer-secretkey": "Jeton secret du consommateur :",
+ "mwoauth-consumer-accesstoken": "Jeton d’accès :",
+ "mwoauth-consumer-reason": "Motif :",
"mwoauth-consumer-developer-agreement": "En soumettant cette application, vous acceptez que nous nous réservons le droit de la désactiver, de supprimer ou restreindre votre accès ou celui de votre application à ce site, et d’entreprendre toute autre action que nous estimons appropriée si nous estimons, à notre seule discrétion, que vous ou votre application violez une politique, une ligne directrice ou un principe de ce site. Nous pouvons modifier cette Politique des applications n’importe quand sans avis préalable, à notre seule discrétion et comme nous le jugeons nécessaire. Votre poursuite de l’utilisation de OAuth constitue une acceptation de ces modifications.",
"mwoauth-consumer-email-unconfirmed": "Votre adresse de courriel du compte n’a pas encore été confirmée.",
"mwoauth-consumer-email-mismatched": "L’adresse de courriel fournie doit correspondre à celle de votre compte.",
- "mwoauth-consumer-alreadyexists": "Un consommateur avec cette combinaison de nom/version/éditeur existe déjà",
- "mwoauth-consumer-alreadyexistsversion": "Un consommateur avec cette combinaison de nom/éditeur existe déjà avec une version égale ou supérieure (« $1 »)",
- "mwoauth-consumer-not-accepted": "Impossible de mettre à jour les informations pour une demande de consommateur en cours",
- "mwoauth-consumer-not-proposed": "Le consommateur n’est actuellement pas proposé",
- "mwoauth-consumer-not-disabled": "Le consommateur n’est pas désactivé pour le moment",
- "mwoauth-consumer-not-approved": "Le consommateur n’est pas approuvé (il peut avoir été désactivé)",
+ "mwoauth-consumer-alreadyexists": "Un consommateur avec cette combinaison de nom / version / éditeur existe déjà.",
+ "mwoauth-consumer-alreadyexistsversion": "Un consommateur avec cette combinaison de nom / éditeur existe déjà avec une version égale ou supérieure (« $1 »).",
+ "mwoauth-consumer-not-accepted": "Impossible de mettre à jour les informations pour une requête de consommateur en cours.",
+ "mwoauth-consumer-not-proposed": "Le consommateur n’est actuellement pas proposé.",
+ "mwoauth-consumer-not-disabled": "Le consommateur n’est pas désactivé pour le moment.",
+ "mwoauth-consumer-not-approved": "Le consommateur n’est pas approuvé (il peut avoir été désactivé).",
"mwoauth-missing-consumer-key": "Aucune clé de consommateur n’a été fournie.",
"mwoauth-invalid-consumer-key": "Aucun consommateur n’existe avec la clé fournie.",
- "mwoauth-invalid-access-token": "Aucun jeton d’accès n’existe pour la clé fournie",
- "mwoauth-invalid-access-wrongwiki": "Le consommateur ne peut être utilisé que sur le projet « $1 ».",
- "mwoauth-consumer-conflict": "Quelqu’un a modifié les attributs de ce consommateur pendant que vous le consultiez. Veuillez réessayer. Vous pouvez aussi vérifier le journal des modifications.",
- "mwoauth-consumer-grantshelp": "Chaque droit accorde l’accès aux droits d’utilisateur listés qu’un compte utilisateur possède déjà. Voyez le [[Special:ListGrants|tableau des droits]] pour plus d’informations.",
+ "mwoauth-invalid-access-token": "Aucun jeton d’accès n’existe pour la clé fournie.",
+ "mwoauth-invalid-access-wrongwiki": "Le consommateur ne peut être utilisé que sur le projet « $1 ».",
+ "mwoauth-consumer-conflict": "Quelqu’un a modifié les attributs de ce consommateur pendant que vous le consultiez. Veuillez essayer à nouveau. Vous pouvez aussi vérifier le journal des modifications.",
+ "mwoauth-consumer-grantshelp": "Chaque autorisation accorde l’accès aux droits d’utilisateur listés qu’un compte utilisateur possède déjà. Voyez le [[Special:ListGrants|tableau des autorisations]] pour plus d’informations.",
"mwoauth-consumer-stage-proposed": "proposé",
"mwoauth-consumer-stage-rejected": "rejeté",
"mwoauth-consumer-stage-expired": "expiré",
@@ -81,13 +87,16 @@
"mwoauth-consumer-stage-disabled": "désactivé",
"mwoauth-consumer-stage-suppressed": "supprimé",
"oauthconsumerregistration": "Inscription de consommateur OAuth",
- "mwoauthconsumerregistration-navigation": "Navigation :",
- "mwoauthconsumerregistration-propose": "Proposer un nouveau consommateur",
+ "mwoauthconsumerregistration-navigation": "Navigation :",
+ "mwoauthconsumerregistration-propose-oauth1a": "Proposer un nouveau consommateur OAuth 1.0a",
+ "mwoauthconsumerregistration-propose-oauth2": "Proposer un nouveau client OAuth 2.0",
"mwoauthconsumerregistration-list": "Ma liste de consommateurs",
"mwoauthconsumerregistration-main": "Principal",
- "mwoauthconsumerregistration-propose-text": "Les développeurs devraient utiliser le formulaire ci-dessous pour proposer un nouveau consommateur OAuth (voir la [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth documentation de l’extension] pour plus de détails). Après avoir validé ce formulaire, vous recevrez un jeton que votre application utilisera pour s’identifier auprès de MediaWiki. Un administrateur OAuth devra approuver votre application avant qu’elle ne puisse être approuvée par les autres utilisateurs.\n\nQuelques recommandations et remarques :\n* Essayez d’utiliser le moins de droits possibles. Évitez les droits qui ne sont pas vraiment nécessaires pour le moment.\n* Les versions sont de la forme « majeure.mineure.révision » (les deux derniers champs étant facultatifs) et croissent quand des changements dans les permissions sont nécessaires.\n* Veuillez fournir une clé publique RSA (au format PEM) si possible ; sinon, un jeton secret (moins sécurisé) vous sera assigné.\n* Vous pouvez utiliser un ID de projet pour limiter ce consommateur à un unique projet de ce site (utilisez « * » pour tous les projets).",
+ "mwoauthconsumerregistration-propose-text": "Vous pouvez :\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|proposer un consommateur OAuth 1.0a]] ;\n* [[Special:OAuthConsumerRegistration/propose/oauth2|proposer un client OAuth 2.0]].",
+ "mwoauthconsumerregistration-propose-text-oauth1a": "Les développeurs devraient utiliser le formulaire ci-dessous pour proposer un nouveau consommateur OAuth 1.0a (voir la [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth documentation de l’extension] pour plus de détails). Une fois ce formulaire soumis, vous recevrez un jeton que votre application utilisera pour s’identifier auprès de MediaWiki. Un administrateur OAuth devra approuver votre application avant qu’elle puisse être autorisée pour d’autres utilisateurs.\n\nQuelques recommandations et remarques :\n* essayez d’utiliser aussi peu de droits que possible ; éviter les droits qui ne sont actuellement pas nécessaires ;\n* les versions sont de la forme « majeur.mineur.correctif » (les deux derniers étant facultatifs) et augmentent quand des changements de droit sont nécessaires ;\n* veuillez fournir une clé RSA publique (au format PEM) si possible ; sinon, un jeton secret (moins sécurisé) devra être utilisé ;\n* vous pouvez utiliser un identifiant de projet pour limiter le consommateur à un seul projet sur ce site (utiliser « * » pour tous les projets).",
+ "mwoauthconsumerregistration-propose-text-oauth2": "Les développeurs devraient utiliser le formulaire ci-dessous pour demander un jeton pour un nouveau client OAuth 2.0 (voir la [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth documentation de l’extension] pour plus de détails). Une fois ce formulaire soumis, vous recevrez un jeton que votre application utilisera pour s’identifier auprès de MediaWiki. Un administrateur OAuth devra approuver votre application avant qu’elle puisse être autorisée pour d’autres utilisateurs.\n\nQuelques recommandations et remarques :\n* essayez d’utiliser aussi peu de périmètres que possible. Éviter les périmètres qui ne sont actuellement pas nécessaires ;\n* les versions sont de la forme « majeur.mineur.correctif » (les deux derniers étant facultatifs) et augmentent quand des changements de périmètre sont nécessaires ;\n* vous pouvez utiliser un identifiant de projet pour limiter le consommateur à un seul projet sur ce site (utiliser « * » pour tous les projets).",
"mwoauthconsumerregistration-update-text": "Utilisez le formulaire ci-dessous pour mettre à jour les aspects d’un consommateur OAuth que vous contrôlez.\n\nToutes les valeurs ici écraseront les précédentes. Ne laissez aucun champ blanc sauf si vous désirez vraiment effacer ces valeurs.",
- "mwoauthconsumerregistration-maintext": "Cette page sert à laisser les développeurs proposer et mettre à jour des applications consommatrices OAuth dans le registre de ce site.\n\nDepuis ici, vous pouvez :\n* [[Special:OAuthConsumerRegistration/propose|Demander un jeton pour un nouveau consommateur]].\n* [[Special:OAuthConsumerRegistration/list|Gérer vos consommateurs existants]].\n\nPour plus d’information sur OAuth, voyez la [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth documentation de l’extension].",
+ "mwoauthconsumerregistration-maintext": "Cette page sert à laisser les développeurs proposer et mettre à jour des applications consommatrices OAuth dans le registre de ce site.\n\nDepuis ici, vous pouvez :\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|demander un jeton pour un nouveau consommateur OAuth 1.0a]] ;\n* [[Special:OAuthConsumerRegistration/propose/oauth2|demander un jeton pour un nouveau client OAuth 2.0]] ;\n* [[Special:OAuthConsumerRegistration/list|gérer vos consommateurs existants]].\n\nPour plus d’information sur OAuth, voyez la [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth documentation de l’extension].",
"mwoauthconsumerregistration-propose-legend": "Nouvelle application consommatrice OAuth",
"mwoauthconsumerregistration-update-legend": "Mettre à jour l’application consommatrice OAuth",
"mwoauthconsumerregistration-propose-submit": "Proposer un consommateur",
@@ -102,17 +111,17 @@
"mwoauthconsumerregistration-lastchange": "Dernière modification",
"mwoauthconsumerregistration-manage": "gérer",
"mwoauthconsumerregistration-resetsecretkey": "Réinitialiser la clé secrète avec une nouvelle valeur",
- "mwoauthconsumerregistration-proposed": "Votre demande de consommateur OAuth a été reçue.\n\nIl vous a été assigné un jeton de consommateur '''$1''' et un jeton secret '''$2'''. ''Veuillez les conserver pour des besoins ultérieurs.''",
- "mwoauthconsumerregistration-created-owner-only": "Votre consommateur OAuth a été créé.\n\nVos jetons sont :\n; Jeton du consommateur : $1\n; Secret du consommateur : $2\n; Jeton d’accès : $3\n; Secret d’accès : $4\n<em>Veuillez les conserver pour pouvoir vous y référer ultérieurement.</em>",
- "mwoauthconsumerregistration-created-owner-only-oauth2": "Votre client OAuth 2.0 a été créé.\n\nVos jetons sont :\n; Clé d’application client : $1\n; Secret de l’application client : $2\n; Jeton d’accès : $3\n;<em>Veuillez les enregistrer pour de futures références.</em>",
+ "mwoauthconsumerregistration-proposed": "Votre demande de consommateur OAuth a été reçue.\n\nUn jeton de consommateur '''$1''' et un jeton secret '''$2''' vous ont été affectés. ''Veuillez les conserver pour tout besoin ultérieur.''",
+ "mwoauthconsumerregistration-created-owner-only": "Votre consommateur OAuth a été créé.\n\nVos jetons sont :\n; Jeton du consommateur <nowiki>:</nowiki>: $1\n; Secret du consommateur <nowiki>:</nowiki>: $2\n; Jeton d’accès <nowiki>:</nowiki>: $3\n; Secret d’accès <nowiki>:</nowiki>: $4\n<em>Veuillez les conserver pour tout besoin ultérieur.</em>",
+ "mwoauthconsumerregistration-created-owner-only-oauth2": "Votre client OAuth 2.0 a été créé.\n\nVos jetons sont :\n; Clé d’application client <nowiki>:</nowiki>: $1\n; Secret de l’application client <nowiki>:</nowiki>: $2\n; Jeton d’accès <nowiki>:</nowiki>: $3\n;<em>Veuillez les conserver pour tout besoin ultérieur.</em>",
"mwoauthconsumerregistration-updated": "Votre registre de consommateur OAuth a été mis à jour.",
- "mwoauthconsumerregistration-secretreset": "Un jeton secret de consommateur de '''$1''' vous a été assigné. ''Veuillez le conserver pour tout besoin ultérieur.''",
- "mwoauthconsumerregistration-secretreset-owner-only": "Vos jetons de consommateur OAuth ont été réinitialisés. Les nouveaux jetons sont :\n; Jeton du consommateur : $1\n; Secret du consommateur : $2\n; Jeton d’accès : $3\n; Secret d’accès : $4\n<em>Veuillez les conserver pour pouvoir vous y référer ultérieurement.</em>",
- "mwoauthconsumerregistration-secretreset-owner-only-oauth2": "Vos jetons de consommateur OAuth 2.0 ont été réinitialisés. Les nouveaux jetons sont :\n; Jeton du consommateur : $1\n; Secret du consommateur : $2\n; Jeton d’accès : $3\n<em>Veuillez les enregistrer pour de futures références.</em>",
- "mwoauthconsumerregistration-need-emailconfirmed": "Vous devez confirmer votre adresse de messagerie avant de créer des applications OAuth.\nVeuillez fournir et valider votre adresse de messagerie via vos [[Special:Preferences|préférences utilisateur]].",
+ "mwoauthconsumerregistration-secretreset": "Un jeton secret de consommateur de '''$1''' vous a été affecté. ''Veuillez le conserver pour tout besoin ultérieur.''",
+ "mwoauthconsumerregistration-secretreset-owner-only": "Vos jetons de consommateur OAuth ont été réinitialisés. Les nouveaux jetons sont :\n; Jeton du consommateur <nowiki>:</nowiki>: $1\n; Secret du consommateur <nowiki>:</nowiki>: $2\n; Jeton d’accès <nowiki>:</nowiki>: $3\n; Secret d’accès <nowiki>:</nowiki>: $4\n<em>Veuillez les conserver pour tout besoin ultérieur.</em>",
+ "mwoauthconsumerregistration-secretreset-owner-only-oauth2": "Vos jetons de consommateur OAuth 2.0 ont été réinitialisés. Les nouveaux jetons sont :\n; Jeton du consommateur <nowiki>:</nowiki>: $1\n; Secret du consommateur <nowiki>:</nowiki>: $2\n; Jeton d’accès <nowiki>:</nowiki>: $3\n<em>Veuillez les conserver pour tout besoin ultérieur.</em>",
+ "mwoauthconsumerregistration-need-emailconfirmed": "Vous devez confirmer votre adresse de courriel avant de créer des applications OAuth.\nVeuillez définir et valider votre adresse de courriel via [[Special:Preferences|vos préférences d’utilisateur]].",
"oauthmanageconsumers": "Gérer les consommateurs OAuth",
"mwoauthmanageconsumers-notloggedin": "Vous devez être connecté(e) pour accéder à cette page.",
- "mwoauthmanageconsumers-type": "Files :",
+ "mwoauthmanageconsumers-type": "Files :",
"mwoauthmanageconsumers-showproposed": "Requêtes proposées",
"mwoauthmanageconsumers-showrejected": "Requêtes rejetées",
"mwoauthmanageconsumers-showexpired": "Requêtes expirées",
@@ -123,11 +132,11 @@
"mwoauthmanageconsumers-linkdisabled": "requêtes désactivées",
"mwoauthmanageconsumers-main": "Principal",
"mwoauthmanageconsumers-maintext": "Cette page est conçue pour traiter les demandes d’applications consommatrices OAuth (voir http://oauth.net) et gérer les consommateurs OAuth existants.",
- "mwoauthmanageconsumers-queues": "Sélectionner une file de confirmation de consommateur ci-dessous :",
+ "mwoauthmanageconsumers-queues": "Sélectionner une file de confirmation de consommateur ci-dessous :",
"mwoauthmanageconsumers-q-proposed": "File des requêtes de consommateur proposés",
"mwoauthmanageconsumers-q-rejected": "File des requêtes de consommateur rejetées",
"mwoauthmanageconsumers-q-expired": "File des requêtes de consommateur expirées",
- "mwoauthmanageconsumers-lists": "Sélectionner une liste d’états de consommateur ci-dessous :",
+ "mwoauthmanageconsumers-lists": "Sélectionner une liste d’états de consommateur ci-dessous :",
"mwoauthmanageconsumers-l-approved": "Liste des consommateurs actuellement approuvés",
"mwoauthmanageconsumers-l-disabled": "Liste des consommateurs actuellement désactivés",
"mwoauthmanageconsumers-none-proposed": "Aucun consommateur proposé dans cette liste.",
@@ -141,17 +150,17 @@
"mwoauthmanageconsumers-email": "Courriel de contact",
"mwoauthmanageconsumers-consumerkey": "Clé de consommateur",
"mwoauthmanageconsumers-lastchange": "Dernière modification",
- "mwoauthmanageconsumers-review": "revoir/gérer",
+ "mwoauthmanageconsumers-review": "revoir / gérer",
"mwoauthmanageconsumers-confirm-text": "Utilisez ce formulaire pour approuver, rejeter, désactiver ou réactiver ce consommateur.",
"mwoauthmanageconsumers-confirm-legend": "Gérer le consommateur OAuth",
- "mwoauthmanageconsumers-action": "Modifier l’état :",
+ "mwoauthmanageconsumers-action": "Modifier l’état :",
"mwoauthmanageconsumers-approve": "Approuvé",
"mwoauthmanageconsumers-reject": "Rejeté",
"mwoauthmanageconsumers-rsuppress": "Rejeté et supprimé",
"mwoauthmanageconsumers-disable": "Désactivé",
"mwoauthmanageconsumers-dsuppress": "Désactivé et supprimé",
"mwoauthmanageconsumers-reenable": "Approuvé",
- "mwoauthmanageconsumers-reason": "Motif :",
+ "mwoauthmanageconsumers-reason": "Motif :",
"mwoauthmanageconsumers-confirm-submit": "Mettre à jour l’état du consommateur",
"mwoauthmanageconsumers-success-approved": "La requête a été approuvée.",
"mwoauthmanageconsumers-success-rejected": "La requête a été rejetée.",
@@ -168,8 +177,8 @@
"mwoauthlistconsumers-user": "Éditeur",
"mwoauthlistconsumers-description": "Description",
"mwoauthlistconsumers-wiki": "Projet applicable",
- "mwoauthlistconsumers-callbackurl": "« URL de rappel » de OAuth",
- "mwoauthlistconsumers-callbackisprefix": "Permettre au consommateur de spécifier un rappel dans les requêtes et utiliser l’URL de « rappel » ci-dessus comme préfixe obligatoire.",
+ "mwoauthlistconsumers-callbackurl": "« URL de rappel » pour OAuth",
+ "mwoauthlistconsumers-callbackisprefix": "Permettre au consommateur de spécifier un rappel dans les requêtes et utiliser l’URL de « rappel » ci-dessus comme préfixe obligatoire.",
"mwoauthlistconsumers-grants": "Droits applicables",
"mwoauthlistconsumers-basicgrantsonly": "(accès de base uniquement)",
"mwoauthlistconsumers-status": "État",
@@ -179,167 +188,172 @@
"mwoauthlistconsumers-status-disabled": "désactivé",
"mwoauthlistconsumers-status-rejected": "rejeté",
"mwoauthlistconsumers-status-expired": "expiré",
- "mwoauthlistconsumers-navigation": "Navigation :",
+ "mwoauthlistconsumers-navigation": "Navigation :",
"mwoauthlistconsumers-update-link": "Mettre à jour le consommateur",
"mwoauthlistconsumers-manage-link": "Gérer le consommateur",
- "mwoauthlistconsumers-grants-link": "Gérer les droits",
+ "mwoauthlistconsumers-grants-link": "Gérer les autorisations",
"mwoauthlistconsumers-rclink": "Modifications récentes par cette application",
"oauthmanagemygrants": "Gérer les applications connectées",
- "mwoauthmanagemygrants-text": "Cette page liste toutes les applications qui peuvent utiliser votre compte. Pour chacune de ces applications, son périmètre d’accès est limité par les droits que vous lui avez accordés quand vous l’avez autorisée à agir en votre nom. Si vous avez autorisé une application de façon séparée à accéder à différents projets « frères » en votre nom, alors vous verrez une configuration distincte pour chacun de ces projets ci-dessous.\n\nLes applications connectées accèdent à votre compte en utilisant le protocole OAuth. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth En savoir plus sur les applications connectées])</span>",
- "mwoauthmanagemygrants-navigation": "Navigation :",
+ "mwoauthmanagemygrants-text": "Cette page liste toutes les applications qui peuvent utiliser votre compte. Pour chacune de ces applications, son périmètre d’accès est limité par les autorisations que vous lui avez accordées quand vous l’avez autorisée à agir en votre nom. Si vous avez autorisé une application de façon séparée à accéder à différents projets « frères » en votre nom, alors vous verrez une configuration distincte pour chacun de ces projets ci-dessous.\n\nLes applications connectées accèdent à votre compte en utilisant le protocole OAuth. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth En savoir plus sur les applications connectées])</span>",
+ "mwoauthmanagemygrants-navigation": "Navigation :",
"mwoauthmanagemygrants-showlist": "Liste des applications connectées",
"mwoauthmanagemygrants-none": "Il n’y a aucune application connectée à votre compte.",
- "mwoauthmanagemygrants-user": "Éditeur :",
+ "mwoauthmanagemygrants-user": "Éditeur :",
"mwoauthmanagemygrants-description": "Description",
- "mwoauthmanagemygrants-wikiallowed": "Autorisé sur le projet :",
- "mwoauthmanagemygrants-grants": "Droits applicables",
- "mwoauthmanagemygrants-grantsallowed": "Droits accordés :",
- "mwoauthmanagemygrants-applicablegrantsallowed": "Droits applicables accordés :",
+ "mwoauthmanagemygrants-wikiallowed": "Autorisé sur le projet :",
+ "mwoauthmanagemygrants-grants": "Autorisations applicables",
+ "mwoauthmanagemygrants-grantsallowed": "Autorisations accordées :",
+ "mwoauthmanagemygrants-applicablegrantsallowed": "Autorisations applicables accordées :",
"mwoauthmanagemygrants-review": "gérer l’accès",
"mwoauthmanagemygrants-revoke": "révoquer l’accès",
"mwoauthmanagemygrants-grantaccept": "Accordé",
"mwoauthmanagemygrants-update-text": "Utiliser le formulaire ci-dessous pour modifier les droits accordés à une application pour agir en votre nom.",
- "mwoauthmanagemygrants-revoke-text": "Utiliser le formulaire ci-dessous pour révoquer le droit, pour une application, d’agir en votre nom.",
+ "mwoauthmanagemygrants-revoke-text": "Utiliser le formulaire ci-dessous pour révoquer le droit pour une application d’agir en votre nom.",
"mwoauthmanagemygrants-confirm-legend": "Gérer les applications connectées",
- "mwoauthmanagemygrants-update": "Mettre à jour les droits",
+ "mwoauthmanagemygrants-update": "Mettre à jour les autorisations",
"mwoauthmanagemygrants-renounce": "Ne plus autoriser",
- "mwoauthmanagemygrants-action": "Modifier l’état :",
+ "mwoauthmanagemygrants-action": "Modifier l’état :",
"mwoauthmanagemygrants-confirm-submit": "Mettre à jour l’état du jeton d’accès",
"mwoauthmanagemygrants-success-update": "Vos préférences pour cette application ont été mises à jour.",
- "mwoauthmanagemygrants-success-renounce": "L'accès de l'application à votre compte a été supprimé.",
- "mwoauthmanagemygrants-basic-tooltip": "Pourquoi ne puis-je pas mettre à jour cette autorisation ? Celle-ci donne à votre application connectée des droits de base dont elle a besoin pour fonctionner correctement. Si vous ne voulez pas que cette application connectée ait ces droits, vous devriez révoquer son accès.",
- "mwoauthmanagemygrants-authonly-tooltip": "Pourquoi ne puis-je pas mettre à jour ce droit ? Si vous ne voulez pas que cette application connectée ait ce droit, vous devriez révoquer son accès.",
- "mwoauthmanagemygrants-editslink": "{{GENDER:$1|Vos}} modifications par cette application",
- "mwoauthmanagemygrants-actionslink": "{{GENDER:$1|Vos}} actions par cette application",
- "logentry-mwoauthconsumer-propose": "$1 {{GENDER:$2|a proposé}} un consommateur OAuth (clé du consommateur $4)",
- "logentry-mwoauthconsumer-update": "$1 {{GENDER:$2|a mis à jour}} un consommateur OAuth (clé du consommateur $4)",
- "logentry-mwoauthconsumer-approve": "$1 {{GENDER:$2|a approuvé}} un consommateur OAuth proposé par $3 (clé du consommateur $4)",
- "logentry-mwoauthconsumer-reject": "$1 {{GENDER:$2|a rejeté}} un consommateur OAuth proposé par $3 (clé du consommateur $4)",
- "logentry-mwoauthconsumer-disable": "$1 a désactivé un consommateur OAuth proposé par $3 (clé du consommateur $4)",
- "logentry-mwoauthconsumer-reenable": "$1 {{GENDER:$2|a réactivé}} un consommateur OAuth proposé par $3 (clé du consommateur $4)",
- "logentry-mwoauthconsumer-create-owner-only": "$1 {{GENDER:$2|a créé}} un consommateur OAuth réservé au propriétaire (clé de consommateur $4)",
- "log-action-filter-mwoauthconsumer": "Type d'action de consommateur OAuth :",
+ "mwoauthmanagemygrants-success-renounce": "L’accès de l’application à votre compte a été révoqué.",
+ "mwoauthmanagemygrants-basic-tooltip": "Pourquoi ne puis-je pas mettre à jour cette autorisation ? Celle-ci donne à votre application connectée des droits de base dont elle a besoin pour fonctionner correctement. Si vous ne voulez pas que cette application connectée ait ces droits, vous devriez révoquer son accès.",
+ "mwoauthmanagemygrants-authonly-tooltip": "Pourquoi ne puis-je pas mettre à jour cette autorisation ? Si vous ne voulez pas que cette application connectée ait ce droit, vous devriez révoquer son accès.",
+ "mwoauthmanagemygrants-editslink": "{{GENDER:$1|}}Vos modifications par cette application",
+ "mwoauthmanagemygrants-actionslink": "{{GENDER:$1|}}Vos actions par cette application",
+ "logentry-mwoauthconsumer-propose": "$1{{GENDER:$2|}} a proposé un consommateur OAuth (clé du consommateur $4).",
+ "logentry-mwoauthconsumer-update": "$1{{GENDER:$2|}} a mis à jour un consommateur OAuth (clé du consommateur $4).",
+ "logentry-mwoauthconsumer-approve": "$1{{GENDER:$2|}} a approuvé un consommateur OAuth proposé par $3 (clé du consommateur $4).",
+ "logentry-mwoauthconsumer-reject": "$1{{GENDER:$2|}} a rejeté un consommateur OAuth proposé par $3 (clé du consommateur $4).",
+ "logentry-mwoauthconsumer-disable": "$1{{GENDER:$2|}} a désactivé un consommateur OAuth pour $3 (clé du consommateur $4).",
+ "logentry-mwoauthconsumer-reenable": "$1{{GENDER:$2|}} a réactivé un consommateur OAuth pour $3 (clé du consommateur $4).",
+ "logentry-mwoauthconsumer-create-owner-only": "$1{{GENDER:$2|}} a créé un consommateur OAuth réservé au propriétaire (clé de consommateur $4).",
+ "log-action-filter-mwoauthconsumer": "Type d’action de consommateur OAuth :",
"log-action-filter-mwoauthconsumer-approve": "Approbation de consommateur OAuth",
- "log-action-filter-mwoauthconsumer-create-owner-only": "Création d’un consommateur OAuth pour le propriétaire seul",
+ "log-action-filter-mwoauthconsumer-create-owner-only": "Création d’un consommateur OAuth réservé au propriétaire",
"log-action-filter-mwoauthconsumer-disable": "Désactivation de consommateur OAuth",
"log-action-filter-mwoauthconsumer-propose": "Proposition de consommateur OAuth",
"log-action-filter-mwoauthconsumer-reenable": "Réactivation de consommateur OAuth",
"log-action-filter-mwoauthconsumer-reject": "Rejet de consommateur OAuth",
"log-action-filter-mwoauthconsumer-update": "Mise à jour de consommateur OAuth",
- "mwoauthconsumer-consumer-logpage": "Journal du consommateur OAuth",
+ "mwoauthconsumer-consumer-logpage": "Journal des consommateurs OAuth",
"mwoauthconsumer-consumer-logpagetext": "Journal des approbations, rejets et désactivations de consommateurs OAuth enregistrés.",
- "mwoauth-bad-request-missing-params": "Désolé, quelque chose s’est mal passé lors de la configuration de cette application connectée. Contactez le développeur de l’application.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Paramètres OAuth manquants, $1</span>",
- "mwoauth-bad-request-invalid-action": "Désolé, quelque chose s’est mal passé, vous devez contacter l’auteur de l’application pour vous aider.\n\n<span class=\"plainlinks mw-mwoautherror-details\">URL inconnue, $1</span>",
- "mwoauth-bad-request-invalid-action-contact": "Désolé, quelque chose s’est mal passé. Vous devez [$1 contacter] l’auteur de l’application pour obtenir de l’aide.\n\n<span class=\"plainlinks mw-mwoautherror-détail\">URL inconnue, $2</span>",
+ "mwoauth-bad-request-missing-params": "Désolé, quelque chose s’est mal passé lors de la configuration de cette application connectée. Contactez le développeur de l’application.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Paramètres OAuth manquants : $1</span>",
+ "mwoauth-bad-request-invalid-action": "Désolé, quelque chose s’est mal passé. Vous devez contacter l’auteur de l’application pour obtenir de l’aide.\n\n<span class=\"plainlinks mw-mwoautherror-details\">URL inconnue : $1</span>",
+ "mwoauth-bad-request-invalid-action-contact": "Désolé, quelque chose s’est mal passé. Vous devez [$1 contacter] l’auteur de l’application pour obtenir de l’aide.\n\n<span class=\"plainlinks mw-mwoautherror-détail\">URL inconnue : $2</span>",
"mwoauthdatastore-access-token-not-found": "Aucun droit approuvé n’a été trouvé pour ce jeton d’autorisation.",
- "mwoauthdatastore-request-token-not-found": "Désolé, quelque chose s’est mal passé lors de la connexion de cette application.\nRevenez en arrière et essayez de reconnecter votre compte, ou contactez l’auteur de l’application.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Jeton OAuth introuvable, $1</span>",
- "mwoauthdatastore-callback-not-found": "URL de rappel de OAuth non trouvée dans le cache. C’est probablement une erreur de l’application (mauvaise façon de faire la requête au serveur).",
- "mwoauthdatastore-request-token-already-used": "Cette requête a déjà été effectuée et ne peut pas être soumise à nouveau.\nRetournez à l’application et essayez de connecter de nouveau votre compte, ou contactez l’auteur de l’application.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Jeton OAuth déjà utilisé, $1</span>",
- "mwoauthdatastore-bad-token": "Aucun jeton correspondant à votre demande n’a été trouvé",
+ "mwoauthdatastore-request-token-not-found": "Désolé, quelque chose s’est mal passé lors de la connexion de cette application.\nRevenez en arrière et essayez de reconnecter votre compte, ou bien contactez l’auteur de l’application.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Jeton OAuth introuvable : $1</span>",
+ "mwoauthdatastore-callback-not-found": "URL de rappel de OAuth non trouvée dans le cache. C’est probablement une erreur dans la façon dont l’application effectue ses requêtes au serveur.",
+ "mwoauthdatastore-request-token-already-used": "Cette requête a déjà été effectuée et ne peut pas être soumise à nouveau.\nRetournez à l’application et essayez de connecter de nouveau votre compte, ou bien contactez l’auteur de l’application.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Jeton OAuth déjà utilisé : $1</span>",
+ "mwoauthdatastore-bad-token": "Aucun jeton correspondant à votre demande n’a été trouvé.",
"mwoauthdatastore-bad-source-ip": "La requête provient d’une adresse IP non valide.",
- "mwoauthdatastore-bad-verifier": "Le code de vérification fourni n’était pas valide",
- "mwoauthdatastore-invalid-token-type": "Le type de jeton demandé n’est pas valide",
- "mwoauthgrants-general-error": "Il y a eu une erreur dans votre demande OAuth",
- "mwoauthserver-bad-consumer": "« $1 » n’est pas approuvé comme App Connectée, [$2 contacter] l’auteur de l’application pour l’aide.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Application connectée OAuth non approuvée, $3 </span>",
- "mwoauthserver-bad-consumer-key": "Désolé, quelque chose s’est mal passé lors de la connexion de cette application.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Clé de OAuth inconnue, $1</span>",
- "mwoauthserver-insufficient-rights": "Votre compte n’est pas autorisé à utiliser les Applications connectées, contactez l’administrateur de votre site pour savoir pourquoi.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Droits utilisateur OAuth insuffisants, $1</span>",
- "mwoauthserver-invalid-request-token": "Jeton non valide dans votre demande",
- "mwoauthserver-invalid-user": "Pour utiliser les Applications connectées sur ce site, vous devez avoir un compte transverse à tous les projets. Quand vous aurez un compte sur tous les projets, vous pouvez essayer de vous reconnecter à « $1 ».\n\n<span class=\"plainlinks mw-mwoautherror-details\">Connexion unifiée nécessaire, $2 </span>",
- "mwoauthserver-consumer-no-secret": "Désolé, quelque chose s’est mal passé lors de la connexion à cette application.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Le consommateur n’a pas de clé secrète, $1</span>",
- "mwoauthserver-consumer-owner-only": "« $1 » est une Application connectée réservée au propriétaire. Pour obtenir le jeton d’accès, voyez [[$2]].\n\n<span class=\"plainlinks mw-mwoautherror-details\">Le consommateur est limité au propriétaire, $3</span>",
+ "mwoauthdatastore-bad-verifier": "Le code de vérification fourni n’était pas valide.",
+ "mwoauthdatastore-invalid-token-type": "Le type de jeton demandé n’est pas valide.",
+ "mwoauthgrants-general-error": "Il y avait une erreur dans votre demande OAuth.",
+ "mwoauthserver-bad-consumer": "« $1 » n’est pas approuvé comme application connectée, [$2 contactez] l’auteur de l’application pour obtenir de l’aide.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Application connectée OAuth non approuvée, $3</span>",
+ "mwoauthserver-bad-consumer-key": "Désolé, quelque chose s’est mal passé lors de la connexion de cette application.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Clé de OAuth inconnue : $1</span>",
+ "mwoauthserver-insufficient-rights": "Votre compte n’est pas autorisé à utiliser les applications connectées, contactez l’administrateur de votre site pour savoir pourquoi.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Droits utilisateur OAuth insuffisants : $1</span>",
+ "mwoauthserver-invalid-request-token": "Jeton non valide dans votre demande.",
+ "mwoauthserver-invalid-user": "Pour utiliser les applications connectées sur ce site, vous devez avoir un compte transverse à tous les projets. Quand vous aurez un compte sur tous les projets, vous pouvez essayer de vous reconnecter à « $1 ».\n\n<span class=\"plainlinks mw-mwoautherror-details\">Connexion unifiée nécessaire : $2</span>",
+ "mwoauthserver-consumer-no-secret": "Désolé, quelque chose s’est mal passé lors de la connexion à cette application.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Le consommateur n’a pas de clé secrète : $1</span>",
+ "mwoauthserver-consumer-owner-only": "« $1 » est une application connectée réservée au propriétaire. Pour obtenir le jeton d’accès, voyez [[$2]].\n\n<span class=\"plainlinks mw-mwoautherror-details\">Le consommateur est réservé au propriétaire : $3</span>",
"mwoauth-invalid-authorization-title": "Erreur d’autorisation OAuth",
- "mwoauth-invalid-authorization": "Les entêtes d’autorisation dans votre requête ne sont pas valides : $1",
- "mwoauth-invalid-authorization-wrong-wiki": "Les entêtes d’autorisation dans votre requête ne sont pas valides pour $1",
- "mwoauth-invalid-authorization-invalid-user": "Les entêtes d’autorisation dans votre requête concernent un utilisateur qui n’existe pas ici",
- "mwoauth-invalid-authorization-wrong-user": "Les entêtes d’autorisation dans votre requête concernent un autre utilisateur",
- "mwoauth-invalid-authorization-not-approved": "L’application à laquelle vous essayez de vous connecter semble mal paramétrée, contactez l’auteur de $1 pour de l’aide.",
- "mwoauth-invalid-authorization-blocked-user": "Les entêtes d’autorisation dans votre requête concernent un utilisateur qui est bloqué",
- "mwoauth-form-description-allwikis": "Bonjour $1,\n\nAfin de finaliser votre demande, '''$2''' a besoin de l'autorisation pour faire les actions suivantes en votre nom sur tous les projets de ce site :\n\n\n$4",
- "mwoauth-form-description-onewiki": "Bonjour $1,\n\nAfin de finaliser votre demande, '''$2''' a besoin de votre permission pour faire les actions suivantes en votre nom sur ''$4'':\n\n\n$5",
- "mwoauth-form-description-allwikis-nogrants": "Bonjour $1,\n\nAfin de finaliser votre demande, '''$2''' a besoin de votre permission pour accéder en votre nom aux informations concernant tous les projets de ce site. Aucune modification ne sera faite avec votre compte.",
- "mwoauth-form-description-onewiki-nogrants": "Bonjour $1,\n\nAfin de finaliser votre demande, '''$2''' a besoin de votre permission pour accéder aux informations sur ''$4''. Aucune modification ne sera faite avec votre compte.",
- "mwoauth-form-description-allwikis-privateinfo": "Bonjour $1,\n\nAfin de finaliser votre demande, <strong>$2</strong> a besoin de droits pour accéder à des informations vous concernant, y compris votre vrai nom et votre adresse de messagerie, sur tous les projets de ce site. Aucune modification ne sera effectuée avec votre compte.",
- "mwoauth-form-description-onewiki-privateinfo": "Bonjour $1,\n\nAfin de finaliser votre demande, <strong>$2</strong> a besoin de droits pour accéder à des informations, comme votre vrai nom et votre adresse de messagerie, sur ''$4''. Aucune modification ne sera effectuée avec votre compte.",
+ "mwoauth-invalid-authorization": "Les entêtes d’autorisation dans votre requête ne sont pas valides : $1",
+ "mwoauth-invalid-authorization-wrong-wiki": "Les entêtes d’autorisation dans votre requête ne sont pas valides pour $1.",
+ "mwoauth-invalid-authorization-invalid-user": "Les entêtes d’autorisation dans votre requête concernent un utilisateur qui n’existe pas ici.",
+ "mwoauth-invalid-authorization-wrong-user": "Les entêtes d’autorisation dans votre requête concernent un autre utilisateur.",
+ "mwoauth-invalid-authorization-not-approved": "L’application à laquelle vous essayez de vous connecter semble mal paramétrée, contactez l’auteur de $1 pour obtenir de l’aide.",
+ "mwoauth-invalid-authorization-blocked-user": "Les entêtes d’autorisation dans votre requête concernent un utilisateur qui est bloqué.",
+ "mwoauth-form-description-allwikis": "Bonjour $1,\n\nAfin de finaliser votre demande, '''$2''' a besoin de l'autorisation pour effectuer les actions suivantes en votre nom sur tous les projets de ce site :\n\n$4",
+ "mwoauth-form-description-onewiki": "Bonjour $1,\n\nAfin de finaliser votre demande, '''$2''' a besoin de votre permission pour effectuer les actions suivantes en votre nom sur ''$4'' :\n\n$5",
+ "mwoauth-form-description-allwikis-nogrants": "Bonjour $1,\n\nAfin de finaliser votre demande, '''$2''' a besoin de votre permission pour accéder en votre nom aux informations concernant tous les projets de ce site. Aucune modification ne sera effectuée avec votre compte.",
+ "mwoauth-form-description-onewiki-nogrants": "Bonjour $1,\n\nAfin de finaliser votre demande, '''$2''' a besoin de votre permission pour accéder aux informations sur ''$4''. Aucune modification ne sera effectuée avec votre compte.",
+ "mwoauth-form-description-allwikis-privateinfo": "Bonjour $1,\n\nAfin de finaliser votre demande, <strong>$2</strong> a besoin de votre permission pour accéder à des informations vous concernant, y compris votre vrai nom et votre adresse de messagerie, sur tous les projets de ce site. Aucune modification ne sera effectuée avec votre compte.",
+ "mwoauth-form-description-onewiki-privateinfo": "Bonjour $1,\n\nAfin de finaliser votre demande, <strong>$2</strong> a besoin de votre permission pour accéder à des informations, comme votre vrai nom et votre adresse de messagerie, sur ''$4''. Aucune modification ne sera effectuée avec votre compte.",
"mwoauth-form-description-allwikis-privateinfo-norealname": "Bonjour $1,\n\nPour terminer votre requête, '''$2''' a besoin du droit d’accéder à vos informations, y compris votre adresse de messagerie, sur tous les projets de ce site. Aucune modification ne sera apportée à votre compte.",
"mwoauth-form-description-onewiki-privateinfo-norealname": "Bonjour $1,\n\nPour terminer votre requête, '''$2''' a besoin du droit d’accéder à des informations, comme votre adresse de messagerie, sur ''$4''. Aucune modification ne sera apportée à votre compte.",
"mwoauth-form-button-approve": "Autoriser",
"mwoauth-form-button-cancel": "Annuler",
"mwoauth-error": "Erreur de connexion de l’application",
- "mwoauth-grants-heading": "Droits requis :",
+ "mwoauth-error-missing-callback-url-non-owner": "L’URL de rappel ( callback_url) est obligatoire pour les clients qui ne sont pas réservés à leur propriétaire.",
+ "mwoauth-grants-heading": "Droits demandés :",
"mwoauth-grants-nogrants": "L’application n’a demandé aucun droit.",
- "mwoauth-acceptance-cancelled": "Vous avez choisi de ne pas autoriser $1 à accéder à votre compte. $1 ne fonctionnera pas à moins que vous lui autorisiez l’accès. Vous pouvez revenir à $1 ou [[Special:OAuthManageMyGrants|gérer]] vos applications connectées.",
+ "mwoauth-acceptance-cancelled": "Vous avez choisi de ne pas autoriser « $1 » à accéder à votre compte. « $1 » ne fonctionnera pas à moins que vous lui en autorisiez l’accès. Vous pouvez revenir à « $1 » ou [[Special:OAuthManageMyGrants|gérer]] vos applications connectées.",
"mwoauth-granttype-normal": "Autorisation de requête pour des droits spécifiques.",
- "grant-mwoauth-authonly": "Pour la vérification de l'identité de l'utilisateur uniquement, pas possible de lire des pages ni d'agir pour le compte de l'utilisateur.",
- "grant-mwoauth-authonlyprivate": "Vérification de l’identité de l’utilisateur seulement avec accès à son vrai nom et à son adresse de messagerie, pas possible de lire des pages ni d’agir pour le compte de l’utilisateur.",
- "mwoauth-listgrants-extra-summary": "== Autorisations spécifiques à OAuth ==\n\nCes droits supplémentaires sont applicables aux consommateurs OAuth.",
- "mwoauth-oauth-exception": "Une erreur s’est produite dans le protocole OAuth : $1",
- "mwoauth-callback-not-oob": "oauth_callback doit être défini, et doit valoir \"oob\" (en minuscules)",
- "mwoauth-callback-not-oob-or-prefix": "oauth_callback doit être positionné, et doit être mis à « oob » (attention à la casse), ou le rappel configuré doit être un préfixe du rappel fourni.",
- "right-mwoauthproposeconsumer": "Proposer des nouveaux consommateurs OAuth",
- "right-mwoauthupdateownconsumer": "Mettre à jour les consommateurs OAuth",
+ "grant-mwoauth-authonly": "Pour la vérification de l’identité de l’utilisateur uniquement, sans possibilité de lire des pages ni d’agir au nom de l’utilisateur.",
+ "grant-mwoauth-authonlyprivate": "Vérification de l’identité de l’utilisateur seulement avec accès à son vrai nom et à son adresse de messagerie, sans possibilité de lire des pages ni d’agir au nom de l’utilisateur.",
+ "mwoauth-listgrants-extra-summary": "== Autorisations spécifiques à OAuth ==\n\nLes autorisations supplémentaires suivantes sont applicables aux consommateurs OAuth.",
+ "mwoauth-oauth-exception": "Une erreur s’est produite dans le protocole OAuth : $1",
+ "mwoauth-callback-not-oob": "Le rappel OAuth (oauth_callback) doit être positionné à « oob » (en minuscules).",
+ "mwoauth-callback-not-oob-or-prefix": "Le rappel OAuth (oauth_callback) doit être positionné à « oob » (en minuscules), ou bien le rappel configuré doit être un préfixe du rappel fourni.",
+ "right-mwoauthproposeconsumer": "Proposer de nouveaux consommateurs OAuth",
+ "right-mwoauthupdateownconsumer": "Mettre à jour les consommateurs OAuth que vous contrôlez",
"right-mwoauthmanageconsumer": "Gérer les consommateurs OAuth",
- "right-mwoauthsuppress": "Supprimer les consommateurs OAuth",
+ "right-mwoauthsuppress": "Supprimer des consommateurs OAuth",
"right-mwoauthviewsuppressed": "Afficher les consommateurs OAuth supprimés",
"right-mwoauthviewprivate": "Afficher les données privées OAuth",
- "right-mwoauthmanagemygrants": "Gérer les droits OAuth",
+ "right-mwoauthmanagemygrants": "Gérer les autorisations OAuth",
"action-mwoauthmanageconsumer": "gérer les consommateurs OAuth",
"action-mwoauthsuppress": "supprimer les consommateurs OAuth",
- "action-mwoauthmanagemygrants": "gérer vos droits OAuth",
+ "action-mwoauthmanagemygrants": "gérer vos autorisations OAuth",
"action-mwoauthproposeconsumer": "proposer de nouveaux consommateurs OAuth",
- "action-mwoauthupdateownconsumer": "mettre à jour les consommateurs OAuth",
+ "action-mwoauthupdateownconsumer": "mettre à jour les consommateurs OAuth que vous contrôlez",
"action-mwoauthviewprivate": "afficher les données OAuth privées",
"action-mwoauthviewsuppressed": "afficher les consommateurs OAuth supprimés",
"mwoauth-tag-reserved": "Les balises commençant par <code>OAuth CID:</code> sont réservées à une utilisation par OAuth.",
- "mwoauth-botpasswords-note": "<strong>Note :</strong> <span class=\"plainlinks\">[$1 OAuth]</span> est plus sécurisé que les mots de passe de robots et devrait être privilégié si le robot l’accepte.",
- "mwoauth-api-module-disabled": "Le module « $1 » n’est pas disponible avec OAuth.",
- "echo-category-title-oauth-owner": "Développement de OAuth",
+ "mwoauth-botpasswords-note": "<strong>Note :</strong> <span class=\"plainlinks\">[$1 OAuth]</span> est plus sécurisé que les mots de passe de robots et devrait être privilégié si le robot le prend en charge.",
+ "mwoauth-api-module-disabled": "Le module « $1 » n’est pas disponible avec OAuth.",
+ "echo-category-title-oauth-owner": "Développement d’OAuth",
"echo-pref-tooltip-oauth-owner": "M'informer sur les événements liés aux applications OAuth que j'ai créées.",
- "echo-category-title-oauth-admin": "Administrateur de OAuth",
+ "echo-category-title-oauth-admin": "Administrateur d’OAuth",
"echo-pref-tooltip-oauth-admin": "M'informer sur les événements liés à la revue des applications OAuth.",
- "notification-oauth-app-propose-title": "$1 {{GENDER:$1|a proposé}} une nouvelle application OAuth : $2",
- "notification-oauth-app-update-title": "$1 {{GENDER:$1|a actualisé}} l'application OAuth $2",
- "notification-oauth-app-approve-title": "$1 {{GENDER:$1|a approuvé}} {{GENDER:$3|votre}} application OAuth ($2)",
- "notification-oauth-app-reject-title": "$1 {{GENDER:$1|a rejeté}} {{GENDER:$3|votre}} application OAuth ($2)",
- "notification-oauth-app-disable-title": "$1 {{GENDER:$1|a invalidé}} {{GENDER:$3|votre}} application OAuth ($2)",
- "notification-oauth-app-reenable-title": "$1 {{GENDER:$1|a réactivé}} {{GENDER:$3|votre}} OAuth application ($2)",
- "notification-oauth-app-propose-subject": "$1 {{GENDER:$1|a proposé}} une nouvelle application OAuth sur {{SITENAME}}",
- "notification-oauth-app-update-subject": "$1 {{GENDER:$1|a mis à jour}} une application OAuth sur {{SITENAME}}",
- "notification-oauth-app-approve-subject": "$1 {{GENDER:$1|a approuvé}} {{GENDER:$3|votre}} application OAuth sur {{SITENAME}}",
- "notification-oauth-app-reject-subject": "$1 {{GENDER:$1|a rejeté}} {{GENDER:$3|votre}} application OAuth sur {{SITENAME}}",
- "notification-oauth-app-disable-subject": "$1 {{GENDER:$1|a désactivé}} {{GENDER:$3|votre}} application OAuth sur {{SITENAME}}",
- "notification-oauth-app-reenable-subject": "$1 {{GENDER:$1|a réactivé}} {{GENDER:$3|votre}} application OAuth sur {{SITENAME}}",
- "notification-oauth-app-propose-primary-link": "Révision de l'application",
- "notification-oauth-app-update-primary-link": "Revoir l'application",
- "notification-oauth-app-approve-primary-link": "Voir l'application",
- "notification-oauth-app-reject-primary-link": "Voir l'application",
- "notification-oauth-app-disable-primary-link": "Voir l'application",
- "notification-oauth-app-reenable-primary-link": "Voir l'application",
- "notification-oauth-app-body": "Raison : $1",
+ "notification-oauth-app-propose-title": "$1{{GENDER:$1|}} a proposé une nouvelle application OAuth : $2.",
+ "notification-oauth-app-update-title": "$1{{GENDER:$1|}} a mis à jour l’application OAuth $2.",
+ "notification-oauth-app-approve-title": "$1{{GENDER:$1|}} a approuvé votre{{GENDER:$3|}} application OAuth ($2).",
+ "notification-oauth-app-reject-title": "$1{{GENDER:$1|}} a rejeté votre{{GENDER:$3|}} application OAuth ($2).",
+ "notification-oauth-app-disable-title": "$1{{GENDER:$1|}} a désactivé votre{{GENDER:$3|}} application OAuth ($2).",
+ "notification-oauth-app-reenable-title": "$1{{GENDER:$1|}} a réactivé votre{{GENDER:$3|}} application OAuth ($2).",
+ "notification-oauth-app-propose-subject": "$1{{GENDER:$1|}} a proposé une nouvelle application OAuth sur {{SITENAME}}.",
+ "notification-oauth-app-update-subject": "$1{{GENDER:$1|}} a mis à jour une nouvelle application OAuth sur {{SITENAME}}.",
+ "notification-oauth-app-approve-subject": "$1{{GENDER:$1|}} a approuvé votre{{GENDER:$3|}} application OAuth sur {{SITENAME}}.",
+ "notification-oauth-app-reject-subject": "$1{{GENDER:$1|}} a rejeté votre{{GENDER:$3|}} application OAuth sur {{SITENAME}}.",
+ "notification-oauth-app-disable-subject": "$1{{GENDER:$1|}} a désactivé votre{{GENDER:$3|}} application OAuth sur {{SITENAME}}.",
+ "notification-oauth-app-reenable-subject": "$1{{GENDER:$1|}} a réactivé votre{{GENDER:$3|}} application OAuth sur {{SITENAME}}.",
+ "notification-oauth-app-propose-primary-link": "Passer en revue l’application",
+ "notification-oauth-app-update-primary-link": "Passer en revue l’application",
+ "notification-oauth-app-approve-primary-link": "Voir l’application",
+ "notification-oauth-app-reject-primary-link": "Voir l’application",
+ "notification-oauth-app-disable-primary-link": "Voir l’application",
+ "notification-oauth-app-reenable-primary-link": "Voir l’application",
+ "notification-oauth-app-body": "Motif : $1",
"mwoauth-oauth-version": "Version du protocole OAuth",
"mwoauth-oauth2-is-confidential": "Le client est confidentiel",
- "mwoauth-oauth2-is-confidential-help": "Un client confidentiel est une application qui peut conserver un mot de passe client confidentiel pour le reste du monde. Les clients non confidentiels sont moins sécurisés",
+ "mwoauth-oauth2-is-confidential-help": "Un client confidentiel est une application qui peut garder un mot de passe client confidentiel pour le reste du monde. Les clients non confidentiels sont moins sécurisés.",
"mwoauth-oauth2-granttypes": "Types d’autorisation OAuth2 autorisés",
"mwoauth-oauth2-granttype-auth-code": "Code d’autorisation",
"mwoauth-oauth2-granttype-refresh-token": "Rafraîchir le jeton",
"mwoauth-oauth2-granttype-client-credentials": "Certificats client",
- "mwoauth-oauth2-error-create-at-no-user-approval": "Impossible de créer un jeton d’accès, l’utilisateur n’a pas approuvé l’utilisation de ce jeton d’accès",
- "mwoauth-oauth2-error-user-approval-deny": "L’utilisateur a rejeté la requête de l’application client",
- "mwoauth-oauth-unsupported-version": "Ce point de terminaison n’est pas autorisé pour la version OAuth $1",
- "mwoauth-oauth2-error-unauthorized-scope": "Le périmètre « $1 » n’est pas autorisé pour cette application",
- "mwoauth-oauth2-error-owner-only-invalid-grant": "Les clients propriétaires seuls doivent être autorisés à utiliser client_credentials",
- "mwoauth-oauth2-unable-to-retrieve-access-token": "Impossible de récupérer le jeton d’accès : $1",
+ "mwoauth-oauth2-error-create-at-no-user-approval": "Impossible de créer un jeton d’accès, l’utilisateur n’a pas approuvé l’utilisation de ce jeton d’accès.",
+ "mwoauth-oauth2-error-user-approval-deny": "L’utilisateur a rejeté la requête de l’application cliente.",
+ "mwoauth-oauth-unsupported-version": "Ce point de terminaison n’est pas autorisé pour la version OAuth $1.",
+ "mwoauth-oauth2-error-unauthorized-scope": "La portée « $1 » n’est pas autorisée pour cette application.",
+ "mwoauth-oauth2-error-owner-only-invalid-grant": "Les clients réservés à leur propriétaire doivent être autorisés à utiliser les certificats du client (client_credentials).",
+ "mwoauth-oauth2-unable-to-retrieve-access-token": "Impossible de récupérer le jeton d’accès : $1",
"mwoauth-oauth2-error-server-error": "Le serveur d’autorisation a rencontré une condition inattendue qui l’a empêché d’achever la requête.",
- "mwoauth-oauth2-error-invalid-request": "Il manque un paramètre obligatoire pour la requête, ou une valeur de paramètre est non valide, ou un paramètre est répété ou mal construit.",
+ "mwoauth-oauth2-error-invalid-request": "Il manque un paramètre obligatoire pour la requête, ou bien une valeur de paramètre est non valide, ou encore un paramètre est répété ou mal formé.",
"mwoauth-oauth2-error-unauthorized-client": "Le client n’est pas autorisé à demander un code d’autorisation en utilisant cette méthode.",
"mwoauth-oauth2-error-access-denied": "Le propriétaire de la ressource ou le serveur d’autorisation a refusé la requête.",
- "mwoauth-oauth2-error-unsupported-response-type": "Le serveur d’autorisation ne supporte pas l’obtention d’un code d’autorisation en utilisant cette méthode.",
- "mwoauth-oauth2-error-invalid-scope": "Le périmètre demandé n’est pas valide, inconnu ou mal formé.",
+ "mwoauth-oauth2-error-unsupported-response-type": "Le serveur d’autorisation ne prend pas en charge l’obtention d’un code d’autorisation au moyen de cette méthode.",
+ "mwoauth-oauth2-error-invalid-scope": "La portée demandée n’est pas valide, ou bien est inconnue ou mal formée.",
"mwoauth-oauth2-error-temporarily-unavailable": "Le serveur d’autorisation est actuellement incapable de traiter la demande, du fait d’une surcharge temporaire ou d’une maintenance du serveur.",
- "mwoauth-oauth2-error-invalid-client": "L’authentification du client a échoué (par ex., client inconnu, pas d’authentification de client incluse, ou méthode d’authentification non supportée)",
- "mwoauth-oauth2-error-request-not-verified": "Essai de récupérer la propriété vérifiée avant de vérifier la requête",
+ "mwoauth-oauth2-error-invalid-client": "L’authentification du client a échoué (par ex., client inconnu, pas d’authentification de client incluse, ou méthode d’authentification non prise en charge).",
+ "mwoauth-oauth2-error-request-not-verified": "Tentative de récupération de la propriété vérifiée avant de vérifier la requête.",
"mwoauth-oauth2-invalid-access-token": "Jeton d’accès non valide",
- "mwoauth-consumer-access-no-user": "L’approbation du serveur doit être liée à un utilisateur valide, utilisateur avec ID 0 fourni",
+ "mwoauth-consumer-access-no-user": "L’approbation du consommateur doit être liée à un utilisateur valide, mais un utilisateur d’identifiant 0 a été fourni.",
"mwoauth-login-required-reason": "Vous devez vous connecter à votre compte {{SITENAME}} pour autoriser les applications à y accéder.",
- "mwoauthconsumer-consumer-view": "Voir ce client",
- "mwoauthconsumer-application-view": "Voir cette application"
+ "mwoauthconsumer-consumer-view": "Voir ce consommateur",
+ "mwoauthconsumer-application-view": "Voir cette application",
+ "grant-oauthmanageownclient": "Gérer vos clients OAuth",
+ "mwoauth-consumer-user-mismatch": "Vous ne pouvez effectuer aucune action sur les clients qui ne vous appartiennent pas.",
+ "mwoauth-consumer-deleted-error": "Vous ne pouvez effectuer aucune action sur les clients supprimés.",
+ "mwoauth-consumer-submit-error": "Une erreur s’est produite en enregistrant un consommateur."
}
diff --git a/OAuth/i18n/gl.json b/OAuth/i18n/gl.json
index f76967c1..5dac393f 100644
--- a/OAuth/i18n/gl.json
+++ b/OAuth/i18n/gl.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "ArenaL5",
"Banjo",
"Elisardojm",
"Fisterraeomar",
@@ -9,7 +10,7 @@
"Toliño"
]
},
- "mwoauth-desc": "Permite o uso do OAuth 1.0a para autorización de API",
+ "mwoauth-desc": "Permite o uso de OAuth 1.0a e OAuth 2.0 para autorización de API",
"mwoauth-verified": "Agora, esta aplicación ten permitido acceder a MediaWiki no seu nome.\n\nPara completar o proceso, achegue este valor de verificación á aplicación: '''$1'''",
"mwoauth-db-readonly": "A base de datos OAuth está pechada temporalmente. Por favor, probe de novo nuns minutos.",
"mwoauth-missing-field": "Falta o valor para o campo \"$1\"",
@@ -18,7 +19,7 @@
"mwoauth-field-hidden": "(esta información está agochada)",
"mwoauth-field-private": "(esta información é privada)",
"mwoauth-prefs-managegrants": "Aplicacións conectadas:",
- "mwoauth-prefs-managegrantslink": "Administrar $1 {{PLURAL:$1|aplicación conectada|aplicacións conectadas}}",
+ "mwoauth-prefs-managegrantslink": "Administrar {{PLURAL:$1|$1 aplicación conectada|$1 aplicacións conectadas|0=aplicacións conectadas}}",
"mwoauth-consumer-allwikis": "Todos os proxectos deste sitio",
"mwoauth-consumer-key": "Clave do consumidor:",
"mwoauth-consumer-name": "Nome da aplicación:",
@@ -68,12 +69,11 @@
"mwoauth-consumer-stage-suppressed": "suprimido",
"oauthconsumerregistration": "Rexistro de consumidor OAuth",
"mwoauthconsumerregistration-navigation": "Navegación:",
- "mwoauthconsumerregistration-propose": "Propoñer un novo consumidor",
"mwoauthconsumerregistration-list": "A miña lista de consumidores",
"mwoauthconsumerregistration-main": "Principal",
- "mwoauthconsumerregistration-propose-text": "Os desenvolvedores deben utilizar o formulario inferior para propoñer un novo consumidor OAuth (véxase a [//www.mediawiki.org/wiki/Extension:OAuth documentación da extensión] para atopar máis detalles). Despois de enviar este formulario, recibirá un pase que a súa aplicación usará para identificarse en MediaWiki. Un administrador de OAuth terá que aprobar a súa aplicación antes de poder ser autorizada por outros usuarios.\n\nAlgunhas recomendacións e observacións:\n* Intente utilizar as menos concesións posibles. Evite as concesións que non sexan realmente necesarias agora.\n* As versións son da forma \"maior.menor.lanzamento\" (os dous últimos son opcionais) e aumentan cando son necesarios cambios nas concesións.\n* Achegue unha clave RSA pública (en formato PEM) se fose posible; en caso contrario, haberá que utilizar un pase secreto (menos seguro).\n* Pode empregar o ID dun proxecto para restrinxir o consumidor a un único proxecto neste sitio (utilice \"*\" para todos os proxectos).",
+ "mwoauthconsumerregistration-propose-text": "Os desenvolvedores deben utilizar o formulario inferior para propoñer un novo consumidor OAuth (véxase a [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth documentación da extensión] para atopar máis detalles). Despois de enviar este formulario, recibirá un pase que a súa aplicación usará para identificarse en MediaWiki. Un administrador de OAuth terá que aprobar a súa aplicación antes de poder ser autorizada por outros usuarios.\n\nAlgunhas recomendacións e observacións:\n* Intente utilizar as menos concesións posibles. Evite as concesións que non sexan realmente necesarias agora.\n* As versións son da forma \"maior.menor.lanzamento\" (os dous últimos son opcionais) e aumentan cando son necesarios cambios nas concesións.\n* Achegue unha clave RSA pública (en formato PEM) se fose posible; en caso contrario, haberá que utilizar un pase secreto (menos seguro).\n* Pode empregar o ID dun proxecto para restrinxir o consumidor a un único proxecto neste sitio (utilice \"*\" para todos os proxectos).",
"mwoauthconsumerregistration-update-text": "Utilice o formulario inferior para actualizar aspectos dun consumidor OAuth que controle.\n\nTodos os valores que haxa aquí sobrescribirán os anteriores. Non deixe campos en branco a menos que queira limpar eses valores.",
- "mwoauthconsumerregistration-maintext": "Esta páxina está destinada a que os desenvolvedores propoñan e actualicen aplicacións de consumidores OAuth no rexistro do sitio.\n\nDesde aquí, pode:\n* [[Special:OAuthConsumerRegistration/propose|Solicitar un pase para un novo consumidor]].\n* [[Special:OAuthConsumerRegistration/list|Administrar os consumidores existentes]].\n\nPara obter máis información sobre OAuth, consulte a [//www.mediawiki.org/wiki/Extension:OAuth documentación da extensión].",
+ "mwoauthconsumerregistration-maintext": "Esta páxina está destinada a que os desenvolvedores propoñan e actualicen aplicacións de consumidores OAuth no rexistro do sitio.\n\nDesde aquí, pode:\n* [[Special:OAuthConsumerRegistration/propose|Solicitar un pase para un novo consumidor]].\n* [[Special:OAuthConsumerRegistration/list|Administrar os consumidores existentes]].\n\nPara obter máis información sobre OAuth, consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth documentación da extensión].",
"mwoauthconsumerregistration-propose-legend": "Nova aplicación de consumidores OAuth",
"mwoauthconsumerregistration-update-legend": "Actualizar a aplicación de consumidores OAuth",
"mwoauthconsumerregistration-propose-submit": "Propoñer o consumidor",
diff --git a/OAuth/i18n/he.json b/OAuth/i18n/he.json
index 9681936b..c545fbd9 100644
--- a/OAuth/i18n/he.json
+++ b/OAuth/i18n/he.json
@@ -10,6 +10,7 @@
"דולב"
]
},
+ "abusefilter-edit-builder-vars-oauth-consumer": "צרכן ה־OAuth ששימש לביצוע השינוי הזה",
"mwoauth-desc": "מאפשרת שימוש ב־OAuth 1.0a וב־OAuth 2.0 לאישור ב־API",
"mwoauth-nosubpage-explanation": "OAuth הוא מנגנון שמאפשר ליישומים חיצוניים לזהות משתמש {{SITENAME}} או לפעול בשמו, אחרי קבלת אישור מאותו המשתמש.\n\nכדי שהדף הזה יעשה משהו, נחוצים עוד פרמטרים. אם נשלחת הנה מיישום חיצוני, זה כנראה קרה בשל שגיאה ביישום; כדאי לך ליצור קשר עם היוצר שלה.",
"mwoauth-verified": "עכשיו היישום הזה מורשה להתחבר למדיה־ויקי בשמך.\n\nכדי להשלים את התהליך, יש לתת את ערך האימות הבא ליישום: '''$1'''",
@@ -17,8 +18,9 @@
"mwoauth-missing-field": "חסר ערך עבור שדה \"$1\"",
"mwoauth-invalid-field": "ערך לא תקין עבור שדה \"$1\"",
"mwoauth-invalid-field-generic": "סופק ערך לא תקין",
- "mwoauth-field-hidden": "(מידע זה מוסתר)",
- "mwoauth-field-private": "(מידע זה הוא פרטי)",
+ "mwoauth-invalid-field-oauth2GrantTypes": "יישומי OAuth 2 חייבים לציין לפחות סוג אחד של זיכיון",
+ "mwoauth-field-hidden": "(המידע הזה מוסתר)",
+ "mwoauth-field-private": "(המידע הזה פרטי)",
"mwoauth-prefs-managegrants": "יישומים מחוברים:",
"mwoauth-prefs-managegrantslink": "ניהול {{PLURAL:$1|היישום המחובר|$1 היישומים המחוברים|0=היישומים המחוברים}}",
"mwoauth-consumer-allwikis": "כל המיזמים באתר הזה",
@@ -34,6 +36,8 @@
"mwoauth-consumer-owner-only-help": "בחירת האפשרות הזאת תגרום לצרכן להיות מאושר אוטומטית וקביל לשימוש על־ידי $1. הוא לא יהיה שמיש על־ידי שום משתמש אחר, וזרימת האישור הרגילה לא תפעל. פעולות שתיעשינה באמצעות הצרכן הזה לא תתויגנה.",
"mwoauth-consumer-description": "תיאור היישום:",
"mwoauth-consumer-callbackurl": "כתובת מענה (callback) של OAuth:",
+ "mwoauth-consumer-callbackurl-help": "בניגוד ל־OAuth 1.0a, ה־URL הזה מותאם במדויק",
+ "mwoauth-consumer-callbackurl-warning": "(תווים כלליים בפתחה)",
"mwoauth-consumer-callbackisprefix": "לאפשר לצרכן להגדיר מענה (callback) בבקשות ולהשתמש בכתובת ה־\"callback\" לעיל בתור תחילית דרושה.",
"mwoauth-consumer-granttypes": "סוגי הזיכיונות המבוקשים:",
"mwoauth-consumer-grantsneeded": "זיכיונות מתאימים:",
@@ -57,8 +61,8 @@
"mwoauth-consumer-not-disabled": "הצרכן אינו כבוי כרגע",
"mwoauth-consumer-not-approved": "הצרכן לא מאושר (ייתכן שהוא כבוי)",
"mwoauth-missing-consumer-key": "לא ניתן מפתח צרכן",
- "mwoauth-invalid-consumer-key": "אין צרכן עם מפתח זה.",
- "mwoauth-invalid-access-token": "אין אסימון גישה עם המפתח.",
+ "mwoauth-invalid-consumer-key": "אין צרכן עם המפתח שניתן.",
+ "mwoauth-invalid-access-token": "אין אסימון גישה עם המפתח שניתן.",
"mwoauth-invalid-access-wrongwiki": "הצרכן יכול לשמש רק במיזם \"$1\".",
"mwoauth-consumer-conflict": "מישהו שינה את המאפיינים של הצרכן הזה בזמן שצפית בו. נא לנסות שוב. אפשר לבדוק את יומן השינויים.",
"mwoauth-consumer-grantshelp": "כל זיכיון נותן גישה להרשאות המשתמש הרשומות שכבר ניתנו לחשבון משתמש. ר' את הדף [[Special:ListGrants|טבלת הזיכיונות]] למידע נוסף.",
@@ -70,12 +74,15 @@
"mwoauth-consumer-stage-suppressed": "מועלם",
"oauthconsumerregistration": "רישום צרכן OAuth",
"mwoauthconsumerregistration-navigation": "ניווט:",
- "mwoauthconsumerregistration-propose": "הצעת צרכן חדש",
+ "mwoauthconsumerregistration-propose-oauth1a": "הצעת צרכן OAuth 1.0a חדש",
+ "mwoauthconsumerregistration-propose-oauth2": "הצעת לקוח OAuth 2.0 חדש",
"mwoauthconsumerregistration-list": "רשימת הצרכנים שלי",
"mwoauthconsumerregistration-main": "ראשי",
- "mwoauthconsumerregistration-propose-text": "המפתחים צריכים להשתמש בטופס להלן כדי להציע צרכן OAuth חדש (ר' את [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth תיעוד ההרחבה] לפרטים נוספים). אחרי שליחת הטופס הזה יישלח אליך אסימון שהיישום שלך ישתמש בו כדי להזדהות בפני מדיה־ויקי. מנהל OAuth יצטרך לאשר את הפנייה שלך לפני שהיא תאושר על־ידי משתמשים אחרים.\n\nמספר עצות והערות:\n* מומלץ להשתמש בכמה שפחות זיכיונות. מומלץ להימנע שאינם נחוצים כעת.\n* הגרסאות נכתבות בצורה \"major.minor.release\" (לא חובה לכתוב את שני החלקים האחרונים) ועולים בכל פעם שהזיכיונות משתנים.\n* נא לספק מפתח RSA ציבורי (בתסדיר PEM) אם אפשר; אחרת ישמש אסימון סודי אחור (מאובטח פחות).\n* באפשרותך להשתמש במזהה מיזם כדי להגביל את הצרכן למיזם אחד באתר הזה (אפשר להשתמש ב־\"*\" לכל המיזמים).",
+ "mwoauthconsumerregistration-propose-text": "באפשרותך:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|להציע צרכן OAuth 1.0a]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|להציע לקוח OAuth 2.0]].",
+ "mwoauthconsumerregistration-propose-text-oauth1a": "המפתחים צריכים להשתמש בטופס להלן כדי להציע צרכן OAuth 1.0a חדש (ר' את [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth תיעוד ההרחבה] לפרטים נוספים). אחרי שליחת הטופס הזה יישלח אליך אסימון שהיישום שלך ישתמש בו כדי להזדהות בפני מדיה־ויקי. מנהל OAuth יצטרך לאשר את הפנייה שלך לפני שהיא תאושר על־ידי משתמשים אחרים.\n\nכמה המלצות והערות:\n* מומלץ להשתמש בכמה שפחות זיכיונות. כדאי להימנע מזיכיונות שאינם נחוצים כעת.\n* הגרסאות נכתבות בצורה \"major.minor.release\" (לא חובה לכתוב את שני החלקים האחרונים) ועולים בכל פעם שהזיכיונות משתנים.\n* נא לספק מפתח RSA ציבורי (בתסדיר PEM) אם אפשר; אחרת יהיה צורך להשתמש באסימון סודי (מאובטח פחות).\n* באפשרותך להשתמש במזהה מיזם כדי להגביל את הצרכן למיזם אחד באתר הזה (אפשר להשתמש ב־\"*\" לכל המיזמים).",
+ "mwoauthconsumerregistration-propose-text-oauth2": "המפתחים צריכים להשתמש בטופס להלן כדי לבקש לקוח OAuth 2.0 חדש (ר' את [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth תיעוד ההרחבה] לפרטים נוספים). אחרי שליחת הטופס הזה יישלח אליך אסימון שהיישום שלך ישתמש בו כדי להזדהות בפני מדיה־ויקי. מנהל OAuth יצטרך לאשר את הפנייה שלך לפני שהיא תאושר על־ידי משתמשים אחרים.\n\nכמה המלצות והערות:\n* מומלץ להשתמש בכמה שפחות טווחים. כדאי להימנע מטווחים שאינם נחוצים כעת.\n* הגרסאות נכתבות בצורה \"major.minor.release\" (לא חובה לכתוב את שני החלקים האחרונים) ועולים בכל פעם שנדרשים שינויים בטווחים.\n* באפשרותך להשתמש במזהה מיזם כדי להגביל את הצרכן למיזם אחד באתר הזה (אפשר להשתמש ב־\"*\" לכל המיזמים).",
"mwoauthconsumerregistration-update-text": "השתמשו בטופס שלהלן כדי לעדכן את פרטי צרכן OAuth.\n\nכל הערכים כאן יחליפו את כל הקודמים. אין להשאיר שדות ריקים אלא אם כן אתם מתכוונים לנקות את הערכים האלה.",
- "mwoauthconsumerregistration-maintext": "הדף הזה מאפשר למפתחים להציע ולעדכן יישומים שיהיו צרכני OAuth ברישום של האתר הזה.\n\nמכאן אפשר:\n* [[Special:OAuthConsumerRegistration/propose|לבקש אסימון בשביל צרכן חדש]].\n* [[Special:OAuthConsumerRegistration/list|לנהל את הצרכנים הנוכחיים שלך]].\n\nלמידע נוסף על OAuth, נא לראות את [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth התיעוד של ההרחבה].",
+ "mwoauthconsumerregistration-maintext": "הדף הזה מאפשר למפתחים להציע ולעדכן יישומים שיהיו צרכני OAuth ברישום של האתר הזה.\n\nמכאן אפשר:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|לבקש אסימון בשביל צרכן OAuth 1.0a חדש]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|לבקש אסימון בשביל לקוח OAuth 2 חדש]].\n* [[Special:OAuthConsumerRegistration/list|לנהל את הצרכנים הנוכחיים שלך]].\n\nלמידע נוסף על OAuth, נא לקרוא את [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth התיעוד של ההרחבה].",
"mwoauthconsumerregistration-propose-legend": "יישום צרכן OAuth חדש",
"mwoauthconsumerregistration-update-legend": "עדכון יישום צרכן OAuth",
"mwoauthconsumerregistration-propose-submit": "הצעת צרכן",
@@ -99,7 +106,7 @@
"mwoauthconsumerregistration-secretreset-owner-only-oauth2": "אסימון לקוח ה־OAuth 2.0 שלך אותחלו. האסימונים החדשים הם:\n; מפתח יישום לקוח: $1\n; סוד יישום לקוח: $2\n; אסימון גישה: $3\n;<em>נא לשמור אותך לבדיקה בעתיד.</em>",
"mwoauthconsumerregistration-need-emailconfirmed": "יש לאשר את כתובת הדוא\"ל לפני יצירת יישומי OAuth.\nנא להגדיר ולאשר את כתובת הדוא\"ל שלך דרך [[Special:Preferences|העדפות המשתמש]] שלך.",
"oauthmanageconsumers": "ניהול צרכני OAuth",
- "mwoauthmanageconsumers-notloggedin": "עליכם להיות מחוברים כדי לגשת לדף זה.",
+ "mwoauthmanageconsumers-notloggedin": "חובה להתחבר לחשבון כדי לגשת לדף הזה.",
"mwoauthmanageconsumers-type": "תורים:",
"mwoauthmanageconsumers-showproposed": "בקשות שהוצעו",
"mwoauthmanageconsumers-showrejected": "בקשות דחויות",
@@ -118,11 +125,11 @@
"mwoauthmanageconsumers-lists": "נא לבחור מצב צרכן מתוך רשימה להלן:",
"mwoauthmanageconsumers-l-approved": "רשימת הצרכנים מאושרים",
"mwoauthmanageconsumers-l-disabled": "רשימת הצרכנים הכבויים",
- "mwoauthmanageconsumers-none-proposed": "אין צרכנים ברשימה זו.",
- "mwoauthmanageconsumers-none-rejected": "אין צרכנים ברשימה זו.",
- "mwoauthmanageconsumers-none-expired": "אין צרכנים ברשימה זו.",
- "mwoauthmanageconsumers-none-approved": "אין צרכנים בקטגוריה זו.",
- "mwoauthmanageconsumers-none-disabled": "אין צרכנים בקטגוריה זו.",
+ "mwoauthmanageconsumers-none-proposed": "אין צרכנים מוצעים ברשימה הזאת.",
+ "mwoauthmanageconsumers-none-rejected": "אין צרכנים מוצעים ברשימה הזאת.",
+ "mwoauthmanageconsumers-none-expired": "אין צרכנים מוצעים ברשימה הזאת.",
+ "mwoauthmanageconsumers-none-approved": "אין צרכנים שמתאימים לתנאים האלה.",
+ "mwoauthmanageconsumers-none-disabled": "אין צרכנים שמתאימים לתנאים האלה.",
"mwoauthmanageconsumers-name": "צרכן",
"mwoauthmanageconsumers-user": "מפרסם",
"mwoauthmanageconsumers-description": "תיאור",
@@ -130,7 +137,7 @@
"mwoauthmanageconsumers-consumerkey": "מפתח צרכן",
"mwoauthmanageconsumers-lastchange": "שינוי אחרון",
"mwoauthmanageconsumers-review": "סקירה/ניהול",
- "mwoauthmanageconsumers-confirm-text": "טופס זה מיועד לאשר, לדחות, לכבות, או להפעיל מחדש את הצרכן הזה.",
+ "mwoauthmanageconsumers-confirm-text": "אפשר להשתמש בטופס הזה כדי לאשר, לדחות, לכבות, או להפעיל מחדש את הצרכן הזה.",
"mwoauthmanageconsumers-confirm-legend": "ניהול צרכן OAuth",
"mwoauthmanageconsumers-action": "שינוי מצב:",
"mwoauthmanageconsumers-approve": "מאושר",
@@ -171,9 +178,9 @@
"mwoauthlistconsumers-update-link": "עדכון צרכן",
"mwoauthlistconsumers-manage-link": "ניהול צרכן",
"mwoauthlistconsumers-grants-link": "ניהול זיכיונות",
- "mwoauthlistconsumers-rclink": "שינויים אחרונים שנעשו על־די היישום הזה",
+ "mwoauthlistconsumers-rclink": "שינויים אחרונים שנעשו על־ידי היישום הזה",
"oauthmanagemygrants": "ניהול יישומים מחוברים",
- "mwoauthmanagemygrants-text": "בדף הזה נמצאת רשימה של כל היישומים שיכולים להשתמש בחשבון שלך. לכל יישום כזה טווח הגישה מוגבל בהרשאות שנתת לו כאשר אישרת לו לפעול בשמך. אם נתת אישור נפרד ליישום לגשת בשמך למיזמים אחרים, תראה את ההגדרות הנפרדות לכל מיזם כזה להלן.\n\nהיישומים המחוברים ניגשים לחשבון שלך באמצעות פרוטוקול OAuth. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth מידע נוסף על יישומים מחוברים])</span>",
+ "mwoauthmanagemygrants-text": "הדף הזה מציג רשימה של כל היישומים שיכולים להשתמש בחשבון שלך. לכל יישום כזה טווח הגישה מוגבל בהרשאות שנתת לו כאשר אישרת לו לפעול בשמך. אם נתת אישור נפרד ליישום לגשת בשמך למיזמים אחרים, תראה את ההגדרות הנפרדות לכל מיזם כזה להלן.\n\nהיישומים המחוברים ניגשים לחשבון שלך באמצעות פרוטוקול OAuth. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth מידע נוסף על יישומים מחוברים])</span>",
"mwoauthmanagemygrants-navigation": "ניווט:",
"mwoauthmanagemygrants-showlist": "רשימת היישומים המחוברים",
"mwoauthmanagemygrants-none": "לא מחובר שום יישום לחשבון שלך.",
@@ -216,11 +223,11 @@
"log-action-filter-mwoauthconsumer-update": "עדכון צרכן OAuth",
"mwoauthconsumer-consumer-logpage": "יומן צרכן OAuth",
"mwoauthconsumer-consumer-logpagetext": "יומן של אישורים, שלילות וכיבויים של צרכני OAuth רשומים.",
- "mwoauth-bad-request-missing-params": "סליחה, משהו השתבש עם הגדרות היישום המחובר. <span class=\"plainlinks\">[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth נא ליצור קשר עם התמיכה]</span> כדי לקבל עזרה בתיקון.\n\n<span class=\"plainlinks mw-mwoautherror-details\">חסרים פרמטרים ל־OAuth‏, $1</span>",
- "mwoauth-bad-request-invalid-action": "סליחה, משהו השתבש ויש ליצור קשר עם יוצר היישום כדי לקבל עזרה עם זה.\n\n<span class=\"plainlinks mw-mwoautherror-details\">כתובת בלתי ידועה, $1</span>",
- "mwoauth-bad-request-invalid-action-contact": "סליחה, משהו השתבש. יש [$1 ליצור קשר] עם יוצר היישום כדי לקבל עזרה עם זה.\n\n<span class=\"plainlinks mw-mwoautherror-details\">כתובת לא ידועה, $2</span>",
+ "mwoauth-bad-request-missing-params": "מצטערים, משהו השתבש עם הגדרות היישום המחובר. נא ליצור קשר עם מפתח היישום.\n\n<span class=\"plainlinks mw-mwoautherror-details\">חסרים פרמטרים ל־OAuth‏, $1</span>",
+ "mwoauth-bad-request-invalid-action": "מצטערים, משהו השתבש ועליך ליצור קשר עם יוצר היישום כדי לקבל עזרה עם זה.\n\n<span class=\"plainlinks mw-mwoautherror-details\">כתובת בלתי־ידועה, $1</span>",
+ "mwoauth-bad-request-invalid-action-contact": "מצטערים, משהו השתבש. עליך [$1 ליצור קשר] עם יוצר היישום כדי לקבל עזרה עם זה.\n\n<span class=\"plainlinks mw-mwoautherror-details\">כתובת URL לא ידועה, $2</span>",
"mwoauthdatastore-access-token-not-found": "לא נמצא שום זיכיון מאושר עבור אסימון האישור הזה.",
- "mwoauthdatastore-request-token-not-found": "סליחה, משהו השתבש עם היישום הזה.\nנא לחזור ולנסות להתחבר שוב לחשבונך או ליצור קשר עם יוצר היישום.\n\n<span class=\"plainlinks mw-mwoautherror-details\">לא נמצא אסימון OAuth‏, $1</span>",
+ "mwoauthdatastore-request-token-not-found": "מצטערים, משהו השתבש עם חיבור היישום הזה.\nנא לחזור ולנסות להתחבר שוב לחשבונך או ליצור קשר עם יוצר היישום.\n\n<span class=\"plainlinks mw-mwoautherror-details\">לא נמצא אסימון OAuth‏, $1</span>",
"mwoauthdatastore-callback-not-found": "הכתובת של מענה (callback) של OAuth לא נמצאה במטמון. זאת כנראה שגיאה בצורה שבה היישום שולח בקשות לשרת.",
"mwoauthdatastore-request-token-already-used": "הבקשה כבר הושלמה ולא ניתן לשלוח אותה מחדש.\nנא לחזור ליישום ולנסות להתחבר עם החשבון שלך שוב, או ליצור קשר עם מחבר היישום.\n\n<span class=\"plainlinks mw-mwoautherror-details\">אסימון OAuth כבר היה בשימוש, $1</span>",
"mwoauthdatastore-bad-token": "לא נמצא אסימון מתאים לבקשתך.",
@@ -229,11 +236,11 @@
"mwoauthdatastore-invalid-token-type": "האסימון המבוקש אינו תקין.",
"mwoauthgrants-general-error": "אירעה שגיאה בבקשת OAuth.",
"mwoauthserver-bad-consumer": "\"$1\" אינו נתמך בתור יישום מחובר. נא [$2 ליצור קשר] עם מחבר היישום כדי לקבל עזרה.\n\n<span class=\"plainlinks mw-mwoautherror-details\">יישום ה־OAuth אינו מאושר, $3</span>",
- "mwoauthserver-bad-consumer-key": "סליחה, משהו השתבש עם היישום הזה.\n\n<span class=\"plainlinks mw-mwoautherror-details\">מפתח OAuth לא ידוע, $1</span>",
+ "mwoauthserver-bad-consumer-key": "מצטערים, משהו השתבש עם חיבור היישום הזה.\n\n<span class=\"plainlinks mw-mwoautherror-details\">מפתח OAuth לא ידוע, $1</span>",
"mwoauthserver-insufficient-rights": "לחשבון שלך אין אישור להשתמש ביישומים מחוברים. נא ליצור קשר עם מנהל האתר שלך כדי להבין למה.\n\n<span class=\"plainlinks mw-mwoautherror-details\">הרשאות משתמש OAuth לא מספיקות, $1</span>",
"mwoauthserver-invalid-request-token": "אסימון לא תקין בבקשתך.",
"mwoauthserver-invalid-user": "כדי להשתמש ביישומים מחוברים באתר הזה, צריך להיות לך חשבון בכל המיזמים. כאשר יהיה לך חשבון בכל המיזמים, אפשר לנסות לחבר את \"$1\" שוב.\n\n<span class=\"plainlinks mw-mwoautherror-details\">דרושה כניסה מאוחדת, $2</span>",
- "mwoauthserver-consumer-no-secret": "סליחה, משהו השתבש בעת ההתחברות עם היישום הזה.\n\n<span class=\"plainlinks mw-mwoautherror-details\">לצרכן אין מפתח סודי, $1</span>",
+ "mwoauthserver-consumer-no-secret": "מצטערים, משהו השתבש עם חיבור היישום הזה.\n\n<span class=\"plainlinks mw-mwoautherror-details\">לצרכן אין מפתח סודי, $1</span>",
"mwoauthserver-consumer-owner-only": "\"$1\" הוא יישום מחובר לבעלים בלבד. כדי לאחזר את אסימון הגישה, ר' [[$2]].\n\n<span class=\"plainlinks mw-mwoautherror-details\">צרכן לבעלים בלבד, $3</span>",
"mwoauth-invalid-authorization-title": "שגיאת אימות OAuth",
"mwoauth-invalid-authorization": "כותרות האישור בבקשה שלך אינן תקניות: $1",
@@ -253,9 +260,10 @@
"mwoauth-form-button-approve": "לאפשר",
"mwoauth-form-button-cancel": "ביטול",
"mwoauth-error": "שגיאה בחיבור היישום",
+ "mwoauth-error-missing-callback-url-non-owner": "נדרש callback_url עבור לקוחות non-owner-only",
"mwoauth-grants-heading": "הרשאות מבוקשות:",
"mwoauth-grants-nogrants": "היישום לא ביקש שום הרשאות.",
- "mwoauth-acceptance-cancelled": "בחרת לא לאפשר ל{{GRAMMAR:תחילית|$1}} לגשת לחשבון שלך. $1 לא יעבוד אלא אם כן תיתן לו גישה. ניתן לחזור על $1 או [[Special:OAuthManageMyGrants|לנהל]] את היישומים המחוברים שלך.",
+ "mwoauth-acceptance-cancelled": "בחרת לא לאפשר לצרכן \"$1\" לגשת לחשבון שלך. \"$1\" לא יעבוד אלא אם כן תיתן לו גישה. ניתן לחזור על \"$1\" או [[Special:OAuthManageMyGrants|לנהל]] את היישומים המחוברים שלך.",
"mwoauth-granttype-normal": "בקשת אישור להרשאות מסוימות.",
"grant-mwoauth-authonly": "רק בדיקת זהות משתמש, ללא יכולת לקרוא דפים או לפעול בשם המשתמש.",
"grant-mwoauth-authonlyprivate": "רק בדיקת זהות משתמש עם גישה לשם אמיתי וכתובת דוא\"ל, ללא יכולת לקרוא דפים או לפעול בשם המשתמש.",
@@ -329,5 +337,9 @@
"mwoauth-consumer-access-no-user": "אישור לקוח צריך להיות משויך למשתמש תקין, ניתן משתמש עם מזהה 0",
"mwoauth-login-required-reason": "עליך להיכנס לחשבון שלך באתר {{SITENAME}} כדי לאשר ליישומים לגשת אליו.",
"mwoauthconsumer-consumer-view": "הצגת הצרכן הזה",
- "mwoauthconsumer-application-view": "הצגת היישום הזה"
+ "mwoauthconsumer-application-view": "הצגת היישום הזה",
+ "grant-oauthmanageownclient": "ניהול לקוחות ה־OAuth שלך",
+ "mwoauth-consumer-user-mismatch": "אין לך אפשר לבצע פעולות על לקוחות שאינם שייכים לך",
+ "mwoauth-consumer-deleted-error": "אין לך אפשרות לבצע בעולם על לקוחות מחוקים",
+ "mwoauth-consumer-submit-error": "אירעה שגיאה בעת שמירת צרכן"
}
diff --git a/OAuth/i18n/hi.json b/OAuth/i18n/hi.json
index 5fc7c81a..7ec5465d 100644
--- a/OAuth/i18n/hi.json
+++ b/OAuth/i18n/hi.json
@@ -1,10 +1,14 @@
{
"@metadata": {
"authors": [
+ "Saurmandal",
"राम प्रसाद जोशी",
"संजीव कुमार"
]
},
+ "mwoauth-prefs-managegrants": "जोड़े गए ऐप्स:",
+ "mwoauth-prefs-managegrantslink": "जुड़े हुए {{PLURAL:$1|$1 ऐप|$1 ऐप्स|0=ऐप्स}} को प्रबंधित करें",
"mwoauth-consumer-email-unconfirmed": "आप के खाता पर इमेल पता प्रमाणित नही है।",
- "mwoauthdatastore-bad-source-ip": "यह अनुरोध एक अवैध आईपी पते से आया है।"
+ "mwoauthdatastore-bad-source-ip": "यह अनुरोध एक अवैध आईपी पते से आया है।",
+ "echo-category-title-oauth-owner": "OAuth विकास"
}
diff --git a/OAuth/i18n/hr.json b/OAuth/i18n/hr.json
index 01da8959..8548b0d3 100644
--- a/OAuth/i18n/hr.json
+++ b/OAuth/i18n/hr.json
@@ -6,11 +6,12 @@
"Excaliboor",
"MaGa",
"Neptune, the Mystic",
+ "Ponor",
"Vlad5250"
]
},
"mwoauth-desc": "Omogućuje upotrebu OAuth 1.0a i OAuth 2.0 za autorizaciju API-ja",
- "mwoauth-verified": "Aplikaciji je dopušten pristup MediaWikiju u vaše ime.\n\nDa biste dovršili postupak, navedite kontrolnu vrijednost aplikacije: '''$1'''",
+ "mwoauth-verified": "Aplikaciji je sada dopušten pristup MediaWikiju u Vaše ime.\n\nDa biste dovršili postupak, u aplikaciji unesite sljedeću kontrolnu vrijednost: '''$1'''",
"mwoauth-db-readonly": "Baza podataka OAuth privremeno je zaključana. Pokušajte ponovo za nekoliko minuta.",
"mwoauth-missing-field": "Nedostaje vrijednost u polju »$1«",
"mwoauth-invalid-field": "U polju »$1« dana je nevažeća vrijednost",
@@ -41,6 +42,7 @@
"mwoauth-consumer-restrictions-json": "Ograničenja upotrebe (JSON):",
"mwoauth-consumer-rsakey": "Javni RSA ključ (nije obavezno):",
"mwoauth-consumer-rsakey-help": "Unesite javni ključ za upotrebu metode potpisa RSA-SHA1. Ostavite ga praznim da biste koristili proizvoljnu tajnu HMAC-SHA1. Ako niste sigurni, ostavite prazno.",
+ "mwoauth-consumer-accesstoken": "Pristupni tajni ključ:",
"mwoauth-consumer-reason": "Razlog:",
"mwoauth-consumer-email-unconfirmed": "Vaša adresa e-pošte još nije potvrđena.",
"mwoauth-consumer-email-mismatched": "Navedena e-pošta mora odgovarati onoj na Vašem računu.",
@@ -55,9 +57,14 @@
"mwoauth-invalid-access-wrongwiki": "Korisnik može biti korišten samo na projektu »$1«.",
"mwoauth-consumer-conflict": "Za vrijeme pregledavanja netko je promijenio atribute ovog korisnika. Pokušajte ponovno. Možete pogledati dnevnik promjena.",
"mwoauth-consumer-grantshelp": "Svaka dozvola daje pristup navedenim suradničkim pravima koja su već dodijeljena suradničkom računu. Za više informacija vidi [[Special:ListGrants|tablicu dozvola]].",
+ "mwoauth-consumer-stage-proposed": "predloženo",
+ "mwoauth-consumer-stage-rejected": "odbijeno",
+ "mwoauth-consumer-stage-expired": "isteklo",
+ "mwoauth-consumer-stage-approved": "odobreno",
+ "mwoauth-consumer-stage-disabled": "onemogućeno",
+ "mwoauth-consumer-stage-suppressed": "skriveno",
"oauthconsumerregistration": "Registracija trošača OAutha",
"mwoauthconsumerregistration-navigation": "Orijentacija:",
- "mwoauthconsumerregistration-propose": "Predložite novog korisnika",
"mwoauthconsumerregistration-list": "Popis mojih korisnika",
"mwoauthconsumerregistration-main": "Glavna",
"mwoauthconsumerregistration-update-text": "Donji obrazac služi za promjenu aspekata OAuth trošača koga kontrolirate.\n\nSve ovdje navedene vrijednosti bit će prepisane preko postojećih. Ne ostavljajte prazna polja, osim ako ne želite izbrisati njihove vrijednosti.",
@@ -78,6 +85,14 @@
"mwoauthconsumerregistration-need-emailconfirmed": "Morate potvrditi Vašu adresu e-pošte prije stvaranja OAuth aplikacija.\nMolimo unesite i ovjerite Vašu adresu e-pošte u [[Special:Preferences|suradničkim postavkama]].",
"oauthmanageconsumers": "Upravljanje korisnicima OAutha",
"mwoauthmanageconsumers-notloggedin": "Da biste otvorili ovu stranicu, morate biti prijavljeni.",
+ "mwoauthmanageconsumers-showproposed": "Predloženi zahtjevi",
+ "mwoauthmanageconsumers-showrejected": "Odbijeni zahtjevi",
+ "mwoauthmanageconsumers-showexpired": "Istekli zahtjevi",
+ "mwoauthmanageconsumers-linkproposed": "Predloženi zahtjevi",
+ "mwoauthmanageconsumers-linkrejected": "odbijeni zahtjevi",
+ "mwoauthmanageconsumers-linkexpired": "istekli zahtjevi",
+ "mwoauthmanageconsumers-linkapproved": "odobreni zahtjevi",
+ "mwoauthmanageconsumers-linkdisabled": "onemogućeni zahtjevi",
"mwoauthmanageconsumers-main": "Glavna",
"mwoauthmanageconsumers-maintext": "Ova je stranica predviđena za rad sa zahtjevima suradničkih OAuth aplikacija (vidi http://oauth.net) i upravljanje postojećim korisnicima.",
"mwoauthmanageconsumers-queues": "Niže odaberite red korisnika za odobrenje:",
@@ -121,6 +136,12 @@
"mwoauthlistconsumers-basicgrantsonly": "(samo osnovni pristup)",
"mwoauthlistconsumers-status": "Status",
"mwoauth-consumer-stage-any": "bilo koji",
+ "mwoauthlistconsumers-status-proposed": "predloženo",
+ "mwoauthlistconsumers-status-approved": "odobreno",
+ "mwoauthlistconsumers-status-disabled": "onemogućeno",
+ "mwoauthlistconsumers-status-rejected": "odbijeno",
+ "mwoauthlistconsumers-status-expired": "isteklo",
+ "mwoauthlistconsumers-navigation": "Orijentacija:",
"mwoauthlistconsumers-rclink": "Nedavne promjene ovom aplikacijom",
"oauthmanagemygrants": "Upravljanje povezanim aplikacijama",
"mwoauthmanagemygrants-text": "Ovo je popis svih aplikacija koje možete koristiti s Vašim suradničkim računom. Opseg djelovanja svake aplikacije ograničen je dopuštenjima koja odobrite prilikom autorizacije. Ukoliko posebno definirate dopuštenja za svaki sestrinski projekt, vidjet ćete posebne konfiguracije za svaki projekt.\n\nPovezane aplikacije pristupaju Vašem suradničkom računu putem protokola OAuth. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Saznajte više o povezanim aplikacijama])</span>",
@@ -197,6 +218,7 @@
"notification-oauth-app-disable-primary-link": "Vidi aplikaciju",
"notification-oauth-app-reenable-primary-link": "Vidi aplikaciju",
"notification-oauth-app-body": "Razlog: $1",
+ "mwoauth-oauth-version": "Inačica OAuth protokola",
"mwoauth-oauth2-invalid-access-token": "Pristupni tajni ključ nije valjan",
"mwoauthconsumer-consumer-view": "Prikaži ovoga trošača"
}
diff --git a/OAuth/i18n/ht.json b/OAuth/i18n/ht.json
deleted file mode 100644
index 7b50f58d..00000000
--- a/OAuth/i18n/ht.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "@metadata": {
- "authors": [
- "Tisave"
- ]
- },
- "mwoauth-grant-viewdeleted": "Gade fichye ak paj ki efase yo"
-}
diff --git a/OAuth/i18n/hu.json b/OAuth/i18n/hu.json
index 65940940..009be9e5 100644
--- a/OAuth/i18n/hu.json
+++ b/OAuth/i18n/hu.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Adam78",
"Bencemac",
"Csega",
"Dorgan",
@@ -27,14 +28,15 @@
"mwoauth-consumer-granttypes": "Kért jogosultságok típusai:",
"mwoauth-consumer-grantsneeded": "Alkalmazás engedélyei:",
"mwoauth-consumer-wiki-thiswiki": "Jelenlegi projekt ($1)",
- "mwoauth-consumer-rsakey": "Nyilvános RSA kulcs:",
+ "mwoauth-consumer-rsakey": "Nyilvános RSA-kulcs (nem kötelező):",
"mwoauth-consumer-reason": "Ok:",
- "mwoauth-consumer-email-unconfirmed": "A fiókodhoz tartozó e-mail címet még nem erősítetted meg.",
- "mwoauth-consumer-email-mismatched": "A megadott e-mail címnek azonosnak kell lennie a fiókodhoz tartozóval.",
+ "mwoauth-consumer-email-unconfirmed": "A fiókodhoz tartozó e-mail-címet még nem erősítetted meg.",
+ "mwoauth-consumer-email-mismatched": "A megadott e-mail-címnek azonosnak kell lennie a fiókodhoz tartozóval.",
+ "mwoauth-consumer-grantshelp": "Mindegyik jogosultság olyan felsorolt felhasználói jogokhoz ad hozzáférést, amelyekkel egy felhasználói fiók már rendelkezik. További információkhoz lásd [[Special:ListGrants|a jogosultságok táblázatát]].",
"mwoauth-consumer-stage-proposed": "javasolt",
- "mwoauth-consumer-stage-rejected": "visszadobott",
+ "mwoauth-consumer-stage-rejected": "elutasított",
"mwoauth-consumer-stage-expired": "lejárt",
- "mwoauth-consumer-stage-approved": "ellenőrzött",
+ "mwoauth-consumer-stage-approved": "jóváhagyott",
"mwoauth-consumer-stage-disabled": "letiltott",
"mwoauth-consumer-stage-suppressed": "elrejtett",
"mwoauthconsumerregistration-navigation": "Navigáció:",
@@ -50,30 +52,45 @@
"mwoauthmanageconsumers-email": "Kapcsolattartási e-mail",
"mwoauthmanageconsumers-lastchange": "Utolsó változtatás",
"mwoauthmanageconsumers-action": "Állapot módosítása:",
- "mwoauthmanageconsumers-approve": "Ellenőrzött",
- "oauthlistconsumers": "OAuth alkalmazások listája",
- "mwoauthlistconsumers-legend": "OAuth alkalmazások böngészése",
+ "mwoauthmanageconsumers-approve": "Jóváhagyott",
+ "oauthlistconsumers": "OAuth-alkalmazások listája",
+ "mwoauthlistconsumers-legend": "OAuth-alkalmazások böngészése",
+ "mwoauthlistconsumers-user": "Közzétevő",
"mwoauthlistconsumers-description": "Leírás",
+ "mwoauthlistconsumers-grants": "Elérhető jogosultságok",
"mwoauthlistconsumers-basicgrantsonly": "(csak alapvető hozzáférés)",
- "mwoauthlistconsumers-status-approved": "ellenőrzött",
- "mwoauthlistconsumers-status-rejected": "visszadobott",
+ "mwoauthlistconsumers-status-approved": "jóváhagyott",
+ "mwoauthlistconsumers-status-rejected": "elutasított",
+ "mwoauthlistconsumers-grants-link": "Jogosultságok kezelése",
"oauthmanagemygrants": "Összekapcsolt alkalmazások kezelése",
+ "mwoauthmanagemygrants-text": "Ezen az oldalon vannak felsorolva azok az alkalmazások, amelyek használhatják a fiókodat. Minden ilyen alkalmazás esetén a hozzáférés hatókörét azok a jogosultságok korlátozzák, amelyeket az alkalmazásnak adtál, amikor felhatalmaztad, hogy a nevedben eljárjon. Ha külön engedélyezted egy alkalmazásnak, hogy a nevedben más testvérprojektekhez férjen hozzá, akkor az alábbiakban külön konfiguráció fog szerepelni minden ilyen projektnél.\n\nAz összekapcsolt alkalmazások az OAuth protokollal férnek hozzá a fiókodhoz. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Tudj meg többet a csatlakoztatott alkalmazásokról])</span>",
"mwoauthmanagemygrants-showlist": "Összekapcsolt alkalmazások listája",
"mwoauthmanagemygrants-none": "Nincsen a fiókodhoz kapcsolt alkalmazás.",
+ "mwoauthmanagemygrants-user": "Közzétevő:",
"mwoauthmanagemygrants-description": "Leírás",
"mwoauthmanagemygrants-wikiallowed": "Engedélyezve a következő projekte(ke)n:",
+ "mwoauthmanagemygrants-grants": "Elérhető jogosultságok",
+ "mwoauthmanagemygrants-applicablegrantsallowed": "Elérhető jogosultságok engedélyezve:",
+ "mwoauthmanagemygrants-review": "hozzáférés szerkesztése",
"mwoauthmanagemygrants-revoke": "hozzáférés megvonása",
"mwoauthmanagemygrants-grantaccept": "Megadva",
"mwoauthmanagemygrants-update-text": "Az alábbi űrlap segítségével módosíthatod egy nevedben eljáró alkalmazás engedélyeit.",
"mwoauthmanagemygrants-confirm-legend": "Összekapcsolt alkalmazások kezelése",
+ "mwoauthmanagemygrants-update": "Jogosultságok frissítése",
"mwoauthmanagemygrants-renounce": "Engedély visszavonása",
- "mwoauth-form-description-allwikis": "Helló $1,\n\nA kérésed befejezéséhez a(z) '''$2''' alkalmazásnak szüksége van engedélyre, hogy a következő műveleteket végrehajthassa a nevedben az összes projektben:\n\n$4",
- "mwoauth-form-description-onewiki": "Helló $1,\n\nA kérésed befejezéséhez a(z) '''$2''' alkalmazásnak szüksége van engedélyre, hogy a következő műveleteket végrehajthassa a nevedben a(z) ''$4'' wikin:\n\n$5",
- "mwoauth-form-description-allwikis-nogrants": "Helló $1,\n\nA kérésed befejezéséhez a(z) '''$2''' alkalmazásnak szüksége van engedélyre, hogy hozzáférhessen információkhoz a nevedben az oldal összes projektjében. Semmilyen változás nem fog történni a fiókoddal.",
- "mwoauth-form-description-onewiki-nogrants": "Helló $1,\n\nA kérésed befejezéséhez a(z) '''$2''' alkalmazásnak szüksége van engedélyre, hogy hozzáférhessen információkhoz a nevedben a(z) '''$4''' wikin. Semmilyen változás nem fog történni a fiókoddal.",
+ "mwoauthmanagemygrants-basic-tooltip": "Miért nem frissíthetem? Ez a jogosultság a kapcsolt alkalmazásodnak olyan alapvető engedélyeket ad, amelyek a megfelelő működéséhez szükségesek. Ha nem szeretnéd, hogy ez a kapcsolt alkalmazás rendelkezzen ezekkel a jogokkal, akkor az alkalmazás hozzáférését vissza kell vonnod.",
+ "mwoauthmanagemygrants-editslink": "{{GENDER:$1|Szerkesztéseid}} ezzel az alkalmazással",
+ "mwoauthmanagemygrants-actionslink": "{{GENDER:$1|Műveleteid}} ezzel az alkalmazással",
+ "mwoauth-form-description-allwikis": "Helló, $1,\n\nA kérésed teljesítéséhez a(z) '''$2''' alkalmazásnak engedélyre van szüksége, hogy végrehajthassa a nevedben az alábbi műveleteket ezen honlap összes projektjén:\n\n$4",
+ "mwoauth-form-description-onewiki": "Helló, $1,\n\nA kérésed teljesítéséhez a(z) '''$2''' alkalmazásnak engedélyre van szüksége, hogy végrehajthassa a nevedben az alábbi műveleteket a(z) ''$4'' wikin:\n\n$5",
+ "mwoauth-form-description-allwikis-nogrants": "Helló, $1,\n\nA kérésed teljesítéséhez a(z) '''$2''' alkalmazásnak engedélyre van szüksége, hogy hozzáférhessen információkhoz a nevedben a honlap összes projektjén. A fiókoddal semmilyen változás nem fog történni.",
+ "mwoauth-form-description-onewiki-nogrants": "Helló, $1,\n\nA kérésed teljesítéséhez a(z) '''$2''' alkalmazásnak engedélyre van szüksége, hogy hozzáférhessen információkhoz a nevedben a(z) '''$4''' wikin. A fiókoddal semmilyen változás nem fog történni.",
"mwoauth-form-button-approve": "Engedélyezés",
- "mwoauth-form-button-cancel": "Mégse",
+ "mwoauth-form-button-cancel": "Mégsem",
"mwoauth-grants-heading": "Kért engedélyek:",
"mwoauth-grants-nogrants": "Ez az alkalmazás nem kért semmilyen engedélyt.",
+ "mwoauth-listgrants-extra-summary": "== OAuth-specifikus jogosultságok ==\n\nEzek a további jogosultságok az OAuth-felhasználókra vonatkoznak.",
+ "right-mwoauthmanagemygrants": "OAuth-jogosultságok kezelése",
+ "action-mwoauthmanagemygrants": "OAuth-jogosultságaid kezelése",
"echo-category-title-oauth-owner": "OAuth-fejlesztés"
}
diff --git a/OAuth/i18n/ia.json b/OAuth/i18n/ia.json
index dcf54bb5..5ebaf756 100644
--- a/OAuth/i18n/ia.json
+++ b/OAuth/i18n/ia.json
@@ -1,15 +1,19 @@
{
"@metadata": {
"authors": [
- "McDutchie"
+ "McDutchie",
+ "Shirayuki"
]
},
+ "abusefilter-edit-builder-vars-oauth-consumer": "Consumitor OAuth usate pro effectuar iste cambiamento",
"mwoauth-desc": "Permitte usar OAuth 1.0a e OAuth 2.0 pro autorisation via API",
+ "mwoauth-nosubpage-explanation": "OAuth es un mechanismo que permitte a applicationes externe identificar un usator de {{SITENAME}} o ager in su nomine, post reciper permission de ille usator.\n\nPro facer que iste pagina face qualcosa, plus parametros es necessari. Si tu ha essite redirigite hic ab un application externe, isto esseva probabilemente a causa de un error in ille application; tu deberea contactar le autor.",
"mwoauth-verified": "Le application ha ora le permission de acceder a MediaWiki in tu nomine.\n\nPro concluder le processo, forni iste valor de verification al application: '''$1'''",
"mwoauth-db-readonly": "Le base de datos OAuth es temporarimente blocate. Tenta lo de novo in alcun minutas.",
"mwoauth-missing-field": "Manca un valor pro le campo \"$1\"",
"mwoauth-invalid-field": "Valor non valide fornite pro le campo \"$1\"",
"mwoauth-invalid-field-generic": "Valor non valide fornite",
+ "mwoauth-invalid-field-oauth2GrantTypes": "Applicationes OAuth 2 debe specificar al minus un typo de concession",
"mwoauth-field-hidden": "(iste information es celate)",
"mwoauth-field-private": "(iste information es private)",
"mwoauth-prefs-managegrants": "Applicationes connectite:",
@@ -27,6 +31,8 @@
"mwoauth-consumer-owner-only-help": "Si iste option es seligite, le consumitor essera automaticamente approbate e su uso per $1 essera acceptate. Illo non essera usabile per alcun altere usator e le processo de autorisation normal non functionara. Le actiones prendite con iste consumitor non essera etiquettate.",
"mwoauth-consumer-description": "Description del application:",
"mwoauth-consumer-callbackurl": "URL de retorno pro OAuth:",
+ "mwoauth-consumer-callbackurl-help": "A differentia de OAuth 1.0a, iste adresse URL se verifica con precision",
+ "mwoauth-consumer-callbackurl-warning": "(porto arbitrari)",
"mwoauth-consumer-callbackisprefix": "Permitte al consumitor specificar un appello de retorno in requestas e usar le URL \"callback\" hic supra como prefixo obligatori.",
"mwoauth-consumer-granttypes": "Typos de concession requestate:",
"mwoauth-consumer-grantsneeded": "Concessiones applicabile:",
@@ -63,12 +69,15 @@
"mwoauth-consumer-stage-suppressed": "supprimite",
"oauthconsumerregistration": "Registration de consumitor OAuth",
"mwoauthconsumerregistration-navigation": "Navigation:",
- "mwoauthconsumerregistration-propose": "Proponer nove consumitor",
+ "mwoauthconsumerregistration-propose-oauth1a": "Proponer nove consumitor OAuth 1.0a",
+ "mwoauthconsumerregistration-propose-oauth2": "Proponer nove cliente OAuth 2.0",
"mwoauthconsumerregistration-list": "Mi lista de consumitores",
"mwoauthconsumerregistration-main": "Principal",
- "mwoauthconsumerregistration-propose-text": "Programmatores deberea usar le formulario hic infra pro proponer un nove consumitor OAuth (vide le [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth documentation del extension] pro plus detalios). Post haber submittite iste formulario, tu recipera un token, le qual tu application va usar pro identificar se pro MediaWiki. Un administrator de OAuth debera approbar tu application ante que illo pote esser autorisate per altere usatores.\n\nEcce alcun recommendationes e remarcas:\n* Concede le minus derectos possibile. Evita concessiones que non es necessari in iste momento.\n* Le versiones es in forma \"major.minor.edition\" (le ultime duo es optional) e augmenta quando cambiamentos de concession es necessari.\n* Forni un clave RSA (in formato PEM) si possibile; alteremente un token secrete (e minus secur) te essera assignate.\n* Tu pote usar un ID de projecto pro limitar le consumitor a un singule projecto in iste sito (usa \"*\" pro tote le projectos).",
+ "mwoauthconsumerregistration-propose-text": "Tu pote:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|Proponer un consumitor OAuth 1.0a]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Proponer un cliente OAuth 2.0]].",
+ "mwoauthconsumerregistration-propose-text-oauth1a": "Disveloppatores deberea usar le formulario hic infra pro proponer un nove consumitor OAuth 1.0a (vide le [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth documentation del extension] pro plus detalios). Post inviar iste formulario, tu recipera un token que tu application usara pro identificar se a MediaWiki. Un administrator de OAuth debera approbar tu application ante que altere usatores pote autorisar lo.\n\nQualque recommendationes e remarcas:\n* Tenta usar le minor numero de concessiones possibile. Evita concessiones que non es actualmente necessari.\n* Le versiones es del forma \"major.minor.edition\" (le ultime duo essente facultative) e augmenta quando es necessari cambiar le concessiones.\n* Per favor forni un clave RSA public (in formato PEM) si possibile; alteremente es necessari usar un token secrete (minus secur).\n* Tu pote usar un ID de projecto pro limitar le consumitor a un sol projecto sur iste sito (usa \"*\" pro tote le projectos).",
+ "mwoauthconsumerregistration-propose-text-oauth2": "Disveloppatores deberea usar le formulario hic infra pro requestar un token pro un nove client OAuth 2.0 (vide le [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth documentation del extension] pro plus detalios). Post inviar iste formulario, tu recipera un token que tu application usara pro identificar se a MediaWiki. Un administrator de OAuth debera approbar tu application ante que altere usatores pote autorisar lo.\n\nQualque recommendationes e remarcas:\n* Tenta usar le minor numero de concessiones possibile. Evita concessiones que non es actualmente necessari.\n* Le versiones es del forma \"major.minor.edition\" (le ultime duo essente facultative) e augmenta quando es necessari cambiar le perimetro.\n* Tu pote usar un ID de projecto pro limitar le consumitor a un sol projecto sur iste sito (usa \"*\" pro tote le projectos).",
"mwoauthconsumerregistration-update-text": "Le formulario sequente permitte actualisar aspectos de un consumitor OAuth que tu controla.\n\nTote le valores hic superscribera omne previe valores. Non lassa campos vacue si tu non ha le intention de rader iste valores.",
- "mwoauthconsumerregistration-maintext": "Iste pagina es pro permitter al disveloppatores de proponer e actualisar applicationes de consumitor OAuth in le base de registration de iste sito.\n\nAb hic, tu pote:\n* [[Special:OAuthConsumerRegistration/propose|Requestar un token pro un nove consumitor]].\n* [[Special:OAuthConsumerRegistration/list|Gerer tu consumitores existente]].\n\nPro plus information sur OAuth, vide le [https://www.mediawiki.org/Special:MyLanguage/wiki/Extension:OAuth documentation del extension].",
+ "mwoauthconsumerregistration-maintext": "Iste pagina es pro permitter al disveloppatores de proponer e actualisar applicationes de consumitor OAuth in le base de registration de iste sito.\n\nSur iste pagina, tu pote:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|Requestar un token pro un nove consumitor OAuth 1.0a]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Requestar un token pro un nove cliente OAuth 2.0]].\n* [[Special:OAuthConsumerRegistration/list|Gerer tu consumitores existente]].\n\nPro plus information sur OAuth, vide le [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth documentation del extension].",
"mwoauthconsumerregistration-propose-legend": "Nove application de consumitor OAuth",
"mwoauthconsumerregistration-update-legend": "Actualisar application de consumitor OAuth",
"mwoauthconsumerregistration-propose-submit": "Proponer consumitor",
@@ -85,9 +94,11 @@
"mwoauthconsumerregistration-resetsecretkey": "Reinitialisar le clave secrete a un nove valor",
"mwoauthconsumerregistration-proposed": "Tu requesta de consumitor OAuth ha essite recipite.\n\nLe systema te ha assignate un token de consumitor '''$1''' e un token secrete '''$2'''. ''Per favor conserva istes pro referentia futur.''",
"mwoauthconsumerregistration-created-owner-only": "Tu consumitor OAuth ha essite create.\n\nTu tokens es:\n; Token de consumitor: $1\n; Secreto de consumitor: $2\n; Token de accesso: $3\n; Secreto de accesso: $4\n<em>Per favor, conserva istes pro referentia futur.</em>",
+ "mwoauthconsumerregistration-created-owner-only-oauth2": "Le cliente OAuth 2.0 ha essite create.\n\nLe tokens es:\n; Clave del application cliente: $1\n; Secreto del application cliente: $2\n; Token de accesso: $3\n;<em>Per favor, conserva istes pro referentia futur.</em>",
"mwoauthconsumerregistration-updated": "Le registration de consumitor OAuth ha essite actualisate.",
"mwoauthconsumerregistration-secretreset": "Le systema te ha assignate un token secrete de consumitor '''$1'''. ''Per favor conserva lo pro referentia futur.''",
"mwoauthconsumerregistration-secretreset-owner-only": "Tu tokens de consumitor OAuth ha essite reinitialisate. Le nove tokens es:\n; Token de consumitor: $1\n; Secreto de consumitor: $2\n; Token de accesso: $3\n; Secreto de accesso: $4\n<em>Per favor, conserva istes pro referentia futur.</em>",
+ "mwoauthconsumerregistration-secretreset-owner-only-oauth2": "Le tokens de consumitor OAuth ha essite reinitialisate. Le nove tokens es:\n; Token de consumitor: $1\n; Secreto de consumitor: $2\n; Token de accesso: $3\n<em>Per favor, conserva istes pro referentia futur.</em>",
"mwoauthconsumerregistration-need-emailconfirmed": "Tu debe confirmar tu adresse de e-mail pro poter crear applicationes OAuth.\nPer favor entra e valida tu adresse de e-mail per medio de tu [[Special:Preferences|preferentias de usator]].",
"oauthmanageconsumers": "Gerer consumitores OAuth",
"mwoauthmanageconsumers-notloggedin": "Tu debe aperir session pro acceder a iste pagina.",
@@ -158,6 +169,10 @@
"mwoauthlistconsumers-status-disabled": "disactivate",
"mwoauthlistconsumers-status-rejected": "rejectate",
"mwoauthlistconsumers-status-expired": "expirate",
+ "mwoauthlistconsumers-navigation": "Navigation:",
+ "mwoauthlistconsumers-update-link": "Actualisar consumitor",
+ "mwoauthlistconsumers-manage-link": "Gerer consumitor",
+ "mwoauthlistconsumers-grants-link": "Gerer concessiones",
"mwoauthlistconsumers-rclink": "Modificationes recente per iste application",
"oauthmanagemygrants": "Gerer applicationes connectite",
"mwoauthmanagemygrants-text": "Iste pagina lista tote le applicationes que pote usar tu conto. Pro cata un de iste applicationes, su perimetro de accesso es limitate per le derectos que tu ha concedite a illo quando tu lo autorisava a ager in tu nomine. Si tu ha separatemente autorisate un application a acceder a differente projectos fratres in tu nomine, alora tu videra un configuration distincte pro cata un de iste projectos hic infra.\n\nLe applicationes connectite accede a tu conto usante le protocollo OAuth. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Lege plus sur applicationes connectite])</span>",
@@ -240,6 +255,7 @@
"mwoauth-form-button-approve": "Autorisar",
"mwoauth-form-button-cancel": "Cancellar",
"mwoauth-error": "Error de connexion del application",
+ "mwoauth-error-missing-callback-url-non-owner": "callback_url es obligatori pro clientes non limitate al proprietario",
"mwoauth-grants-heading": "Permissiones requestate:",
"mwoauth-grants-nogrants": "Le application non ha requestate alcun permission.",
"mwoauth-acceptance-cancelled": "Tu ha refusate a \"$1\" le accesso a tu conto. \"$1\" non pote functionar si tu non lo permitte de acceder. Tu pote retornar a \"$1\" o [[Special:OAuthManageMyGrants|gerer]] tu applicationes connectite.",
@@ -290,6 +306,35 @@
"notification-oauth-app-disable-primary-link": "Vider application",
"notification-oauth-app-reenable-primary-link": "Vider application",
"notification-oauth-app-body": "Motivo: $1",
+ "mwoauth-oauth-version": "Version del protocollo OAuth",
+ "mwoauth-oauth2-is-confidential": "Cliente es confidential",
+ "mwoauth-oauth2-is-confidential-help": "Un cliente confidential es un application que es capace de guardar le contrasigno de un cliente confidential pro le mundo. Clientes non confidential es minus secur.",
+ "mwoauth-oauth2-granttypes": "Typos de concession OAuth2 permittite",
+ "mwoauth-oauth2-granttype-auth-code": "Codice de autorisation",
+ "mwoauth-oauth2-granttype-refresh-token": "Token de refrescamento",
+ "mwoauth-oauth2-granttype-client-credentials": "Credentiales del cliente",
+ "mwoauth-oauth2-error-create-at-no-user-approval": "Impossibile crear le token de accesso: le usator non ha approbate le emission de iste token de accesso.",
+ "mwoauth-oauth2-error-user-approval-deny": "Le usator ha rejectate le requesta del application cliente.",
+ "mwoauth-oauth-unsupported-version": "Iste puncto de termination non es permittite pro OAuth version $1.",
+ "mwoauth-oauth2-error-unauthorized-scope": "Le perimetro \"$1\" non es permittite pro iste application.",
+ "mwoauth-oauth2-error-owner-only-invalid-grant": "Le clientes limitate al proprietario debe esser autorisate a usar client_credentials",
+ "mwoauth-oauth2-unable-to-retrieve-access-token": "Impossibile recuperar le token de accesso: $1",
+ "mwoauth-oauth2-error-server-error": "Le servitor de autorisation ha incontrate un condition inexpectate que lo ha impedite de satisfacer le requesta.",
+ "mwoauth-oauth2-error-invalid-request": "Le requesta care de un parametro obligatori, o include un valor non valide de un parametro, o include un parametro plus de un vice, o es alteremente mal formate.",
+ "mwoauth-oauth2-error-unauthorized-client": "Le cliente non es autorisate a requestar un codice de autorisation usante iste methodo.",
+ "mwoauth-oauth2-error-access-denied": "Le proprietario del ressource o le servitor de autorisation ha refusate le requesta.",
+ "mwoauth-oauth2-error-unsupported-response-type": "Le servitor de autorisation non supporta le obtention de un codice de autorisation usante iste methodo.",
+ "mwoauth-oauth2-error-invalid-scope": "Le perimetro requestate es invalide, incognite, o mal formate.",
+ "mwoauth-oauth2-error-temporarily-unavailable": "Le servitor de autorisation non pote tractar le requesta in iste momento perque le servitor es temporarimente supercargate o sub mantenentia.",
+ "mwoauth-oauth2-error-invalid-client": "Le authentication del cliente ha fallite (p.ex. cliente incognite, nulle authentication del cliente includite, o methodo de authentication non supportate)",
+ "mwoauth-oauth2-error-request-not-verified": "Le systema ora tenta recuperar le proprietate verificate ante de verificar le requesta",
+ "mwoauth-oauth2-invalid-access-token": "Token de accesso non valide",
+ "mwoauth-consumer-access-no-user": "Le approbation del consumitor debe esser ligate a un usator valide, ma un usator con ID 0 ha essite fornite",
+ "mwoauth-login-required-reason": "Tu debe aperir session con tu conto de {{SITENAME}} pro autorisar applicationes a acceder a illo.",
"mwoauthconsumer-consumer-view": "Vider iste consumitor",
- "mwoauthconsumer-application-view": "Vider iste application"
+ "mwoauthconsumer-application-view": "Vider iste application",
+ "grant-oauthmanageownclient": "Gerer tu clientes OAuth",
+ "mwoauth-consumer-user-mismatch": "Tu non pote exequer actiones sur clientes que non te pertine",
+ "mwoauth-consumer-deleted-error": "Impossibile exequer actiones sur clientes delite",
+ "mwoauth-consumer-submit-error": "Un error occurreva durante le salveguarda de un consumitor"
}
diff --git a/OAuth/i18n/ie.json b/OAuth/i18n/ie.json
new file mode 100644
index 00000000..a28292c5
--- /dev/null
+++ b/OAuth/i18n/ie.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Renan"
+ ]
+ },
+ "mwoauth-consumer-reason": "Rason:",
+ "mwoauthmanageconsumers-reason": "Rason:",
+ "notification-oauth-app-body": "Rason: $1"
+}
diff --git a/OAuth/i18n/inh.json b/OAuth/i18n/inh.json
index c94b28f0..20ac45bf 100644
--- a/OAuth/i18n/inh.json
+++ b/OAuth/i18n/inh.json
@@ -5,6 +5,6 @@
]
},
"mwoauth-prefs-managegrants": "Хьатесса приложенеш:",
- "mwoauth-prefs-managegrantslink": "{{PLURAL:$1|$1 приложенена урхалду|1=приложенена урхалду}}",
+ "mwoauth-prefs-managegrantslink": "Урхалду {{PLURAL:$1|$1 хьалсегача приложененна|0=хьалсегача приложенешта}}",
"oauthmanagemygrants": "Хьатессача приложенешта урхалдар"
}
diff --git a/OAuth/i18n/io.json b/OAuth/i18n/io.json
index 2d7fa779..1b49f567 100644
--- a/OAuth/i18n/io.json
+++ b/OAuth/i18n/io.json
@@ -4,15 +4,74 @@
"Joao Xavier"
]
},
+ "mwoauth-missing-field": "Mankas informo por \"$1\"",
+ "mwoauth-invalid-field": "Nevalida informo por \"$1\"",
+ "mwoauth-invalid-field-generic": "Nevalida valoro furnisita",
+ "mwoauth-field-hidden": "(ca informo esas celita)",
+ "mwoauth-field-private": "(ca informo esas privata)",
"mwoauth-prefs-managegrants": "Aplikaji relata:",
- "mwoauth-prefs-managegrantslink": "Administrar $1 {{PLURAL:$1|aplikajo|aplikaji}} relata",
+ "mwoauth-prefs-managegrantslink": "Administrar {{PLURAL:$1|aplikajo|aplikaji}} konektita",
+ "mwoauth-consumer-name": "Nomo di la programo ''app'':",
"mwoauth-consumer-user": "Publikigero:",
+ "mwoauth-consumer-stage": "Nuna stando:",
+ "mwoauth-consumer-wiki-thiswiki": "Nuna projeto ($1)",
+ "mwoauth-consumer-restrictions": "Restrikti pri uzo:",
+ "mwoauth-consumer-restrictions-json": "Restrikti pri uzo (JSON):",
"mwoauth-consumer-reason": "Motivo:",
+ "mwoauth-consumer-stage-proposed": "propozita",
+ "mwoauth-consumer-stage-rejected": "rejektita",
+ "mwoauth-consumer-stage-expired": "expirinta",
+ "mwoauth-consumer-stage-approved": "aprobita",
+ "mwoauth-consumer-stage-disabled": "sen efekto",
+ "mwoauth-consumer-stage-suppressed": "supresita",
+ "mwoauthconsumerregistration-main": "Precipua",
"mwoauthconsumerregistration-user": "Publikigero",
+ "mwoauthconsumerregistration-description": "Deskripto",
+ "mwoauthconsumerregistration-email": "E-posto por kontakto",
+ "mwoauthconsumerregistration-consumerkey": "ID dil konsumero",
+ "mwoauthconsumerregistration-stage": "Stando",
+ "mwoauthconsumerregistration-lastchange": "Lasta modifikuro",
+ "mwoauthconsumerregistration-manage": "administrar",
+ "mwoauthconsumerregistration-resetsecretkey": "Chanjar la sekreta vorto a nova valoro",
+ "mwoauthmanageconsumers-showproposed": "Demandi propozita",
+ "mwoauthmanageconsumers-showrejected": "Demandi refuzita",
+ "mwoauthmanageconsumers-showexpired": "Demandi expirita",
+ "mwoauthmanageconsumers-linkproposed": "demandi propozita",
+ "mwoauthmanageconsumers-linkrejected": "demandi refuzita",
+ "mwoauthmanageconsumers-linkexpired": "demandi expirita",
+ "mwoauthmanageconsumers-linkapproved": "demandi aprobita",
+ "mwoauthmanageconsumers-linkdisabled": "demandi deskapabligita",
+ "mwoauthmanageconsumers-main": "Precipua",
+ "mwoauthmanageconsumers-consumerkey": "ID dil konsumero",
+ "mwoauthmanageconsumers-lastchange": "Lasta modifikuro",
+ "mwoauthmanageconsumers-review": "revizar/jerar",
+ "mwoauthmanageconsumers-action": "Modifikar stando:",
+ "mwoauthmanageconsumers-approve": "Aprobita",
+ "mwoauthmanageconsumers-reject": "Ne aceptita",
+ "mwoauthmanageconsumers-rsuppress": "Refuzita e supresita",
+ "mwoauthmanageconsumers-disable": "Sen efekto",
+ "mwoauthmanageconsumers-dsuppress": "Refuzita e supresita",
+ "mwoauthmanageconsumers-reenable": "Aprobita",
+ "mwoauthmanageconsumers-reason": "Motivo:",
+ "mwoauthlistconsumers-name": "Nomo di la programo ''app''",
"mwoauth-consumer-stage-any": "irga",
+ "mwoauthlistconsumers-status-approved": "aprobita",
+ "mwoauthlistconsumers-status-disabled": "sen efekto",
+ "mwoauthlistconsumers-status-expired": "expirinta",
+ "mwoauthlistconsumers-navigation": "Navigado:",
+ "mwoauthlistconsumers-update-link": "Aktualigar konsumero",
+ "mwoauthlistconsumers-manage-link": "Administrar konsumero",
+ "mwoauthlistconsumers-grants-link": "Administrar permisi",
+ "mwoauthlistconsumers-rclink": "Recenta modifikuri facita da ca ''app''",
+ "oauthmanagemygrants": "Administrar konektita aplikaji",
+ "mwoauthmanagemygrants-navigation": "Navigado:",
+ "mwoauthmanagemygrants-description": "Deskripto",
"mwoauth-form-description-allwikis-privateinfo-norealname": "Saluto $1,\n\nPor atendar komplete vua demando, '''$2''' bezonas acesar informi pri vu, inkluzite vua e-posto adreso, en omna projeti de ca retsituo. Nula modifikuri facesos en vua uzero-konto.",
"mwoauth-form-button-cancel": "Nuligar",
+ "grant-mwoauth-authonly": "Nur identifiko di uzero, ne esas posibla lektar pagini od agar por interesto di altru.",
+ "grant-mwoauth-authonlyprivate": "Nur esas posibla identifikar vera nomi e vera reto-adresi, ne esas posibla lektar pagini od agar por interesto di altra uzero.",
"notification-oauth-app-reject-primary-link": "Montrez 'app'",
"notification-oauth-app-disable-primary-link": "Vidar 'app'",
- "notification-oauth-app-body": "Motivo: $1"
+ "notification-oauth-app-body": "Motivo: $1",
+ "mwoauth-oauth-version": "Versiono dil protokolo OAuth"
}
diff --git a/OAuth/i18n/is.json b/OAuth/i18n/is.json
index 28fe43d4..1ebc4d47 100644
--- a/OAuth/i18n/is.json
+++ b/OAuth/i18n/is.json
@@ -4,6 +4,8 @@
"Sveinn í Felli"
]
},
+ "mwoauth-prefs-managegrants": "Tengd forrit:",
+ "mwoauth-prefs-managegrantslink": "Sýsla með {{PLURAL:$1|$1 tengt forrit|$1 tengd forrit|0=tengd forrit}}",
"mwoauth-consumer-key": "Lykill notanda:",
"mwoauth-consumer-name": "Heiti forrits:",
"mwoauth-consumer-user": "Útgefandi:",
@@ -44,9 +46,11 @@
"mwoauthlistconsumers-status-disabled": "óvirkt",
"mwoauthlistconsumers-status-rejected": "hafnað",
"mwoauthlistconsumers-status-expired": "útrunnið",
+ "oauthmanagemygrants": "Sýsla með tengd forrit",
"mwoauthmanagemygrants-navigation": "Flakk:",
"mwoauthmanagemygrants-user": "Útgefandi:",
"mwoauthmanagemygrants-description": "Lýsing",
+ "mwoauthmanagemygrants-confirm-legend": "Sýsla með tengt forrit",
"mwoauth-form-button-approve": "Leyfa",
"mwoauth-form-button-cancel": "Hætta við",
"notification-oauth-app-body": "Ástæða: $1"
diff --git a/OAuth/i18n/it.json b/OAuth/i18n/it.json
index ccf09d60..ef01c9f2 100644
--- a/OAuth/i18n/it.json
+++ b/OAuth/i18n/it.json
@@ -2,7 +2,9 @@
"@metadata": {
"authors": [
"Alexmar983",
+ "Amire80",
"Beta16",
+ "Daimona Eaytoy",
"Giromin Cangiaxo",
"Nemo bis",
"Ricordisamoa",
@@ -64,7 +66,6 @@
"mwoauth-consumer-stage-suppressed": "soppresso",
"oauthconsumerregistration": "Registrazione cliente OAuth",
"mwoauthconsumerregistration-navigation": "Navigazione:",
- "mwoauthconsumerregistration-propose": "Proponi nuovo cliente",
"mwoauthconsumerregistration-list": "Miei clienti",
"mwoauthconsumerregistration-main": "Principale",
"mwoauthconsumerregistration-propose-text": "Gli sviluppatori dovrebbero usare il seguente modulo per proporre un nuovo cliente OAuth (vedi la [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth documentazione dell'estensione] per ulteriori dettagli). Dopo l'invio di questo modulo, riceverai un token che l'applicazione utilizzerà per identificarsi in MediaWiki. Un amministratore di OAuth dovrà approvare l'applicazione prima che questa potrà essere autorizzata da altri utenti.\n\nAlcune raccomandazioni e osservazioni:\n* cerca di utilizzare meno assegnazioni possibili. Cerca di evitare di assegnare diritti che non sono realmente necessari ora\n* le versioni sono nella forma \"major.minor.release\" (gli ultimi due sono opzionali) ed aumentala nel caso siano necessarie ulteriori assegnazioni di diritti\n* fornisce una chiave RSA pubblica (in formato PEM) se possibile; altrimenti dovrà essere utilizzato un token segreto (meno sicuro)\n* è possibile utilizzare un ID progetto per limitare il cliente ad un singolo progetto su questo sito (usa \"*\" per tutti i progetti).",
@@ -220,7 +221,7 @@
"mwoauth-error": "Errore di connessione dell'applicazione",
"mwoauth-grants-heading": "Autorizzazioni richieste:",
"mwoauth-grants-nogrants": "L'applicazione non ha richiesto alcuna autorizzazione.",
- "mwoauth-acceptance-cancelled": "Hai scelto di non consentire a \"$1\" ad accedere alla tua utenza. \"$1\" non funzionerà a meno che non gli permetti l'accesso. Puoi tornare a \"$1\" o nella [[Special:OAuthManageMyGrants|gestione]] delle tue applicazioni connesse.",
+ "mwoauth-acceptance-cancelled": "Hai scelto di non consentire a \"$1\" di accedere alla tua utenza. \"$1\" non funzionerà a meno che tu non consenta l'accesso. Puoi tornare a \"$1\" o alla [[Special:OAuthManageMyGrants|gestione]] delle tue applicazioni connesse.",
"grant-mwoauth-authonly": "Solo verifica identità utente, nessuna capacità di leggere pagine o agire per conto di un utente.",
"grant-mwoauth-authonlyprivate": "Verifica identità utente solo con accesso al nome reale e indirizzo email, nessuna capacità di leggere pagine o agire per conto di un utente.",
"mwoauth-listgrants-extra-summary": "== Assegnazioni specifiche OAuth ==\n\nQueste assegnazioni supplementari sono applicabili ai clienti OAuth.",
diff --git a/OAuth/i18n/ja.json b/OAuth/i18n/ja.json
index 45d0c784..7fdfaa8f 100644
--- a/OAuth/i18n/ja.json
+++ b/OAuth/i18n/ja.json
@@ -13,7 +13,6 @@
"Yusuke1109"
]
},
- "oauth": "OAuth",
"mwoauth-desc": "API 認証に OAuth 1.0a および OAuth 2.0 を使用できるようにする",
"mwoauth-verified": "このアプリケーションがあなたに代わって MediaWiki にアクセスすることが許可されました。\n\nこの手続きを完了するには次の検証トークンをアプリケーションに提供してください: '''$1'''",
"mwoauth-db-readonly": "OAuth データベースは一時的にロックされています。しばらくしてからもう一度お試しください。",
@@ -62,7 +61,6 @@
"mwoauth-consumer-stage-disabled": "無効",
"oauthconsumerregistration": "OAuth コンシューマー登録",
"mwoauthconsumerregistration-navigation": "ナビゲーション:",
- "mwoauthconsumerregistration-propose": "新しいコンシューマーの提案",
"mwoauthconsumerregistration-list": "自分のコンシューマー一覧",
"mwoauthconsumerregistration-main": "メイン",
"mwoauthconsumerregistration-update-legend": "OAuth コンシューマー アプリケーションの更新",
diff --git a/OAuth/i18n/kaa.json b/OAuth/i18n/kaa.json
new file mode 100644
index 00000000..c2c7e2e5
--- /dev/null
+++ b/OAuth/i18n/kaa.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Nurlan"
+ ]
+ },
+ "mwoauth-prefs-managegrants": "Qosılǵan qosımshalar:"
+}
diff --git a/OAuth/i18n/ko.json b/OAuth/i18n/ko.json
index 4e6ea0a9..d78b1d40 100644
--- a/OAuth/i18n/ko.json
+++ b/OAuth/i18n/ko.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Bluehill",
"Hwangjy9",
"Hym411",
"LiteHell",
@@ -9,10 +10,12 @@
"Priviet",
"Revi",
"Ykhwong",
+ "렌즈",
"아라"
]
},
- "mwoauth-desc": "API 인증을 위해 OAuth 1.0a를 사용할 수 있게 합니다",
+ "abusefilter-edit-builder-vars-oauth-consumer": "이 변경을 수행하기 위해 사용되는 OAuth 컨슈머",
+ "mwoauth-desc": "API 인증을 위해 OAuth 1.0a와 OAuth 2.0을 사용할 수 있게 합니다",
"mwoauth-verified": "프로세스를 완성하기 위해서는 이 증명값을 이 응용프로그램에 입력해야 합니다: '''$1'''",
"mwoauth-db-readonly": "OAuth 데이터베이스가 현재 잠겨 있습니다. 다시 시도해 주세요.",
"mwoauth-missing-field": "\"$1\" 필드에 대한 값이 없습니다",
@@ -21,7 +24,7 @@
"mwoauth-field-hidden": "(이 정보는 숨겨져 있습니다)",
"mwoauth-field-private": "(이 정보는 비공개입니다)",
"mwoauth-prefs-managegrants": "연결된 앱:",
- "mwoauth-prefs-managegrantslink": "연결된 {{PLURAL:$1|애플리케이션}} $1개 관리",
+ "mwoauth-prefs-managegrantslink": "연결된 {{PLURAL:$1|애플리케이션 $1개|0=애플리케이션}} 관리",
"mwoauth-consumer-allwikis": "이 사이트의 모든 프로젝트",
"mwoauth-consumer-key": "컨슈머 키:",
"mwoauth-consumer-name": "애플리케이션 이름:",
@@ -29,11 +32,14 @@
"mwoauth-consumer-user": "게시자:",
"mwoauth-consumer-stage": "현재 상태:",
"mwoauth-consumer-email": "연락처 이메일 주소:",
+ "mwoauth-consumer-email-help": "신규 컨슈머를 승인하는 사람에게만 표시됩니다",
"mwoauth-consumer-owner-only-label": "소유자 전용:",
"mwoauth-consumer-owner-only": "$1 사용자만 사용할 수 있습니다.",
+ "mwoauth-consumer-owner-only-help": "이 옵션을 선택하면 컨슈머가 자동으로 승인되어 $1에 의한 사용이 승인됩니다. 다른 사용자는 사용할 수 없으며 일반적인 권한 부여 흐름이 작동하지 않습니다. 이 컨슈머를 사용하여 수행한 작업은 태그가 지정되지 않습니다.",
"mwoauth-consumer-description": "애플리케이션 설명:",
"mwoauth-consumer-callbackurl": "OAuth \"콜백\" URL:",
- "mwoauth-consumer-granttypes": "요청된 승인 유쳥들:",
+ "mwoauth-consumer-callbackisprefix": "컨슈머가 요청에서 콜백을 지정할 수 있게 하고 위의 \"콜백\" URL를 접두사로 요구합니다.",
+ "mwoauth-consumer-granttypes": "요청된 승인 유형들:",
"mwoauth-consumer-grantsneeded": "적용할 수 있는 부여:",
"mwoauth-consumer-required-grant": "컨슈머에게 적용할 수 있음",
"mwoauth-consumer-wiki": "적용할 수 있는 프로젝트:",
@@ -41,6 +47,7 @@
"mwoauth-consumer-restrictions": "사용 제한:",
"mwoauth-consumer-restrictions-json": "사용 제한 (JSON):",
"mwoauth-consumer-rsakey": "공개 RSA 키 (선택 사항):",
+ "mwoauth-consumer-rsakey-help": "RSA-SHA1 서명 방법을 사용하려면 공개 키를 입력하십시오. 임의의 비밀키로 HMAC-SHA1을 사용하려면 비워 둡니다. 어느 쪽인지 확실하지 않은 경우 비워 두십시오.",
"mwoauth-consumer-secretkey": "컨슈머 비밀 토큰:",
"mwoauth-consumer-accesstoken": "접근 토큰:",
"mwoauth-consumer-reason": "이유:",
@@ -66,12 +73,11 @@
"mwoauth-consumer-stage-suppressed": "표시하지 않음",
"oauthconsumerregistration": "OAuth 컨슈머 등록",
"mwoauthconsumerregistration-navigation": "둘러보기:",
- "mwoauthconsumerregistration-propose": "새 컨슈머 제안",
"mwoauthconsumerregistration-list": "내 컨슈머 목록",
"mwoauthconsumerregistration-main": "대문",
- "mwoauthconsumerregistration-propose-text": "개발자는 다음 양식을 사용하여 새로운 OAuth 고객을 제안해야 합니다.(자세한 정보는 [//www.mediawiki.org/wiki/Extension:OAuth 확장 기능 문서]를 참조하세요) 이 양식을 제출하고 나면 당신의 지원서가 미디어위키에서 자체적으로 식별하는데 사용할 토큰을 받게 됩니다. OAuth 관리자는 다른 사용자가 권한을 받기 전에 지원서를 승인해야 합니다.\n\n몇 가지 권고 및 참고사항:\n* 가능한 적은 권한을 사용하도록 노력해 주세요. 실제로 지금 필요하지 않은 권한은 사용을 삼가세요.\n* 버전은 \"major.minor.release\" 형태이며 (마지막 2가지는 선택 사항) 권한 변경이 필요할 때 숫자가 증가합니다.\n* 가능하면 공개 RSA 키(PEM 포맷)를 제공해 주세요. 아니면 비밀 토큰(덜 안전함)을 사용해야 합니다.\n* 고객이 특정한 CIDR 범위 내의 IP에서만 접근하도록 제한하려면 JSON 제한 필드를 사용해 주세요.\n* 고객이 이 사이트의 하나의 프로젝트에만 접근할 수 있도록 제한하려면 프로젝트 ID를 사용하면 됩니다. (모든 프로젝트에는 \"*\" 을 사용하세요.)\n* 제공된 이메일 주소가 당신의 계정의 이메일 주소와 일치해야 합니다. (인증되어야 합니다)",
+ "mwoauthconsumerregistration-propose-text": "개발자는 다음 양식을 사용하여 새로운 OAuth 고객을 제안해야 합니다.(자세한 정보는 [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth 확장 기능 문서]를 참조하세요) 이 양식을 제출하고 나면 당신의 지원서가 미디어위키에서 자체적으로 식별하는데 사용할 토큰을 받게 됩니다. OAuth 관리자는 다른 사용자가 권한을 받기 전에 지원서를 승인해야 합니다.\n\n몇 가지 권고 및 참고사항:\n* 가능한 적은 권한을 사용하도록 노력해 주세요. 실제로 지금 필요하지 않은 권한은 사용을 삼가세요.\n* 버전은 \"major.minor.release\" 형태이며 (마지막 2가지는 선택 사항) 권한 변경이 필요할 때 숫자가 증가합니다.\n* 가능하면 공개 RSA 키(PEM 포맷)를 제공해 주세요. 아니면 비밀 토큰(덜 안전함)을 사용해야 합니다.\n* 고객이 이 사이트의 하나의 프로젝트에만 접근할 수 있도록 제한하려면 프로젝트 ID를 사용하면 됩니다. (모든 프로젝트에는 \"*\" 을 사용하세요.)",
"mwoauthconsumerregistration-update-text": "아래의 양식을 사용하여 당신이 관리하는 OAuth 고객의 속성을 업데이트하세요. \n\n여기의 모든 값은 이전 값을 덮어쓸 것입니다. 이 값을 지우려고 하지 않는다면 빈 필드는 비워두세요.",
- "mwoauthconsumerregistration-maintext": "이 문서는 개발자가 제안하고 이 사이트의 레지스트리에서 OAuth 컨슈머 응용 프로그램을 업데이트할 수 있도록 합니다.\n\n여기서 할 수 있는 작업:\n* [[Special:OAuthConsumerRegistration/propose|새로운 고객에게 토큰을 요청]].\n* [[Special:OAuthConsumerRegistration/list|기존 고객 관리]].\n\nOAuth에 대한 더 자세한 정보를 얻으려면 [//www.mediawiki.org/wiki/Extension:OAuth 확장 기능 문서]를 참조하세요.",
+ "mwoauthconsumerregistration-maintext": "이 문서는 개발자가 제안하고 이 사이트의 레지스트리에서 OAuth 컨슈머 응용 프로그램을 업데이트할 수 있도록 합니다.\n\n여기서 할 수 있는 작업:\n* [[Special:OAuthConsumerRegistration/propose|새로운 고객에게 토큰을 요청]].\n* [[Special:OAuthConsumerRegistration/list|기존 고객 관리]].\n\nOAuth에 대한 더 자세한 정보를 얻으려면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth 확장 기능 문서]를 참조하세요.",
"mwoauthconsumerregistration-propose-legend": "새 OAuth 컨슈머 애플리케이션",
"mwoauthconsumerregistration-update-legend": "OAuth 컨슈머 애플리케이션 업데이트",
"mwoauthconsumerregistration-propose-submit": "컨슈머 제안",
@@ -96,6 +102,11 @@
"mwoauthmanageconsumers-showproposed": "제안된 요청",
"mwoauthmanageconsumers-showrejected": "거부된 요청",
"mwoauthmanageconsumers-showexpired": "만료된 요청",
+ "mwoauthmanageconsumers-linkproposed": "제안된 요청",
+ "mwoauthmanageconsumers-linkrejected": "거부된 요청",
+ "mwoauthmanageconsumers-linkexpired": "만료된 요청",
+ "mwoauthmanageconsumers-linkapproved": "승인된 요청",
+ "mwoauthmanageconsumers-linkdisabled": "비활성화된 요청",
"mwoauthmanageconsumers-main": "주요",
"mwoauthmanageconsumers-maintext": "이 문서는 OAuth(http://oauth.net 를 참조하세요) 컨슈머 지원서 요청을 관리하고 인증된 OAuth 컨슈머를 관리합니다.",
"mwoauthmanageconsumers-queues": "아래에서 컨슈머 확인 대기열을 선택하세요:",
@@ -153,6 +164,9 @@
"mwoauthlistconsumers-status-disabled": "비활성화됨",
"mwoauthlistconsumers-status-rejected": "거부됨",
"mwoauthlistconsumers-status-expired": "만료됨",
+ "mwoauthlistconsumers-navigation": "둘러보기:",
+ "mwoauthlistconsumers-update-link": "컨슈머 변경",
+ "mwoauthlistconsumers-manage-link": "컨슈머 관리",
"mwoauthlistconsumers-rclink": "이 애플리케이션의 최근 바뀜",
"oauthmanagemygrants": "연결된 애플리케이션 관리",
"mwoauthmanagemygrants-text": "이 문서는 당신의 계정을 사용할 수 있는 모든 애플리케이션을 나열합니다. 이러한 애플리케이션은 당신을 대신하여 인증할 때 애플리케이션에 부여한 권한이 접근 범위를 제한합니다. 만약 애플리케이션이 당신을 대신해 자매 프로젝트에 접근하도록 하기 위해서 애플리케이션에 개별적으로 권한을 부여한다면 각각의 프로젝트들에 대한 개별 설정이 아래에 보일 것입니다.\n\n연결된 애플리케이션들은 OAuth 프로토콜을 사용하여 계정에 접근합니다. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth 연결된 애플리케이션에 대해 더 알아보세요])</span>",
@@ -236,6 +250,7 @@
"action-mwoauthmanagemygrants": "내 OAuth 부여 관리",
"action-mwoauthproposeconsumer": "새 OAuth 컨슈머 제안",
"action-mwoauthupdateownconsumer": "내가 제어할 수 있는 OAuth 컨슈머 업데이트",
+ "action-mwoauthviewprivate": "비공개 OAuth 데이터 보기",
"action-mwoauthviewsuppressed": "표시하지 않은 OAuth 컨슈머 보기",
"mwoauth-botpasswords-note": "<strong>주의:</strong> <span class=\"plainlinks\">[$1 OAuth]</span>가 봇 비밀번호 보다 더 안전하며 봇이 이를 지원하면 이 기능이 더 선호됩니다.",
"mwoauth-api-module-disabled": "\"$1\" 모듈은 OAuth와 함께 사용할 수 없습니다.",
@@ -245,16 +260,16 @@
"echo-pref-tooltip-oauth-admin": "OAuth 애플리케이션의 검토에 관한 이벤트를 내게 알립니다.",
"notification-oauth-app-propose-title": "$1님이 새로운 OAuth 앱을 {{GENDER:$1|제안했습니다}}: $2",
"notification-oauth-app-update-title": "$1님이 OAuth 앱 $2을(를) {{GENDER:$1|업데이트했습니다}}",
- "notification-oauth-app-approve-title": "$1님이 {{GENDER:$3|당신의}} OAuth 앱($2)을 {{GENDER:$2|승인했습니다}}",
- "notification-oauth-app-reject-title": "$1님이 {{GENDER:$3|당신의}} OAuth 앱($2)을 {{GENDER:$2|거부했습니다}}",
- "notification-oauth-app-disable-title": "$1님이 {{GENDER:$3|당신의}} OAuth 앱($2)을 {{GENDER:$2|비활성화했습니다}}",
- "notification-oauth-app-reenable-title": "$1님이 {{GENDER:$3|당신의}} OAuth 앱($2)을 {{GENDER:$2|다시 활성화했습니다}}",
+ "notification-oauth-app-approve-title": "$1님이 {{GENDER:$3|당신의}} OAuth 앱($2)을 {{GENDER:$1|승인했습니다}}",
+ "notification-oauth-app-reject-title": "$1님이 {{GENDER:$3|당신의}} OAuth 앱($2)을 {{GENDER:$1|거부했습니다}}",
+ "notification-oauth-app-disable-title": "$1님이 {{GENDER:$3|당신의}} OAuth 앱($2)을 {{GENDER:$1|비활성화했습니다}}",
+ "notification-oauth-app-reenable-title": "$1님이 {{GENDER:$3|당신의}} OAuth 앱($2)을 {{GENDER:$1|다시 활성화했습니다}}",
"notification-oauth-app-propose-subject": "$1님이 {{SITENAME}}에서 새로운 OAuth 앱을 {{GENDER:$1|제안했습니다}}",
"notification-oauth-app-update-subject": "$1님이 {{SITENAME}}에서 OAuth 앱을 {{GENDER:$1|업데이트했습니다}}",
- "notification-oauth-app-approve-subject": "$1님이 {{SITENAME}}에서 {{GENDER:$3|당신의}} OAuth 앱을 {{GENDER:$2|승인했습니다}}",
- "notification-oauth-app-reject-subject": "$1님이 {{SITENAME}}에서 {{GENDER:$3|당신의}} OAuth 앱($2)을 {{GENDER:$2|거부했습니다}}",
- "notification-oauth-app-disable-subject": "$1님이 {{SITENAME}}에서 {{GENDER:$3|당신의}} OAuth 앱을 {{GENDER:$2|비활성화했습니다}}",
- "notification-oauth-app-reenable-subject": "$1님이 {{SITENAME}}에서 {{GENDER:$3|당신의}} OAuth 앱($2)을 {{GENDER:$2|다시 활성화했습니다}}",
+ "notification-oauth-app-approve-subject": "$1님이 {{SITENAME}}에서 {{GENDER:$3|당신의}} OAuth 앱을 {{GENDER:$1|승인했습니다}}",
+ "notification-oauth-app-reject-subject": "$1님이 {{SITENAME}}에서 {{GENDER:$3|당신의}} OAuth 앱을 {{GENDER:$1|거부했습니다}}",
+ "notification-oauth-app-disable-subject": "$1님이 {{SITENAME}}에서 {{GENDER:$3|당신의}} OAuth 앱을 {{GENDER:$1|비활성화했습니다}}",
+ "notification-oauth-app-reenable-subject": "$1님이 {{SITENAME}}에서 {{GENDER:$3|당신의}} OAuth 앱을 {{GENDER:$1|다시 활성화했습니다}}",
"notification-oauth-app-propose-primary-link": "앱 평가",
"notification-oauth-app-update-primary-link": "앱 평가",
"notification-oauth-app-approve-primary-link": "앱 보기",
@@ -262,6 +277,11 @@
"notification-oauth-app-disable-primary-link": "앱 보기",
"notification-oauth-app-reenable-primary-link": "앱 보기",
"notification-oauth-app-body": "이유: $1",
+ "mwoauth-oauth-version": "OAuth 프로토콜 버전",
+ "mwoauth-oauth2-granttype-refresh-token": "리프레시 토큰",
+ "mwoauth-oauth2-invalid-access-token": "유효하지 않은 액세스 토큰",
"mwoauth-login-required-reason": "애플리케이션의 접근 인가를 위해 {{SITENAME}} 계정으로 로그인해야 합니다.",
- "mwoauthconsumer-application-view": "이 애플리케이션 보기"
+ "mwoauthconsumer-consumer-view": "이 컨슈머 보기",
+ "mwoauthconsumer-application-view": "이 애플리케이션 보기",
+ "grant-oauthmanageownclient": "내 OAuth 클라이언트 관리"
}
diff --git a/OAuth/i18n/ksh.json b/OAuth/i18n/ksh.json
index 20ef5107..0dff517f 100644
--- a/OAuth/i18n/ksh.json
+++ b/OAuth/i18n/ksh.json
@@ -4,7 +4,6 @@
"Purodha"
]
},
- "oauth": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"an open standard for authorization\">OAuth</i>",
"mwoauth-desc": "Määd e müjjelesch, <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"an open standard for authorization\">OAuth</i> Väsjohn 1.0a för et Enlogge övver de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> ze bruche.",
"mwoauth-db-readonly": "De Dahtebangk vum <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"an open standard for authorization\">OAuth</i> es em Momang jeschpächt. Versöhg et en e paa Menotte wider.",
"mwoauth-missing-field": "Ene Wäät för dat Väld „$1“ fählt",
diff --git a/OAuth/i18n/ku-latn.json b/OAuth/i18n/ku-latn.json
index b17e66a6..2b330b3d 100644
--- a/OAuth/i18n/ku-latn.json
+++ b/OAuth/i18n/ku-latn.json
@@ -1,9 +1,11 @@
{
"@metadata": {
"authors": [
+ "Balyozxane",
"George Animal"
]
},
+ "mwoauthconsumerregistration-description": "Danasîn",
"notification-oauth-app-approve-primary-link": "Sepanê bibîne",
"notification-oauth-app-reject-primary-link": "Sepanê bibîne",
"notification-oauth-app-disable-primary-link": "Sepanê bibîne",
diff --git a/OAuth/i18n/lb.json b/OAuth/i18n/lb.json
index 3054d422..aefff4b0 100644
--- a/OAuth/i18n/lb.json
+++ b/OAuth/i18n/lb.json
@@ -7,7 +7,6 @@
"Soued031"
]
},
- "oauth": "OAuth",
"mwoauth-desc": "Erlaabt de Gebrauch vun OAuth 1.0a an OAuth 2.0 fir API Autorisatioun",
"mwoauth-verified": "D'Applikatioun ass elo berechtegt op MediaWiki an Ärem Numm zouzegräifen.\n\nFir de Prozess ofzeschléissen, gitt wgl. dëse Kontrollwäert un d'Applatioun virun: '''$1'''",
"mwoauth-db-readonly": "D'OAuth-Datebank ass temporär gespaart. Probéiert wgl. an e puer Minutte nach eng Kéier.",
@@ -17,32 +16,45 @@
"mwoauth-field-hidden": "(dës Informatioun ass verstoppt)",
"mwoauth-field-private": "(dës Informatioun ass privat)",
"mwoauth-prefs-managegrants": "Verbonnen Applicatiounen:",
- "mwoauth-prefs-managegrantslink": "$1 Verbonnen {{PLURAL:$1|$1 Verbonnen Applicatioun|$1 Verbonnen Applicatioune|0=verbonnen Applicatioune}} geréieren",
+ "mwoauth-prefs-managegrantslink": "{{PLURAL:$1|$1 Verbonnen Applicatioun|$1 Verbonnen Applicatioune|0=verbonnen Applicatioune}} geréieren",
"mwoauth-consumer-allwikis": "All Projeten op dësem Site",
"mwoauth-consumer-name": "Numm vun der Applicatioun:",
+ "mwoauth-consumer-version": "Verbraucherversioun:",
+ "mwoauth-consumer-user": "Editeur:",
"mwoauth-consumer-stage": "Aktuelle Status:",
"mwoauth-consumer-email": "Kontakt-E-Mail-Adress:",
"mwoauth-consumer-owner-only-label": "Besëtzer-nëmmen:",
"mwoauth-consumer-description": "Beschreiwung vum Programm:",
+ "mwoauth-consumer-callbackurl": "OAuth-Callback-URL:",
"mwoauth-consumer-wiki-thiswiki": "Aktuelle Projet ($1)",
+ "mwoauth-consumer-restrictions": "Limitatioune fir d'Benotzen:",
+ "mwoauth-consumer-restrictions-json": "Limitatioun fir d'Benotzen (JSON):",
"mwoauth-consumer-reason": "Grond:",
"mwoauth-consumer-email-unconfirmed": "D'E-Mail-Adress vun Ärem Benotzerkont gouf nach net confirméiert.",
+ "mwoauth-consumer-email-mismatched": "D'E-Mail-Adress déi ugi gëtt muss déi sinn, déi an Ärem Benotzerkont uginn ass.",
+ "mwoauth-consumer-not-proposed": "De Konsument gëtt elo net proposéiert",
"mwoauth-consumer-not-disabled": "De Konsument ass elo net desaktivéiert",
"mwoauth-invalid-consumer-key": "Et gëtt kee Konsument mat dem Schlëssel deen ugi gouf.",
"mwoauth-consumer-stage-proposed": "geplangt",
"mwoauth-consumer-stage-rejected": "refuséiert",
"mwoauth-consumer-stage-expired": "ofgelaf",
+ "mwoauth-consumer-stage-approved": "akzeptéiert",
"mwoauth-consumer-stage-disabled": "desaktivéiert",
+ "mwoauth-consumer-stage-suppressed": "ewechgeholl",
"mwoauthconsumerregistration-navigation": "Navigatioun:",
+ "mwoauthconsumerregistration-list": "Meng Verbraucherlëscht",
"mwoauthconsumerregistration-main": "Haaptsäit",
"mwoauthconsumerregistration-update-submit": "Konsument aktualiséieren",
"mwoauthconsumerregistration-name": "Konsument",
+ "mwoauthconsumerregistration-user": "Editeur",
"mwoauthconsumerregistration-description": "Beschreiwung",
+ "mwoauthconsumerregistration-email": "Kontakt-E-Mail-Adress",
"mwoauthconsumerregistration-stage": "Status",
"mwoauthconsumerregistration-lastchange": "Lescht Ännerung",
"mwoauthconsumerregistration-manage": "geréieren",
"mwoauthconsumerregistration-resetsecretkey": "De Geheimschlëssel op en neie Wäert setzen",
"mwoauthmanageconsumers-notloggedin": "Dir musst ageloggt si fir op dës Säit ze kommen.",
+ "mwoauthmanageconsumers-type": "Queuen:",
"mwoauthmanageconsumers-showproposed": "Proposéiert Ufroen",
"mwoauthmanageconsumers-showrejected": "Refuséiert Ufroen",
"mwoauthmanageconsumers-showexpired": "Ofgelafen Ufroen",
@@ -58,6 +70,8 @@
"mwoauthmanageconsumers-email": "Kontakt-E-Mail",
"mwoauthmanageconsumers-lastchange": "Lescht Ännerung",
"mwoauthmanageconsumers-review": "nokucken/geréieren",
+ "mwoauthmanageconsumers-action": "Status änneren:",
+ "mwoauthmanageconsumers-approve": "Akzeptéiert",
"mwoauthmanageconsumers-reject": "Refuséiert",
"mwoauthmanageconsumers-disable": "Desaktivéiert",
"mwoauthmanageconsumers-reenable": "Akzeptéiert",
@@ -67,18 +81,24 @@
"oauthlistconsumers": "OAuth-Programmer opzielen",
"mwoauthlistconsumers-view": "Detailer",
"mwoauthlistconsumers-name": "Numm vun der Applicatioun",
+ "mwoauthlistconsumers-user": "Editeur",
"mwoauthlistconsumers-description": "Beschreiwung",
"mwoauthlistconsumers-wiki": "Applicabele Projet",
"mwoauthlistconsumers-status-proposed": "proposéiert",
+ "mwoauthlistconsumers-status-approved": "akzeptéiert",
"mwoauthlistconsumers-status-disabled": "desaktivéiert",
+ "mwoauthlistconsumers-status-rejected": "refuséiert",
"mwoauthlistconsumers-status-expired": "ofgelaf",
"mwoauthlistconsumers-navigation": "Navigatioun:",
"mwoauthlistconsumers-grants-link": "Rechter geréieren",
"oauthmanagemygrants": "Verbonnen Applicatioune geréieren",
"mwoauthmanagemygrants-navigation": "Navigatioun:",
+ "mwoauthmanagemygrants-user": "Editeur:",
"mwoauthmanagemygrants-description": "Beschreiwung",
"mwoauthmanagemygrants-wikiallowed": "Um Projet erlaabt:",
"mwoauthmanagemygrants-grantaccept": "Accordéiert",
+ "mwoauthmanagemygrants-update-text": "Benotzt de Formulaire hei drënner fir déi autoriséiert Rechter vun der Applikatioun, déi an dengem Numm handelt, z'änneren.",
+ "mwoauthmanagemygrants-confirm-legend": "Verbonnen Applikatioun geréieren",
"mwoauthmanagemygrants-update": "Rechter aktualiséieren",
"mwoauthmanagemygrants-renounce": "Autorisatioun ewechhuelen",
"mwoauthmanagemygrants-action": "Status änneren:",
@@ -96,6 +116,8 @@
"mwoauth-form-description-allwikis-nogrants": "Bonjour $1,\n\nFir Är Ufro ofzeschléissen, brauch '''$2''' d'Autorisatioun fir dës Aktiounen an Ärem Numm op alle Projete vun dësem Site ze maachen. Et gi keng Ännerungen un Ärem Benotzerkont gemaach.",
"mwoauth-form-description-onewiki-nogrants": "Bonjour $1,\n\nFir Är Ufro ofzeschléissen, brauch '''$2''' d'Autorisatioun fir op Informatiounen op '''$4''' an Ärem Numm zouzegräifen. Et gi keng Ännerungen un Ärem Benotzerkont gemaach.",
"mwoauth-form-description-allwikis-privateinfo": "Bonjour $1,\n\nFir Är Ufro ofzeschléissen, brauch '''$2''' d'Autorisatioun fir op Informatiounen iwwer Iech, inklusiv Äre richtegen Numm an Är E-Mail-Adress, op alle Projete vun dësem Site, zouzegräifen. Et gi keng Ännerungen un Ärem Benotzerkont gemaach",
+ "mwoauth-form-description-allwikis-privateinfo-norealname": "Bonjour $1,\n\nFir Är Ufro ofzeschléissen, brauch '''$2''' d'Autorisatioun fir op Informatiounen iwwer Iech, inklusiv Är E-Mail-Adress, op alle Projete vun dësem Site, zouzegräifen. Et gi keng Ännerungen mat Ärem Benotzerkont gemaach.",
+ "mwoauth-form-description-onewiki-privateinfo-norealname": "Bonjour $1,\n\nFir Är Ufro ofzeschléissen, brauch '''$2''' d'Autorisatioun fir op Informatiounen op ''$4'' inklusiv Ärer E-Mail-Adress zouzegräifen. Et gi keng Ännerungen un Ärem Benotzerkont gemaach.",
"mwoauth-form-button-approve": "Erlaben",
"mwoauth-form-button-cancel": "Ofbriechen",
"mwoauth-error": "Verbinndungsfeeler vun der Software",
@@ -128,5 +150,6 @@
"notification-oauth-app-body": "Grond: $1",
"mwoauth-oauth2-granttype-auth-code": "Autorisatiouns-Code",
"mwoauthconsumer-consumer-view": "Dëse Konsument weisen",
- "mwoauthconsumer-application-view": "Dës Applikatioun weisen"
+ "mwoauthconsumer-application-view": "Dës Applikatioun weisen",
+ "grant-oauthmanageownclient": "Geréiert Är OAuth Clienten"
}
diff --git a/OAuth/i18n/lld.json b/OAuth/i18n/lld.json
index 071194cf..ea899d74 100644
--- a/OAuth/i18n/lld.json
+++ b/OAuth/i18n/lld.json
@@ -4,6 +4,8 @@
"Starladin"
]
},
+ "oauthlistconsumers": "Lista dles aplicaziuns OAuth",
+ "oauthmanagemygrants": "Gestiun dles aplicaziuns colegades",
"mwoauth-oauth2-granttype-auth-code": "Codesc d'autorisaziun",
"mwoauth-oauth2-granttype-refresh-token": "Ciaria danü le simbol",
"mwoauth-oauth2-granttype-client-credentials": "Dac dl cliënt",
diff --git a/OAuth/i18n/lmo.json b/OAuth/i18n/lmo.json
new file mode 100644
index 00000000..221e69c0
--- /dev/null
+++ b/OAuth/i18n/lmo.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Salvemm el lombard"
+ ]
+ },
+ "oauthlistconsumers": "Lista di aplicazzion OAuth"
+}
diff --git a/OAuth/i18n/lt.json b/OAuth/i18n/lt.json
index f043728a..91bc8693 100644
--- a/OAuth/i18n/lt.json
+++ b/OAuth/i18n/lt.json
@@ -4,10 +4,11 @@
"Eitvys200",
"Homo",
"Hugo.arg",
- "Manvydasz"
+ "Manvydasz",
+ "Tomasdd"
]
},
- "mwoauth-desc": "Leidžia naudoti OAuth 1.0a API autorizacijai",
+ "mwoauth-desc": "Leidžia naudoti OAuth 1.0a ir OAuth 2.0 API autorizacijai",
"mwoauth-prefs-managegrants": "Susieti programiniai įskiepiai:",
"mwoauth-prefs-managegrantslink": "Tvarkyti $1 {{PLURAL:$1|susietą programinį įskiepį|susietus programinius įskiepius|susietų programinių įskiepių}}",
"oauthmanagemygrants": "Tvarkyti susietas programas",
diff --git a/OAuth/i18n/mk.json b/OAuth/i18n/mk.json
index fefa94bb..8292f7f6 100644
--- a/OAuth/i18n/mk.json
+++ b/OAuth/i18n/mk.json
@@ -1,11 +1,14 @@
{
"@metadata": {
"authors": [
+ "Amire80",
"Bjankuloski06",
"Macofe",
"Vlad5250"
]
},
+ "abusefilter-edit-builder-vars-oauth-consumer": "OAuth-потрошувачот со кој се врши оваа промена",
+ "oauth": "OAuth",
"mwoauth-desc": "Овозможува употреба на OAuth 1.0a и OAuth 2.0 за заверка на приложници",
"mwoauth-nosubpage-explanation": "OAuth е механизам кој им овозможува на надворешните прилози да распознаат корисник на {{SITENAME}} или да делуваат во негово име, откако ќе добијат дозвола од него.\n\nЗа оваа страница да работи, се бараат уште параметри. Ако сте тука преку надворешен прилог, тоа веројатно се случило поради грешка во прилогот; ќе треба да го контактирате авторот.",
"mwoauth-verified": "На извршникот не му е дозволен пристап до МедијаВики во ваше име.\n\nЗа да ја довршите постапката, на извршникот укажете му ја следнава контролна вредност: '''$1'''",
@@ -13,6 +16,7 @@
"mwoauth-missing-field": "Недостасува вредност во полето „$1“",
"mwoauth-invalid-field": "Во полето „$1“ е зададена неважечка вредност",
"mwoauth-invalid-field-generic": "Укажана е неважечка вредност",
+ "mwoauth-invalid-field-oauth2GrantTypes": "Прилозите на OAuth 2 мора да укажуваат барем еден вид на доделба",
"mwoauth-field-hidden": "(оваа информација е скриена)",
"mwoauth-field-private": "(оваа информација е доверлива)",
"mwoauth-prefs-managegrants": "Поврзани извршници:",
@@ -30,6 +34,8 @@
"mwoauth-consumer-owner-only-help": "Со оваа можност, потрошувачот ќе биде автоматски одобрен и прифатин за употреба од $1. Нема да може да го користи било кој друг корисник, и нема да работи вообичаениот тек на овластување. Дејствата на овој потрошувач нема да се означуваат.",
"mwoauth-consumer-description": "Опис на извршникот:",
"mwoauth-consumer-callbackurl": "URL-адреса за повикување на OAuth:",
+ "mwoauth-consumer-callbackurl-help": "За разлика од OAuth 1.0a, оваа URL-адреса е точно совпадната",
+ "mwoauth-consumer-callbackurl-warning": "(џокерска порта)",
"mwoauth-consumer-callbackisprefix": "Овозможи му на потрошувачот да укаже повратен повик во барањата и погоре да користи URL за повратен повик како задолжителна претставка.",
"mwoauth-consumer-granttypes": "Видови доделувања што се бараат:",
"mwoauth-consumer-grantsneeded": "Применливи доделувања:",
@@ -66,12 +72,15 @@
"mwoauth-consumer-stage-suppressed": "притаен",
"oauthconsumerregistration": "Пријава на потрошувач на OAuth",
"mwoauthconsumerregistration-navigation": "Прегледник:",
- "mwoauthconsumerregistration-propose": "Предложи нов потрошувач",
+ "mwoauthconsumerregistration-propose-oauth1a": "Предложи нов потрошувач на OAuth 1.0a",
+ "mwoauthconsumerregistration-propose-oauth2": "Предложи нов клиент на OAuth 2.0",
"mwoauthconsumerregistration-list": "Список на мои потрошувачи",
"mwoauthconsumerregistration-main": "Главна",
- "mwoauthconsumerregistration-propose-text": "Програмерите треба да го користат образецов за предлагање на нов потрошувач на OAuth (повеќе ќе најдете во [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth документацијата на додатокот]). Откако ќе го поднесете образецот, ќе добиете шифра со која ќе се претставувате на МедијаВики. Администратор на OAuth ќе треба да ви ја одобри пријавата пред да можат да ја овластуваат корисниците.\n\nНеколку препораки и напомении:\n* Доделувајте што помалку одобренија. Одбегнувајте ги оние што не се потребни во моментов.\n* Верзиите се од обликот „главно.споредно.издание“ (последните две се незадолжителни) и зголемете и се зголемуваат со потребата за измени во доделувањата.\n* По можност, внесете јавен RSA-клуч (во форматот PEM); во спротивно (помалку безбедно) ќе ви зададеме таен клуч.\n* Можете да го ограничите потрошувачот на само еден проект на ова мрежно место, внесувајќи ја назнаката на проектот („*“ за сите проект).",
+ "mwoauthconsumerregistration-propose-text": "Можете да:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|Предложите потрошувач на OAuth 1.0a]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Предложите клиент на OAuth 2.0]].",
+ "mwoauthconsumerregistration-propose-text-oauth1a": "Програмерите треба да го користат образецов за предлагање на нов потрошувач на OAuth (повеќе ќе најдете во [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth документацијата на додатокот]). Откако ќе го поднесете образецот, ќе добиете шифра со која ќе се претставувате на МедијаВики. Администратор на OAuth ќе треба да ви ја одобри пријавата пред да можат да ја овластуваат корисниците.\n\nНеколку препораки и напомени:\n* Доделувајте што помалку одобренија. Одбегнувајте ги оние што не се потребни во моментов.\n* Верзиите се од обликот „главно.споредно.издание“ (последните две се незадолжителни) и зголемете и се зголемуваат со потребата за измени во доделувањата.\n* По можност, внесете јавен RSA-клуч (во форматот PEM); во спротивно (помалку безбедно) ќе ви зададеме таен клуч.\n* Можете да го ограничите потрошувачот на само еден проект на ова мрежно место, внесувајќи ја назнаката на проектот („*“ за сите проект).",
+ "mwoauthconsumerregistration-propose-text-oauth2": "Програмерите треба да го користат образецов за побараат шифра на нов потрошувач на OAuth (повеќе ќе најдете во [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth документацијата на додатокот]). Откако ќе го поднесете образецот, ќе добиете шифра со која вашиот прилог ќе се претставува на МедијаВики. Администратор на OAuth ќе треба да ви ја одобри пријавата пред да можат да ја овластуваат корисниците.\n\nНеколку препораки и напомени:\n* Пробајте да користите што помалку делокрузи. Избегнувајте ги оние што не се потребни сега.\n* Верзиите се во обликот „големо.мало.издание“ (последните две се незадолжителни) и зголемувајте по потреба, како што се зголемува делокругот.\n* Можете да го ограничите потрошувачот на само еден проект на ова мрежно место, внесувајќи ја назнаката на проектот („*“ за сите проекти).",
"mwoauthconsumerregistration-update-text": "Образецот подолу служи за менување на аспекти на потрошувачот на OAuth што се во ваша контрола.\n\nСите вредности тука ќе се презапишат врз претходните. Не оставајте празни полиња, освен ако не сакате да ги исчистите истите.",
- "mwoauthconsumerregistration-maintext": "Оваа страница им овозможува на програмерите да предлагаат и подновуваат (менуваат) потрошувачки извршници за OAuth (погл. http://oauth.net) во регистарот на ова мрежно место.\n\nОд овде можете да: [[Special:OAuthConsumerRegistration/propose|предложите нов потрошувач]] или пак [[Special:OAuthConsumerRegistration/list|раководите со вашите постоечки потрошувачи]].\n\nПовеќе информации за OAuth ќе најдете во [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth документацијата на додатокот].",
+ "mwoauthconsumerregistration-maintext": "Оваа страница им овозможува на програмерите да предлагаат и подновуваат (менуваат) потрошувачки извршници за OAuth (погл. http://oauth.net) во регистарот на ова мрежно место.\n\nОд овде можете да: * [[Special:OAuthConsumerRegistration/propose/oauth1a|Побарате шифра за нов потрошувач на OAuth 1.0a]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Побарате шифра за нов клиент на 2.0]].\n* [[Special:OAuthConsumerRegistration/list|Раководите се постоечки потрошувачи]].\n\nПовеќе информации за OAuth ќе најдете во [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth документацијата на додатокот].",
"mwoauthconsumerregistration-propose-legend": "Нов кориснички извршник за OAuth",
"mwoauthconsumerregistration-update-legend": "Измена на кориснички извршник за OAuth",
"mwoauthconsumerregistration-propose-submit": "Предложи потрошувач",
@@ -212,7 +221,7 @@
"log-action-filter-mwoauthconsumer-update": "Потрошувачка поднова со OAuth",
"mwoauthconsumer-consumer-logpage": "Потрошувачки дневник за OAuth",
"mwoauthconsumer-consumer-logpagetext": "Дневник на одобрувања, одбивања и оневозможувања на зачленети потрошувачи на OAuth.",
- "mwoauth-bad-request-missing-params": "За жал, се јави проблем при поставувањето на извршникот. Обратете се на <span class=\"plainlinks\">[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth местото за поддршка]</span> за да дознаете како да го решите.\n\n<span class=\"plainlinks mw-mwoautherror-details\">На OAuth му недостасуваат параметри, $1</span>",
+ "mwoauth-bad-request-missing-params": "За жал, се јави проблем при поставувањето на прилогот. Обратете се кај неговиот разработувач.\n\n<span class=\"plainlinks mw-mwoautherror-details\">На OAuth му недостасуваат параметри, $1</span>",
"mwoauth-bad-request-invalid-action": "За жал, се јави проблем при поставувањето на извршнико. Обратете се кај неговиот автор за да го решите.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Непозната URL, $1</span>",
"mwoauth-bad-request-invalid-action-contact": "За жал, се јави некаков проблем. Ќе треба да се [$1 обратите] кај авторот на извршникот за да го решите.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Непозната URL, $2</span>",
"mwoauthdatastore-access-token-not-found": "Не пронајдов одобрено доделување со таа повластена шифра",
@@ -249,6 +258,7 @@
"mwoauth-form-button-approve": "Дозволи",
"mwoauth-form-button-cancel": "Откажи",
"mwoauth-error": "Грешка во поврзувањето со извршникот",
+ "mwoauth-error-missing-callback-url-non-owner": "Се бара callback_url за само несопственички клиенти",
"mwoauth-grants-heading": "Побарани дозволи:",
"mwoauth-grants-nogrants": "Извршникот нема побарано ниедна дозвола.",
"mwoauth-acceptance-cancelled": "Одбравте на „$1“ да не му дозволите пристап на вашата сметка. „$1“ ќе работи само ако му дадете дозвола. Можете да се вратите на „$1“ или пак да направите [[Special:OAuthManageMyGrants|нагодувања]] на поврзаните извршници.",
@@ -325,5 +335,9 @@
"mwoauth-consumer-access-no-user": "Потрошувачкото одобрение мора да биде врзано за важечки корисник. Укажан е корисник со назнака 0",
"mwoauth-login-required-reason": "Ќе треба да се најавите со вашата сметка на {{SITENAME}} за да ги овластите прилозите за пристап до неа.",
"mwoauthconsumer-consumer-view": "Погл. го потрошувачов",
- "mwoauthconsumer-application-view": "Погр. го прилогов"
+ "mwoauthconsumer-application-view": "Погр. го прилогов",
+ "grant-oauthmanageownclient": "Раководење со вашите клиенти на OAuth",
+ "mwoauth-consumer-user-mismatch": "Не можете да вршите дејства врз клиенти кои не ви припаѓаат вам",
+ "mwoauth-consumer-deleted-error": "Не можете да вршите дејства врз избришани клиенти",
+ "mwoauth-consumer-submit-error": "Се појави грешка при зачувувањето на потрошувач"
}
diff --git a/OAuth/i18n/mr.json b/OAuth/i18n/mr.json
index aefa4da7..4a2c19af 100644
--- a/OAuth/i18n/mr.json
+++ b/OAuth/i18n/mr.json
@@ -52,7 +52,6 @@
"mwoauth-consumer-stage-disabled": "अक्षम केलेल्या",
"mwoauth-consumer-stage-suppressed": "दमन(सप्रेस) केलेल्या",
"mwoauthconsumerregistration-navigation": "सुचालन:",
- "mwoauthconsumerregistration-propose": "नविन ग्राहक प्रस्तावित करा",
"mwoauthconsumerregistration-list": "माझी ग्राहक यादी",
"mwoauthconsumerregistration-main": "मुख्य",
"mwoauthconsumerregistration-name": "ग्राहक",
diff --git a/OAuth/i18n/mt.json b/OAuth/i18n/mt.json
new file mode 100644
index 00000000..f6cc552b
--- /dev/null
+++ b/OAuth/i18n/mt.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chrisportelli"
+ ]
+ },
+ "mwoauth-prefs-managegrants": "Applikazzjonijiet konnessi:"
+}
diff --git a/OAuth/i18n/my.json b/OAuth/i18n/my.json
index c32c8c57..bcec2c56 100644
--- a/OAuth/i18n/my.json
+++ b/OAuth/i18n/my.json
@@ -10,9 +10,13 @@
"mwoauth-prefs-managegrants": "ဆက်သွယ်ထားသော အက်ပ်များ -",
"mwoauth-prefs-managegrantslink": "ချိတ်ဆက်ထားသော {{PLURAL:$1|အပလေကေးရှင်း|အပလေကေးရှင်းများ}} $1 ခုကို စီမံခန့်ခွဲရန်",
"mwoauth-consumer-allwikis": "ဤဆိုဒ်ပေါ်ရှိ ပရောဂျက်အားလုံး",
+ "mwoauth-consumer-name": "အပလေကေးရှင်းအမည်-",
+ "mwoauth-consumer-version": "အသုံးပြုသူ ဗားရှင်း-",
"mwoauth-consumer-user": "ထုတ်ဝေသူ:",
"mwoauth-consumer-stage": "လက်ရှိအခြေနေ:",
+ "mwoauth-consumer-wiki": "အသုံးချနိုင်သော ပရောဂျက်-",
"mwoauth-consumer-wiki-thiswiki": "လက်ရှိ ပရောဂျက် ($1)",
+ "mwoauth-consumer-restrictions": "အသုံးချမှု ကန့်သတ်ချက်များ-",
"mwoauth-consumer-reason": "အ​ကြောင်း​ပြ​ချက်:",
"mwoauth-consumer-stage-proposed": "အဆိုပြုထားသော",
"mwoauth-consumer-stage-rejected": "ငြင်းပယ်ခဲ့သည်",
diff --git a/OAuth/i18n/nah.json b/OAuth/i18n/nah.json
index b04db54e..51c32867 100644
--- a/OAuth/i18n/nah.json
+++ b/OAuth/i18n/nah.json
@@ -1,8 +1,9 @@
{
"@metadata": {
"authors": [
- "Akapochtli"
+ "Akapochtli",
+ "Languaeditor"
]
},
- "mwoauth-form-button-cancel": "Moxitiniz"
+ "mwoauth-form-button-cancel": "Xikxolewa"
}
diff --git a/OAuth/i18n/nb.json b/OAuth/i18n/nb.json
index 91d2324e..69181329 100644
--- a/OAuth/i18n/nb.json
+++ b/OAuth/i18n/nb.json
@@ -6,6 +6,7 @@
"Jon Harald Søby"
]
},
+ "abusefilter-edit-builder-vars-oauth-consumer": "OAuth-konsument brukt til å utføre denne endringen",
"mwoauth-desc": "Muliggjør bruk av OAuth 1.0a og OAuth 2.0 for API-autorisering",
"mwoauth-nosubpage-explanation": "OAuth er en mekanisme som lar eksterne applikasjoner identifisere en {{SITENAME}}-bruker eller handle på deres vegne, etter at tillatelse er gitt av brukeren.\n\nFor at denne siden skal gjøre noe må flere parametere angis. Hvis du ble sendt hit av en ekstern applikasjon var det trolig på grunn av en feil i applikasjonen; du burde kontakte opphavspersonen dens.",
"mwoauth-verified": "Applikasjonen har nå tilgang til MediaWiki på dine vegne.\n\nFor å fullføre prosessen, vennligst angi verifikasjonsverdien til applikasjonen: '''$1'''",
@@ -30,6 +31,7 @@
"mwoauth-consumer-owner-only-help": "Å velge dette alternativet gjør at konsumenten godkjennes automatisk og godtas for bruk av $1. Det vil ikke kunne brukes av andre brukere, og den vanlige autoriseringsflyten vil ikke fungere. Handlinger tatt med denne konsumenten blir ikke tagget.",
"mwoauth-consumer-description": "Beskrivelse av appen:",
"mwoauth-consumer-callbackurl": "OAuth «callback»-URL:",
+ "mwoauth-consumer-callbackurl-warning": "(jokertegn-port)",
"mwoauth-consumer-callbackisprefix": "La konsument angi et callback i forespørsler og bruke «callback»-URL-en ovenfor som påkrevd prefiks.",
"mwoauth-consumer-granttypes": "Typer tildelinger som det bes om:",
"mwoauth-consumer-grantsneeded": "Tilgjengelige tildelinger:",
@@ -66,10 +68,9 @@
"mwoauth-consumer-stage-suppressed": "underslått",
"oauthconsumerregistration": "OAuth-konsumentregistrering",
"mwoauthconsumerregistration-navigation": "Navigasjon:",
- "mwoauthconsumerregistration-propose": "Foreslå ny konsument",
"mwoauthconsumerregistration-list": "Min konsumentliste",
"mwoauthconsumerregistration-main": "Hovedside",
- "mwoauthconsumerregistration-propose-text": "Utviklere kan bruke skjemaet under for å søke om en ny OAuth-konsument (se [//www.mediawiki.org/wiki/Extension:OAuth dokumentasjonen for MediaWiki-tillegget] for flere detaljer). Etter at skjemaet er sendt inn, vil du få et token som applikasjonen kan bruke for å identifisere seg for MediaWiki. En OAuth-administrator må godkjenne søknaden før applikasjonen kan brukes av andre brukere.\n\nNoen anbefalinger:\n* Prøv å bruke så få rettighetstildelinger som mulig. Unngå tildelinger som strengt tatt ikke er nødvendige.\n* Versjonsnumre følger formen «major.minor.release» (de siste to er valgfrie) og øker når endringer i tildelinger er nødvendige.\n* Du kan begrense applikasjonen til et bestemt prosjekt.",
+ "mwoauthconsumerregistration-propose-text": "Utviklere kan bruke skjemaet under for å søke om en ny OAuth-konsument (se [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth dokumentasjonen for MediaWiki-tillegget] for flere detaljer). Etter at skjemaet er sendt inn, vil du få et token som applikasjonen kan bruke for å identifisere seg for MediaWiki. En OAuth-administrator må godkjenne søknaden før applikasjonen kan brukes av andre brukere.\n\nNoen anbefalinger:\n* Prøv å bruke så få rettighetstildelinger som mulig. Unngå tildelinger som strengt tatt ikke er nødvendige.\n* Versjonsnumre følger formen «major.minor.release» (de siste to er valgfrie) og øker når endringer i tildelinger er nødvendige.\n* Du kan begrense applikasjonen til et bestemt prosjekt.",
"mwoauthconsumerregistration-update-text": "Bruk skjemaet under for å oppdatere innstillinger for en OAuth-konsument du kontrollerer.",
"mwoauthconsumerregistration-maintext": "Denne siden er for å la utviklere foreslå og oppdatere OAuth-konsumentapplikasjoner i registeret.\n\nHerfra kan du\n* [[Special:OAuthConsumerRegistration/propose|Søke om et token for en ny konsumentapplikasjon]].\n* [[Special:OAuthConsumerRegistration/list|Håndtere dine eksisterende konsumentapplikasjoner]].\n\nFor mer informasjon om OAuth, se [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth dokumentasjonen for MediaWiki-tillegget].",
"mwoauthconsumerregistration-propose-legend": "Ny OAuth-konsumentapplikasjon",
@@ -249,6 +250,7 @@
"mwoauth-form-button-approve": "Godkjenn",
"mwoauth-form-button-cancel": "Avbryt",
"mwoauth-error": "Tilkoblingsfeil for applikasjonen",
+ "mwoauth-error-missing-callback-url-non-owner": "callback_url kreves for «non-owner-only»-klienter",
"mwoauth-grants-heading": "Ønskede rettigheter:",
"mwoauth-grants-nogrants": "Applikasjonen har ikke bedt om noen rettigheter.",
"mwoauth-acceptance-cancelled": "Du har valgt å ikke gi «$1» tilgang til kontoen din. «$1» vil ikke fungere uten denne tilgangen. Du kan velge å gå tilbake til «$1» eller [[Special:OAuthManageMyGrants|håndtere]] dine tilkoblede apper.",
@@ -305,15 +307,19 @@
"mwoauth-oauth2-granttypes": "Tillatte OAuth2-tildelingstyper",
"mwoauth-oauth2-granttype-auth-code": "Autoriseringskode",
"mwoauth-oauth2-granttype-refresh-token": "Oppdater nøkkel",
+ "mwoauth-oauth2-granttype-client-credentials": "Klientlegitimasjon",
"mwoauth-oauth2-error-create-at-no-user-approval": "Kan ikke opprette tilgangsnøkkel, brukeren godtok ikke å utdele denne tilgangsnøkkelen",
"mwoauth-oauth2-error-user-approval-deny": "Brukeren har avvist forespørselen fra klientapplikasjonen",
"mwoauth-oauth-unsupported-version": "Dette endepunktet er ikke tillatt for OAuth versjon $1",
+ "mwoauth-oauth2-error-unauthorized-scope": "Omfanget «$1» er ikke tillatt for denne applikasjonen",
"mwoauth-oauth2-error-owner-only-invalid-grant": "Klienter for kun eiere må kunne bruke client_credentials",
"mwoauth-oauth2-unable-to-retrieve-access-token": "Kunne ikke hente tilgangsnøkkel: $1",
+ "mwoauth-oauth2-error-server-error": "Autorisasjonstjeneren påtraff en uventet tilstand som forhindret den fra å fullføre forespørselen.",
"mwoauth-oauth2-error-invalid-request": "Forespørselen mangler en påkrevd parameter, inkluderer en ugyldig parameterverdi, inkluderer en parameter flere ganger, eller er misformet på annet vis.",
"mwoauth-oauth2-error-unauthorized-client": "Klienten er ikke autorisert til å be om en autoriseringskode med denne metoden.",
"mwoauth-oauth2-error-access-denied": "Ressurseieren eller autoriseringstjeneren avviste forespørselen.",
"mwoauth-oauth2-error-unsupported-response-type": "Autoriseringstjeneren støtter ikke henting av autoriseringskode med denne metoden.",
+ "mwoauth-oauth2-error-invalid-scope": "Det forespurte omfanget er ugyldig, ukjent eller feilformet.",
"mwoauth-oauth2-error-temporarily-unavailable": "Autoriseringstjeneren er for tiden ikke i stand til å behandle forespørselen på grunn av overbelastning eller vedlikehold av tjeneren.",
"mwoauth-oauth2-error-invalid-client": "Klientautentisering feilet (f.eks. ukjent klient, ingen klientautentisering inkludert eller ustøttet autentiseringsmetode)",
"mwoauth-oauth2-error-request-not-verified": "Prøvde å hente godkjent egenskap før forespørselen ble bekreftet",
@@ -321,5 +327,9 @@
"mwoauth-consumer-access-no-user": "Konsumentgodkjenning må være knyttet til en gyldig bruker, bruker med ID 0 gitt",
"mwoauth-login-required-reason": "Du må logge inn med kontoen din på {{SITENAME}} for å autorisere tilgang til applikasjoner.",
"mwoauthconsumer-consumer-view": "Vis denne konsumenten",
- "mwoauthconsumer-application-view": "Vis denne applikasjonen"
+ "mwoauthconsumer-application-view": "Vis denne applikasjonen",
+ "grant-oauthmanageownclient": "Behandle OAuth-klientene dine",
+ "mwoauth-consumer-user-mismatch": "Du kan ikke utføre handlinger på klienter som ikke tilhører deg",
+ "mwoauth-consumer-deleted-error": "Du kan ikke utføre handlinger på slettede klienter",
+ "mwoauth-consumer-submit-error": "En feil oppsto mens konsumenten ble lagret"
}
diff --git a/OAuth/i18n/ne.json b/OAuth/i18n/ne.json
index fdd51c24..0ed23f73 100644
--- a/OAuth/i18n/ne.json
+++ b/OAuth/i18n/ne.json
@@ -1,14 +1,17 @@
{
"@metadata": {
"authors": [
+ "Bada Kaji",
"NehalDaveND",
"Nirjal stha",
"पर्वत सुबेदी",
+ "बडा काजी",
"राम प्रसाद जोशी",
"सरोज कुमार ढकाल"
]
},
"mwoauth-prefs-managegrants": "जडान गरिएका अनुप्रयाेगहरू",
+ "mwoauth-prefs-managegrantslink": "जडान {{PLURAL:$1|गरिएका $1 एप|गरिएका $1 एपहरू|0=गरिएका एपहरू}} प्रबन्ध गर्नुहोस्",
"mwoauth-consumer-granttypes": "निवेदन गरिएको अनुदानको प्रकारः",
"mwoauth-consumer-reason": "कारण:",
"mwoauth-consumer-email-unconfirmed": "तपाईंको खातामा इमेल ठेगाना प्रमाणित भएको छैन ।",
@@ -22,7 +25,8 @@
"mwoauthlistconsumers-status": "स्थिति",
"mwoauthlistconsumers-navigation": "पथ प्रर्दशन",
"mwoauthlistconsumers-update-link": "अद्यावधिक उपभोक्ता",
+ "oauthmanagemygrants": "जडान गरिएका अनुप्रयोगहरू व्यवस्थापन गर्नुहोस्",
"mwoauthmanagemygrants-description": "विवरण",
- "mwoauth-form-button-cancel": "रद्द गर्ने",
+ "mwoauth-form-button-cancel": "रद्द गर्नुहोस्",
"mwoauth-granttype-normal": "विशेष अनुमति अधिकारको लागि निवेदन गर्नुहोस् ।"
}
diff --git a/OAuth/i18n/nl-informal.json b/OAuth/i18n/nl-informal.json
new file mode 100644
index 00000000..2f651650
--- /dev/null
+++ b/OAuth/i18n/nl-informal.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "McDutchie"
+ ]
+ },
+ "mwoauthconsumerregistration-propose-text": "Je kunt:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|Een OAuth 1.0a-consument voorstellen]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Een OAuth 2.0-cliënt voorstellen]]."
+}
diff --git a/OAuth/i18n/nl.json b/OAuth/i18n/nl.json
index a634312e..db9a30aa 100644
--- a/OAuth/i18n/nl.json
+++ b/OAuth/i18n/nl.json
@@ -73,12 +73,11 @@
"mwoauth-consumer-stage-suppressed": "onderdrukt",
"oauthconsumerregistration": "Registratie van OAuth-toepassingen",
"mwoauthconsumerregistration-navigation": "Navigatie:",
- "mwoauthconsumerregistration-propose": "Nieuwe consumer voorstellen",
"mwoauthconsumerregistration-list": "Uw consumerlijst",
"mwoauthconsumerregistration-main": "Startpagina",
- "mwoauthconsumerregistration-propose-text": "Ontwikkelaars moeten onderstaand formulier gebruiken om een nieuwe OAuth-toepassing voor te stellen (zie de [//www.mediawiki.org/wiki/Extension:OAuth documentatie van de uitbreiding] voor meer details). Na het indienen van dit formulier ontvangt u een token dat uw toepassing gaat gebruiken om zichzelf te identificeren bij MediaWiki. Een OAuth-beheerder moet uw toepassing goedkeuren voor het door andere gebruikers kan worden toegestaan.\n\nEen paar aanbevelingen en opmerkingen:\n* Probeer zo min mogelijk bevoegdheden te gebruiken. Vermijd bevoegdheden die niet echt nodig zijn.\n* Versies zijn van de vorm \"groot.klein.release\" (de laatste twee elementen zijn optioneel) en moeten oplopen als er wijzigingen voor bevoegdheden nodig zijn.\n* Verschaf indien mogelijk een publieke RSA-sleutel (in PEM-formaat); als dat niet mogelijk is, zal een (minder veilig) geheim token moeten worden gebruikt.\n* U kunt een project-ID gebruiken om de toepassing te beperken tot één enkel project op deze site (gebruik \"*\" voor alle projecten).",
+ "mwoauthconsumerregistration-propose-text": "U kunt:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|Een OAuth 1.0a-consument voorstellen]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Een OAuth 2.0-cliënt voorstellen]].",
"mwoauthconsumerregistration-update-text": "Gebruik onderstaand formulier om bepaalde aspecten van de OAuth-toepassing die u beheert bij te werken.\n\nAlle waarden hier overschrijven eerdere waarden. Laat velden niet leeg, tenzij u inderdaad waarden wilt verwijderen.",
- "mwoauthconsumerregistration-maintext": "Op deze pagina kunnen ontwikkelaars OAuth-toepassingen voorstellen en bijwerken in het register van deze site.\n\nVanaf hier kunt u:\n* [[Special:OAuthConsumerRegistration/propose|een token aanvragen voor een nieuwe toepassing]];\n* [[Special:OAuthConsumerRegistration/list|uw lijst met bestaande toepassingen beheren]].\n\nVoor meer informatie over OAuth kunt u de [https://www.mediawiki.org/wiki/Extension:OAuth uitbreidingsdocumentatie] raadplegen.",
+ "mwoauthconsumerregistration-maintext": "Op deze pagina kunnen ontwikkelaars OAuth-toepassingen voorstellen en bijwerken in het register van deze site.\n\nVanaf hier kunt u:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|Een token voor een nieuwe OAuth 1.0a-consument aanvragen]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Een token voor een nieuwe OAuth 2.0-cliënt aanvragen]].\n* [[Special:OAuthConsumerRegistration/list|Uw lijst met bestaande toepassingen beheren]].\n\nVoor meer informatie over OAuth kunt u de [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth documentatie van deze uitbreiding] raadplegen.",
"mwoauthconsumerregistration-propose-legend": "Nieuwe OAuth-consumertoepassing",
"mwoauthconsumerregistration-update-legend": "OAuth-consumertoepassing bijwerken",
"mwoauthconsumerregistration-propose-submit": "Consumer voorstellen",
@@ -189,7 +188,7 @@
"mwoauthmanagemygrants-confirm-submit": "Toegangstokenstatus bijwerken",
"mwoauthmanagemygrants-success-update": "Uw voorkeuren voor deze toepassing zijn bijgewerkt.",
"mwoauthmanagemygrants-success-renounce": "De toegang tot uw account is voor deze toepassing ingetrokken.",
- "mwoauthmanagemygrants-basic-tooltip": "Waarom kan ik deze toestemming niet bijwerken? Deze toestemming geeft uw gekoppelde toepassing standaard rechten die nodig zijn om goed te kunnen werken. Als u niet wilt dat deze gekoppelde toepassing deze rechten heeft, trek dan de toegang van de toepassing in.",
+ "mwoauthmanagemygrants-basic-tooltip": "Waarom kan ik deze toestemming niet bijwerken? Deze toestemming geeft uw gekoppelde toepassing basisrechten die nodig zijn om goed te kunnen werken. Als u niet wilt dat deze gekoppelde toepassing deze rechten heeft, trek dan de toegang van de toepassing in.",
"mwoauthmanagemygrants-editslink": "{{GENDER:$1|Uw}} bewerkingen gemaakt door deze applicatie",
"mwoauthmanagemygrants-actionslink": "{{GENDER:$1|Uw}} handelingen uitgevoerd door deze applicatie",
"logentry-mwoauthconsumer-propose": "$1 {{GENDER:$2|heeft}} een OAuth-toepassing (toepassingssleutel $4) voorgesteld",
@@ -276,5 +275,6 @@
"notification-oauth-app-disable-primary-link": "Bekijk applicatie",
"notification-oauth-app-reenable-primary-link": "Bekijk applicatie",
"notification-oauth-app-body": "Reden: $1",
+ "mwoauth-oauth2-granttype-auth-code": "Autorisatiecode",
"mwoauth-oauth2-granttype-client-credentials": "Aanmeldgegevens klant"
}
diff --git a/OAuth/i18n/nn.json b/OAuth/i18n/nn.json
index 59783dfb..d45db316 100644
--- a/OAuth/i18n/nn.json
+++ b/OAuth/i18n/nn.json
@@ -39,5 +39,7 @@
"mwoauthmanagemygrants-update": "Oppdater løyve",
"mwoauth-form-description-allwikis": "Hei $1,\n\nfor å fullføra førespurnaden treng '''$2''' løyve til å utføra desse handlingane på dine vegner på alle prosjekta på denne nettstaden:\n\n$4",
"mwoauth-form-description-onewiki": "Hei $1,\n\nfor å fullføra førespurnaden treng '''$2''' løyve til å utføra desse handlingane på dine vegner på ''$4'':\n\n$5",
- "mwoauth-form-description-allwikis-nogrants": "Hei $1,\n\nFor å fullføra førespurnaden din treng '''$2''' løyve til å henta informasjon på dine vegner frå alle prosjekt på denne nettstaden. Ingen endringar vil gjerast med kontoen din."
+ "mwoauth-form-description-allwikis-nogrants": "Hei $1,\n\nFor å fullføra førespurnaden din treng '''$2''' løyve til å henta informasjon på dine vegner frå alle prosjekt på denne nettstaden. Ingen endringar vil gjerast med kontoen din.",
+ "mwoauth-form-description-allwikis-privateinfo-norealname": "Hei $1,\n\nFor å fullføra førespurnaden din treng '''$2''' tilgang til informasjon, inkludert e-postadressa di, på alle prosjekt på denne nettstaden. Ingen endringar vert gjorde med kontoen din.",
+ "mwoauth-form-description-onewiki-privateinfo-norealname": "Hei $1,\n\nFor å fullføra førespurnaden din treng '''$2''' tilgang til informasjon, inkludert e-postadressa di, på ''$4''. Ingen endringar vert gjorde med kontoen din."
}
diff --git a/OAuth/i18n/oc.json b/OAuth/i18n/oc.json
index e07c2766..c0842af8 100644
--- a/OAuth/i18n/oc.json
+++ b/OAuth/i18n/oc.json
@@ -54,7 +54,6 @@
"mwoauth-consumer-stage-suppressed": "suprimit",
"oauthconsumerregistration": "Inscripcion de consomidor OAuth",
"mwoauthconsumerregistration-navigation": "Navigacion :",
- "mwoauthconsumerregistration-propose": "Prepausar un novèl consomator",
"mwoauthconsumerregistration-list": "Ma lista de consomators",
"mwoauthconsumerregistration-main": "Principal",
"mwoauthconsumerregistration-propose-submit": "Prepausar un consomator",
diff --git a/OAuth/i18n/pam.json b/OAuth/i18n/pam.json
deleted file mode 100644
index 15dac1b6..00000000
--- a/OAuth/i18n/pam.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "@metadata": {
- "authors": [
- "Leeheonjin"
- ]
- },
- "mwoauth-grant-createeditmovepage": "Alilan deng bulung (pages)"
-}
diff --git a/OAuth/i18n/pl.json b/OAuth/i18n/pl.json
index b99da681..bfe963e6 100644
--- a/OAuth/i18n/pl.json
+++ b/OAuth/i18n/pl.json
@@ -8,6 +8,8 @@
"Railfail536",
"Rzuwig",
"Sp5uhe",
+ "Stim pl",
+ "Tsca",
"Ty221",
"Vlad5250",
"Vuh",
@@ -15,7 +17,7 @@
]
},
"mwoauth-desc": "Umożliwia korzystanie z OAuth 1.0a i OAuth 2.0 w celu autoryzacji API",
- "mwoauth-nosubpage-explanation": "OAuth jest mechanizmem pozwalającym zewnętrznym aplikacjom na zidentyfikowanie użytkownika {{GRAMMAR:D.lp|{{SITENAME}}}} lub działanie w jego imieniu po otyrzymnaniu uprawnień od użytkownika.\n\nDo działąnia tej strony potrzeba więcej parametrów. Jeśli {{GENDER:|trafiłeś|trafiłaś}} tutaj z zewnętrznej aplikacji, prawdopodobnie było to spowodowane błędem w tej aplikacji; zaleca się kontakt z jej autorem.",
+ "mwoauth-nosubpage-explanation": "OAuth jest mechanizmem pozwalającym zewnętrznym aplikacjom na zidentyfikowanie użytkownika {{GRAMMAR:D.lp|{{SITENAME}}}} lub działanie w jego imieniu po otyrzymnaniu uprawnień od użytkownika.\n\nDo działania tej strony potrzeba więcej parametrów. Jeśli {{GENDER:|trafiłeś|trafiłaś}} tutaj z zewnętrznej aplikacji, prawdopodobnie było to spowodowane błędem w tej aplikacji; zaleca się kontakt z jej autorem.",
"mwoauth-verified": "Aplikacja ma teraz dostęp do MediaWiki w twoim imieniu.\n\nAby ukończyć proces wprowadź ten kod weryfikacyjny w aplikacji: '''$1'''",
"mwoauth-db-readonly": "Bazy danych OAuth jest tymczasowo zablokowana. Proszę spróbować ponownie za kilka minut.",
"mwoauth-missing-field": "Brak wartości dla pola „$1”",
@@ -74,7 +76,6 @@
"mwoauth-consumer-stage-suppressed": "ukryte",
"oauthconsumerregistration": "Rejestracja konsumenta OAuth",
"mwoauthconsumerregistration-navigation": "Nawigacja:",
- "mwoauthconsumerregistration-propose": "Zaproponuj nowego konsumenta",
"mwoauthconsumerregistration-list": "Lista moich konsumentów",
"mwoauthconsumerregistration-main": "Główna",
"mwoauthconsumerregistration-propose-text": "Deweloperzy powinni używać poniższego formularza w celu zaproponowania nowego konsumenta OAuth (zobacz [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth dokumentację rozszerzenia] po więcej szczegółów). Po przesłaniu tego formularza otrzymasz token, którego używała będzie Twoja aplikacja w celu identyfikacji w MediaWiki. Administrator OAuth będzie musiał zatwierdzić twoją aplikację zanim będzie mogła być autoryzowana przez innych użytkowników.\n\nKika rekomendacji i uwag:\n* Staraj się używać tak niewielu dostępów, jak to możliwe. Unikaj dostępów, które nie są niezbędne w danej chwili.\n* Wersje podawane są w formacie „główne.poboczne.wydanie” (z czego dwa ostatnie są opcjonalne) i wzrastają, gdy zmiany w dostępach są konieczne.\n* Wprowadź publiczny klucz RSA (w formacie PEM) gdy to możliwe; w innym wypadku wykorzystany zostanie (mniej bezpieczny) token bezpieczeństwa.\n* Możesz użyć identyfikatora projektu aby ograniczyć konsumenta do pojedynczego projektu na stronie (użycie „*” da dostęp do wszystkich projektów).",
@@ -174,6 +175,7 @@
"mwoauthlistconsumers-navigation": "Nawigacja:",
"mwoauthlistconsumers-update-link": "Zaktualizuj konsumenta",
"mwoauthlistconsumers-manage-link": "Zarządzaj konsumentem",
+ "mwoauthlistconsumers-grants-link": "Zarządzanie dostępami",
"mwoauthlistconsumers-rclink": "Ostatnie zmiany wykonane za pośrednictwem tej aplikacji",
"oauthmanagemygrants": "Zarządzanie włączonymi aplikacjami",
"mwoauthmanagemygrants-text": "Poniższa strona zawiera listę wszystkich aplikacji, które mogą korzystać z Twojego konta. Zakres uprawnień każdej aplikacji jest ograniczony przez dostępy, jakich jej {{GENDER:|udzieliłeś|udzieliłaś}} podczas autoryzacji do działania w Twoim imieniu. Jeżeli oddzielnie {{GENDER:|autoryzowałeś|autoryzowałaś}} dostęp aplikacji do swojego konta na innym siostrzanym projekcie, poniżej zobaczysz oddzielną konfigurację dla każdego z tych projektów.\n\nPołączone aplikacje mają dostęp do twojego konta za pomocą protokołu OAuth. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Dowiedz się więcej o połączonych aplikacjach])</span>",
@@ -249,10 +251,10 @@
"mwoauth-form-description-onewiki": "{{GENDER:$1|Użytkowniku|Użytkowniczko}} $1,\n\nAby wykonać żądanie aplikacja '''$2''' potrzebuje uprawnień do wykonywania w Twoim imieniu następujących działań na „{{GRAMMAR:Ms.lp|$4}}”:\n\n$5",
"mwoauth-form-description-allwikis-nogrants": "{{GENDER:$1|Użytkowniku|Użytkowniczko}} $1,\n\nAby wykonać żądanie aplikacja '''$2''' potrzebuje dostępu do informacji w Twoim imieniu na wszystkich projektach tej witryny. Z twojego konta nie będą wykonywane żadne zmiany.",
"mwoauth-form-description-onewiki-nogrants": "{{GENDER:$1|Użytkowniku|Użytkowniczko}} $1,\n\nAby wykonać żądanie aplikacja '''$2''' potrzebuje dostępu do informacji w Twoim imieniu na „{{GRAMMAR:Ms.lp|$4}}”. Z twojego konta nie będą wykonywane żadne zmiany.",
- "mwoauth-form-description-allwikis-privateinfo": "{{GENDER:$1|Użytkowniku|Użytkowniczko}} $1,\n\nAby wykonać żądanie aplikacja '''$2''' potrzebuje dostępu do informacji o tobie, włączając twoje prawdziwe nazwisko i adres e-mail we wszystkich projektach tej witryny. Z twojego konta nie będą wykonywane żadne zmiany.",
- "mwoauth-form-description-onewiki-privateinfo": "{{GENDER:$1|Użytkowniku|Użytkowniczko}} $1,\n\nAby wykonać żądanie aplikacja '''$2''' potrzebuje dostępu do informacji o tobie, włączając twoje prawdziwe nazwisko i adres e-mail na „{{GRAMMAR:Ms.lp|$4}}”. Z twojego konta nie będą wykonywane żadne zmiany.",
- "mwoauth-form-description-allwikis-privateinfo-norealname": "{{GENDER:$1|Użytkowniku|Użytkowniczko}} $1,\n\nAby wykonać żądanie aplikacja '''$2''' potrzebuje dostępu do informacji o tobie, włączając twój adres e-mail we wszystkich projektach tej witryny. Z twojego konta nie będą wykonywane żadne zmiany.",
- "mwoauth-form-description-onewiki-privateinfo-norealname": "{{GENDER:$1|Użytkowniku|Użytkowniczko}} $1,\n\nAby wykonać żądanie aplikacja '''$2''' potrzebuje dostępu do informacji o tobie, włączając twój adres e-mail na „{{GRAMMAR:Ms.lp|$4}}”. Z twojego konta nie będą wykonywane żadne zmiany.",
+ "mwoauth-form-description-allwikis-privateinfo": "{{GENDER:$1|Użytkowniku|Użytkowniczko}} $1!\n\nAby wykonać żądanie, aplikacja '''$2''' potrzebuje dostępu do informacji o Tobie, włączając Twoje prawdziwe nazwisko i adres e-mail we wszystkich projektach tej witryny. Z Twojego konta nie będą wykonywane żadne zmiany.",
+ "mwoauth-form-description-onewiki-privateinfo": "{{GENDER:$1|Użytkowniku|Użytkowniczko}} $1!\n\nAby wykonać żądanie, aplikacja '''$2''' potrzebuje dostępu do informacji o Tobie, włączając Twoje prawdziwe nazwisko i adres e-mail na „{{GRAMMAR:Ms.lp|$4}}”. Z Twojego konta nie będą wykonywane żadne zmiany.",
+ "mwoauth-form-description-allwikis-privateinfo-norealname": "{{GENDER:$1|Użytkowniku|Użytkowniczko}} $1!\n\nAby wykonać żądanie, aplikacja '''$2''' potrzebuje dostępu do informacji o Tobie, włączając Twój adres e-mail we wszystkich projektach tej witryny. Z Twojego konta nie będą wykonywane żadne zmiany.",
+ "mwoauth-form-description-onewiki-privateinfo-norealname": "{{GENDER:$1|Użytkowniku|Użytkowniczko}} $1!\n\nAby wykonać żądanie, aplikacja '''$2''' potrzebuje dostępu do informacji o Tobie, włączając Twój adres e-mail na „{{GRAMMAR:Ms.lp|$4}}”. Z Twojego konta nie będą wykonywane żadne zmiany.",
"mwoauth-form-button-approve": "Zezwól",
"mwoauth-form-button-cancel": "Anuluj",
"mwoauth-error": "Błąd połączenia z aplikacją",
@@ -320,12 +322,21 @@
"mwoauth-oauth2-error-owner-only-invalid-grant": "Konsumenci do użytku tylko przez właściciela muszą mieć dostęp do używania client_credentials",
"mwoauth-oauth2-unable-to-retrieve-access-token": "Nie udało się pozyskać klucza dostępu: $1",
"mwoauth-oauth2-error-server-error": "Serwer autoryzacyjny napotkał niespodziewany warunek, który uniemożliwił mu wykonanie żądania.",
+ "mwoauth-oauth2-error-invalid-request": "Żądanie nie zawiera wymaganego parametru, zawiera nieprawidłową wartość parametru, zawiera parametr podany więcej niż jeden raz lub jest wadliwe w inny sposób.",
"mwoauth-oauth2-error-unauthorized-client": "Klient nie jest autoryzowany aby żądać kodu autoryzacyjnego używając tej metody.",
"mwoauth-oauth2-error-access-denied": "Właściciel zasobu lub serwer autoryzujący odrzucił żądanie.",
"mwoauth-oauth2-error-unsupported-response-type": "Serwer autoryzujący nie wspiera uzyskiwania kodu autoryzacyjnego używając tej metody.",
"mwoauth-oauth2-error-invalid-scope": "Żądany zakres jest nieprawidłowy, nieznany lub zniekształcony.",
+ "mwoauth-oauth2-error-temporarily-unavailable": "Serwer uwierzytelnianie jest obecnie niezdolny do przetworzenia żądania w związku z chwilowym przeciążeniem lub pracami konserwacyjnymi na serwerze.",
+ "mwoauth-oauth2-error-invalid-client": "Uwierzytelnianie klienta nie powiodła się (np. klient jest nieznany, nie podano uwierzytelnienia klienta lub metoda uwierzytelniania nie jest wpierana)",
+ "mwoauth-oauth2-error-request-not-verified": "Próba pozyskania zweryfikowanej własności przed zweryfikowaniem żądania",
"mwoauth-oauth2-invalid-access-token": "Nieprawidłowy klucz dostępu.",
+ "mwoauth-consumer-access-no-user": "Zgoda wyrażona prze konsumenta musi być powiązania z prawidłowym użytkownikiem; podano użytkownika o identyfikatorze 0",
"mwoauth-login-required-reason": "Musisz zalogować się na {{GRAMMAR:B.lp|{{SITENAME}}}} aby dać tej aplikacji dostęp do swojego konta.",
"mwoauthconsumer-consumer-view": "Zobacz tego konsumenta",
- "mwoauthconsumer-application-view": "Zobacz tę aplikację"
+ "mwoauthconsumer-application-view": "Zobacz tę aplikację",
+ "grant-oauthmanageownclient": "Zarządzenie swoimi klientami OAuth",
+ "mwoauth-consumer-user-mismatch": "Nie możesz wykonywać żadnych akcji na klientach, które do Ciebie nie należą",
+ "mwoauth-consumer-deleted-error": "Nie możesz wykonywać żadnych operacji na usuniętych klientach",
+ "mwoauth-consumer-submit-error": "Wystąpił błąd podczas zapisywania konsumenta"
}
diff --git a/OAuth/i18n/pnb.json b/OAuth/i18n/pnb.json
new file mode 100644
index 00000000..f059c473
--- /dev/null
+++ b/OAuth/i18n/pnb.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "Abbas dhothar"
+ ]
+ },
+ "mwoauth-consumer-reason": "وجہ:",
+ "mwoauthconsumerregistration-description": "تفصیل",
+ "mwoauthmanageconsumers-description": "تفصیل",
+ "mwoauthmanageconsumers-reason": "وجہ:",
+ "mwoauthlistconsumers-description": "تفصیل",
+ "mwoauthmanagemygrants-description": "تفصیل",
+ "mwoauth-form-button-cancel": "منسوخ کرو",
+ "notification-oauth-app-body": "وجہ: $1"
+}
diff --git a/OAuth/i18n/pt-br.json b/OAuth/i18n/pt-br.json
index c41d6fb4..d12a513f 100644
--- a/OAuth/i18n/pt-br.json
+++ b/OAuth/i18n/pt-br.json
@@ -4,6 +4,7 @@
"Araceletorres",
"Cybermandrake",
"Eduardo Addad de Oliveira",
+ "Eduardoaddad",
"Felipe L. Ewald",
"Hamilton Abreu",
"He7d3r",
@@ -14,7 +15,6 @@
"Rodrigo codignoli"
]
},
- "oauth": "OAuth",
"mwoauth-desc": "Permite o uso do OAuth 1.0a e OAuth 2.0 para autorização da API",
"mwoauth-nosubpage-explanation": "OAuth é um mecanismo que permite que aplicativos externos identifiquem um usuário do {{SITENAME}} ou atuem em seu nome, depois de receber permissão desse usuário.\n\nPara que esta página faça alguma coisa, são necessários mais parâmetros. Se você foi enviado aqui de um aplicativo externo, isso provavelmente ocorreu devido a um erro nesse aplicativo; você deve entrar em contato com o autor.",
"mwoauth-verified": "O aplicativo possui permissão para acessar ao MediaWiki através da sua conta.\n\nPara concluir o processo, proceda à verificação para o aplicativo através deste valor: '''$1'''",
@@ -39,6 +39,7 @@
"mwoauth-consumer-owner-only-help": "Selecionar esta opção fará com que o consumidor seja automaticamente aprovado e aceito para uso em $1. Não será utilizável por nenhum outro usuário e o fluxo de autorização usual não funcionará. As ações tomadas com esse consumidor não serão marcadas.",
"mwoauth-consumer-description": "Descrição do aplicativo:",
"mwoauth-consumer-callbackurl": "OAuth \"callback\" URL:",
+ "mwoauth-consumer-callbackurl-warning": "(porta curinga)",
"mwoauth-consumer-callbackisprefix": "Permitir que o consumidor especifique um retorno nos pedidos e use o URL \"callback\" acima como um prefixo necessário.",
"mwoauth-consumer-granttypes": "Tipos de permissões sendo solicitadas:",
"mwoauth-consumer-grantsneeded": "Permissões aplicáveis:",
@@ -75,7 +76,6 @@
"mwoauth-consumer-stage-suppressed": "suprimido",
"oauthconsumerregistration": "Registro do consumidor OAuth",
"mwoauthconsumerregistration-navigation": "Navegação:",
- "mwoauthconsumerregistration-propose": "Propor novo consumidor",
"mwoauthconsumerregistration-list": "Minha lista de consumidores",
"mwoauthconsumerregistration-main": "Principal",
"mwoauthconsumerregistration-propose-text": "Os desenvolvedores devem usar a forma abaixo para propôr um novo consumidor da OAuth (veja a [//www.mediawiki.org/wiki/Extension:OAuth documentação da extensão] para obter mais detalhes). Depois de enviar esta forma você receberá um token que seu aplicativo usará para se identificar com o MediaWiki. Um administrador do OAuth precisará aprovar seu aplicativo antes que ele possa ser autorizado por outros usuários.\n\nAlgumas recomendações e observações:\n* Tente usar o mínimo possível de concessões. Evite concessões que não são realmente necessárias agora.\n* As versões são da forma \"major.minor.release\" (os últimos dois sendo opcionais) e aumentam à medida que são necessárias alterações de concessão.\n* Forneça uma chave pública RSA (em Formato PEM), se possível; Caso contrário, será necessário usar um token secreto (menos seguro). \n* Você pode usar uma ID do projeto para restringir o consumidor a um único projeto neste site (use \"*\" para todos os projetos).",
@@ -256,6 +256,7 @@
"mwoauth-form-button-approve": "Permitir",
"mwoauth-form-button-cancel": "Cancelar",
"mwoauth-error": "Erro de conexão do aplicativo",
+ "mwoauth-error-missing-callback-url-non-owner": "callback_url é necessário para clientes não proprietários",
"mwoauth-grants-heading": "Permissões solicitadas:",
"mwoauth-grants-nogrants": "O aplicativo não solicitou nenhuma permissão.",
"mwoauth-acceptance-cancelled": "Escolheu que o aplicativo \"$1\" não pode aceder à sua conta. \"$1\" não irá funcionar a menos que permita o seu acesso. Pode regressar a \"$1\" ou [[Special:OAuthManageMyGrants|gerir]] os seus aplicativos conectados.",
@@ -332,5 +333,9 @@
"mwoauth-consumer-access-no-user": "A aprovação do consumidor deve estar vinculada a um usuário válido, usuário com o ID 0 fornecido",
"mwoauth-login-required-reason": "Você precisa entrar na sua conta {{SITENAME}} para autorizar aplicativos a acessá-lo.",
"mwoauthconsumer-consumer-view": "Ver este consumidor",
- "mwoauthconsumer-application-view": "Ver esta aplicação"
+ "mwoauthconsumer-application-view": "Ver esta aplicação",
+ "grant-oauthmanageownclient": "Gerenciar seus clientes OAuth",
+ "mwoauth-consumer-user-mismatch": "Você não pode realizar ações em clientes que não pertencem a você",
+ "mwoauth-consumer-deleted-error": "Você não pode executar ações em clientes excluídos",
+ "mwoauth-consumer-submit-error": "Ocorreu um erro ao salvar um consumidor"
}
diff --git a/OAuth/i18n/pt.json b/OAuth/i18n/pt.json
index 1ed33ffd..19bd5915 100644
--- a/OAuth/i18n/pt.json
+++ b/OAuth/i18n/pt.json
@@ -14,12 +14,15 @@
"Vitorvicentevalente"
]
},
- "mwoauth-desc": "Permite o uso do OAuth 1.0a para autorização da API",
+ "abusefilter-edit-builder-vars-oauth-consumer": "Consumidor OAuth usado para realizar esta mudança",
+ "mwoauth-desc": "Permite o uso do OAuth 1.0a e OAuth 2.0 para autorização da API",
+ "mwoauth-nosubpage-explanation": "O OAuth é um mecanismo que permite que aplicações externas identifiquem um utilizador da wiki {{SITENAME}} ou ajam em seu nome, após receberem permissão desse utilizador.\n\nPara que esta página faça alguma coisa, são necessários mais parâmetros. Se chegou cá vindo de uma aplicação externa, isso provavelmente deve-se a um erro nessa aplicação; deve contactar o respetivo autor.",
"mwoauth-verified": "A aplicação tem agora permissão para aceder ao MediaWiki em seu nome.\n\nPara concluir o processo, forneça à aplicação este valor de verificação: '''$1'''",
"mwoauth-db-readonly": "A base de dados do OAuth está temporariamente bloqueada. Por favor, tente novamente dentro de alguns minutos.",
"mwoauth-missing-field": "Valor em falta para o campo \"$1\"",
"mwoauth-invalid-field": "Valor inválido fornecido para o campo \"$1\"",
"mwoauth-invalid-field-generic": "Valor fornecido inválido",
+ "mwoauth-invalid-field-oauth2GrantTypes": "As aplicações OAuth 2 têm de especificar pelo menos um tipo de concessão de permissões",
"mwoauth-field-hidden": "(esta informação está oculta)",
"mwoauth-field-private": "(esta informação é confidencial)",
"mwoauth-prefs-managegrants": "Aplicações ligadas:",
@@ -37,6 +40,8 @@
"mwoauth-consumer-owner-only-help": "Selecionar esta opção causa a aprovação automática do consumidor e o seu uso por $1. O consumidor não pode ser usado por nenhum outro utilizador, e o processo normal de autorização não funcionará. As operações executadas através deste consumidor não serão etiquetadas.",
"mwoauth-consumer-description": "Descrição da aplicação:",
"mwoauth-consumer-callbackurl": "URL de retorno do OAuth:",
+ "mwoauth-consumer-callbackurl-help": "Ao contrário do OAuth 1.0a, este URL é de correspondência exata",
+ "mwoauth-consumer-callbackurl-warning": "(porta genérica)",
"mwoauth-consumer-callbackisprefix": "Permitir que o consumidor especifique um retorno nos pedidos e use o URL de \"retorno\" acima como prefixo obrigatório.",
"mwoauth-consumer-granttypes": "Tipos de concessões que são solicitadas:",
"mwoauth-consumer-grantsneeded": "Concessões de permissões aplicáveis:",
@@ -73,12 +78,15 @@
"mwoauth-consumer-stage-suppressed": "suprimido",
"oauthconsumerregistration": "Registo de consumidores OAuth",
"mwoauthconsumerregistration-navigation": "Navegação:",
- "mwoauthconsumerregistration-propose": "Propor um consumidor novo",
+ "mwoauthconsumerregistration-propose-oauth1a": "Propor novo consumidor OAuth 1.0a",
+ "mwoauthconsumerregistration-propose-oauth2": "Propor novo cliente OAuth 2.0",
"mwoauthconsumerregistration-list": "A minha lista de consumidores",
"mwoauthconsumerregistration-main": "Principal",
- "mwoauthconsumerregistration-propose-text": "Os programadores devem usar o formulário abaixo para propor um novo consumidor OAuth (consulte a [//www.mediawiki.org/wiki/Extension:OAuth documentação da extensão] para mais detalhes). Depois de enviarem o formulário, receberão uma chave que a vossa aplicação deverá usar para se identificar ao MediaWiki. Um administrador OAuth terá de aprovar a aplicação antes que ela possa ser autorizada pelos utilizadores.\n\nAlgumas recomendações e notas:\n* A sua aplicação deve usar o mínimo de privilégios possível. Evite privilégios que não sejam necessários por enquanto.\n* As versões seguem o formato \"maior.menor.revisão\" (sendo os dois últimos opcionais) e terão de ser aumentadas se a aplicação necessitar de alterações de privilégios.\n* Forneça uma chave RSA pública (em formato PEM) se for possível; se não, terá de ser usada uma chave secreta (que é menos segura).\n* Pode usar um identificador de projeto para restringir o acesso do consumidor a um único projeto deste sítio (use \"*\" para todos os projetos).",
+ "mwoauthconsumerregistration-propose-text": "Pode:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|Propor um consumidor OAuth 1.0a]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Propor um cliente OAuth 2.0]].",
+ "mwoauthconsumerregistration-propose-text-oauth1a": "Os programadores devem usar o formulário abaixo para propor um novo consumidor OAuth 1.0a (consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth documentação da extensão] para mais detalhes). Depois de enviarem o formulário, receberão uma chave que a vossa aplicação deverá usar para se identificar ao MediaWiki. Um administrador OAuth terá de aprovar a aplicação antes que ela possa ser autorizada pelos utilizadores.\n\nAlgumas recomendações e notas:\n* A sua aplicação deve usar o mínimo de privilégios possível. Evite privilégios que não sejam necessários por enquanto.\n* As versões seguem o formato \"maior.menor.revisão\" (sendo os dois últimos opcionais) e terão de ser aumentadas se a aplicação necessitar de alterações de privilégios.\n* Forneça uma chave RSA pública (em formato PEM) se for possível; se não, terá de ser usada uma chave secreta (que é menos segura).\n* Pode usar um identificador de projeto para restringir o acesso do consumidor a um único projeto deste ''site'' (use \"*\" para todos os projetos).",
+ "mwoauthconsumerregistration-propose-text-oauth2": "Os programadores devem usar o formulário abaixo para propor um novo cliente OAuth 2.0 (consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth documentação da extensão] para mais detalhes). Depois de enviarem o formulário, receberão uma chave que a vossa aplicação deverá usar para se identificar ao MediaWiki. Um administrador OAuth terá de aprovar a aplicação antes que ela possa ser autorizada pelos utilizadores.\n\nAlgumas recomendações e notas:\n* A sua aplicação deve usar o mínimo de âmbitos possível. Evite âmbitos que não sejam necessários por enquanto.\n* As versões seguem o formato \"maior.menor.revisão\" (sendo os dois últimos opcionais) e terão de ser aumentadas se a aplicação necessitar de alterações de âmbito.\n* Pode usar um identificador de projeto para restringir o acesso do consumidor a um único projeto deste ''site'' (use \"*\" para todos os projetos).",
"mwoauthconsumerregistration-update-text": "Use o formulário abaixo para atualizar aspetos de um consumidor OAuth que controla.\n\nTodos os valores irão sobrepor-se a quaisquer valores anteriores. Não deixe campos em branco a menos que pretenda limpar esses valores.",
- "mwoauthconsumerregistration-maintext": "Esta página permite que programadores proponham e atualizem aplicações consumidor OAuth no registo deste sítio.\n\nA partir daqui pode:\n* [[Special:OAuthConsumerRegistration/propose|Pedir uma chave para um consumidor novo]].\n* [[Special:OAuthConsumerRegistration/list|Gerir os seus consumidores existentes]].\n\nPara mais informações acerca do OAuth, consulte a [//www.mediawiki.org/wiki/Extension:documentação da extensão OAuth].",
+ "mwoauthconsumerregistration-maintext": "Esta página permite que programadores proponham e atualizem aplicações consumidor OAuth no registo deste ''site''.\n\nDaqui pode:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|Pedir uma chave para um consumidor OAuth 1.0a novo]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Pedir uma chave para um cliente OAuth 2.0 novo]].\n* [[Special:OAuthConsumerRegistration/list|Gerir os seus consumidores existentes]].\n\nPara mais informações acerca do OAuth, consulte a [https://www.mediawiki.org/wiki/Extension:OAuth documentação da extensão].",
"mwoauthconsumerregistration-propose-legend": "Nova aplicação consumidor OAuth",
"mwoauthconsumerregistration-update-legend": "Atualizar a aplicação consumidor OAuth",
"mwoauthconsumerregistration-propose-submit": "Propor consumidor",
@@ -95,9 +103,11 @@
"mwoauthconsumerregistration-resetsecretkey": "Reiniciar chave secreta para um novo valor",
"mwoauthconsumerregistration-proposed": "O seu pedido de consumidor OAuth foi recebido.\n\nFoi-lhe atribuída a chave de consumidor '''$1''' e a chave secreta '''$2'''. ''Anote estes valores para referência futura, por favor.''",
"mwoauthconsumerregistration-created-owner-only": "O seu consumidor OAuth foi criado.\n\nAs suas chaves são:\n; Chave de consumidor: $1\n; Segredo de consumidor: $2\n; Chave de acesso: $3\n; Segredo de acesso: $4\n<em>Anote estes valores para referência futura, por favor.</em>",
+ "mwoauthconsumerregistration-created-owner-only-oauth2": "O seu cliente OAuth 2.0 foi criado.\n\nAs suas chaves são:\n; Chave da aplicação cliente: $1 \n; Segredo da aplicação cliente: $2 \n; Chave de acesso: $3 \n; <em>Anote estes valores para referência futura, por favor.</em>",
"mwoauthconsumerregistration-updated": "O registo do seu consumidor OAuth foi atualizado.",
"mwoauthconsumerregistration-secretreset": "Foi-lhe atribuído o segredo de consumidor '''$1'''. ''Anote estes valores para referência futura, por favor.''",
"mwoauthconsumerregistration-secretreset-owner-only": "As suas chaves de consumidor OAuth foram reiniciadas. As novas chaves são:\n; Chave de consumidor: $1\n; Segredo de consumidor: $2\n; Chave de acesso: $3\n; Segredo de acesso: $4\n<em>Anote estes valores para referência futura, por favor.</em>",
+ "mwoauthconsumerregistration-secretreset-owner-only-oauth2": "As suas chaves de consumidor OAuth foram reiniciadas. As novas chaves são:\n; Chave de consumidor: $1\n; Segredo de consumidor: $2\n; Chave de acesso: $3\n<em>Anote estes valores para referência futura, por favor.</em>",
"mwoauthconsumerregistration-need-emailconfirmed": "Tem de confirmar o seu endereço de correio eletrónico antes de criar aplicações OAuth.\nIntroduza e valide o endereço através das [[Special:Preferences|preferências do utilizador]], por favor.",
"oauthmanageconsumers": "Gerir consumidores OAuth",
"mwoauthmanageconsumers-notloggedin": "Precisa de ter sessão iniciada para aceder a esta página.",
@@ -168,9 +178,13 @@
"mwoauthlistconsumers-status-disabled": "desativado",
"mwoauthlistconsumers-status-rejected": "rejeitado",
"mwoauthlistconsumers-status-expired": "expirado",
+ "mwoauthlistconsumers-navigation": "Navegação:",
+ "mwoauthlistconsumers-update-link": "Atualizar consumidor",
+ "mwoauthlistconsumers-manage-link": "Gerir consumidor",
+ "mwoauthlistconsumers-grants-link": "Gerir concessões de permissões",
"mwoauthlistconsumers-rclink": "Mudanças recentes por esta aplicação",
"oauthmanagemygrants": "Gerir aplicações ligadas",
- "mwoauthmanagemygrants-text": "Esta página lista todas as aplicações que podem usar a sua conta. O âmbito de acesso de qualquer aplicação é limitado pelas permissões que concede à aplicação quando a autoriza a agir em seu nome. Se autorizou uma aplicação a aceder a vários projetos em separado, verá abaixo uma configuração separada para cada projeto.\n\nAs aplicações ligadas acedem à sua conta usando o protocolo OAuth. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Saiba mais])</span>",
+ "mwoauthmanagemygrants-text": "Esta página lista todas as aplicações que podem usar a sua conta. O âmbito de acesso de qualquer aplicação é limitado pelas permissões que concedeu à aplicação quando a autorizou a agir em seu nome. Se separadamente autorizou uma aplicação a aceder a vários projetos em seu nome, verá abaixo uma configuração separada para cada projeto.\n\nAs aplicações ligadas acedem à sua conta usando o protocolo OAuth. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Saiba mais sobre aplicações ligadas])</span>",
"mwoauthmanagemygrants-navigation": "Navegação:",
"mwoauthmanagemygrants-showlist": "Lista de aplicações ligadas",
"mwoauthmanagemygrants-none": "Não existem aplicações ligadas à sua conta.",
@@ -192,17 +206,17 @@
"mwoauthmanagemygrants-confirm-submit": "Atualizar estado da chave de acesso",
"mwoauthmanagemygrants-success-update": "As suas preferências para esta aplicação foram atualizadas.",
"mwoauthmanagemygrants-success-renounce": "O acesso da aplicação à sua conta foi revogado.",
- "mwoauthmanagemygrants-basic-tooltip": "Porque é que não posso atualizar esta concessão de permissões? Esta concessão de permissões dá à sua aplicação ligada as permissões básicas que ela necessita para funcionar devidamente. Se não deseja que a aplicação tenha estas permissões, deve revogar o acesso da aplicação.",
- "mwoauthmanagemygrants-authonly-tooltip": "Porque é que não posso atualizar esta concessão de permissões? Se não deseja que a esta aplicação ligada tenha esta permissão, deve revogar o acesso da aplicação.",
- "mwoauthmanagemygrants-editslink": "{{GENDER:$1|As suas}} edições por esta aplicação",
- "mwoauthmanagemygrants-actionslink": "{{GENDER:$1|As suas}} operações por esta aplicação",
- "logentry-mwoauthconsumer-propose": "$1 {{GENDER:$2|propôs}} um consumidor OAuth (chave do consumidor $4)",
- "logentry-mwoauthconsumer-update": "$1 {{GENDER:$2|atualizou}} um consumidor OAuth (chave do consumidor $4)",
- "logentry-mwoauthconsumer-approve": "$1 {{GENDER:$2|aprovou}} um consumidor OAuth proposto por $3 (chave do consumidor $4)",
- "logentry-mwoauthconsumer-reject": "$1 {{GENDER:$2|rejeitou}} um consumidor OAuth proposto por $3 (chave do consumidor $4)",
- "logentry-mwoauthconsumer-disable": "$1 {{GENDER:$2|disativou}} um consumidor OAuth proposto por $3 (chave do consumidor $4)",
- "logentry-mwoauthconsumer-reenable": "$1 {{GENDER:$2|reativou}} um consumidor OAuth proposto por $3 (chave do consumidor $4)",
- "logentry-mwoauthconsumer-create-owner-only": "$1 {{GENDER:$2|criou}} um consumidor OAuth reservado ao proprietário (chave do consumidor $4)",
+ "mwoauthmanagemygrants-basic-tooltip": "Porque não posso atualizar esta concessão de permissões? Esta concessão de permissões dá à sua aplicação ligada as permissões básicas que ela necessita para funcionar devidamente. Se não deseja que a aplicação tenha estas permissões, deve revogar o acesso da aplicação.",
+ "mwoauthmanagemygrants-authonly-tooltip": "Porque não posso atualizar esta concessão de permissões? Se não deseja que esta aplicação ligada tenha esta permissão, deve revogar o acesso da aplicação.",
+ "mwoauthmanagemygrants-editslink": "As suas edições feitas por esta aplicação{{GENDER:$1|}}",
+ "mwoauthmanagemygrants-actionslink": "As suas operações feitas por esta aplicação{{GENDER:$1|}}",
+ "logentry-mwoauthconsumer-propose": "$1 propôs um consumidor OAuth (chave do consumidor $4){{GENDER:$2|}}",
+ "logentry-mwoauthconsumer-update": "$1 atualizou um consumidor OAuth (chave do consumidor $4){{GENDER:$2|}}",
+ "logentry-mwoauthconsumer-approve": "$1 aprovou um consumidor OAuth proposto por $3 (chave do consumidor $4){{GENDER:$2|}}",
+ "logentry-mwoauthconsumer-reject": "$1 rejeitou um consumidor OAuth proposto por $3 (chave do consumidor $4){{GENDER:$2|}}",
+ "logentry-mwoauthconsumer-disable": "$1 desativou um consumidor OAuth proposto por $3 (chave do consumidor $4){{GENDER:$2|}}",
+ "logentry-mwoauthconsumer-reenable": "$1 reativou um consumidor OAuth proposto por $3 (chave do consumidor $4){{GENDER:$2|}}",
+ "logentry-mwoauthconsumer-create-owner-only": "$1 criou um consumidor OAuth reservado ao proprietário (chave do consumidor $4){{GENDER:$2|}}",
"log-action-filter-mwoauthconsumer": "Tipo de ação do consumidor OAuth:",
"log-action-filter-mwoauthconsumer-approve": "Aprovação do consumidor OAuth",
"log-action-filter-mwoauthconsumer-create-owner-only": "Criação de consumidor OAuth reservada para proprietários",
@@ -217,7 +231,7 @@
"mwoauth-bad-request-invalid-action": "Desculpe, mas algo correu mal e precisa de contactar o autor da aplicação para obter ajuda com o problema.\n\n<span class=\"plainlinks mw-mwoautherror-details\">URL desconhecido, $1</span>",
"mwoauth-bad-request-invalid-action-contact": "Desculpe, mas algo correu mal. Precisa de [$1 contactar] o autor da aplicação para obter ajuda.\n\n<span class=\"plainlinks mw-mwoautherror-details\">URL desconhecido, $2</span>",
"mwoauthdatastore-access-token-not-found": "Não foi encontrada nenhuma concessão de permissões aprovada para essa chave de autorização.",
- "mwoauthdatastore-request-token-not-found": "Desculpe, algo correu mal ao ligar esta aplicação.\nVolte atrás e tente ligar a sua conta novamente, ou contacte o autor da aplicação.\n\n<span class=\"plainlinks mw-mwoautherror-details\">A chave OAuth não foi encontrada, $1</span>",
+ "mwoauthdatastore-request-token-not-found": "Desculpe, qualquer coisa correu mal ao ligar esta aplicação.\nVolte atrás e tente ligar a sua conta novamente, ou contacte o autor da aplicação.\n\n<span class=\"plainlinks mw-mwoautherror-details\">A chave OAuth não foi encontrada, $1</span>",
"mwoauthdatastore-callback-not-found": "O URL de retorno OAuth não foi encontrado na ''cache''. Isto provavelmente resulta de um erro na forma como a aplicação faz pedidos ao servidor.",
"mwoauthdatastore-request-token-already-used": "Este pedido já foi concluído e não pode ser apresentado novamente.\nRetroceda para a aplicação e tente ligar a sua conta novamente, ou contacte o autor da aplicação.\n\n<span class=\"plainlinks mw-mwoautherror-details\">A chave OAuth já foi usada, $1</span>",
"mwoauthdatastore-bad-token": "Não foi encontrada nenhuma chave que corresponda ao seu pedido.",
@@ -250,8 +264,9 @@
"mwoauth-form-button-approve": "Permitir",
"mwoauth-form-button-cancel": "Cancelar",
"mwoauth-error": "Erro de ligação da aplicação",
+ "mwoauth-error-missing-callback-url-non-owner": "''callback_url'' é obrigatório para clientes que não são reservados para o proprietário",
"mwoauth-grants-heading": "Permissões solicitadas:",
- "mwoauth-grants-nogrants": "A aplicação não solicitou quaisquer permissões.",
+ "mwoauth-grants-nogrants": "A aplicação não pediu nenhuma permissão.",
"mwoauth-acceptance-cancelled": "Escolheu não permitir que a aplicação \"$1\" possa aceder à sua conta. \"$1\" não irá funcionar a menos que permita o acesso. Pode regressar a \"$1\" ou [[Special:OAuthManageMyGrants|gerir]] as suas aplicações ligadas.",
"mwoauth-granttype-normal": "Solicitar autorização para permissões específicas.",
"grant-mwoauth-authonly": "Apenas verificação da identidade do utilizador, sem capacidade de ler páginas ou agir em nome de um utilizador.",
@@ -299,5 +314,36 @@
"notification-oauth-app-reject-primary-link": "Ver aplicação",
"notification-oauth-app-disable-primary-link": "Ver aplicação",
"notification-oauth-app-reenable-primary-link": "Ver aplicação",
- "notification-oauth-app-body": "Motivo: $1"
+ "notification-oauth-app-body": "Motivo: $1",
+ "mwoauth-oauth-version": "Versão do protocolo OAuth",
+ "mwoauth-oauth2-is-confidential": "O cliente é confidencial",
+ "mwoauth-oauth2-is-confidential-help": "Um cliente confidencial é uma aplicação capaz de manter a palavra-passe de um cliente confidencial para o resto do mundo. Os clientes que não são confidenciais são menos seguros",
+ "mwoauth-oauth2-granttypes": "Tipos de concessão de permissões OAuth2 permitidos",
+ "mwoauth-oauth2-granttype-auth-code": "Código de autorização",
+ "mwoauth-oauth2-granttype-refresh-token": "Atualizar chave",
+ "mwoauth-oauth2-granttype-client-credentials": "Credenciais do cliente",
+ "mwoauth-oauth2-error-create-at-no-user-approval": "Não é possível criar a chave de acesso; o utilizador não aprovou a emissão desta chave de acesso",
+ "mwoauth-oauth2-error-user-approval-deny": "O utilizador rejeitou o pedido da aplicação cliente",
+ "mwoauth-oauth-unsupported-version": "Este ponto final não é permitido para a versão $1 do OAuth",
+ "mwoauth-oauth2-error-unauthorized-scope": "O âmbito \"$1\" não é permitido para esta aplicação",
+ "mwoauth-oauth2-error-owner-only-invalid-grant": "Os clientes reservados ao proprietário têm de ter permissão para usar ''client_credentials''",
+ "mwoauth-oauth2-unable-to-retrieve-access-token": "Não foi possível obter a chave de acesso: $1",
+ "mwoauth-oauth2-error-server-error": "O servidor de autorização detetou uma condição inesperada que o impediu de atender o pedido.",
+ "mwoauth-oauth2-error-invalid-request": "O pedido tem em falta um parâmetro obrigatório, inclui um valor de parâmetro inválido, inclui um parâmetro mais do que uma vez ou tem outro problema qualquer.",
+ "mwoauth-oauth2-error-unauthorized-client": "O cliente não está autorizado a pedir um código de autorização usando este método.",
+ "mwoauth-oauth2-error-access-denied": "O proprietário do recurso ou servidor de autorização negou o pedido.",
+ "mwoauth-oauth2-error-unsupported-response-type": "O servidor de autorização não suporta a obtenção de um código de autorização usando este método.",
+ "mwoauth-oauth2-error-invalid-scope": "O âmbito pedido é inválido, desconhecido ou está malformado.",
+ "mwoauth-oauth2-error-temporarily-unavailable": "Neste momento, o servidor de autorização não consegue atender ao pedido devido a uma sobrecarga temporária ou a uma manutenção do servidor.",
+ "mwoauth-oauth2-error-invalid-client": "Falha na autenticação do cliente (por exemplo, cliente desconhecido, não foi incluída autenticação do cliente ou o método de autenticação não é suportado)",
+ "mwoauth-oauth2-error-request-not-verified": "A tentar obter a propriedade verificada antes de verificar o pedido",
+ "mwoauth-oauth2-invalid-access-token": "Chave de acesso inválida",
+ "mwoauth-consumer-access-no-user": "A aprovação do consumidor deve estar ligada a um utilizador válido; foi fornecido o utilizador com identificador 0",
+ "mwoauth-login-required-reason": "Tem de entrar na sua conta da wiki {{SITENAME}} para autorizar aplicações a acederem a ela.",
+ "mwoauthconsumer-consumer-view": "Ver este consumidor",
+ "mwoauthconsumer-application-view": "Ver esta aplicação",
+ "grant-oauthmanageownclient": "Gerir os seus clientes OAuth",
+ "mwoauth-consumer-user-mismatch": "Não pode realizar ações em clientes que não lhe pertencem",
+ "mwoauth-consumer-deleted-error": "Não pode realizar ações em clientes que foram eliminados",
+ "mwoauth-consumer-submit-error": "Ocorreu um erro ao gravar um consumidor"
}
diff --git a/OAuth/i18n/qqq.json b/OAuth/i18n/qqq.json
index 55183e4e..596afb5f 100644
--- a/OAuth/i18n/qqq.json
+++ b/OAuth/i18n/qqq.json
@@ -5,24 +5,28 @@
"Hamilton Abreu",
"Liuxinyu970226",
"Mar(c)",
+ "McDutchie",
"Mormegil",
"Pyscowicz",
"Raymond",
"Shirayuki",
"Siebrand",
+ "SunAfterRain",
"Sunny00217",
"Tgr",
"Umherirrender"
]
},
+ "abusefilter-edit-builder-vars-oauth-consumer": "Abuse filter syntax option in a dropdown from the group {{msg-mw|Abusefilter-edit-builder-group-vars}}.",
"oauth": "{{Optional}}\nTitle of MWOAuth page.\n{{Identical|OAuth}}",
"mwoauth-desc": "{{desc|name=OAuth|url=https://www.mediawiki.org/wiki/Extension:OAuth}}",
- "mwoauth-nosubpage-explanation": "Non-technical explanation shown to when a person accidentally lands on Special:OAuth",
+ "mwoauth-nosubpage-explanation": "Non-technical explanation shown to when a person accidentally lands on Special:OAuth\n\n{{Doc-singularthey}}",
"mwoauth-verified": "Displayed to the user when the consumer does not have a callback URL, to provide the verification token that the consumer needs to complete the app authorization process.\n\nParameters:\n* $1 - verification token\n* $2 - (Unused) request token (the app should already have this)",
"mwoauth-db-readonly": "Error displayed when an admin has temporarily make OAuth read-only",
"mwoauth-missing-field": "Parameters:\n* $1 - field name\nSee also:\n* {{msg-mw|Mwoauth-invalid-field}}",
"mwoauth-invalid-field": "Parameters:\n* $1 - field name\nSee also:\n* {{msg-mw|Mwoauth-missing-field}}",
"mwoauth-invalid-field-generic": "Used as generic error message for form field validation.",
+ "mwoauth-invalid-field-oauth2GrantTypes": "Used during form field validation when the oauth2GrantTypes field is empty.",
"mwoauth-field-hidden": "Used if the information has been deleted and the user is not allowed to view suppressed information.\n\nSee also:\n* {{msg-mw|Mwoauth-field-private}}",
"mwoauth-field-private": "Used if the user is not allowed to view private information.\n\nSee also:\n* {{msg-mw|Mwoauth-field-hidden}}",
"mwoauth-prefs-managegrants": "Used as label in [[Special:Preferences]].\n\nSee also:\n* {{msg-mw|Mwoauth-prefs-managegrantslink}}.",
@@ -40,6 +44,8 @@
"mwoauth-consumer-owner-only-help": "Used as help text for the \"Owner only\" checkbox.",
"mwoauth-consumer-description": "Used as label for the \"description\" textarea.\n{{Identical|Application description}}",
"mwoauth-consumer-callbackurl": "Used as label for the \"Callback URL\" input box.\n\nSee [[w:Callback (computer programming)]].",
+ "mwoauth-consumer-callbackurl-help": "\"Used as help message for the \\\"Callback URL\\\" input box, in the OAuth 2.0 consumer registration form.\".",
+ "mwoauth-consumer-callbackurl-warning": "Used as a warning shown alongside {{msg-mw|mwoauth-consumer-callbackurl}} sometimes, when the callback URL allows arbitrary [[w:Port (computer networking)|port numbers]].",
"mwoauth-consumer-callbackisprefix": "Used as a label for the check box where user can decide if their consumer should use \"Callback URL\" as a string prefix (checked), or if the consumer cannot customize the callback URL in its requests as is required to specify \"oob\" (unchecked, default).",
"mwoauth-consumer-granttypes": "Used as label to select between authorization-only (with or without private info) and normal API access",
"mwoauth-consumer-grantsneeded": "Used as label.\n\nFollowed by the list of grants.\n{{Identical|Applicable grant}}",
@@ -76,10 +82,13 @@
"mwoauth-consumer-stage-suppressed": "{{Related|Mwoauth-consumer-stage}}\n{{Identical|Suppressed}}",
"oauthconsumerregistration": "{{doc-special|MWOAuthConsumerRegistration}}",
"mwoauthconsumerregistration-navigation": "Used in page subtitle.\n{{Identical|Navigation}}",
- "mwoauthconsumerregistration-propose": "Text for the link that developers follow to request that their application is accepted as an OAuth application on this site.",
+ "mwoauthconsumerregistration-propose-oauth1a": "Text for the link that developers follow to request that their application is accepted as an OAuth 1a application on this site.",
+ "mwoauthconsumerregistration-propose-oauth2": "Text for the link that developers follow to request that their application is accepted as an OAuth 2 application on this site.",
"mwoauthconsumerregistration-list": "Used in page subtitle link text",
"mwoauthconsumerregistration-main": "Used as label for \"View all\" link.\n\nPreceded by list of the links (\"|\" separated) which have any one of the following link texts:\n* {{msg-mw|Mwoauthconsumerregistration-propose}}\n* {{msg-mw|Mwoauthconsumerregistration-list}}\n{{Identical|Main}}",
- "mwoauthconsumerregistration-propose-text": "Used as introduction text for the form.\n\n\"Application\" means \"app, software application\".",
+ "mwoauthconsumerregistration-propose-text": "Used on [[Special:OAuthConsumerRegistration/propose]] to direct proposers to either the OAuth 1.0a form or the OAuth 2.0 form.",
+ "mwoauthconsumerregistration-propose-text-oauth1a": "Used as introduction text for the OAuth 1.0a form at [[Special:OAuthConsumerRegistration/propose/oauth1a]].\n\n\"Application\" means \"app, software application\".",
+ "mwoauthconsumerregistration-propose-text-oauth2": "Used as introduction text for the OAuth 2.0 form at [[Special:OAuthConsumerRegistration/propose/oauth2]].\n\n\"Application\" means \"app, software application\".",
"mwoauthconsumerregistration-update-text": "Used as introduction text for the form.",
"mwoauthconsumerregistration-maintext": "Used as introduction text in [[Special:OAuthConsumerRegistration]].",
"mwoauthconsumerregistration-propose-legend": "Used as fieldset label.",
@@ -230,7 +239,7 @@
"mwoauthdatastore-callback-not-found": "Error message when the callback URL is not found in cache.",
"mwoauthdatastore-request-token-already-used": "Error message when a request token that has already been used was resubmitted. Parameters:\n* $1 - a link to the explanation of the error. The text link is the error code.",
"mwoauthdatastore-bad-token": "Error message when an invalid token was submitted",
- "mwoauthdatastore-bad-source-ip": "Error message when a request comes from an IP address which is not among those whitelisted",
+ "mwoauthdatastore-bad-source-ip": "Error message when a request comes from an IP address which is not among those on the allowlist",
"mwoauthdatastore-bad-verifier": "Error message when an invalid verification code was submitted",
"mwoauthdatastore-invalid-token-type": "Error message when an invalid page was requested",
"mwoauthgrants-general-error": "Generic error, when something unexpected happened while processing the OAuth request",
@@ -256,10 +265,11 @@
"mwoauth-form-description-onewiki-privateinfo": "Description of a form requesting the user authorize an OAuth consumer to access private information about the user but with no grants. The language should parallel {{msg-mw|grant-mwoauth-authonlyprivate}}.\n\nParameters:\n* $1 - the username\n* $2 - application name\n* $3 - application publisher\n* $4 - wiki project name\nSee also:\n{{related|mwoauth-form-description}}",
"mwoauth-form-description-allwikis-privateinfo-norealname": "Description of a form requesting the user authorize an OAuth consumer to access private information about the user but with no grants, on a wiki which does not use real names. The language should parallel {{msg-mw|grant-mwoauth-authonlyprivate}}.\n\nParameters:\n* $1 - the username\n* $2 - application name\n* $3 - application publisher\nSee also:\n{{related|mwoauth-form-description}}",
"mwoauth-form-description-onewiki-privateinfo-norealname": "Description of a form requesting the user authorize an OAuth consumer to access private information about the user but with no grants, on a wiki which does not use real names. The language should parallel {{msg-mw|grant-mwoauth-authonlyprivate}}.\n\nParameters:\n* $1 - the username\n* $2 - application name\n* $3 - application publisher\n* $4 - wiki project name\nSee also:\n{{related|mwoauth-form-description}}",
- "mwoauth-form-legal": "Message used for wiki-specific legal notes. Keep this blank.",
+ "mwoauth-form-legal": "{{notranslate}}\nMessage used for wiki-specific legal notes.",
"mwoauth-form-button-approve": "Button label, indicating the user wants to allow access.\n\nSee also:\n* {{msg-mw|Mwoauth-form-button-cancel}}\n{{Identical|Allow}}",
"mwoauth-form-button-cancel": "Button label, indicating the user wants to cancel granting access.\n\nSee also:\n* {{msg-mw|Mwoauth-form-button-approve}}\n{{Identical|Cancel}}",
"mwoauth-error": "Heading on the page, whenever an OAuth error is presented to a user.",
+ "mwoauth-error-missing-callback-url-non-owner": "Error when callback_url is not provided for a non-owner-only client",
"mwoauth-grants-heading": "Used as label for the grants list.\n\nSee also:\n* {{msg-mw|Grant-blockusers}}\n* {{msg-mw|Grant-createaccount}}\n* {{msg-mw|Grant-createeditmovepage}}\n* {{msg-mw|Grant-delete}}\n* {{msg-mw|Grant-editinterface}}\n* {{msg-mw|Grant-editmycssjs}}\n* {{msg-mw|Grant-editmywatchlist}}\n* {{msg-mw|Grant-editpage}}\n* {{msg-mw|Grant-editprotected}}\n* {{msg-mw|Grant-highvolume}}\n* {{msg-mw|Grant-oversight}}\n* {{msg-mw|Grant-patrol}}\n* {{msg-mw|Grant-protect}}\n* {{msg-mw|Grant-rollback}}\n* {{msg-mw|Grant-sendemail}}\n* {{msg-mw|Grant-uploadeditmovefile}}\n* {{msg-mw|Grant-uploadfile}}\n* {{msg-mw|Grant-basic}}\n* {{msg-mw|Grant-viewdeleted}}\n* {{msg-mw|Grant-viewmywatchlist}}",
"mwoauth-grants-nogrants": "Warning message that the OAuth consumer has not requested any permissions",
"mwoauth-acceptance-cancelled": "Message shown when an OAuth authorization request is declined. Parameters:\n* $1 - consumer name",
@@ -311,8 +321,8 @@
"notification-oauth-app-reenable-primary-link": "Text of the link which appears at the end of the email notification {{msg-mw|notification-oauth-app-reenable-email-batch-body}}. It links to the app update page for app owners.",
"notification-oauth-app-body": "Text of the body of app stage change notifications. $1 is the reason given by the user who made the change.\n{{Identical|Reason}}",
"mwoauth-oauth-version": "Used as a label in multiple places for the field indicating OAuth version consumer is registered to use",
- "mwoauth-oauth-version-1": "Label for OAuth version 1.0a",
- "mwoauth-oauth-version-2": "Label for OAuth version 2.0",
+ "mwoauth-oauth-version-1": "{{notranslate}}\nLabel for OAuth version 1.0a",
+ "mwoauth-oauth-version-2": "{{notranslate}}\nLabel for OAuth version 2.0",
"mwoauth-oauth2-is-confidential": "Used as a field label that indicates if the consumer (client) is confidential",
"mwoauth-oauth2-is-confidential-help": "Help message for the field that indicates if the consumer (client) is confidential",
"mwoauth-oauth2-granttypes": "Used as a label for field that determines which types of OAuth2 grants consumer can use",
@@ -325,7 +335,7 @@
"mwoauth-oauth2-error-unauthorized-scope": "Error when application is not allowed to use requested scope.\n$1 - first not allowed scope",
"mwoauth-oauth2-error-owner-only-invalid-grant": "Error for OAuth2 owner-only clients, when client is not allowed to use 'client_credentials' grant",
"mwoauth-oauth2-unable-to-retrieve-access-token": "Error displayed when OAuth2 access token cannot be retrieved for owner-only application.\n$1 - error message (reason)",
- "mwoauth-oauth2-error": "Error message to be displayed to the user on OAuth2 errors.\n$1 - error type\n$2 - error message\n$3-hint",
+ "mwoauth-oauth2-error": "{{notranslate}}\nError message to be displayed to the user on OAuth2 errors.\n*$1 - error type\n*$2 - error message\n*$3 - hint",
"mwoauth-oauth2-error-server-error": "OAuth2 error for error type server_error",
"mwoauth-oauth2-error-invalid-request": "OAuth2 error for error type invalid_request",
"mwoauth-oauth2-error-unauthorized-client": "OAuth2 error for error type unauthorized_client",
@@ -339,5 +349,9 @@
"mwoauth-consumer-access-no-user": "Error message when trying to save user approval with anonymous user",
"mwoauth-login-required-reason": "Helper text that appears when a user is redirected to Special:Login page because they attempted authorisation while not logged in on the provider",
"mwoauthconsumer-consumer-view": "Used as link text in a navigation menu.",
- "mwoauthconsumer-application-view": "Used as link text in a navigation menu."
+ "mwoauthconsumer-application-view": "Used as link text in a navigation menu.",
+ "grant-oauthmanageownclient": "Name for grant \"oauthmanageownclient\".\n{{Related|Grant}}",
+ "mwoauth-consumer-user-mismatch": "Error message when user tries to perform an action on a client that belongs to another user",
+ "mwoauth-consumer-deleted-error": "Error message when user tries to perform an action on a deleted client",
+ "mwoauth-consumer-submit-error": "Error message when submitting a consumer but no consumer data available for response"
}
diff --git a/OAuth/i18n/ro.json b/OAuth/i18n/ro.json
index 449d4353..f0bd7749 100644
--- a/OAuth/i18n/ro.json
+++ b/OAuth/i18n/ro.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"Minisarm",
+ "NGC 54",
"Rsocol",
"XXN"
]
@@ -9,5 +10,8 @@
"mwoauth-prefs-managegrants": "Aplicații conectate:",
"mwoauth-prefs-managegrantslink": "Administrează {{PLURAL:$1|$1 aplicație conectată|$1 aplicații conectate|$1 de aplicații conectate}}",
"oauthmanagemygrants": "Administrare aplicații conectate",
- "mwoauthmanagemygrants-text": "Această pagină afișează toate aplicațiile care pot folosi contul dumneavoastră. Pentru fiecare astfel de aplicație, accesul este limitat de permisiunile pe care le-ați acordat aplicației atunci când ați autorizat-o să acționeze în numele dumneavoastră. Dacă ați autorizat separat o aplicație să acceseze anumite proiecte în numele dumneavoastră, veți vedea mai jos configurări separate pentru fiecare proiect.\n\nAplicațiile conectate accesează contul dumneavoastră folosind protocolul OAuth. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Aflați mai multe despre aplicații conectate])</span>"
+ "mwoauthmanagemygrants-text": "Această pagină afișează toate aplicațiile care pot folosi contul dumneavoastră. Pentru fiecare astfel de aplicație, accesul este limitat de permisiunile pe care le-ați acordat aplicației atunci când ați autorizat-o să acționeze în numele dumneavoastră. Dacă ați autorizat separat o aplicație să acceseze anumite proiecte în numele dumneavoastră, veți vedea mai jos configurări separate pentru fiecare proiect.\n\nAplicațiile conectate accesează contul dumneavoastră folosind protocolul OAuth. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Aflați mai multe despre aplicații conectate])</span>",
+ "mwoauthconsumer-consumer-logpage": "Jurnal consumatori OAuth",
+ "mwoauth-form-description-allwikis": "Bună, $1,\n\nPentru a finaliza cererea dvs., '''$2''' are nevoie de permisiunea de a efectua următoarele acțiuni în numele dvs. pe toate proiectele acestui site:\n\n$4",
+ "echo-category-title-oauth-owner": "Dezvoltare OAuth"
}
diff --git a/OAuth/i18n/ru.json b/OAuth/i18n/ru.json
index a34dde41..238236c0 100644
--- a/OAuth/i18n/ru.json
+++ b/OAuth/i18n/ru.json
@@ -26,12 +26,13 @@
"Rubin16",
"SergeyButkov",
"Vlad5250",
+ "WindEwriX",
"Yurik",
"Дмитрий"
]
},
"mwoauth-desc": "Позволяет использование OAuth 1.0a и OAuth 2.0 для API авторизации",
- "mwoauth-nosubpage-explanation": "OAuth - это механизм, который позволяет внешним приложениям идентифицировать участника {{SITENAME}} или действовать от его имени после получения разрешения от этого участника.\n\nЧтобы эта страница что-то сделала, требуется больше параметров. Если вы были отправлены сюда из внешнего приложения, это, вероятно, было связано с ошибкой в этом приложении; Вы должны связаться с автором.",
+ "mwoauth-nosubpage-explanation": "OAuth — это механизм, который позволяет внешним приложениям идентифицировать участника {{SITENAME}} или действовать от его имени после получения разрешения от этого участника.\n\nЧтобы эта страница что-то сделала, требуется больше параметров. Если вы были отправлены сюда из внешнего приложения, это, вероятно, было связано с ошибкой в этом приложении; Вы должны связаться с автором.",
"mwoauth-verified": "Приложению теперь разрешён доступ к MediaWiki от вашего имени.\n\nДля завершения процесса, предоставьте приложению это проверочное значение: '''$1'''",
"mwoauth-db-readonly": "База данных OAuth временно заблокирована. Повторите действие через несколько минут.",
"mwoauth-missing-field": "Отсутствует значение для поля «$1»",
@@ -90,7 +91,6 @@
"mwoauth-consumer-stage-suppressed": "подавлен",
"oauthconsumerregistration": "Регистрация клиента OAuth",
"mwoauthconsumerregistration-navigation": "Навигацияː",
- "mwoauthconsumerregistration-propose": "Предложить новое клиентское подключение",
"mwoauthconsumerregistration-list": "Мой список клиентских подключений",
"mwoauthconsumerregistration-main": "Главная",
"mwoauthconsumerregistration-propose-legend": "Новое клиентское OAuth-приложение",
@@ -260,5 +260,6 @@
"notification-oauth-app-reenable-primary-link": "Просмотр приложения.",
"notification-oauth-app-body": "Причина: $1",
"mwoauth-oauth2-granttype-auth-code": "Код авторизации",
+ "mwoauth-oauth2-granttype-refresh-token": "Обновить токен",
"mwoauthconsumer-application-view": "Посмотреть это приложение"
}
diff --git a/OAuth/i18n/rue.json b/OAuth/i18n/rue.json
new file mode 100644
index 00000000..99005a26
--- /dev/null
+++ b/OAuth/i18n/rue.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Tkalyn"
+ ]
+ },
+ "mwoauth-prefs-managegrants": "Припоєны аплікації",
+ "mwoauth-prefs-managegrantslink": "Справовати {{PLURAL:$1|$1 припоєну аплікацію|$1 припоєны аплікації|0=припоєны аплікації}}"
+}
diff --git a/OAuth/i18n/scn.json b/OAuth/i18n/scn.json
index 6e10b621..1079401a 100644
--- a/OAuth/i18n/scn.json
+++ b/OAuth/i18n/scn.json
@@ -1,9 +1,42 @@
{
"@metadata": {
"authors": [
+ "Ajeje Brazorf",
"Sarvaturi"
]
},
+ "mwoauth-consumer-name": "Nomu di l'appricazzioni:",
+ "mwoauth-consumer-description": "Discrizzioni di l'appricazzioni:",
+ "mwoauth-consumer-grantsneeded": "Assignazzioni applicàbbili:",
+ "mwoauth-consumer-wiki": "Pruggettu applicàbbili:",
+ "mwoauth-consumer-reason": "Mutivu:",
+ "mwoauth-consumer-stage-approved": "appruvatu",
+ "mwoauthconsumerregistration-main": "Principali",
+ "mwoauthconsumerregistration-description": "Discrizzioni",
+ "mwoauthconsumerregistration-stage": "Statu",
+ "mwoauthconsumerregistration-lastchange": "Ùrtimu canciamentu",
+ "mwoauthmanageconsumers-type": "Cudi:",
+ "mwoauthmanageconsumers-main": "Principali",
+ "mwoauthmanageconsumers-description": "Discrizzioni",
+ "mwoauthmanageconsumers-lastchange": "Ùrtimu canciamentu",
+ "mwoauthmanageconsumers-action": "Cancia lu statu:",
+ "mwoauthmanageconsumers-approve": "Appruvatu",
+ "mwoauthmanageconsumers-reenable": "Appruvatu",
+ "mwoauthmanageconsumers-reason": "Mutivu:",
"oauthlistconsumers": "Elencu di l'applicazzioni OAuth",
- "oauthmanagemygrants": "Gistioni di l'applicazzioni cunnessi"
+ "mwoauthlistconsumers-view": "dittagghî",
+ "mwoauthlistconsumers-name": "Nomu di l'appricazzioni",
+ "mwoauthlistconsumers-description": "Discrizzioni",
+ "mwoauthlistconsumers-wiki": "Pruggettu applicàbbili",
+ "mwoauthlistconsumers-grants": "Assignazzioni applicàbbili",
+ "mwoauthlistconsumers-status": "Statu",
+ "mwoauth-consumer-stage-any": "quarsiasi",
+ "mwoauthlistconsumers-status-approved": "appruvatu",
+ "oauthmanagemygrants": "Gistioni di l'applicazzioni cunnessi",
+ "mwoauthmanagemygrants-description": "Discrizzioni",
+ "mwoauthmanagemygrants-grants": "Assignazzioni applicàbbili",
+ "mwoauthmanagemygrants-action": "Cancia lu statu:",
+ "mwoauth-form-button-approve": "Cunsenti",
+ "mwoauth-form-button-cancel": "Annulla",
+ "notification-oauth-app-body": "Mutivu: $1"
}
diff --git a/OAuth/i18n/sco.json b/OAuth/i18n/sco.json
index 5ef07b2d..8d64d22e 100644
--- a/OAuth/i18n/sco.json
+++ b/OAuth/i18n/sco.json
@@ -6,9 +6,13 @@
]
},
"mwoauth-db-readonly": "The OAuth database is temperarilie lockit. Please ettle at it again in twa-three minutes.",
+ "mwoauth-consumer-stage-approved": "appruived",
"mwoauthconsumerregistration-description": "Descreeption",
"mwoauthmanageconsumers-description": "Descreeption",
+ "mwoauthmanageconsumers-approve": "Appruived",
+ "mwoauthmanageconsumers-reenable": "Appruived",
"mwoauthlistconsumers-description": "Descreeption",
+ "mwoauthlistconsumers-status-approved": "appruived",
"mwoauthmanagemygrants-description": "Descreeption",
"mwoauthmanagemygrants-basic-tooltip": "Why can Ah naw update this graunt? This graunt gies yer connected appleecation basic permeessions that it requires fer tae function properlie. Gif ye dinna want this connected appleecation tae hae thir richts, ye shid revoke the appleecation's access."
}
diff --git a/OAuth/i18n/sd.json b/OAuth/i18n/sd.json
index f14ffc1d..fce80b94 100644
--- a/OAuth/i18n/sd.json
+++ b/OAuth/i18n/sd.json
@@ -5,57 +5,62 @@
"Tweety"
]
},
- "mwoauth-field-hidden": "(هي ڄاڻ خفيا آهي)",
- "mwoauth-field-private": "(هي ذاتي ڄاڻ آهي)",
+ "mwoauth-field-hidden": "(هي معلومات لڪيل آهي)",
+ "mwoauth-field-private": "(هي خانگي معلومات آهي)",
"mwoauth-prefs-managegrants": "ڳنڍيل ايپس:",
"mwoauth-prefs-managegrantslink": "{{PLURAL:$1|$1 ڳنڍيل ايپليڪيشن|$1 ڳنڍيل ايپليڪيشنون|0=ڳنڍيل ايپليڪيشنون}} سنڀاليو",
- "mwoauth-consumer-allwikis": "هن وڪي جي سڀئي منصوبن ۾",
+ "mwoauth-consumer-allwikis": "هن سائيٽ تي سڀ رٿائون",
"mwoauth-consumer-key": "واپرائيندڙ ڄاٻي:",
"mwoauth-consumer-name": "ايپليڪشن نالو:",
- "mwoauth-consumer-version": "واپرائيندڙ ورزن:",
+ "mwoauth-consumer-version": "واپرائيندڙ ورجاءُ:",
"mwoauth-consumer-user": "ڇاپيندڙ:",
"mwoauth-consumer-stage": "هاڻوڪي حالت:",
- "mwoauth-consumer-email": "رابطي جو برقٽپال پتو:",
+ "mwoauth-consumer-email": "رابطي لاءِ ايميل پتو:",
"mwoauth-consumer-owner-only-label": "رڳو-مالڪ:",
"mwoauth-consumer-description": "ايپليڪشن تفصيل",
"mwoauth-consumer-granttypes": "درخواست ڪيل اجازتون:",
"mwoauth-consumer-grantsneeded": "مناسب اجازتون:",
- "mwoauth-consumer-reason": "سبب:",
+ "mwoauth-consumer-reason": "ڪارڻ:",
"mwoauthconsumerregistration-navigation": "رهنمائي:",
"mwoauthconsumerregistration-main": "مُک",
"mwoauthconsumerregistration-propose-submit": "واپرائڻ جو سبب",
"mwoauthconsumerregistration-user": "ڇاپيندڙ",
"mwoauthconsumerregistration-description": "تفصيل",
- "mwoauthconsumerregistration-email": "رابطي جي برقٽپال",
+ "mwoauthconsumerregistration-email": "رابطي لاءِ ايميل",
"mwoauthconsumerregistration-stage": "حالت",
"mwoauthconsumerregistration-lastchange": "آخري بدلاءُ",
"mwoauthconsumerregistration-manage": "انتظام",
- "mwoauthmanageconsumers-type": "قطار:",
+ "mwoauthmanageconsumers-type": "قطارون:",
"mwoauthmanageconsumers-main": "مُک",
"mwoauthmanageconsumers-user": "ڇاپيندڙ",
"mwoauthmanageconsumers-description": "تفصيل",
- "mwoauthmanageconsumers-email": "رابطي جي برقٽپال",
+ "mwoauthmanageconsumers-email": "رابطي لاءِ ايميل",
"mwoauthmanageconsumers-consumerkey": "واپرائيندڙ ڄاٻي:",
"mwoauthmanageconsumers-lastchange": "آخري بدلاءُ",
- "mwoauthmanageconsumers-review": "جائزو/انتظام",
- "mwoauthmanageconsumers-approve": "قبول ڪيل",
+ "mwoauthmanageconsumers-review": "نظرثاني ڪريو/سنڀاليو",
+ "mwoauthmanageconsumers-approve": "منظور ڪيل",
"mwoauthmanageconsumers-reject": "رد ڪيل",
- "mwoauthmanageconsumers-disable": "غيرفعال",
- "mwoauthmanageconsumers-reenable": "قبول ڪيل",
- "mwoauthmanageconsumers-reason": "سبب:",
+ "mwoauthmanageconsumers-disable": "غيرڪارگر ٿيل",
+ "mwoauthmanageconsumers-reenable": "منظور ڪيل",
+ "mwoauthmanageconsumers-reason": "ڪارڻ:",
+ "mwoauthlistconsumers-user": "ڇاپيندڙ",
"mwoauth-consumer-stage-any": "ڪابہ",
- "oauthmanagemygrants": "ڳنڊيل اپليڪيشنن جو انتظام",
+ "mwoauthlistconsumers-rclink": "ھن ايپليڪيشن ذريعي تازيون تبديليون",
+ "oauthmanagemygrants": "ڳنڊيل ايپليڪيشنن جو انتظام ڪريو",
"mwoauthmanagemygrants-text": "هتي اهي ايپليڪيشنون ڏنل آهن، جيڪي اوهان جي کاتي سان ڳنڍيل آهن. ڪنھن بہ ايپليڪيشن کي ڪيترا اختيار ڏنل آهن، اهي اوهان ايپليڪشن کي پھرين ڀيري استعمال ڪرڻ وقت ڏيندا آهيو. جيڪڏهن اوهان ڪنھن ٻي وڪي پراجيڪٽ لاءِ ڪو ايپليڪشن الڳ سان استعمال ڪريو ٿا تہ ان جي لاءِ هيٺ الڳ ترتيبون ڏنل آهن. \n\nڳنڍيل ايپليڪشن OAuth protocol ذريعي اوهان جي کاتي جو اختيار رکي ٿي. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth ڳنڍيل ايپليڪشنن بابت وڌيڪ پرايو])</span>",
"mwoauthmanagemygrants-showlist": "فھرست ڳنڍيل ايپليڪشن",
+ "mwoauthmanagemygrants-user": "ڇاپيندڙ:",
"mwoauthmanagemygrants-wikiallowed": "منصوبن ۾ اجازت:",
"mwoauthmanagemygrants-applicablegrantsallowed": "مناسب اجازت ڏنل:",
"mwoauthmanagemygrants-review": "رسد سنڀاليو",
"mwoauthmanagemygrants-revoke": "اختيار ختم ڪيو",
"mwoauthmanagemygrants-grantaccept": "اجازت",
"mwoauthmanagemygrants-revoke-text": "هيٺ ڄاڻيل اپليڪيشن جو اختيار ختم ڪيو.",
- "mwoauthmanagemygrants-confirm-legend": "ڳنڊيل اپليڪيشنن جو انتظام",
+ "mwoauthmanagemygrants-confirm-legend": "ڳنڊيل ايپليڪيشن جو انتظام ڪريو",
"mwoauthmanagemygrants-update": "اجازتن جي ٻيهر ترتيب",
"mwoauthmanagemygrants-renounce": "خاتمو اختيار",
"mwoauthmanagemygrants-action": "حالت بدلايو:",
+ "mwoauthmanagemygrants-editslink": "{{GENDER:$1|توھان جون}} ھن ايپليڪيشن ذريعي سنوارون",
+ "mwoauthmanagemygrants-actionslink": "{{GENDER:$1|توھان جا}} عمل ھن ايپليڪيشن ذريعي",
"mwoauth-form-button-cancel": "رد"
}
diff --git a/OAuth/i18n/sh.json b/OAuth/i18n/sh.json
index 77713aeb..b5e20697 100644
--- a/OAuth/i18n/sh.json
+++ b/OAuth/i18n/sh.json
@@ -15,7 +15,7 @@
"mwoauth-field-private": "(ovaj podatak je povjerljiv)",
"mwoauth-prefs-managegrants": "Povezani izvršnici:",
"mwoauth-prefs-managegrantslink": "Upravljanje {{PLURAL:$1|$1 povezanim izvršnikom|$1 povezanim izvršnicima|0=povezanim izvršnicima}}",
- "mwoauth-consumer-allwikis": "Svim projektima na ovom sajtu",
+ "mwoauth-consumer-allwikis": "Svi projekti na ovom sajtu",
"mwoauth-consumer-key": "Potrošački ključ:",
"mwoauth-consumer-name": "Naziv izvršnika:",
"mwoauth-consumer-version": "Potrošačka verzija:",
@@ -64,7 +64,6 @@
"mwoauth-consumer-stage-suppressed": "potisnut",
"oauthconsumerregistration": "Registracija potrošača OAutha",
"mwoauthconsumerregistration-navigation": "Navigacija:",
- "mwoauthconsumerregistration-propose": "Predloži novog potrošača",
"mwoauthconsumerregistration-list": "Popis mojih potrošača",
"mwoauthconsumerregistration-main": "Glavna",
"mwoauthconsumerregistration-propose-text": "Programeri bi trebali koristiti ovaj predložak za predlaganje novog potrošača OAutha (više ćete naći u [//www.mediawiki.org/wiki/Extension:OAuth dokumentaciji za dodatak]). Nakon što pošaljete obrazac, dobit ćete kod s kojim ćete biti predstavljeni na MediaWiki. Administrator usluge OAuth morat će odobriti vašu aplikaciju prije nego što mogu autorizirati korisnike.\n\n\nNekoliko preporuka i primjedbi:\n* Odobrava kao malo odobrenja. Izbjegavajte one koje trenutno nisu potrebne.\n* Verzije su \"major.minor.release\" (posljednja dva su opcionalna) i povećavaju se s potrebom za izmjenama u dozvolama.\n* Ako je moguće, unesite javni RSA ključ (u PEM formatu); inače (manje sigurni) dat ćemo vam tajni ključ.\n* Možete ograničiti potrošača na samo jedan projekt na ovom sajtu, unoseći naznaku projekta (\"*\" za sve projekte).",
@@ -159,8 +158,11 @@
"mwoauthlistconsumers-status-disabled": "onemogućen",
"mwoauthlistconsumers-status-rejected": "odbijen",
"mwoauthlistconsumers-status-expired": "isteklo",
+ "mwoauthlistconsumers-navigation": "Navigacija:",
+ "mwoauthlistconsumers-update-link": "Podnovi potrošača",
"oauthmanagemygrants": "Upravljanje povezanim izvršnicima",
"mwoauthmanagemygrants-text": "Ova stranica navodi izvršnike što mogu koristiti vaš račun. Njihov stupanj pristupa je ograničen tim što ste im dopustili da rade kada ih odobravaju. Ako ste izvršniku dali posebno odobrenje za pristup drugom zbratimljenom projektu, tada ispod će vam se pojaviti posebne postavke za svaki odeljen projekt.\n\nPovezani izvršnici koriste vaš račun putem protokola OAutha. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth?uselang=sh Saznajte više o povezanim izvršnicima])</span>",
+ "mwoauthmanagemygrants-navigation": "Navigacija:",
"mwoauthmanagemygrants-showlist": "Spisak povezanih izvršnika",
"mwoauthmanagemygrants-none": "Nema izvršnika povezanih s vašim računom.",
"mwoauthmanagemygrants-user": "Izdavač:",
@@ -190,6 +192,7 @@
"logentry-mwoauthconsumer-disable": "$1 {{GENDER:$2|onemogućio|onemogućila}} je potrošač OAutha s $3 (potrošački ključ $4)",
"logentry-mwoauthconsumer-reenable": "$1 {{GENDER:$2|preomogućio|preomogućila}} je potrošač OAutha s $3 (potrošački ključ $4)",
"logentry-mwoauthconsumer-create-owner-only": "$1 {{GENDER:$2|napravio|napravila}} je OAuth-potršač namijenjen samo vlasniku (potrošački ključ $4)",
+ "mwoauthconsumer-consumer-logpage": "Evidencija OAuth trošača",
"mwoauthconsumer-consumer-logpagetext": "Evidencija odobravanja, odbacivanja i onemogućavanja registriranih potrošača OAutha.",
"mwoauth-bad-request-missing-params": "Nažalost, došlo je do problema prilikom postavljivanja izvršnika. Obratite se <span class=\"plainlinks\"> [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth mjestu za podršku]</span> kako biste saznali kako je riješiti.\n\n<span class=\"plainlinks mw-mwoautherror-details\">OAuthu nedostaju parametre, $1</span>",
"mwoauth-bad-request-invalid-action": "Nažalost, došlo je do problema prilikom postavljivanja izvršnik. Obratite se njegovom autoru kako biste je riješiti.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Nepoznata URL, $1</span>",
@@ -252,5 +255,12 @@
"mwoauth-tag-reserved": "Oznake što počinju s <code>OAuth CID:</code> rezervirane su za upotrebu od strane OAutha.",
"mwoauth-botpasswords-note": "<strong>Napomena:</strong> <span class=\"plainlinks\">[$1 OAuth]</span> je sigurniji od botovskih lozinki i treba se koristiti kad god ga bot podržava.",
"mwoauth-api-module-disabled": "Modul \"$1\" nije dostupan s OAuthom.",
- "echo-category-title-oauth-owner": "Razvoj OAutha"
+ "echo-category-title-oauth-owner": "Razvoj OAutha",
+ "echo-category-title-oauth-admin": "Administrator OAutha",
+ "notification-oauth-app-body": "Razlog: $1",
+ "mwoauth-oauth-version": "Verzija OAuth protokola",
+ "grant-oauthmanageownclient": "Upravljanje vlastitima OAuth klijentima",
+ "mwoauth-consumer-user-mismatch": "Ne možete izvršavati radnje nad klijentima koji vam ne pripadaju",
+ "mwoauth-consumer-deleted-error": "Ne možete izvršavati radnje nad obrisanim klijentima",
+ "mwoauth-consumer-submit-error": "Došlo je do greške pri čuvanju potrošača"
}
diff --git a/OAuth/i18n/sje.json b/OAuth/i18n/sje.json
new file mode 100644
index 00000000..00ee997e
--- /dev/null
+++ b/OAuth/i18n/sje.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Olve Utne"
+ ]
+ },
+ "mwoauthconsumerregistration-description": "Gåvådibme",
+ "mwoauthmanageconsumers-description": "Gåvådibme",
+ "mwoauthlistconsumers-description": "Gåvådibme",
+ "mwoauthmanagemygrants-description": "Gåvådibme",
+ "echo-category-title-oauth-admin": "OAuth-háldadäjje"
+}
diff --git a/OAuth/i18n/sl.json b/OAuth/i18n/sl.json
index 452726b7..80976435 100644
--- a/OAuth/i18n/sl.json
+++ b/OAuth/i18n/sl.json
@@ -6,32 +6,102 @@
"Janezdrilc"
]
},
- "mwoauth-prefs-managegrants": "Priklopljene aplikacije:",
- "mwoauth-prefs-managegrantslink": "Upravljaj {{PLURAL:$1|$1 povezano aplikacijo|$1 povezani aplikaciji|$1 povezane aplikacije|$1 povezanih aplikacij|0=povezane aplikacije}}",
- "mwoauth-consumer-allwikis": "Vsi projekti na tem spletišču",
+ "mwoauth-desc": "Omogoča uporabo OAuth 1.0a in OAuth 2.0 za avtorizacijo API-ja",
+ "mwoauth-prefs-managegrants": "Povezani api:",
+ "mwoauth-prefs-managegrantslink": "Upravljaj {{PLURAL:$1|$1 povezani ap|$1 povezana apa|$1 povezane ape|$1 povezanih apov|0=povezane ape}}",
+ "mwoauth-consumer-allwikis": "vsi projekti tega spletnega mesta",
+ "mwoauth-consumer-name": "Ime aplikacije:",
"mwoauth-consumer-user": "Avtor:",
+ "mwoauth-consumer-stage": "Trenutni status:",
+ "mwoauth-consumer-description": "Opis aplikacije:",
+ "mwoauth-consumer-callbackisprefix": "Dovoli stranki, da pri zahtevkih določi povratni klic in kot potrebno predpono za povratni klic uporablja zgornji URL.",
+ "mwoauth-consumer-grantsneeded": "Podeljena pooblastila:",
+ "mwoauth-consumer-wiki": "Projekt uporabe:",
+ "mwoauth-consumer-stage-proposed": "predlagana",
+ "mwoauth-consumer-stage-rejected": "zavrnjena",
+ "mwoauth-consumer-stage-expired": "pretečena",
+ "mwoauth-consumer-stage-approved": "odobrena",
+ "mwoauth-consumer-stage-disabled": "onemogočena",
+ "mwoauth-consumer-stage-suppressed": "skrita",
"mwoauthconsumerregistration-navigation": "Navigacija:",
+ "mwoauthconsumerregistration-propose-oauth1a": "Predlagaj novo stranko OAuth 1.0a",
+ "mwoauthconsumerregistration-propose-oauth2": "Predlagaj novo stranko OAuth 2.0",
"mwoauthconsumerregistration-user": "Avtor",
+ "oauthmanageconsumers": "Upravljanje strank OAuth",
"mwoauthmanageconsumers-user": "Avtor",
+ "mwoauthmanageconsumers-review": "preglej/upravljaj",
+ "mwoauthmanageconsumers-confirm-legend": "Upravljanje stranke OAuth",
+ "mwoauthmanageconsumers-action": "Spremeni status:",
+ "oauthlistconsumers": "Seznam aplikacij OAuth",
+ "mwoauthlistconsumers-legend": "Pregledovanje aplikacij OAuth",
+ "mwoauthlistconsumers-view": "podrobnosti",
+ "mwoauthlistconsumers-name": "Ime aplikacije",
"mwoauthlistconsumers-user": "Avtor",
- "oauthmanagemygrants": "Upravljaj priklopljene aplikacije",
- "mwoauthmanagemygrants-text": "Na tem seznamu so navedene vse aplikacije, ki utegnejo uporabljati tvoj račun. Vsaka izmed njih deluje v okviru dovoljenj, ki si ji jih dodelil ob potrditvi delovanja. Če si delovanje potrdil ločeno za kak sorodni projekt, bodo prikazane ločene nastavitve za vsak projekt posebej.\n\nPovezane aplikacije dostopajo do tvojega računa s pomočjo protokola OAuth. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Več o povezanih aplikacijah])</span>",
+ "mwoauthlistconsumers-description": "Opis",
+ "mwoauthlistconsumers-wiki": "Projekt uporabe",
+ "mwoauthlistconsumers-callbackurl": "URL protokola OAuth za povratni klic",
+ "mwoauthlistconsumers-callbackisprefix": "Dovoli stranki, da pri zahtevkih določi povratni klic in kot potrebno predpono za povratni klic uporablja zgornji URL.",
+ "mwoauthlistconsumers-grants": "Podeljena pooblastila",
+ "mwoauth-consumer-stage-any": "kateri koli",
+ "mwoauthlistconsumers-status-approved": "odobrena",
+ "mwoauthlistconsumers-status-rejected": "zavrnjena",
+ "mwoauthlistconsumers-rclink": "Zadnje spremembe s to aplikacijo",
+ "oauthmanagemygrants": "Upravljanje povezanih aplikacij",
+ "mwoauthmanagemygrants-text": "Na tej strani so navedene vse aplikacije, ki lahko uporabljajo vaš račun. Vsaka od njih deluje v okviru dovoljenj, ki ste ji jih dodelili ob potrditvi delovanja v vašem imenu. Če ste delovanje v katerem od sorodnih projektov potrdili ločeno, bodo nastavitve prikazane za vsak projekt posebej.\n\nPovezane aplikacije dostopajo do vašega računa z uporabo protokola OAuth. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Več o povezanih aplikacijah])</span>",
"mwoauthmanagemygrants-navigation": "Navigacija:",
- "mwoauthmanagemygrants-showlist": "Seznam priklopljenih aplikacij",
+ "mwoauthmanagemygrants-showlist": "Seznam povezanih aplikacij",
+ "mwoauthmanagemygrants-none": "Z vašim računom ni povezana nobena aplikacija.",
"mwoauthmanagemygrants-user": "Avtor:",
- "mwoauthmanagemygrants-wikiallowed": "Odobren na projektu:",
+ "mwoauthmanagemygrants-wikiallowed": "Odobrena v projektu:",
+ "mwoauthmanagemygrants-grants": "Podeljena pooblastila",
+ "mwoauthmanagemygrants-applicablegrantsallowed": "Podeljena pooblastila:",
"mwoauthmanagemygrants-review": "upravljaj dostop",
"mwoauthmanagemygrants-revoke": "prekliči dostop",
- "mwoauthmanagemygrants-grantaccept": "Donirano",
- "mwoauthmanagemygrants-confirm-legend": "Upravljaj priklopljeno aplikacijo",
- "mwoauthmanagemygrants-update": "Posodobitev donacij",
- "mwoauthmanagemygrants-renounce": "Deavtoriziraj",
- "mwoauth-form-description-allwikis": "Pozdravljeni, $1,\n\nza dokončanje prošnje potrebuje '''$2''' dovoljenje, da v vašem imenu v vseh projektih tega spletišča izvede naslednje dejanje:\n\n\n$4",
- "mwoauth-form-description-onewiki": "Pozdravljeni, $1,\n\nza dokončanje prošnje potrebuje '''$2''' dovoljenje, da na projektu »$4« v vašem imenu izvede naslednje dejanje:\n\n\n$5",
- "mwoauth-form-description-allwikis-nogrants": "Pozdravljeni, $1,\n\nza dokončanje prošnje potrebuje '''$2''' dovoljenje, da v vseh projektih tega spletišča dostopa do informacij v vašem imenu. Z vašim računom ne bo narejena nobena sprememba.",
- "mwoauth-form-description-onewiki-nogrants": "Pozdravljeni, $1,\n\nza dokončanje prošnje potrebuje '''$2''' dovoljenje, da v projektu ''$4'' v vašem imenu dostopa do informacij. Z vašim računom ne bo narejena nobena sprememba.",
+ "mwoauthmanagemygrants-grantaccept": "Podeljeno",
+ "mwoauthmanagemygrants-update-text": "S spodnjim obrazcem lahko spremenite dovoljenja, ki so dodeljena aplikaciji za delovanje v vašem imenu.",
+ "mwoauthmanagemygrants-revoke-text": "Uporabite spodnji obrazec, da aplikaciji prekličete dostop za delovanje v vašem imenu.",
+ "mwoauthmanagemygrants-confirm-legend": "Upravljaj povezano aplikacijo",
+ "mwoauthmanagemygrants-update": "Posodobitev pooblastil",
+ "mwoauthmanagemygrants-renounce": "Odvzemi pooblastila",
+ "mwoauthmanagemygrants-action": "Spremeni status:",
+ "mwoauthmanagemygrants-success-update": "Vaše nastavitve za to aplikacijo so posodobljene.",
+ "mwoauthmanagemygrants-editslink": "{{GENDER:$1|Vaša}} urejanja s to aplikacijo",
+ "mwoauthmanagemygrants-actionslink": "{{GENDER:$1|Vaša}} dejanja s to aplikacijo",
+ "mwoauthconsumer-consumer-logpagetext": "Dnevnik odobritev, zavrnitev in onemogočenj registriranih odjemalcev OAuth.",
+ "mwoauthserver-bad-consumer": "Aplikacija »$1« ni odobrena kot povezana aplikacija. Za pomoč [$2 stopite v stik] z avtorjem aplikacije.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Povezana OAuth aplikacija ni odobrena, $3</span>",
+ "mwoauthserver-invalid-user": "Za uporabo povezane aplikacije na tem spletnem mestu morate imeti račun v vseh projektih. Ko boste imeli račun v vseh projektih, lahko poskusite »$1« znova povezati.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Potrebna je enotna prijava, $2</span>",
+ "mwoauth-form-description-allwikis": "Pozdravljeni, $1,\n\nza dokončanje prošnje potrebuje '''$2''' dovoljenje, da v vašem imenu v vseh projektih tega spletnega mesta izvede naslednje dejanje:\n\n\n$4",
+ "mwoauth-form-description-onewiki": "Pozdravljeni, $1,\n\nza dokončanje prošnje potrebuje '''$2''' dovoljenje, da na projektu '''$4''' v vašem imenu izvaja naslednja dejanja:\n\n$5",
+ "mwoauth-form-description-allwikis-nogrants": "Pozdravljeni, $1,\n\nza dokončanje prošnje potrebuje '''$2''' dovoljenje, da v vseh projektih tega spletnega mesta dostopa do informacij v vašem imenu. Z vašim računom ne bo narejena nobena sprememba.",
+ "mwoauth-form-description-onewiki-nogrants": "Pozdravljeni, $1,\n\nza dokončanje prošnje potrebuje '''$2''' dovoljenje, da v projektu ''$4'' v vašem imenu dostopa do podatkov. Z vašim računom ne bo opravljena nobena sprememba.",
+ "mwoauth-form-description-allwikis-privateinfo": "Pozdravljeni, $1,\n\nza dokončanje prošnje potrebuje '''$2''' dovoljenje za dostop do vaših osebnih podatkov, vključno s pravim imenom in e-poštnim naslovom, v vseh projektih tega spletnega mesta. Z vašim računom ne bo opravljena nobena sprememba.",
+ "mwoauth-form-description-onewiki-privateinfo": "Pozdravljeni, $1,\n\nza dokončanje prošnje potrebuje '''$2''' dovoljenje, da v projektu '''$4''' dostopa do podatkov, vključno z vašim pravim imenom in e-poštnim naslovom. Z vašim računom ne bo opravljena nobena sprememba.",
+ "mwoauth-form-description-allwikis-privateinfo-norealname": "Pozdravljeni, $1,\n\nza dokončanje prošnje potrebuje '''$2''' dovoljenje, da v vseh projektih tega spletnega mesta dostopa do vaših osebnih podatkov, vključno z vašim e-poštnim naslovom. Z vašim računom ne bo opravljena nobena sprememba.",
+ "mwoauth-form-description-onewiki-privateinfo-norealname": "Pozdravljeni, $1,\n\nza dokončanje prošnje potrebuje '''$2''' dovoljenje, da v projektu '''$4''' dostopa do podatkov, vključno z vašim e-poštnim naslovom. Z vašim računom ne bo opravljena nobena sprememba.",
"mwoauth-form-button-approve": "Dovoli",
"mwoauth-form-button-cancel": "Prekliči",
"mwoauth-acceptance-cancelled": "Odločili ste se, da »$1« na dovolite dostopa do svojega računa. Oseba »$1« ne bo delovala, razen če ji dovolite dostop. Greste lahko nazaj na »$1« ali na[[Special:OAuthManageMyGrants|urejanje]] vaših povezanih aplikacij.",
- "mwoauth-oauth-exception": "Napaka v protokolu OAuth: $1"
+ "grant-mwoauth-authonly": "Samo preverjanje identitete uporabnikov, brez možnosti branja strani ali delovanja v uporabnikovem imenu.",
+ "grant-mwoauth-authonlyprivate": "Samo preverjanje identitete uporabnikov z možnostjo dostopa do resničnega imena in e-poštnega naslova, brez možnosti branja strani ali delovanja v uporabnikovem imenu.",
+ "mwoauth-listgrants-extra-summary": "== OAuth-specifična pooblastila ==\n\nTa dodatna pooblastila veljajo za stranke OAuth.",
+ "mwoauth-oauth-exception": "Napaka v protokolu OAuth: $1",
+ "right-mwoauthproposeconsumer": "Predlagati nove stranke OAuth",
+ "right-mwoauthupdateownconsumer": "Posodabljanje strank OAuth, ki jih nadzoruje",
+ "right-mwoauthmanageconsumer": "Upravljanje strank OAuth",
+ "right-mwoauthsuppress": "Odstranitev strank OAuth",
+ "right-mwoauthviewsuppressed": "Dostop do odstranjenih strank OAuth",
+ "right-mwoauthviewprivate": "Dostop do zasebnih podatkov OAuth",
+ "right-mwoauthmanagemygrants": "Upravljanje pooblastil OAuth",
+ "action-mwoauthmanageconsumer": "upravljanje strank OAuth",
+ "action-mwoauthsuppress": "odstraniti strank OAuth",
+ "action-mwoauthmanagemygrants": "upravljati vaših pooblastil OAuth",
+ "action-mwoauthproposeconsumer": "predlagati novih strank OAuth",
+ "action-mwoauthupdateownconsumer": "posodabljati strank OAuth, ki jih nadzorujete",
+ "action-mwoauthviewprivate": "dostopati do zasebnih podatkov OAuth",
+ "action-mwoauthviewsuppressed": "dostopati do odstranjenih strank OAuth",
+ "echo-pref-tooltip-oauth-owner": "Obveščaj me o dogodkih, povezanih z aplikacijami OAuth, ki sem jih ustvaril/a.",
+ "echo-pref-tooltip-oauth-admin": "Obveščaj me o dogodkih, povezanih s pregledovanjem aplikacij OAuth.",
+ "mwoauth-oauth-version": "Različica protokola OAuth",
+ "mwoauthconsumer-application-view": "Ogled aplikacije",
+ "grant-oauthmanageownclient": "Upravljanje svojih strank OAuth"
}
diff --git a/OAuth/i18n/smn.json b/OAuth/i18n/smn.json
new file mode 100644
index 00000000..243734a2
--- /dev/null
+++ b/OAuth/i18n/smn.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "Seipinne",
+ "Yupik"
+ ]
+ },
+ "mwoauth-consumer-reason": "Suijâ:",
+ "mwoauthconsumerregistration-main": "Ovdâsijđo",
+ "mwoauthmanageconsumers-main": "Ovdâsijđo",
+ "mwoauthmanageconsumers-reason": "Suijâ:",
+ "mwoauth-form-button-cancel": "Jooskâ",
+ "notification-oauth-app-body": "Suijâ: $1"
+}
diff --git a/OAuth/i18n/sms.json b/OAuth/i18n/sms.json
new file mode 100644
index 00000000..7776e4b0
--- /dev/null
+++ b/OAuth/i18n/sms.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Yupik"
+ ]
+ },
+ "mwoauth-consumer-reason": "Mäinn:",
+ "mwoauthconsumerregistration-main": "Ouddseidd",
+ "mwoauthconsumerregistration-description": "Deskriptt",
+ "mwoauthconsumerregistration-stage": "Status",
+ "mwoauthmanageconsumers-main": "Ouddseidd",
+ "mwoauthmanageconsumers-description": "Deskriptt",
+ "mwoauthmanageconsumers-reason": "Mäinn:",
+ "mwoauthlistconsumers-view": "teâđ",
+ "mwoauthlistconsumers-description": "Deskriptt",
+ "mwoauthlistconsumers-status": "Status",
+ "mwoauthmanagemygrants-navigation": "Vaʹlljõk:",
+ "mwoauthmanagemygrants-description": "Deskriptt",
+ "mwoauth-form-button-cancel": "Jõõsk",
+ "notification-oauth-app-body": "Mäinn: $1"
+}
diff --git a/OAuth/i18n/sq.json b/OAuth/i18n/sq.json
index a055525f..23a48143 100644
--- a/OAuth/i18n/sq.json
+++ b/OAuth/i18n/sq.json
@@ -3,7 +3,8 @@
"authors": [
"Ammartivari",
"Kosovastar",
- "Olsi"
+ "Olsi",
+ "Vanished 456321456"
]
},
"mwoauth-prefs-managegrants": "Aplikacionet e lidhura:",
diff --git a/OAuth/i18n/sr-ec.json b/OAuth/i18n/sr-ec.json
index 02be0730..9b98680e 100644
--- a/OAuth/i18n/sr-ec.json
+++ b/OAuth/i18n/sr-ec.json
@@ -3,6 +3,7 @@
"authors": [
"Acamicamacaraca",
"BadDog",
+ "Kizule",
"Milicevic01",
"Obsuser",
"Zoranzoki21",
@@ -16,12 +17,12 @@
"mwoauth-field-hidden": "(ова информација је скривена)",
"mwoauth-field-private": "(ова информација је приватна)",
"mwoauth-prefs-managegrants": "Повезане апликације:",
- "mwoauth-prefs-managegrantslink": "Управљајте {{PLURAL:$1|1=повезаном апликацијом|повезаним апликацијама ($1)|0=повезаним апликацијама}}",
+ "mwoauth-prefs-managegrantslink": "Управљај {{PLURAL:$1|1=повезаном апликацијом|повезаним апликацијама ($1)|0=повезаним апликацијама}}",
"mwoauth-consumer-allwikis": "Сви пројекти на овом сајту",
"mwoauth-consumer-name": "Име апликације:",
"mwoauth-consumer-user": "Издавач:",
"mwoauth-consumer-stage": "Актуелни статус:",
- "mwoauth-consumer-email": "Адреса е-поште контакта:",
+ "mwoauth-consumer-email": "Имејл-адреса контакта:",
"mwoauth-consumer-description": "Опис апликације:",
"mwoauth-consumer-wiki": "Применљиви пројекти:",
"mwoauth-consumer-wiki-thiswiki": "Тренутни пројекат ($1)",
@@ -43,7 +44,7 @@
"mwoauthconsumerregistration-description": "Опис",
"mwoauthconsumerregistration-stage": "Статус",
"mwoauthconsumerregistration-lastchange": "Последња промена",
- "mwoauthconsumerregistration-manage": "Управљај",
+ "mwoauthconsumerregistration-manage": "управљај",
"mwoauthmanageconsumers-notloggedin": "Морате бити пријављени да бисте приступили овој страници.",
"mwoauthmanageconsumers-showrejected": "Одбијени захтеви",
"mwoauthmanageconsumers-showexpired": "Истекли захтеви",
@@ -74,27 +75,27 @@
"mwoauthlistconsumers-status-rejected": "одбијено",
"mwoauthlistconsumers-status-expired": "истекло",
"oauthmanagemygrants": "Управљање повезаним апликацијама",
- "mwoauthmanagemygrants-text": "Ова страница наводи све апликације које могу да користе ваш налог. За сваку такву апликацију, опсег њеног приступа ограничен је дозволама које сте доделили апликацији када сте је овластили да делује у ваше име. Ако сте засебно овластили апликацију да приступа другом сестринском пројекту у ваше име, онда ћете видети засебну конфигурацију за сваки такав пројекат испод.\n\nПовезане апликације приступају вашем налогу коришћењем OAuth протокола. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Сазнајте више о повезаним апликацијама])</span>",
+ "mwoauthmanagemygrants-text": "Ова страница наводи све апликације које могу да користе ваш налог. За сваку такву апликацију, опсег њеног приступа ограничен је дозволама које сте доделили апликацији када сте је овластили да делује у ваше име. Ако сте засебно овластили апликацију да приступа другом сестринском пројекту у ваше име, онда ћете видети засебну конфигурацију за сваки такав пројекат испод.\n\nПовезане апликације приступају вашем налогу коришћењем OAuth протокола. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Детаљније о повезаним апликацијама])</span>",
"mwoauthmanagemygrants-navigation": "Навигација:",
- "mwoauthmanagemygrants-showlist": "Списак повезаних аликација",
+ "mwoauthmanagemygrants-showlist": "списак повезаних аликација",
"mwoauthmanagemygrants-none": "Нема апликација повезаних са налогом.",
"mwoauthmanagemygrants-user": "Издавач:",
"mwoauthmanagemygrants-description": "Опис",
"mwoauthmanagemygrants-wikiallowed": "Дозвољено на пројекту:",
- "mwoauthmanagemygrants-applicablegrantsallowed": "Дозвољена следећа применљива додељења:",
- "mwoauthmanagemygrants-review": "управљање приступом",
- "mwoauthmanagemygrants-revoke": "опозивање приступа",
- "mwoauthmanagemygrants-grantaccept": "Додељено",
- "mwoauthmanagemygrants-update-text": "Користите образац испод да бисте изменили дозволе додељене апликацији да делује у ваше име.",
+ "mwoauthmanagemygrants-applicablegrantsallowed": "Дозвољена следећа права:",
+ "mwoauthmanagemygrants-review": "управљај приступом",
+ "mwoauthmanagemygrants-revoke": "одузми приступ",
+ "mwoauthmanagemygrants-grantaccept": "Дозвољено",
+ "mwoauthmanagemygrants-update-text": "Користите доњи образац како бисте променили дозволе дате апликацији да делује у ваше име.",
"mwoauthmanagemygrants-revoke-text": "Користите образац испод да бисте опозвали приступ апликацији да делује у ваше име.",
"mwoauthmanagemygrants-confirm-legend": "Управљање повезаним апликацијама",
- "mwoauthmanagemygrants-update": "Ажурирај додељења",
+ "mwoauthmanagemygrants-update": "Ажурирај дозволе",
"mwoauthmanagemygrants-renounce": "Скини овлашћења",
"mwoauthmanagemygrants-action": "Промени статус:",
- "mwoauthmanagemygrants-basic-tooltip": "Зашто не могу да ажурирам ово додељење? Ово додељење даје повезаној апликацији основне дозволе које захтева да би исправно функционисала. Ако не желите да ова повезана апликација има ова права, треба да опозовете приступ апликације.",
+ "mwoauthmanagemygrants-basic-tooltip": "Зашто не могу да ажурирам ову дозволу? Ова дозвола даје повезаној апликацији основна права која су јој потребна да би исправно функционисала. Ако не желите да повезана апликација има ова права, треба да јој одузмете приступ.",
"mwoauthmanagemygrants-editslink": "{{GENDER:$1|Ваше}} измене помоћу ове апликације",
"mwoauthmanagemygrants-actionslink": "{{GENDER:$1|Ваше}} радње помоћу ове апликације",
- "log-action-filter-mwoauthconsumer": "Тип OAuth потрошачке радње:",
+ "log-action-filter-mwoauthconsumer": "Врста OAuth потрошачке радње:",
"log-action-filter-mwoauthconsumer-approve": "OAuth потрошачко одобравање",
"log-action-filter-mwoauthconsumer-create-owner-only": "OAuth потрошачко прављење само за власника",
"log-action-filter-mwoauthconsumer-disable": "OAuth потрошачко онемогућавање",
@@ -103,7 +104,7 @@
"log-action-filter-mwoauthconsumer-reject": "OAuth потрошачко одбијање",
"log-action-filter-mwoauthconsumer-update": "OAuth потрошачко ажурирање",
"mwoauthconsumer-consumer-logpagetext": "Дневник одобравања, одбијања и онемогућавања регистрованих корисника OAuth-а.",
- "mwoauthdatastore-request-token-already-used": "Овај захтев је већ завршен и не може се поново послати.\nВратите се на апликацију и покушајте поново да повежете свој налог или контактирајте аутора апликације.\n\n<span class=\"plainlinks mw-mwoautherror-details\">OAuth токен је већ искоришћен, $1</span>",
+ "mwoauthdatastore-request-token-already-used": "Захтев је већ извршен и не може се поново поднети.\nВратите се на апликацију и покушајте поново да повежете свој налог или се обратите аутору апликације.\n\n<span class=\"plainlinks mw-mwoautherror-details\">OAuth токен је већ искоришћен, $1</span>",
"mwoauth-form-description-allwikis-nogrants": "Здраво $1,\n\nУ циљу завршавања вашег захтева, апликацији '''$2''' је потребна дозвола за приступ информацијама на свим пројектима овог сајта у ваше име. Никакве промене неће бити направљене са вашим налогом.",
"mwoauth-form-button-approve": "Дозволи",
"mwoauth-form-button-cancel": "Откажи",
@@ -113,5 +114,9 @@
"echo-category-title-oauth-owner": "Развој OAuth-а",
"echo-category-title-oauth-admin": "Администратор OAuth-а",
"notification-oauth-app-body": "Разлог: $1",
- "mwoauth-login-required-reason": "Морате се пријавити на налог на пројекту{{SITENAME}} да бисте овластили апликације да му приступе."
+ "mwoauth-login-required-reason": "Морате се пријавити на налог на пројекту{{SITENAME}} да бисте овластили апликације да му приступе.",
+ "grant-oauthmanageownclient": "управљање Вашим OAuth клијентима",
+ "mwoauth-consumer-user-mismatch": "Не можете да вршите радње над клијентима који Вам не припадају",
+ "mwoauth-consumer-deleted-error": "Не можете да вршите радње над избрисаним клијентима",
+ "mwoauth-consumer-submit-error": "Дошло је до грешке при чувању потрошача"
}
diff --git a/OAuth/i18n/sr-el.json b/OAuth/i18n/sr-el.json
index 28f28a1e..2b328af2 100644
--- a/OAuth/i18n/sr-el.json
+++ b/OAuth/i18n/sr-el.json
@@ -1,9 +1,11 @@
{
"@metadata": {
"authors": [
+ "Kizule",
"Milicevic01",
"Obsuser",
"Srdjan m",
+ "Srđan",
"Zoranzoki21"
]
},
diff --git a/OAuth/i18n/sv.json b/OAuth/i18n/sv.json
index 581ebd7a..5691f8c9 100644
--- a/OAuth/i18n/sv.json
+++ b/OAuth/i18n/sv.json
@@ -2,16 +2,19 @@
"@metadata": {
"authors": [
"Ainali",
+ "Dhallin",
"Eihpossophie",
"Jkl",
"Jopparn",
"Lokal Profil",
"Mjälten",
+ "Sabelöga",
"Skalman",
"WikiPhoenix"
]
},
- "mwoauth-desc": "Tillåter användning av OAuth 1.0a för API-tillstånd",
+ "mwoauth-desc": "Tillåter användning av OAuth 1.0a och OAuth 2.0 för API-tillstånd",
+ "mwoauth-nosubpage-explanation": "OAuth är en mekanism som gör det möjligt för externa applikationer att identifiera en {{SITENAME}} - användare eller agera på deras vägnar, efter att ha fått tillstånd från den användaren.\n\nFör att den här sidan ska göra något krävs fler parametrar. Om du skickades hit från en extern applikation berodde det troligen på ett fel i den applikationen. du bör kontakta författaren.",
"mwoauth-verified": "Denna applikation kan nu komma åt MediaWiki för din räkning.\n\nFör att slutföra processen, ge detta verifikationsvärde till applikationen: '''$1'''",
"mwoauth-db-readonly": "OAuth-databasen är tillfälligt låst. Vänligen försök igen om några minuter.",
"mwoauth-missing-field": "Saknar värde för \"$1\"-fältet",
@@ -34,6 +37,7 @@
"mwoauth-consumer-owner-only-help": "Genom att välja detta alternativ kommer konsumenten automatiskt att godkännas och accepteras för användning av $1. Den kommer inte att kunna användas av någon annan användare, och det vanliga autentiseringsflödet kommer inte att fungera. Åtgärder som utgörs med denna konsument kommer inte att taggas.",
"mwoauth-consumer-description": "Beskrivning av applikationen",
"mwoauth-consumer-callbackurl": "OAuth \"callback\"-URL:",
+ "mwoauth-consumer-callbackurl-warning": "(wildcard port)",
"mwoauth-consumer-callbackisprefix": "Gör det möjligt för konsumenter att ange en callback i förfrågningar och använda \"callback\"-URL:en ovan som ett krävt prefix.",
"mwoauth-consumer-granttypes": "Behörighetstyper som efterfrågas:",
"mwoauth-consumer-grantsneeded": "Tillämpliga behörigheter:",
@@ -70,7 +74,6 @@
"mwoauth-consumer-stage-suppressed": "undertryckta",
"oauthconsumerregistration": "Registrering för OAuth-konsumenter",
"mwoauthconsumerregistration-navigation": "Navigering:",
- "mwoauthconsumerregistration-propose": "Föreslå ny kund",
"mwoauthconsumerregistration-list": "Min konsumentlista",
"mwoauthconsumerregistration-main": "Huvudsida",
"mwoauthconsumerregistration-propose-text": "Utvecklare bör använda formuläret nedan för att föreslå en ny OAuth-konsument (se [//www.mediawiki.org/wiki/Extension:OAuth dokumentationen för tillägget] för mer detaljer). Efter att ha skickat in detta formulär, får du en nyckel som din applikation kan använda för att identifiera sig gentemot MediaWiki. En OAuth-administratör måste godkänna din ansökan innan den kan tillåtas av andra användare.\n\nNågra rekommendationer och anmärkningar:\n* Försök att använda så få behörigheter som möjligt. Undvik behörigheter som egentligen inte behövs nu.\n* Versioner är av formen \"huvudversion.underversion.release\" (de två sista är valfria) och ökar allt eftersom behörighetsförändringar behövs.\n* Vänligen ange en publik RSA-nyckel (i PEM-format) om möjligt; annars måste en (mindre säker) hemlig nyckel användas.\n* Du kan använda ett projekt-id för att begränsa konsumenten till ett enskilt projekt på denna webbplats (använd \"*\" för alla projekt).",
@@ -92,9 +95,11 @@
"mwoauthconsumerregistration-resetsecretkey": "Återställ den hemliga nyckeln till ett nytt värde",
"mwoauthconsumerregistration-proposed": "Du har tilldelats konsument-nyckeln av '''$1''' och en hemlig nyckel av '''$2'''. ''Vänligen anteckna dessa för framtida bruk.''",
"mwoauthconsumerregistration-created-owner-only": "Din OAuth-konsument har skapats.\n\nDina nycklar är:\n; Konsumentnyckel: $1\n; Konsumenthemlighet: $2\n; Accessnyckel: $3\n; Accesshemlighet: $4\n<em>Vänligen anteckna dessa för framtida användning.</em>",
+ "mwoauthconsumerregistration-created-owner-only-oauth2": "Din OAuth 2.0 -klient har skapats.\n\nDina tokens är:\n; Kundapplikationsnyckel: $1\n; Kundapplikationshemlighet: $2\n; Åtkomsttoken: $3\n; <em> Spela in dessa för framtida referens. </em>",
"mwoauthconsumerregistration-updated": "Ditt OAuth-konsumentregister uppdaterades.",
"mwoauthconsumerregistration-secretreset": "Du har blivit tilldelad en konsumenttoken av '''$1'''. ''Vänligen anteckna detta för framtida bruk.''",
"mwoauthconsumerregistration-secretreset-owner-only": "Dina konsumentnycklar för OAuth har återställts. De nya nycklarna är:\n; Konsumentnyckel: $1\n; Konsumenthemlighet: $2\n; Accessnyckel: $3\n; Accesshemlighet: $4\n<em>Vänligen anteckna dessa för framtida användning.</em>",
+ "mwoauthconsumerregistration-secretreset-owner-only-oauth2": "Dina OAuth 2.0 -konsumenttoken har återställts. De nya tokensna är:\n; Konsumenttoken: $1\n; Konsumenthemlighet: $2\n; Åtkomsttoken: $3\n<em> Spela in dessa för framtida referens. </em>",
"mwoauthconsumerregistration-need-emailconfirmed": "Du måste bekräfta din e-postadress innan du kan skapa OAuth-applikationer. Var vänlig ställ in och validera din e-postadress genom dina [[Special:Preferences|användarinställningar]].",
"oauthmanageconsumers": "Hantera OAuth-konsumenter",
"mwoauthmanageconsumers-notloggedin": "Du behöver vara inloggad för att komma åt denna sida.",
@@ -165,6 +170,10 @@
"mwoauthlistconsumers-status-disabled": "inaktiverade",
"mwoauthlistconsumers-status-rejected": "avvisad",
"mwoauthlistconsumers-status-expired": "utgången",
+ "mwoauthlistconsumers-navigation": "Navigering:",
+ "mwoauthlistconsumers-update-link": "Uppdatera konsument",
+ "mwoauthlistconsumers-manage-link": "Hantera konsument",
+ "mwoauthlistconsumers-grants-link": "Hantera bidrag",
"mwoauthlistconsumers-rclink": "Senaste ändringarna från denna applikation",
"oauthmanagemygrants": "Hantera anslutna applikationer",
"mwoauthmanagemygrants-text": "Denna sida listar alla applikationer som kan använda ditt konto. För varje sådan applikation är dess tillträde begränsat av de behörigheter vilka du auktoriserade när du valde att låta den agera åt dina vägnar. Om du separat auktoriserar en applikation att tillgå olika systerprojekt åt dina vägnar kommer du se separat konfiguration för varje sådant projekt nedan.\n\nAnsluta applikationer kan få tillgång till ditt konto via OAuth-protokollet. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Läs mer om ansluta applikationer])</span>",
@@ -236,15 +245,18 @@
"mwoauth-invalid-authorization-wrong-user": "Auktoriseringsrubrikerna i din begäran är för en annan användare",
"mwoauth-invalid-authorization-not-approved": "Appen du försöker ansluta verkar vara felaktigt inställd. Kontakta skaparen av \"$1\" för hjälp.",
"mwoauth-invalid-authorization-blocked-user": "Auktoriseringsrubrikerna i din begäran är för en användare som är blockerad",
- "mwoauth-form-description-allwikis": "Hej $1,\nFör att slutföra din begäran behöver '''$2''' behörighet att utföra följande åtgärder åt dina vägnar på alla projekt på denna sida:\n\n$4",
+ "mwoauth-form-description-allwikis": "Hej $1,\n\nFör att slutföra din begäran behöver '''$2''' behörighet att utföra följande åtgärder åt dina vägnar på alla projekt på denna sida:\n\n$4",
"mwoauth-form-description-onewiki": "Hej $1,\n\nFör att slutföra din begäran behöver '''$2''' behörighet att utföra följande åtgärder åt dina vägnar på '''$4''':\n\n$5",
"mwoauth-form-description-allwikis-nogrants": "Hej $1,\n\nFör att slutföra din begäran behöver '''$2''' behörighet till åtkomst för alla projekt på denna sida åt dina vägnar. Inga ändringar kommer att göras på ditt konto.",
"mwoauth-form-description-onewiki-nogrants": "Hej $1,\n\nFör att slutföra din begäran behöver '''$2''' behörighet för att komma åt information på ''$4'' åt dina vägnar. Inga ändringar kommer att göras på ditt konto.",
- "mwoauth-form-description-allwikis-privateinfo": "Hej $1,\n\nFör att slutföra din begäran, behöver \"'$2\"' tillstånd att få tillgång till information om dig, inklusive ditt verkliga namn och e-postadress, i alla projekt på denna webbplats. Inga ändringar kommer att göras med ditt konto.",
- "mwoauth-form-description-onewiki-privateinfo": "Hej $1,\n\nFör att slutföra din begäran behöver '''$2''' behörighet att komma åt information, däribland ditt verkliga namn och mailadress, på ''$4''. Inga ändringar kommer att göras med ditt konto.",
+ "mwoauth-form-description-allwikis-privateinfo": "Hej $1,\n\nFör att slutföra din begäran, behöver '''$2''' tillstånd att få tillgång till information om dig, inklusive ditt verkliga namn och e-postadress, i alla projekt på denna webbplats. Inga ändringar kommer att göras med ditt konto.",
+ "mwoauth-form-description-onewiki-privateinfo": "Hej $1,\n\nFör att slutföra din begäran behöver '''$2''' behörighet att komma åt information, däribland ditt verkliga namn och e-postadress, på ''$4''. Inga ändringar kommer att göras med ditt konto.",
+ "mwoauth-form-description-allwikis-privateinfo-norealname": "Hej $1,\n\nFör att slutföra din begäran, behöver '''$2''' tillstånd att få tillgång till information om dig, inklusive din e-postadress, i alla projekt på denna webbplats. Inga ändringar kommer att göras med ditt konto.",
+ "mwoauth-form-description-onewiki-privateinfo-norealname": "Hej $1,\n\nFör att slutföra din begäran behöver '''$2''' behörighet att komma åt information, däribland din e-postadress, på ''$4''. Inga ändringar kommer att göras med ditt konto.",
"mwoauth-form-button-approve": "Tillåt",
"mwoauth-form-button-cancel": "Avbryt",
"mwoauth-error": "Anslutningsfel för applikationen",
+ "mwoauth-error-missing-callback-url-non-owner": "callback_url krävs för offentliga klienter",
"mwoauth-grants-heading": "Begärda tillstånd:",
"mwoauth-grants-nogrants": "Ansökan har inte begärt något tillstånd.",
"mwoauth-acceptance-cancelled": "Du har valt att inte tillåta \"$1\" åtkomst till ditt konto. \"$1\" kommer inte att fungera om du inte ger den åtkomst. Du kan gå tillbaka till \"$1\" eller [[Special:OAuthManageMyGrants|hantera]] dina anslutna appar.",
@@ -295,5 +307,35 @@
"notification-oauth-app-disable-primary-link": "Visa app",
"notification-oauth-app-reenable-primary-link": "Visa app",
"notification-oauth-app-body": "Anledning: $1",
- "mwoauth-oauth2-granttype-refresh-token": "Uppdatera nyckel"
+ "mwoauth-oauth-version": "OAuth protokollversion",
+ "mwoauth-oauth2-is-confidential": "Kunden är konfidentiell",
+ "mwoauth-oauth2-is-confidential-help": "En konfidentiell klient är en applikation som kan hålla ett klientlösenord konfidentiellt för världen. Icke-konfidentiella klienter är mindre säkra",
+ "mwoauth-oauth2-granttypes": "Tillåtna OAuth2 bidragstyper",
+ "mwoauth-oauth2-granttype-auth-code": "Behörighetskod",
+ "mwoauth-oauth2-granttype-refresh-token": "Uppdatera nyckel",
+ "mwoauth-oauth2-granttype-client-credentials": "Kunduppgifter",
+ "mwoauth-oauth2-error-create-at-no-user-approval": "Det går inte att skapa åtkomsttoken, användaren godkände inte att denna åtkomsttoken utfärdades",
+ "mwoauth-oauth2-error-user-approval-deny": "Användaren har avvisat begäran från klientansökan",
+ "mwoauth-oauth-unsupported-version": "Den här slutpunkten är inte tillåten för OAuth-version $1",
+ "mwoauth-oauth2-error-unauthorized-scope": "Omfattningen \"$1\" är inte tillåten för den här applikationen",
+ "mwoauth-oauth2-error-owner-only-invalid-grant": "Klienter som bara är ägare måste få använda kund_uppgifter",
+ "mwoauth-oauth2-unable-to-retrieve-access-token": "Det gick inte att hämta åtkomsttoken: $1",
+ "mwoauth-oauth2-error-server-error": "Auktoriseringsservern stötte på ett oväntat tillstånd som hindrade den från att uppfylla begäran.",
+ "mwoauth-oauth2-error-invalid-request": "Begäran saknar en obligatorisk parameter, innehåller ett ogiltigt parametervärde, innehåller en parameter mer än en gång eller är på annat sätt felaktig.",
+ "mwoauth-oauth2-error-unauthorized-client": "Klienten är inte behörig att begära en auktoriseringskod med denna metod.",
+ "mwoauth-oauth2-error-access-denied": "Resursägaren eller auktoriseringsservern avvisade begäran.",
+ "mwoauth-oauth2-error-unsupported-response-type": "Auktoriseringsservern stöder inte erhållande av en auktoriseringskod med denna metod.",
+ "mwoauth-oauth2-error-invalid-scope": "Det begärda omfånget är ogiltigt, okänt eller felaktigt.",
+ "mwoauth-oauth2-error-temporarily-unavailable": "Auktoriseringsservern kan för närvarande inte hantera begäran på grund av en tillfällig överbelastning eller underhåll av servern.",
+ "mwoauth-oauth2-error-invalid-client": "Klientautentisering misslyckades (t.ex. okänd klient, ingen klientautentisering ingår eller autentiseringsmetod som inte stöds)",
+ "mwoauth-oauth2-error-request-not-verified": "Försöker hämta verifierad egendom innan du begäran verifieras",
+ "mwoauth-oauth2-invalid-access-token": "Ogiltig åtkomsttoken",
+ "mwoauth-consumer-access-no-user": "Konsumentgodkännande måste vara bunden till en giltig användare, användare med ID 0 anges",
+ "mwoauth-login-required-reason": "Du måste logga in på ditt {{SITENAME}} -konto för att godkänna appar för att komma åt det.",
+ "mwoauthconsumer-consumer-view": "Visa den här konsumenten",
+ "mwoauthconsumer-application-view": "Visa den här applikationen",
+ "grant-oauthmanageownclient": "Hantera dina OAuth-klienter",
+ "mwoauth-consumer-user-mismatch": "Du kan inte utföra handlingar på klienter som inte är dina",
+ "mwoauth-consumer-deleted-error": "Du kan inte utföra handlingar på radera klienter",
+ "mwoauth-consumer-submit-error": "Ett fel uppstod när en konsument skulle sparas"
}
diff --git a/OAuth/i18n/te.json b/OAuth/i18n/te.json
index b9fb0bf3..0147d940 100644
--- a/OAuth/i18n/te.json
+++ b/OAuth/i18n/te.json
@@ -9,5 +9,9 @@
"mwoauth-prefs-managegrants": "అనుసంధానిత అనువర్తనాలు:",
"mwoauth-prefs-managegrantslink": "{{PLURAL:$1|$1 అనుసంధానిత అనువర్తనాన్ని|$1 అనుసంధానిత అనువర్తనాలను|0=అనుసంధానిత అనువర్తనాలను}} నిర్వహించుకోండి",
"mwoauth-consumer-owner-only-label": "యజమాని-మాత్రమే:",
+ "oauthmanagemygrants": "అనుబంధిత అప్లికేషన్లను నిర్వహించు",
+ "mwoauthmanagemygrants-text": "మీ ఖాతాను వాడే అప్లికేషన్లను ఈ పేఝీలో చూడవచ్చు. ఆ అప్లికేషన్ల పరిధి, వాటికి మీరిచ్చిన అనుమతులపై ఆఅధారపడి ఉంటుంది. ఏదైనా అప్లికేషనుకు వేరువేరు ప్రాజెక్టులలో విడివిడిగా ఆథరైజు చేసి ఉంటే, వాటి కాన్ఫిగరేషన్ను విడివిడిగా కింద చూడవచ్చు.\n\nఅనుబంధిత అప్లికేషన్లు OAuth ప్రోటోకోల్‌ను వాడి మీ ఖాతాల్కు కనెక్టవుతాయి. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth అనుబంధిత అప్లికేషన్ల గురించి మరింత తెలుసుకోండి])</span>",
+ "mwoauthmanagemygrants-none": "మీఖాతాకు అనుబంధంగా అప్లికేషన్లేమీ లేవు.",
+ "mwoauthmanagemygrants-confirm-legend": "అనుబంధిత అప్లికేషన్లను నిర్వహించు",
"notification-oauth-app-body": "కారణం: $1"
}
diff --git a/OAuth/i18n/th.json b/OAuth/i18n/th.json
index 04dd7ed6..7de1f514 100644
--- a/OAuth/i18n/th.json
+++ b/OAuth/i18n/th.json
@@ -1,19 +1,22 @@
{
"@metadata": {
"authors": [
- "Aefgh39622"
+ "Aefgh39622",
+ "Patsagorn Y.",
+ "SaldırganSincap"
]
},
"mwoauth-desc": "อนุญาตการใช้ OAuth 1.0a สำหรับการยืนยันตัวบุคคล API",
- "mwoauth-verified": "ขณะนี้แอปพลิเคชันได้รับอนุญาตให้เข้าถึง MediaWiki ในนามของคุณแล้ว\n\nเพื่อดำเนินการให้เสร็จสมบูรณ์ โปรดกรอกโทเค็นการยืนยันตัวบุคคลลงในแอปพลิเคชัน: '''$1'''",
- "mwoauth-db-readonly": "ฐานข้อมูล OAuth ถูกล็อกชั่วคราว โปรดลองอีกครั้งในภายหลัง",
+ "mwoauth-nosubpage-explanation": "OAuth เป็นเครื่องมือหนึ่งที่ช่วยอนุญาตให้แอปพลิเคชันภายนอกสามารถระบุตัวตนของผู้ใช้บน {{SITENAME}} หรือใช้เพื่อกระทำการแทนผู้ใช้ ซึ่งจะทำก็ต่อเมื่อได้รับการอนุญาตจากผู้ใช้นั้น ๆ แล้ว\n\nหากต้องการใช้งานหน้านี้สำหรับการทำสิ่งใดก็ตาม ยังคงต้องการพารามิเตอร์เพิ่มเติม หากคุณมายังหน้านี้ผ่านแอปพลิเคชันใด ๆ เป็นไปได้ว่าอาจเกิดข้อผิดพลาดในแอปพลิเคชันนั้น คุณควรติดต่อเจ้าของแอปพลิเคชัน",
+ "mwoauth-verified": "ขณะนี้แอปพลิเคชันได้รับอนุญาตให้เข้าถึง MediaWiki ในนามของคุณแล้ว\n\nเพื่อดำเนินการให้เสร็จสมบูรณ์ โปรดใส่โทเค็นการยืนยันตัวบุคคลต่อไปนี้ลงในแอปพลิเคชัน: '''$1'''",
+ "mwoauth-db-readonly": "ฐานข้อมูล OAuth ถูกปิดใช้งาน (ล็อก) ชั่วคราว โปรดลองอีกครั้งในภายหลัง",
"mwoauth-missing-field": "ไม่ได้กรอกค่าไว้ลงในเขตข้อมูล \"$1\"",
"mwoauth-invalid-field": "ค่าที่กรอกลงในเขตข้อมูล \"$1\" ไม่ถูกต้อง",
"mwoauth-invalid-field-generic": "ค่าที่กรอกไม่ถูกต้อง",
"mwoauth-field-hidden": "(ข้อมูลนี้ถูกซ่อนไว้)",
- "mwoauth-field-private": "(ข้อมูลนี้เป็นข้อมูลส่วนตัว)",
+ "mwoauth-field-private": "(สารสนเทศนี้เป็นความลับ)",
"mwoauth-prefs-managegrants": "แอปที่เชื่อมต่อ:",
- "mwoauth-prefs-managegrantslink": "จัดการ $1 แอปพลิเคชันที่เชื่อมต่อ",
+ "mwoauth-prefs-managegrantslink": "จัดการ{{PLURAL:$1|&#32;$1 แอปพลิเคชัน|0=แอปพลิเคชัน}}ที่เชื่อมต่อ",
"mwoauth-consumer-allwikis": "โครงการทั้งหมดบนไซต์นี้",
"mwoauth-consumer-key": "คีย์ผู้บริโภค:",
"mwoauth-consumer-name": "ชื่อแอปพลิเคชัน:",
@@ -46,7 +49,6 @@
"mwoauth-consumer-stage-disabled": "ปิดใช้งานแล้ว",
"oauthconsumerregistration": "การลงทะเบียนผู้บริโภค OAuth",
"mwoauthconsumerregistration-navigation": "การนำทาง:",
- "mwoauthconsumerregistration-propose": "เสนอผู้บริโภคใหม่",
"mwoauthconsumerregistration-list": "รายชื่อผู้บริโภคของฉัน",
"mwoauthconsumerregistration-main": "หลัก",
"mwoauthconsumerregistration-update-legend": "อัปเดตแอปพลิเคชันผู้บริโภค OAuth",
@@ -126,6 +128,7 @@
"mwoauthmanagemygrants-renounce": "ยกเลิกการยืนยันตัวบุคคล",
"mwoauthmanagemygrants-action": "เปลี่ยนสถานะ:",
"mwoauthmanagemygrants-confirm-submit": "อัปเดตสถานะโทเค็นการเข้าถึง",
+ "mwoauthmanagemygrants-success-update": "การตั้งค่าแอปพลิเคชันนี้ถูกอัปเดตเรียบร้อยแล้ว",
"logentry-mwoauthconsumer-propose": "$1 ได้เสนอผู้บริโภค OAuth (คีย์ผู้บริโภค $4)",
"logentry-mwoauthconsumer-update": "$1 ได้อัปเดตผู้บริโภค OAuth (คีย์ผู้บริโภค $4)",
"logentry-mwoauthconsumer-approve": "$1 ได้อนุมัติผู้บริโภค OAuth โดย $3 (คีย์ผู้บริโภค $4)",
@@ -133,14 +136,29 @@
"logentry-mwoauthconsumer-disable": "$1 ได้ปิดใช้งานผู้บริโภค OAuth โดย $3 (คีย์ผู้บริโภค $4)",
"logentry-mwoauthconsumer-reenable": "$1 ได้เปิดใช้งานผู้บริโภค OAuth โดย $3 ใหม่ (คีย์ผู้บริโภค $4)",
"mwoauthconsumer-consumer-logpage": "ปูมผู้บริโภค OAuth",
+ "mwoauth-bad-request-missing-params": "ขออภัย เกิดข้อผิดพลาดบางประการในการปรับตั้งค่าการเชื่อมต่อแอปพลิเคชันนี้ กรุณาติดต่อผู้พัฒนาแอปพลิเคชัน\n\n<span class=\"plainlinks mw-mwoautherror-details\">OAuth ขาดพารามิเตอร์ $1 (OAuth missing parameters)</span>",
+ "mwoauth-bad-request-invalid-action": "ขออภัย เกิดข้อผิดพลาดบางประการ คุณจำเป็นต้องติดต่อผู้พัฒนาแอปพลิเคชันนี้เพื่อให้สามารถแก้ปัญหานี้ได้อย่างถูกต้อง\n\n<span class=\"plainlinks mw-mwoautherror-details\">ยูอาร์แอลที่ไม่รุ้จัก $1 (Unknown URL)</span>",
+ "mwoauth-bad-request-invalid-action-contact": "ขออภัย เกิดข้อผิดพลาดบ้างประการ คุณจำเป็นต้อง[$1 ติดต่อ]เจ้าของของแอปพลิเคชันนี้เพื่อให้ช่วยเหลือได้อย่างถูกต้อง\n\n<span class=\"plainlinks mw-mwoautherror-details\">ยูอาร์แอลที่ไม่รู้จัก $2 (Unknown URL)</span>",
+ "mwoauthdatastore-access-token-not-found": "ไม่พบการอนุญาตสำหรับโทเค็นระบุที่ระบุ",
"mwoauthdatastore-bad-token": "ไม่พบโทเค็นที่ตรงกับคำขอของคุณ",
"mwoauthdatastore-bad-verifier": "รหัสการยืนยันที่กรอกไม่ถูกต้อง",
"mwoauthgrants-general-error": "มีข้อผิดพลาดในคำขอ OAuth ของคุณ",
"mwoauthserver-invalid-request-token": "โทเค็นไม่ถูกต้องในคำขอของคุณ",
"mwoauth-invalid-authorization-title": "ข้อผิดพลาดการยืนยันตัวบุคคล OAuth",
+ "mwoauth-form-description-allwikis": "สวัสดี $1\n\nก่อนที่จะทำการสำเร็จคำขอ '''$2''' ต้องการสิทธิ์ในการกระทำดังต่อไปนี้ในทุกโครงการของไซต์นี้:\n\n$4",
+ "mwoauth-form-description-onewiki": "สวัสดี $1\n\nก่อนที่จะทำการสำเร็จคำขอ '''$2''' ต้องการสิทธิ์ในการกระทำดังต่อไปนี้ใน \"$4\":\n\n$5",
+ "mwoauth-form-description-allwikis-nogrants": "สวัสดี $1\n\nก่อนที่จะสำเร็จคำขอของคุณ '''$2''' ต้องการสิทธิ์เพื่อเข้าถึงสารสนเทศในทุกโครงการของไซต์นี้ที่คุณมีปฏิสัมพันธ์ด้วย จะไม่มีการแก้ไขใดโดยบัญชีคุณและไม่มีการเปลี่ยนแปลงการตั้งค่าใด ๆ",
+ "mwoauth-form-description-onewiki-nogrants": "สวัสดี $1\n\nก่อนที่จะสำเร็จคำขอของคุณ '''$2''' ต้องการสิทธิ์เพื่อเข้าถึงสารสนเทศใน \"$4\" ที่คุณมีปฏิสัมพันธ์ด้วย จะไม่มีการแก้ไขใดโดยบัญชีคุณและไม่มีการเปลี่ยนแปลงการตั้งค่าใด ๆ",
+ "mwoauth-form-description-allwikis-privateinfo": "สวัสดี $1\n\nก่อนที่จะสำเร็จคำขอของคุณ '''$2''' ต้องการสิทธิ์เพื่อเข้าถึงสารสนเทศเกี่ยวกับคุณ ซึ่งรวมไปถึงชื่อจริงและที่อยู่อีเมลในทุกโครงการของไซต์นี้",
+ "mwoauth-form-description-onewiki-privateinfo": "สวัสดี $1\n\nก่อนที่จะสำเร็จคำขอของคุณ '''$2''' ต้องการสิทธิ์เพื่อเข้าถึงสารสนเทศเกี่ยวกับคุณ ซึ่งรวมไปถึงชื่อจริงและที่อยู่อีเมลใน \"$4\" ไม่มีการเปลี่ยนแปลงจะเกิดขึ้นในนามของคุร",
+ "mwoauth-form-description-allwikis-privateinfo-norealname": "สวัสดี $1\n\nก่อนที่จะสำเร็จคำขอของคุณ '''$2''' ต้องการสิทธิ์เพื่อเข้าถึงสารสนเทศเกี่ยวกับคุณ ประกอบไปด้วยที่อยู่อีเมลในทุกโครงการของไซต์นี้ ไม่มีการเปลี่ยนแปลงใดจะเกิดขึ้นในนามของคุณ",
+ "mwoauth-form-description-onewiki-privateinfo-norealname": "สวัสดี $1\n\nก่อนที่จะสำเร็จคำขอของคุณ '''$2''' ต้องการสิทธิ์เพื่อเข้าถึงสารสนเทศเกี่ยวกับคุณ ประกอบไปด้วยที่อยู่อีเมลใน \"$4\" ไม่มีการเปลี่ยนแปลงใดจะเกิดขึ้นในนามของคุณ",
"mwoauth-form-button-approve": "อนุญาต",
"mwoauth-form-button-cancel": "ยกเลิก",
"mwoauth-error": "การเชื่อมต่อแอปพลิเคชันผิดพลาด",
+ "mwoauth-error-missing-callback-url-non-owner": "จำเป็นต้องมี callback_url สำหรับไคลเอนต์ที่ไม่ใช่เฉพาะผู้สร้าง",
+ "mwoauth-grants-heading": "สิทธิ์ที่ขออนุญาต:",
+ "mwoauth-grants-nogrants": "แอปพลิเคชันไม่ต้องการสิทธิ์ใด ๆ เพิ่มเติม",
"mwoauth-oauth-exception": "เกิดข้อผิดพลาดในโปรโตคอล OAuth: $1",
"mwoauth-callback-not-oob": "ต้องกำหนดค่าใน oauth_callback และต้องกำหนดค่าเป็น \"oob\" (ตรงตามตัวพิมพ์ใหญ่-เล็ก)",
"right-mwoauthproposeconsumer": "เสนอผู้บริโภค OAuth ใหม่",
@@ -155,6 +173,7 @@
"action-mwoauthproposeconsumer": "เสนอผู้บริโภค OAuth ใหม่",
"action-mwoauthupdateownconsumer": "อัปเดตผู้บริโภค OAuth ที่คุณควบคุม",
"action-mwoauthviewsuppressed": "ดูผู้บริโภค OAuth ที่ไม่แสดง",
+ "mwoauth-botpasswords-note": "<strong>หมายเหตุ:</strong> <span class=\"plainlinks\">[$1 OAuth]</span> เป็นทางเลือกที่ปลอดภัยกว่ารหัสผ่านบอต และควรใช้เสมอเมื่อบอตรองรับ",
"echo-category-title-oauth-owner": "การพัฒนา OAuth",
"echo-pref-tooltip-oauth-owner": "เตือนฉันเกี่ยวกับเหตุการณ์ที่เกี่ยวข้องกับแอปพลิเคชัน OAuth ที่ฉันสร้าง",
"echo-pref-tooltip-oauth-admin": "เตือนฉันเกี่ยวกับเหตุการณ์ที่เกี่ยวข้องกับการตรวจสอบแอปพลิเคชัน OAuth",
diff --git a/OAuth/i18n/ti.json b/OAuth/i18n/ti.json
new file mode 100644
index 00000000..20f99ec9
--- /dev/null
+++ b/OAuth/i18n/ti.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Joanmp17"
+ ]
+ },
+ "mwoauth-field-hidden": "(እዚ ሓበሬታ እዚ ተሓቢኡ ኣሎ)",
+ "mwoauth-field-private": "(እዚ ሓበሬታ እዚ ብሕታዊ እዩ)",
+ "mwoauth-prefs-managegrants": "ዝተኣሳሰሩ መተግበሪታት፦",
+ "mwoauth-prefs-managegrantslink": "$1 {{PLURAL:$1|ዝተኣሳሰረ መተግበሪ|ዝተኣሳሰሩ መተግበሪታት|0=ዝተኣሳሰሩ መተግበሪታት}} ኣመሓድር",
+ "mwoauth-consumer-name": "ስም መተግበሪ፦",
+ "mwoauth-consumer-user": "ሓታሚ፦",
+ "mwoauthconsumerregistration-user": "ሓታሚ",
+ "mwoauthconsumerregistration-description": "መግለጺ",
+ "mwoauthconsumerregistration-manage": "ኣመሓድር",
+ "mwoauthmanageconsumers-user": "ሓታሚ",
+ "mwoauthmanageconsumers-description": "መግለጺ",
+ "mwoauthlistconsumers-user": "ሓታሚ",
+ "mwoauthlistconsumers-description": "መግለጺ",
+ "oauthmanagemygrants": "ዝተኣሳሰሩ መተግበሪታት ኣመሓድር",
+ "mwoauthmanagemygrants-showlist": "ዝርዝር ዝተኣሳሰሩ መተግበሪታት",
+ "mwoauthmanagemygrants-user": "ሓታሚ፦",
+ "mwoauthmanagemygrants-description": "መግለጺ",
+ "mwoauthmanagemygrants-confirm-legend": "ዝተኣሳሰረ መተግበሪ ኣመሓድር"
+}
diff --git a/OAuth/i18n/tr.json b/OAuth/i18n/tr.json
index e921f2ed..9e8a7f4f 100644
--- a/OAuth/i18n/tr.json
+++ b/OAuth/i18n/tr.json
@@ -5,10 +5,15 @@
"Demircimehmed",
"Grkn gll",
"Incelemeelemani",
+ "Joseph",
"McAang",
"Meelo",
+ "MuratTheTurkish",
"Rapsar",
"Sayginer",
+ "Selcuksntrk",
+ "Sezgin İbiş",
+ "Stonecy",
"SwornToTranslate29",
"TmY e12",
"ToprakM",
@@ -25,12 +30,12 @@
"mwoauth-field-hidden": "(bu bilgiler gizlidir)",
"mwoauth-field-private": "(bu bilgi gizlidir)",
"mwoauth-prefs-managegrants": "Bağlı uygulamalar:",
- "mwoauth-prefs-managegrantslink": "{{PLURAL:$1|$1 bağlı uygulamayı|$1 bağlı uygulamayı|0=bağlı uygulamayı}} yönet",
+ "mwoauth-prefs-managegrantslink": "{{PLURAL:$1|$1 bağlı uygulamayı|$1 bağlı uygulamayı|0=Bağlı uygulamaları}} yönet",
"mwoauth-consumer-allwikis": "Bu sitedeki bütün projeler",
"mwoauth-consumer-key": "Tüketici anahtarı:",
"mwoauth-consumer-name": "Uygulama adı:",
"mwoauth-consumer-version": "Tüketici sürümü:",
- "mwoauth-consumer-user": "Yayıncı:",
+ "mwoauth-consumer-user": "Yayımcı:",
"mwoauth-consumer-stage": "Geçerli durumu:",
"mwoauth-consumer-email": "İletişim e-posta adresi:",
"mwoauth-consumer-email-help": "Yalnızca yeni tüketicileri onaylayanlar görebilir",
@@ -39,6 +44,7 @@
"mwoauth-consumer-owner-only-help": "Bu seçeneğin belirlenmesi, tüketicinin otomatik olarak $1 ile onaylanmasına ve kabul edilmesine neden olur. Başka bir kullanıcı tarafından kullanılamaz ve olağan yetkilendirme akışı çalışmaz. Bu tüketici kullanılarak yapılan işlemler etiketlenmez.",
"mwoauth-consumer-description": "Uygulama açıklaması:",
"mwoauth-consumer-callbackurl": "OAuth \"geri arama\" URL'si:",
+ "mwoauth-consumer-callbackurl-warning": "(joker bağlantı noktası)",
"mwoauth-consumer-callbackisprefix": "Tüketicinin isteklerde geri arama yapmasına izin verin ve yukarıdaki \"geri arama\" URL'sini gerekli önek olarak kullanın.",
"mwoauth-consumer-granttypes": "İstenilen hibe türleri:",
"mwoauth-consumer-grantsneeded": "Geçerli ayrıcalıklar:",
@@ -75,12 +81,11 @@
"mwoauth-consumer-stage-suppressed": "bastırılmış",
"oauthconsumerregistration": "OAuth tüketici kaydı",
"mwoauthconsumerregistration-navigation": "Gezinti:",
- "mwoauthconsumerregistration-propose": "Yeni tüketici öner",
"mwoauthconsumerregistration-list": "Tüketici listem",
"mwoauthconsumerregistration-main": "Ana",
- "mwoauthconsumerregistration-propose-text": "Geliştiriciler yeni bir OAuth tüketicisi önermek için aşağıdaki formu kullanmalıdır (daha fazla ayrıntı için [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth uzantı belgelerine] bakın). Bu formu gönderdikten sonra, başvurunuzun kendisini MediaWiki'ye tanıtmak için kullanacağı bir belirteç alacaksınız. Bir OAuth yöneticisinin başvurunuzu diğer kullanıcılar tarafından yetkilendirilebilmesi için onaylaması gerekir.\n\nBirkaç öneri ve açıklama:\n* Mümkün olduğunca az sayıda hibe kullanmaya çalışın. Şu anda gerçekten gerekli olmayan hibelerden kaçının.\n* Sürümler \"major.minor.release\" biçimindedir (son ikisi isteğe bağlıdır) ve hibe değişikliklerine ihtiyaç duyuldukça artar.\n* Mümkünse lütfen genel bir RSA anahtarı (PEM biçiminde) sağlayın; aksi takdirde (daha az güvenli) bir gizli belirteç kullanılmalıdır.\n* Tüketiciyi bu sitedeki tek bir projeyle sınırlamak için bir proje kimliği kullanabilirsiniz (tüm projeler için \"*\" kullanın).",
+ "mwoauthconsumerregistration-propose-text": "Geliştiriciler yeni bir OAuth tüketicisi önermek için aşağıdaki formu kullanmalıdır (daha fazla ayrıntı için [https://www.mediawiki.org/wiki/Extension:OAuth/tr uzantı belgelerine] bakın). Bu formu gönderdikten sonra, başvurunuzun kendisini MediaWiki'ye tanıtmak için kullanacağı bir belirteç alacaksınız. Bir OAuth hizmetlisinin başvurunuzu diğer kullanıcılar tarafından yetkilendirilebilmesi için onaylaması gerekir.\n\nBirkaç öneri ve açıklama:\n* Mümkün olduğunca az sayıda hibe kullanmaya çalışın. Şu anda gerçekten gerekli olmayan hibelerden kaçının.\n* Sürümler \"major.minor.release\" biçimindedir (son ikisi isteğe bağlıdır) ve hibe değişikliklerine ihtiyaç duyuldukça artar.\n* Mümkünse lütfen genel bir RSA anahtarı (PEM biçiminde) sağlayın; aksi takdirde (daha az güvenli) bir gizli belirteç kullanılmalıdır.\n* Tüketiciyi bu sitedeki tek bir projeyle sınırlamak için bir proje kimliği kullanabilirsiniz (tüm projeler için \"*\" kullanın).",
"mwoauthconsumerregistration-update-text": "Kontrol ettiğiniz bir OAuth tüketicisinin özelliklerini güncellemek için aşağıdaki formu kullanın.\n\nBuradaki tüm değerler önceki değerlerin üzerine yazılır. Bu değerleri temizlemeyi düşünmüyorsanız boş alanlar bırakmayın.",
- "mwoauthconsumerregistration-maintext": "Bu sayfa, geliştiricilerin bu sitenin kayıt defterinde OAuth tüketici uygulamaları önermesine ve güncellemesine izin vermek içindir.\n\nBuradan şunları yapabilirsiniz:\n* [[Special:OAuthConsumerRegistration/propose|Yeni bir tüketici için jeton isteyin]].\n* [[Special:OAuthConsumerRegistration/list|Mevcut tüketicilerinizi yönetin]].\n\nOAuth hakkında daha fazla bilgi için lütfen [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth uzantı belgelerine] bakın.",
+ "mwoauthconsumerregistration-maintext": "Bu sayfa, geliştiricilerin bu sitenin kayıt defterinde OAuth tüketici uygulamaları önermesine ve güncellemesine izin vermek içindir.\n\nBuradan şunları yapabilirsiniz:\n* [[Special:OAuthConsumerRegistration/propose|Yeni bir tüketici için jeton isteyin]].\n* [[Special:OAuthConsumerRegistration/list|Mevcut tüketicilerinizi yönetin]].\n\nOAuth hakkında daha fazla bilgi için lütfen [https://www.mediawiki.org/wiki/Extension:OAuth/tr uzantı belgelerine] bakın.",
"mwoauthconsumerregistration-propose-legend": "Yeni OAuth tüketici uygulaması",
"mwoauthconsumerregistration-update-legend": "OAuth tüketici uygulamasını güncelle",
"mwoauthconsumerregistration-propose-submit": "Tüketici öner",
@@ -154,7 +159,7 @@
"mwoauthmanageconsumers-search-publisher": "bu kullanıcının tüketicileri",
"oauthlistconsumers": "Yetkilendirilen uygulamalar listesi",
"mwoauthlistconsumers-legend": "Yetkilendirilen uygulamalara göz atın",
- "mwoauthlistconsumers-view": "detaylar",
+ "mwoauthlistconsumers-view": "ayrıntılar",
"mwoauthlistconsumers-none": "Bu kriterleri karşılayan uygulama bulunamadı.",
"mwoauthlistconsumers-name": "Uygulama adı",
"mwoauthlistconsumers-version": "Tüketici sürümü",
@@ -178,7 +183,7 @@
"mwoauthlistconsumers-grants-link": "Hibeleri yönet",
"mwoauthlistconsumers-rclink": "Bu uygulamanın son değişiklikleri",
"oauthmanagemygrants": "Bağlı uygulamaları yönet",
- "mwoauthmanagemygrants-text": "Bu sayfada hesabınızda kullanılan uygulamaların listesi bulunmaktadır. Bu tür uygulamalar, söz konusu uygulamaya izin verdiğiniz ölçüde sizin adınıza hareket etmeye yetkilidir. Eğer bir uygulama sizin adınıza farklı kardeş projelere erişmek için yetkilendirildiği taktirde, uygulama ile ilgili bölümün altında diğer projeler için yetkilendirme ayarlarını da görebilirsiniz.\n\nBağlı uygulamalar OAuth protokolünü kullanarak, hesaplarınıza erişim sağlar. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Bağlı uygulamalar hakkında daha fazla bilgi alın])</span>",
+ "mwoauthmanagemygrants-text": "Bu sayfa, hesabınızı kullanabilecek tüm uygulamaları listeler. Bu tür herhangi bir uygulama için, erişim kapsamı, sizin adınıza taşıma yetkisi verdiğinizde uygulamaya verdiğiniz izinlerle sınırlıdır. Bir uygulamayı sizin adınıza farklı kardeş projelere erişmesi için ayrı olarak yetkilendirdiyseniz, aşağıda bu tür her proje için ayrı bir yapılandırma göreceksiniz.\n\nBağlı uygulamalar, OAuth protokolünü kullanarak hesabınıza erişir. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Help:OAuth/tr Bağlı uygulamalar hakkında daha fazla bilgi edinin])</span>",
"mwoauthmanagemygrants-navigation": "Gezinti:",
"mwoauthmanagemygrants-showlist": "Bağlı uygulama listesi",
"mwoauthmanagemygrants-none": "Hesabınıza bağlı herhangi bir uygulama yoktur.",
@@ -247,7 +252,7 @@
"mwoauth-invalid-authorization-wrong-user": "İsteğinizdeki yetkilendirme başlıkları farklı bir kullanıcı için",
"mwoauth-invalid-authorization-not-approved": "Bağlanmaya çalıştığınız uygulama yanlış ayarlanmış gibi görünüyor. Yardım için \"$1\" yazarı ile iletişim kurun.",
"mwoauth-invalid-authorization-blocked-user": "İsteğinizdeki yetkilendirme başlıkları engellenen bir kullanıcı içindir",
- "mwoauth-form-description-allwikis": "Merahaba $1,\n\nİsteğinizi tamamlamak için '''$2''', bu sitenin tüm projelerinde sizin adınıza aşağıdaki işlemleri gerçekleştirmek için izne ihtiyaç duyuyor:\n\n$4",
+ "mwoauth-form-description-allwikis": "Merhaba $1,\n\n'''$2''' isteğinizi tamamlamak amacıyla, aşağıdaki işlemleri bu sitenin tüm projelerinde sizin adınıza gerçekleştirmek için izne ihtiyaç duyuyor:\n\n$4",
"mwoauth-form-description-onewiki": "Merhaba $1,\n\nİsteğinizi tamamlamak için '''$2''' sizin adınıza ''$4'' üzerinde aşağıdaki işlemleri gerçekleştirmek için izne ihtiyaç duyuyor:\n\n$5",
"mwoauth-form-description-allwikis-nogrants": "Merhaba $1,\n\nİsteğinizi tamamlamak için '''$2''' adının bu sitenin tüm projeleriyle ilgili bilgilere erişmek için izne ihtiyacı var. Hesabınızda hiçbir değişiklik yapılmayacak.",
"mwoauth-form-description-onewiki-nogrants": "Merhaba $1,\n\nTalebinizi tamamlamak için '''$2''' sizin adınıza ''$4'' ile ilgili bilgilere erişmek için izne ihtiyaç duyuyor. Hesabınızda hiçbir değişiklik yapılmayacak.",
@@ -258,9 +263,10 @@
"mwoauth-form-button-approve": "İzin ver",
"mwoauth-form-button-cancel": "İptal",
"mwoauth-error": "Uygulama Bağlantı Hatası",
+ "mwoauth-error-missing-callback-url-non-owner": "callback_url sahibi olmayan istemciler için gereklidir",
"mwoauth-grants-heading": "İstenen izinler:",
"mwoauth-grants-nogrants": "Uygulama herhangi bir izin istemedi.",
- "mwoauth-acceptance-cancelled": "\"$1\" hesabınızın hesabınıza erişmesine izin vermemeyi seçtiniz. Erişimine izin vermediğiniz sürece \"$1\" çalışmaz. Bağlı uygulamalarınıza \"$1\" veya [[Special:OAuthManageMyGrants|yönete]] geri dönebilirsiniz.",
+ "mwoauth-acceptance-cancelled": "\"$1\" uygulamasının hesabınıza erişmesine izin vermemeyi seçtiniz. Erişimine izin vermediğiniz sürece \"$1\" çalışmaz. \"$1\" uygulamasına geri dönebilir veya bağlı uygulamalarınızı [[Special:OAuthManageMyGrants|yönetebilirsiniz]].",
"mwoauth-granttype-normal": "Özel izinler için yetki talep et.",
"grant-mwoauth-authonly": "Yalnızca kullanıcı kimliği doğrulaması, sayfaları okuma veya kullanıcının adına işlem yapma yeteneği yoktur.",
"grant-mwoauth-authonlyprivate": "Kullanıcı kimliği doğrulaması yalnızca gerçek ad ve e-posta adresine erişimle, sayfaları okuyamaz veya kullanıcının adına hareket edemez.",
@@ -334,5 +340,9 @@
"mwoauth-consumer-access-no-user": "Tüketici onayı geçerli bir kullanıcıya bağlı olmalı, kimlik numarası 0 olan kullanıcı verilmiş olmalıdır",
"mwoauth-login-required-reason": "Uygulamalara erişme yetkisi vermek için {{SITENAME}} hesabınıza giriş yapmanız gerekiyor.",
"mwoauthconsumer-consumer-view": "Bu tüketiciyi görüntüle",
- "mwoauthconsumer-application-view": "Bu uygulamayı görüntüle"
+ "mwoauthconsumer-application-view": "Bu uygulamayı görüntüle",
+ "grant-oauthmanageownclient": "OAuth istemcilerinizi yönetin",
+ "mwoauth-consumer-user-mismatch": "Size ait olmayan istemciler üzerinde işlem yapamazsınız",
+ "mwoauth-consumer-deleted-error": "Silinmiş olan istemciler üzerinde işlem yapamazsınız",
+ "mwoauth-consumer-submit-error": "Bir tüketiciyi kaydederken bir hata oluştu"
}
diff --git a/OAuth/i18n/uk.json b/OAuth/i18n/uk.json
index 39887e7a..32a7af17 100644
--- a/OAuth/i18n/uk.json
+++ b/OAuth/i18n/uk.json
@@ -2,8 +2,11 @@
"@metadata": {
"authors": [
"Ahonc",
+ "Andriy.v",
"Andriykopanytsia",
"Base",
+ "DDPAT",
+ "Ice bulldog",
"Macofe",
"Movses",
"Olion",
@@ -12,6 +15,7 @@
"Ата"
]
},
+ "abusefilter-edit-builder-vars-oauth-consumer": "OAuth-споживач використаний для здійснення цієї дії",
"mwoauth-desc": "Дозволяє використовувати OAuth 1.0a та OAuth 2.0 для API авторизації",
"mwoauth-nosubpage-explanation": "OAuth — це механізм, який дозволяє зовнішнім програмам ідентифікувати користувача сайту {{SITENAME}} чи робити якісь дії від імені такого користувача після отримання від нього дозволу на це.\n\nЩоб ця сторінка могла щось зробити, потрібно більше параметрів. Якщо ви потрапили сюди із зовнішньої програми, це, найімовірніше, сталося через якусь помилку в такій програмі; вам варто зв'язатися з її автором.",
"mwoauth-verified": "Цій програмі зараз дозволений доступ до Медіавікі від вашого імені.\n\nДля завершення процесу надайте це перевірене значення програмі: '''$1'''",
@@ -19,11 +23,12 @@
"mwoauth-missing-field": "Відсутнє значення для поля \"$1\"",
"mwoauth-invalid-field": "Неприпустиме значення для поля \"$1\"",
"mwoauth-invalid-field-generic": "Надано неприпустиме значення",
+ "mwoauth-invalid-field-oauth2GrantTypes": "Програми OAuth 2 повинні вказувати принаймні один тип дозволу",
"mwoauth-field-hidden": "(ця інформація прихована)",
"mwoauth-field-private": "(ця інформація є конфіденційною)",
"mwoauth-prefs-managegrants": "Підключені додатки:",
"mwoauth-prefs-managegrantslink": "Управляти {{PLURAL:$1|$1 з'єднаною програмою|$1 з'єднаними програмами|0=з'єднаними програмами}}",
- "mwoauth-consumer-allwikis": "Всі проекти на цьому сайті",
+ "mwoauth-consumer-allwikis": "Всі проєкти на цьому сайті",
"mwoauth-consumer-key": "Ключ споживача:",
"mwoauth-consumer-name": "Назва програми:",
"mwoauth-consumer-version": "Споживча версія:",
@@ -36,12 +41,14 @@
"mwoauth-consumer-owner-only-help": "Вибір цієї опції зробить так, що споживач буде автоматично прийнятий для використання та затверджений за $1. Ним не зможе користуватися будь-який інший користувач, і звична процедура авторизації не працюватиме. Дії, виконані цим споживачем, не позначатимуться тегами.",
"mwoauth-consumer-description": "Опис програми:",
"mwoauth-consumer-callbackurl": "URL «зворотного виклику» OAuth:",
- "mwoauth-consumer-callbackisprefix": "Дозволяти споживачеві вказати зворотний виклик у запиті використовувати URL «зворотного виклику» вище як обов'язковий префікс.",
+ "mwoauth-consumer-callbackurl-help": "На відміну від OAuth 1.0a, ця URL-адреса точно збігається",
+ "mwoauth-consumer-callbackurl-warning": "(маска порту)",
+ "mwoauth-consumer-callbackisprefix": "Дозволяти споживачеві вказати зворотний виклик у запитах і використовувати URL «зворотного виклику» вище як обов'язковий префікс.",
"mwoauth-consumer-granttypes": "Типи доступу, які запитуються:",
"mwoauth-consumer-grantsneeded": "Придатні гранти:",
"mwoauth-consumer-required-grant": "Застосовні до споживача",
- "mwoauth-consumer-wiki": "Придатний проект:",
- "mwoauth-consumer-wiki-thiswiki": "Поточний проект ($1)",
+ "mwoauth-consumer-wiki": "Придатний проєкт:",
+ "mwoauth-consumer-wiki-thiswiki": "Поточний проєкт ($1)",
"mwoauth-consumer-restrictions": "Обмеження на використання:",
"mwoauth-consumer-restrictions-json": "Обмеження на користування (JSON):",
"mwoauth-consumer-rsakey": "Відкритий ключ RSA (необов'язково):",
@@ -49,7 +56,7 @@
"mwoauth-consumer-secretkey": "Секретний маркер споживача:",
"mwoauth-consumer-accesstoken": "Маркер доступу:",
"mwoauth-consumer-reason": "Причина:",
- "mwoauth-consumer-developer-agreement": "Надсилаючи даний додаток, Ви погоджуєтеся, що ми залишаємо за собою право вимкнути Ваш додаток, вилучити або обмежити доступ до цього сайту Вам чи Вашому додатку, і здійснювати будь-які інші, на нашу думку, необхідні дії, якщо ми вважаємо, за власним судження, що Ви або Ваш додаток порушуєте будь-які політики, правила чи настанови даного сайту. Ми можемо змінити цю політику додатків у будь-який час без попереднього повідомлення, за власним розсудом і так, як ми вважатимемо за необхідне. Ваше подальше використання OAuth означає прийняття цих змін.",
+ "mwoauth-consumer-developer-agreement": "Надсилаючи даний додаток, Ви погоджуєтеся, що ми залишаємо за собою право вимкнути Ваш додаток, вилучити або обмежити доступ до цього сайту Вам чи Вашому додатку, і здійснювати якісь інші, на нашу думку, необхідні дії, якщо ми вважаємо, за власним судженням, що Ви або Ваш додаток порушуєте будь-які політики, правила чи настанови даного сайту. Ми можемо змінити цю політику додатків у будь-який час без попереднього повідомлення, за власним розсудом і так, як ми вважатимемо за необхідне. Ваше подальше використання OAuth означає прийняття цих змін.",
"mwoauth-consumer-email-unconfirmed": "Ваша адреса електронної пошти облікового запису ще не підтверджена.",
"mwoauth-consumer-email-mismatched": "Вказана адреса електронної пошти повинна відповідати вашому обліковому запису.",
"mwoauth-consumer-alreadyexists": "Споживач з таким поєднанням імен/версії/видавця вже існує",
@@ -61,9 +68,9 @@
"mwoauth-missing-consumer-key": "Немає наданого ключа споживача.",
"mwoauth-invalid-consumer-key": "Не існує споживача з даним ключем.",
"mwoauth-invalid-access-token": "Немає маркера доступу з даним ключем.",
- "mwoauth-invalid-access-wrongwiki": "Споживач може використовуватися тільки на проекті \"$1\".",
+ "mwoauth-invalid-access-wrongwiki": "Споживач може використовуватися тільки на проєкті \"$1\".",
"mwoauth-consumer-conflict": "Хтось змінив параметри даного споживача, якого ви дивилися. Будь ласка, спробуйте ще раз. Ви можете перевірити журнал змін.",
- "mwoauth-consumer-grantshelp": "Кожен грант надає доступ до перерахованих прав користувача, які вже має обліковий запис користувача. Подивіться на [[Special:ListGrants|таблицю грантів]] для отримання додаткової інформації.",
+ "mwoauth-consumer-grantshelp": "Кожен грант надає доступ до перелічених прав користувача, які вже має обліковий запис користувача. Подивіться на [[Special:ListGrants|таблицю грантів]] для отримання додаткової інформації.",
"mwoauth-consumer-stage-proposed": "запропоновано",
"mwoauth-consumer-stage-rejected": "відхилено",
"mwoauth-consumer-stage-expired": "застаріле",
@@ -72,12 +79,15 @@
"mwoauth-consumer-stage-suppressed": "пригнічено",
"oauthconsumerregistration": "Реєстрація споживача OAuth",
"mwoauthconsumerregistration-navigation": "Навігація:",
- "mwoauthconsumerregistration-propose": "Запропонувати нового споживача",
+ "mwoauthconsumerregistration-propose-oauth1a": "Запропонувати нового споживача OAuth 1.0a",
+ "mwoauthconsumerregistration-propose-oauth2": "Запропонувати нового клієнта OAuth 2.0",
"mwoauthconsumerregistration-list": "Мій список споживачів",
"mwoauthconsumerregistration-main": "Головна",
- "mwoauthconsumerregistration-propose-text": "Розробники можуть використовувати форму нижче, щоб запропонувати нового споживача OAuth (див. [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth extension documentation] за подробицями). Після надсилання цієї форми Ви отримаєте маркер для Вашої програми, який буде використовуватися нею при ідентифікації на MediaWiki. Адміністратор OAuth повинен затвердити Вашу програму, перш ніж вона буде авторизована іншими користувачами.\n\nКілька рекомендацій і зауважень:\n* Постарайтеся використовувати якомога менше дозволів за можливості. Уникайте дозволів, які насправді не потрібні зараз.\n* Версії мають форму «major.minor.release» (останні дві необов'язкові) і вони збільшуються, якщо необхідні зміни дозволів.\n* Будь ласка, вкажіть відкритий ключ RSA (у форматі PEM), якщо можливо; в іншому випадку (менш безпечно) таємний маркер повинен використовуватися.\n* Ви можете використовувати ідентифікатор проекту, аби обмежувати споживача в одному проекті на цьому сайті (використовуйте «*» для всіх проектів).",
+ "mwoauthconsumerregistration-propose-text": "Ви можете:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|Запропонувати споживача OAuth 1.0a]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Запропонувати клієнта OAuth 2.0]].",
+ "mwoauthconsumerregistration-propose-text-oauth1a": "Розробники можуть використовувати форму нижче, щоб запропонувати нового споживача OAuth 1.0a (див. [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth extension documentation] за деталями). Після надсилання цієї форми Ви отримаєте маркер для Вашої програми, який буде використовуватися нею при ідентифікації на MediaWiki. Адміністратор OAuth повинен затвердити Вашу програму, перш ніж вона буде авторизована іншими користувачами.\n\nКілька рекомендацій і зауважень:\n* Постарайтеся використовувати якомога менше дозволів за можливості. Уникайте дозволів, які насправді не потрібні зараз.\n* Версії мають форму «major.minor.release» (останні дві необов'язкові) і вони збільшуються, якщо необхідні зміни дозволів.\n* Будь ласка, вкажіть відкритий ключ RSA (у форматі PEM), якщо можливо; в іншому випадку (менш безпечно) матиме використовуватися таємний маркер.\n* Ви можете використовувати ідентифікатор проєкту, аби обмежувати споживача в одному проєкті на цьому сайті (використовуйте «*» для всіх проєктів).",
+ "mwoauthconsumerregistration-propose-text-oauth2": "Розробники можуть використовувати форму нижче, щоб запропонувати нового споживача OAuth 2.0 (див. [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth extension documentation] за деталями). Після надсилання цієї форми Ви отримаєте маркер для Вашої програми, який буде використовуватися нею при ідентифікації на MediaWiki. Адміністратор OAuth повинен затвердити Вашу програму, перш ніж вона буде авторизована іншими користувачами.\n\nКілька рекомендацій і зауважень:\n* Постарайтеся використовувати якомога менше дозволів за можливості. Уникайте дозволів, які насправді не потрібні зараз.\n* Версії мають форму «major.minor.release» (останні дві необов'язкові) і вони збільшуються, якщо необхідні зміни дозволів.\n* Ви можете використовувати ідентифікатор проєкту, аби обмежувати споживача в одному проєкті на цьому сайті (використовуйте «*» для всіх проєктів).",
"mwoauthconsumerregistration-update-text": "Використовуйте форму нижче, щоб оновити аспекти споживача OAuth, які ви контролюєте.\n\nВсі значення тут будуть переписувати будь-які попередні. Не залишайте порожні поля, якщо ви не маєте наміру вилучити ці значення.",
- "mwoauthconsumerregistration-maintext": "Ця сторінка дозволяє розробникам пропонувати та оновлювати клієнтські програми OAuth у реєстрі сайту.\n\nЗвідси ви можете:\n* [[Special:OAuthConsumerRegistration/propose|Запитувати маркер для нового клієнта]].\n* [[Special:OAuthConsumerRegistration/list|Управляти вашими наявними клієнтами]].\n\nFor more information about OAuth, please see the [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension: документація про розширення OAuth].",
+ "mwoauthconsumerregistration-maintext": "Ця сторінка дозволяє розробникам пропонувати та оновлювати клієнтські програми OAuth у реєстрі сайту.\n\nЗвідси ви можете:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|Запитувати маркер для нового споживача OAuth 1.0a]].\n* [[Special:OAuthConsumerRegistration/propose/oauth2|Запитувати маркер для нового клієнта OAuth 2.0]].\n* [[Special:OAuthConsumerRegistration/list|Керувати своїми наявними споживачами]].\n\nДля отримання додаткової інформації про OAuth див. [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth наявну документацію].",
"mwoauthconsumerregistration-propose-legend": "Нова програма OAuth споживача",
"mwoauthconsumerregistration-update-legend": "Оновити програму споживача OAuth",
"mwoauthconsumerregistration-propose-submit": "Запропонувати споживача",
@@ -157,7 +167,7 @@
"mwoauthlistconsumers-version": "Споживча версія",
"mwoauthlistconsumers-user": "Видавець",
"mwoauthlistconsumers-description": "Опис",
- "mwoauthlistconsumers-wiki": "Придатний проект",
+ "mwoauthlistconsumers-wiki": "Придатний проєкт",
"mwoauthlistconsumers-callbackurl": "URL «зворотного виклику» OAuth",
"mwoauthlistconsumers-callbackisprefix": "Дозволяти споживачеві вказати зворотний виклик у запиті використовувати URL «зворотного виклику» вище як обов'язковий префікс.",
"mwoauthlistconsumers-grants": "Застосовні ґранти",
@@ -175,13 +185,13 @@
"mwoauthlistconsumers-grants-link": "Керувати грантами",
"mwoauthlistconsumers-rclink": "Останні зміни, зроблені цим застосунком",
"oauthmanagemygrants": "Управління підключеними програмами",
- "mwoauthmanagemygrants-text": "На цій сторінці перераховані всі програми, які можуть використовувати ваш обліковий запис. Для будь-яких таких програм сфера їхнього доступу обмежена дозволами, наданими програмі, коли ви уповноважили її діяти від вашого імені. Якщо ви окремо уповноважили програму для доступу до різних сестринських проектів від вашого імені, то ви побачите окремі налаштування для кожного такого проекту, нижче.",
+ "mwoauthmanagemygrants-text": "На цій сторінці перелічені всі програми, які можуть використовувати ваш обліковий запис. Для будь-яких таких програм сфера їхнього доступу обмежена дозволами, наданими програмі, коли ви уповноважили її діяти від вашого імені. Якщо ви окремо уповноважили програму для доступу до різних сестринських проєктів від вашого імені, то ви побачите окремі налаштування для кожного такого проєкту, нижче.\n\nПідключені програми отримують доступ до вашого облікового запису за допомогою протоколу OAuth. <span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth Докладніше про підключені програми])</span>",
"mwoauthmanagemygrants-navigation": "Навігація:",
"mwoauthmanagemygrants-showlist": "Список підключених програм",
"mwoauthmanagemygrants-none": "Жодна програма не підключена до вашого облікового запису.",
"mwoauthmanagemygrants-user": "Видавець:",
"mwoauthmanagemygrants-description": "Опис",
- "mwoauthmanagemygrants-wikiallowed": "Дозволено на проекті:",
+ "mwoauthmanagemygrants-wikiallowed": "Дозволено на проєкті:",
"mwoauthmanagemygrants-grants": "Застосовні ґранти",
"mwoauthmanagemygrants-grantsallowed": "Ґранти, які дозволили",
"mwoauthmanagemygrants-applicablegrantsallowed": "Застосовні гранти дозволено:",
@@ -234,7 +244,7 @@
"mwoauthserver-bad-consumer-key": "На жаль, щось пішло не так при підключенні цієї програми.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Невідомий ключ OAuth, $1</span>",
"mwoauthserver-insufficient-rights": "Вашому профілю не дозволено використовувати підключені програми, зв'яжіться з адміністратором вашого сайту для з'ясування причин.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Недостатні права користувача OAuth, $1</span>",
"mwoauthserver-invalid-request-token": "Неприпустимий маркер у вашому запиті.",
- "mwoauthserver-invalid-user": "Для використання підключених програм на сайті вам потрібно мати профіль на всі проекти. Коли у вас є обліковий запис на усі проекти, можете спробувати знову підключити «$1».\n\n<span class=\"plainlinks mw-mwoautherror-details\">Необхідний єдиний вхід, $2</span>",
+ "mwoauthserver-invalid-user": "Для використання підключених програм на сайті вам потрібно мати профіль на всі проєкти. Коли у вас є обліковий запис на усі проєкти, можете спробувати знову підключити «$1».\n\n<span class=\"plainlinks mw-mwoautherror-details\">Необхідний єдиний вхід, $2</span>",
"mwoauthserver-consumer-no-secret": "На жаль, щось пішло не так при спробі з'єднання з цією програмою.\n\n<span class=\"plainlinks mw-mwoautherror-details\">Споживач не має секретного ключа, $1</span>",
"mwoauthserver-consumer-owner-only": "«$1» — це пов'язаний додаток виключно для власника. Аби отримати маркер доступу, див. [[$2]].\n\n<span class=\"plainlinks mw-mwoautherror-details\">Цей споживач лише для власника, $3</span>",
"mwoauth-invalid-authorization-title": "Помилка авторизації OAuth",
@@ -244,17 +254,18 @@
"mwoauth-invalid-authorization-wrong-user": "Заголовки авторизації у вашому запиті призначені для іншого користувача",
"mwoauth-invalid-authorization-not-approved": "Програма, якою ви намагаєтеся з'єднатися, схоже, налаштована неправильно, зверніться до автора $1.",
"mwoauth-invalid-authorization-blocked-user": "Заголовки авторизації у вашому запитів призначені для заблокованого користувача",
- "mwoauth-form-description-allwikis": "Привіт, $1!\n\nЩоб завершити Ваш запит, '''$2''' потребує дозволу на такі дії від Вашого імені у всіх проектах цього сайту:\n\n\n$4",
+ "mwoauth-form-description-allwikis": "Привіт, $1!\n\nЩоб завершити Ваш запит, '''$2''' потребує дозволу на такі дії від Вашого імені у всіх проєктах цього сайту:\n\n\n$4",
"mwoauth-form-description-onewiki": "Привіт, $1!\n\nЩоб завершити Ваш запит, '''$2''' потребує дозволу на виконання таких дій від Вашого імені на ''$4'':\n\n\n$5",
- "mwoauth-form-description-allwikis-nogrants": "Привіт, $1!\n\nЩоб завершити Ваш запит, '''$2''' потребує дозвіл на доступ до інформації усіх проектів цього сайту від Вашого імені. Жодних змін Вашого облікового запису не буде.",
+ "mwoauth-form-description-allwikis-nogrants": "Привіт, $1!\n\nЩоб завершити Ваш запит, '''$2''' потребує дозвіл на доступ до інформації усіх проєктів цього сайту від Вашого імені. Жодних змін Вашого облікового запису не буде.",
"mwoauth-form-description-onewiki-nogrants": "Привіт, $1!\n\nЩоб завершити Ваш запит, '''$2''' потребує дозволу на доступ до інформації на ''$4'' від Вашого імені. Жодних змін до Вашого облікового запису не буде.",
"mwoauth-form-description-allwikis-privateinfo": "Привіт, $1!\n\nЩоб виконати Ваш запит, '''$2''' потребує дозволу на доступ до інформації про Вас, включно з Вашим справжнім ім'ям та адресою електронної пошти, в усіх проектах цього сайту. Жодних змін не буде здійснено від імені Вашого облікового запису.",
"mwoauth-form-description-onewiki-privateinfo": "Привіт, $1!\n\nЩоб виконати Ваш запит, '''$2''' потребує дозволу на доступ до інформації про Вас, включно з Вашим справжнім ім'ям та адресою електронної пошти, на сайті ''$4''. Жодних змін не буде здійснено від імені Вашого облікового запису.",
- "mwoauth-form-description-allwikis-privateinfo-norealname": "Привіт, $1!\n\nЩоб виконати Ваш запит, '''$2''' потребує дозволу на доступ до інформації про Вас, в тому числі адресу електронної пошти в усіх проектах цього сайту. Жодних змін не буде здійснено від імені Вашого облікового запису.",
- "mwoauth-form-description-onewiki-privateinfo-norealname": "Привіт, $1!\n\nЩоб виконати Ваш запит, '''$2''' потребує дозволу на доступ до інформації про Вас, в тому числі адресу електронної пошти в проекті ''$4''. Жодних змін не буде здійснено від імені Вашого облікового запису.",
+ "mwoauth-form-description-allwikis-privateinfo-norealname": "Привіт, $1!\n\nЩоб виконати Ваш запит, '''$2''' потребує дозволу на доступ до інформації про Вас, в тому числі адресу електронної пошти в усіх проєктах цього сайту. Жодних змін не буде здійснено від імені Вашого облікового запису.",
+ "mwoauth-form-description-onewiki-privateinfo-norealname": "Привіт, $1!\n\nЩоб виконати Ваш запит, '''$2''' потребує дозволу на доступ до інформації про Вас, в тому числі адресу електронної пошти в проєкті ''$4''. Жодних змін не буде здійснено від імені Вашого облікового запису.",
"mwoauth-form-button-approve": "Дозволити",
"mwoauth-form-button-cancel": "Скасувати",
"mwoauth-error": "Помилка підключення застосунку",
+ "mwoauth-error-missing-callback-url-non-owner": "callback_url є обов'язковим для клієнтів, що не лише для власників.",
"mwoauth-grants-heading": "Потрібні дозволи:",
"mwoauth-grants-nogrants": "Програма не вимагає жодних дозволів.",
"mwoauth-acceptance-cancelled": "Ви вже вибрали не надавати $1 доступу до вашого профілю. $1 не буде працювати без вашого дозволу. Ви можете повернутися до $1 або до [[Special:OAuthManageMyGrants|управління]] вашими підключеними програмами.",
@@ -279,7 +290,7 @@
"action-mwoauthupdateownconsumer": "оновлення споживачів OAuth, яких ви контролюєте",
"action-mwoauthviewprivate": "перегляд приватних даних OAuth",
"action-mwoauthviewsuppressed": "перегляд прихованих споживачів OAuth",
- "mwoauth-tag-reserved": "Теґи, що починаються з <code>OAuth CID:</code> зарезервовані для використання OAuth.",
+ "mwoauth-tag-reserved": "Теги, що починаються з <code>OAuth CID:</code> зарезервовані для використання OAuth.",
"mwoauth-botpasswords-note": "<strong>Примітка:</strong> <span class=\"plainlinks\">[$1 OAuth]</span> — безпечніший, ніж паролі для ботів, і саме цій системі треба віддавати перевагу, якщо бот її підтримує.",
"mwoauth-api-module-disabled": "Модуль «$1» недоступний з OAuth.",
"echo-category-title-oauth-owner": "Розробка OAuth",
@@ -331,5 +342,9 @@
"mwoauth-consumer-access-no-user": "Підтвердження споживача має бути прив'язане до дійсного користувача, тоді як подано користувача з ID 0",
"mwoauth-login-required-reason": "Щоб дозволяти програмам отримувати доступ до вашого облікового запису, вам треба спершу увійти в систему на сайті {{SITENAME}}.",
"mwoauthconsumer-consumer-view": "Переглянути цього споживача",
- "mwoauthconsumer-application-view": "Переглянути цю заявку"
+ "mwoauthconsumer-application-view": "Переглянути цю заявку",
+ "grant-oauthmanageownclient": "Керування Вашими OAuth-клієнтами",
+ "mwoauth-consumer-user-mismatch": "Ви не можете здійснювати дії щодо клієнтів, що не належать Вам",
+ "mwoauth-consumer-deleted-error": "Ви не можете здійснювати дії щодо вилучених клієнтів",
+ "mwoauth-consumer-submit-error": "Сталась помилка при збереженні споживача"
}
diff --git a/OAuth/i18n/uz.json b/OAuth/i18n/uz.json
index 6a53cd9f..8a03f047 100644
--- a/OAuth/i18n/uz.json
+++ b/OAuth/i18n/uz.json
@@ -1,8 +1,21 @@
{
"@metadata": {
"authors": [
+ "Malikxan",
"Sociologist"
]
},
- "mwoauth-prefs-managegrants": "Yoqilgan dasturlar:"
+ "mwoauth-prefs-managegrants": "Yoqilgan dasturlar:",
+ "mwoauth-prefs-managegrantslink": "{{PLURAL:$1|$1 ta yoqilgan dasturni|$1 ta yoqilgan dasturlarni|0=yoqilgan dasturlarni}} boshqarish",
+ "mwoauth-consumer-name": "Dastur nomi:",
+ "mwoauth-consumer-user": "Nashriyot:",
+ "mwoauth-consumer-stage": "Joriy status:",
+ "mwoauth-consumer-reason": "Sabab:",
+ "mwoauth-consumer-stage-rejected": "rad etilgan",
+ "mwoauth-consumer-stage-approved": "maʼqullangan",
+ "mwoauth-consumer-stage-disabled": "oʻchirilgan",
+ "mwoauthconsumerregistration-navigation": "Navigatsiya:",
+ "mwoauthconsumerregistration-description": "Tavsif",
+ "mwoauthconsumerregistration-stage": "Status",
+ "mwoauthconsumerregistration-manage": "boshqarish"
}
diff --git a/OAuth/i18n/vi.json b/OAuth/i18n/vi.json
index 39d42bf2..8473259e 100644
--- a/OAuth/i18n/vi.json
+++ b/OAuth/i18n/vi.json
@@ -5,11 +5,14 @@
"KhangND",
"Macofe",
"Minh Nguyen",
+ "NguoiDungKhongDinhDanh",
"Phjtieudoc",
+ "Vinhtantran",
"Withoutaname"
]
},
- "mwoauth-desc": "Cho phép sử dụng OAuth 1.0a để xác minh khi truy cập API",
+ "mwoauth-desc": "Cho phép sử dụng OAuth 1.0a và OAuth 2.0 để xác minh khi truy cập API",
+ "mwoauth-nosubpage-explanation": "OAuth là một cơ chế cho phép các ứng dụng bên ngoài xác minh một thành viên {{SITENAME}} hoặc vận hành thay mặt cho thành viên đó, sau khi nhận được sự cho phép từ thành viên đó.\n\nĐể trang này có thể hoạt động được, cần các tham số khác. Nếu bạn đến đây từ một ứng dụng bên ngoài, có thể đã có lỗi trong ứng dụng đó; bạn nên liên hệ với tác giả của nó.",
"mwoauth-verified": "Ứng dụng hiện được phép truy cập MediaWiki thay mặt bạn.\n\nĐể hoàn thành quá trình này, xin hãy nhập giá trị xác minh này vào ứng dụng: '''$1'''",
"mwoauth-db-readonly": "Cơ sở dữ liệu OAuth hiện đang bị khóa tạm thời. Xin vui lòng thử lại vài phút nữa.",
"mwoauth-missing-field": "Thiếu giá trị cho trường “$1”",
@@ -18,7 +21,7 @@
"mwoauth-field-hidden": "(thông tin này bị ẩn)",
"mwoauth-field-private": "(thông tin này là bí mật)",
"mwoauth-prefs-managegrants": "Ứng dụng kết nối:",
- "mwoauth-prefs-managegrantslink": "Quản lý $1 ứng dụng kết nối",
+ "mwoauth-prefs-managegrantslink": "Quản lý {{PLURAL:$1|$1 ứng dụng kết nối|0=ứng dụng kết nối}}",
"mwoauth-consumer-allwikis": "Tất cả các dự án trên mạng này",
"mwoauth-consumer-key": "Từ khóa tiêu dùng:",
"mwoauth-consumer-name": "Tên ứng dụng:",
@@ -26,9 +29,13 @@
"mwoauth-consumer-user": "Nhà xuất bản:",
"mwoauth-consumer-stage": "Trạng thái hiện tại:",
"mwoauth-consumer-email": "Địa chỉ thư điện tử liên lạc:",
+ "mwoauth-consumer-email-help": "Chỉ hiển thị với những người đang chấp thuận trình tiêu dùng mới",
"mwoauth-consumer-owner-only-label": "Chỉ bởi chủ:",
+ "mwoauth-consumer-owner-only": "Trình tiêu dùng này chỉ được $1 sử dụng.",
+ "mwoauth-consumer-owner-only-help": "Lựa chọn tùy chọn này sẽ khiến cho trình tiêu dùng tự động được $1 chuẩn thuận và chấp nhận cho sử dụng. Nó sẽ không dùng được bởi người dùng khác, và quy trình chuẩn thuận thông thường sẽ không hoạt động. Các tác vụ do trình tiêu dùng này thực hiện sẽ không bị đánh dấu.",
"mwoauth-consumer-description": "Miêu tả ứng dụng:",
"mwoauth-consumer-callbackurl": "URL “gọi lại” OAuth:",
+ "mwoauth-consumer-callbackurl-warning": "(cổng chung)",
"mwoauth-consumer-callbackisprefix": "Cho phép trình tiêu dùng định rõ một hàm gọi lại và sử dụng địa chỉ URL “gọi lại” bên trên là một tiền tố yêu cầu.",
"mwoauth-consumer-granttypes": "Các phân quyền được yêu cầu:",
"mwoauth-consumer-grantsneeded": "Các quyền có liên quan:",
@@ -37,13 +44,25 @@
"mwoauth-consumer-wiki-thiswiki": "Dự án hiện tại ($1)",
"mwoauth-consumer-restrictions": "Hạn chế sử dụng:",
"mwoauth-consumer-restrictions-json": "Hạn chế sử dụng (JSON):",
- "mwoauth-consumer-rsakey": "Chìa khóa RSA công cộng (tùy chọn):",
- "mwoauth-consumer-secretkey": "Dấu hiệu tiêu dùng bí mật:",
- "mwoauth-consumer-accesstoken": "Dấu hiệu truy cập:",
+ "mwoauth-consumer-rsakey": "Khóa RSA công khai (không bắt buộc):",
+ "mwoauth-consumer-rsakey-help": "Nhập chìa khóa công khai để sử dụng phương pháp chữ ký RSA-SHA1. Để trống để dùng HMAC-SHA1 với mã bí mật ngẫu nhiên. Nếu bạn không chắc nên dùng cái nào, hãy để trống.",
+ "mwoauth-consumer-secretkey": "Token bí mật của người dùng:",
+ "mwoauth-consumer-accesstoken": "Token để truy cập:",
"mwoauth-consumer-reason": "Lý do:",
+ "mwoauth-consumer-developer-agreement": "Khi nộp mẫu này lên, bạn chứng nhận rằng chúng ta bảo lưu quyền tắt ứng dụng của bạn, xóa hoặc hạn chế quyền truy cập của bạn hoặc ứng dụng của bạn vào website, và thực hiện các hành động khác mà chúng tôi cho là phù hợp nếu chúng tôi, dựa trên đánh giá của chúng tôi, tin rằng bạn hoặc ứng dụng của bạn đang vi phạm quy định, hướng dẫn, và nguyên tắc định hướng của website này. Chúng tôi có thể thay đổi Quy định Nộp hồ sơ vào bất kỳ thời điểm nào mà không cần báo trước, dựa trên đánh giá của chúng tôi và khi chúng tôi thấy cần thiết. Việc bạn tiếp tục sử dụng OAuth cấu thành sự chấp thuận các thay đổi đó.",
"mwoauth-consumer-email-unconfirmed": "Địa chỉ thư điện tử tài khoản của bạn chưa được xác nhận.",
"mwoauth-consumer-email-mismatched": "Địa chỉ thư điện tử được cung cấp phải cũng là địa chỉ thư điện tử của tài khoản của bạn.",
- "mwoauth-invalid-access-token": "Không có dấu hiệu truy cập với chìa khóa được cung cấp.",
+ "mwoauth-consumer-alreadyexists": "Một trình tiêu dùng với tổ hợp tên/phiên bản/nhà xuất bản này đã tồn tại",
+ "mwoauth-consumer-alreadyexistsversion": "Một trình tiêu dùng với tổ hợp tên/nhà xuất bản này đã tồn tại với môt phiên bản bằng hoặc mới hơn (“$1”)",
+ "mwoauth-consumer-not-accepted": "Không thể cập nhật thông tin của một yêu cầu trình tiêu dùng đang treo",
+ "mwoauth-consumer-not-proposed": "Trình tiêu dùng hiện chưa được đề xuất",
+ "mwoauth-consumer-not-disabled": "Trình tiêu dùng hiện chưa được tắt",
+ "mwoauth-consumer-not-approved": "Trình tiêu dùng chưa được chuẩn thuận (nó có thể đã bị tắt)",
+ "mwoauth-missing-consumer-key": "Không có chìa khóa trình tiêu dùng.",
+ "mwoauth-invalid-consumer-key": "Không có trình tiêu dùng nào tồn tại với khóa được cung cấp.",
+ "mwoauth-invalid-access-token": "Không có token truy cập với mã được cung cấp.",
+ "mwoauth-invalid-access-wrongwiki": "Trình tiêu dùng chỉ có thể dùng trong dự án “$1”.",
+ "mwoauth-consumer-conflict": "Có ai đó đã thay đổi thuộc tính của trình tiêu dùng này trong khi bạn đang xem nó. Vui lòng thử lại. Bạn có thể cần kiểm tra nhật trình thay đổi.",
"mwoauth-consumer-stage-proposed": "đề xuất",
"mwoauth-consumer-stage-rejected": "từ chối",
"mwoauth-consumer-stage-expired": "hết hạn",
@@ -65,7 +84,7 @@
"mwoauthconsumerregistration-stage": "Trạng thái",
"mwoauthconsumerregistration-lastchange": "Thay đổi cuối cùng",
"mwoauthconsumerregistration-manage": "quản lý",
- "mwoauthconsumerregistration-resetsecretkey": "Đặt lại chìa khóa bí mật thành một giá trị mới",
+ "mwoauthconsumerregistration-resetsecretkey": "Đặt lại một giá trị mới cho chìa khóa bí mật",
"oauthmanageconsumers": "Quản lý tiêu dùng OAuth",
"mwoauthmanageconsumers-notloggedin": "Bạn phải đăng nhập để truy cấp trang này.",
"mwoauthmanageconsumers-type": "Hàng đợi:",
@@ -129,7 +148,7 @@
"mwoauthmanagemygrants-revoke": "thu hồi quyền truy cập",
"mwoauthmanagemygrants-grantaccept": "Cấp quyền",
"mwoauthmanagemygrants-confirm-legend": "Quản lý ứng dụng kết nối",
- "mwoauthmanagemygrants-update": "Cập nhật các dấu hiệu được cấp",
+ "mwoauthmanagemygrants-update": "Cập nhật các chìa khóa được cấp",
"mwoauthmanagemygrants-renounce": "Rút quyền",
"mwoauthmanagemygrants-action": "Thay đổi trạng thái:",
"mwoauthmanagemygrants-confirm-submit": "Cập nhật trạng thái của dấu hiệu truy cập",
@@ -169,6 +188,7 @@
"action-mwoauthmanageconsumer": "quản lý tiêu dùng OAuth",
"action-mwoauthmanagemygrants": "quản lý các quyền OAuth mà bạn cấp",
"action-mwoauthproposeconsumer": "đề xuất tiêu dùng OAuth mới",
+ "mwoauth-botpasswords-note": "<strong>Lưu ý:</strong> <span class=\"plainlinks\">[$1 OAuth]</span> an toàn hơn mật khẩu bot và nên được ưu tiên dùng khi bot có hỗ trợ nó.",
"echo-category-title-oauth-owner": "Phát triển OAuth",
"echo-pref-tooltip-oauth-owner": "Thông báo cho tôi về các sự kiện có liên quan đến ứng dụng OAuth do tôi tạo ra.",
"echo-category-title-oauth-admin": "Quản lý OAuth",
@@ -191,5 +211,6 @@
"notification-oauth-app-reject-primary-link": "Xem ứng dụng",
"notification-oauth-app-disable-primary-link": "Xem ứng dụng",
"notification-oauth-app-reenable-primary-link": "Xem ứng dụng",
- "notification-oauth-app-body": "Lý do: $1"
+ "notification-oauth-app-body": "Lý do: $1",
+ "grant-oauthmanageownclient": "Quản lý trình khách OAuth của bạn"
}
diff --git a/OAuth/i18n/yi.json b/OAuth/i18n/yi.json
index 1e2bea9a..bfb259be 100644
--- a/OAuth/i18n/yi.json
+++ b/OAuth/i18n/yi.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Pacha Tchernof",
"פוילישער"
]
},
@@ -8,5 +9,6 @@
"mwoauth-consumer-version": "קאנסומענט ווערסיע:",
"mwoauth-consumer-email-unconfirmed": "אייער קאנטע ע־פאסט אדרעס איז נאך נישט געווארן באשטעטיגט.",
"oauthmanagemygrants": "פארוואלטן פארבונדענע אנווענדונגען",
+ "mwoauth-form-button-cancel": "אַנולירן",
"notification-oauth-app-body": "אורזאך: $1"
}
diff --git a/OAuth/i18n/yrl.json b/OAuth/i18n/yrl.json
new file mode 100644
index 00000000..54937ef3
--- /dev/null
+++ b/OAuth/i18n/yrl.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Karapananguasú Kururú Teremembé",
+ "Maracajá Teremembé"
+ ]
+ },
+ "mwoauth-prefs-managegrants": "Mburipawa'etá tauyumũdiana:",
+ "mwoauth-prefs-managegrantslink": "Umumurikuá {{PLURAL:$1|$1 mburipawa uyumũdiana|$1 mburipawa'etá tauyumũdiana|0=mburipawa'etá tauyumũdiana}}",
+ "mwoauth-consumer-allwikis": "Panhẽ mumuekawaçawa'etá kuá rituya upé",
+ "mwoauth-consumer-stage": "Status kuiriwara:",
+ "mwoauth-consumer-email": "Email ikurẽdawa:",
+ "mwoauth-consumer-wiki-thiswiki": "Mumuekawaçawa kuiriwara ($1)",
+ "mwoauthconsumerregistration-main": "Yupirũgawa",
+ "mwoauthconsumerregistration-manage": "umumurikuá",
+ "mwoauthmanageconsumers-main": "Yupirũgawa",
+ "oauthmanagemygrants": "Umumurikuá mburipawa'etá tauyumũdiana",
+ "notification-oauth-app-propose-primary-link": "Uamũmaã mburipawa",
+ "notification-oauth-app-update-primary-link": "Uamũmaã mburipawa",
+ "notification-oauth-app-approve-primary-link": "Umaã mburipawa",
+ "notification-oauth-app-reject-primary-link": "Umaã mburipawa",
+ "notification-oauth-app-disable-primary-link": "Umaã mburipawa",
+ "notification-oauth-app-reenable-primary-link": "Umaã mburipawa"
+}
diff --git a/OAuth/i18n/yue.json b/OAuth/i18n/yue.json
index 8e3eee2b..94978ecf 100644
--- a/OAuth/i18n/yue.json
+++ b/OAuth/i18n/yue.json
@@ -5,5 +5,6 @@
]
},
"mwoauth-prefs-managegrants": "連咗嘅應用程式:",
- "mwoauth-prefs-managegrantslink": "管理{{PLURAL:$1|$1個|$1個|0=}}連咗嘅應用程式"
+ "mwoauth-prefs-managegrantslink": "管理{{PLURAL:$1|$1個|$1個|0=}}連咗嘅應用程式",
+ "mwoauthlistconsumers-status": "狀態"
}
diff --git a/OAuth/i18n/zh-hans.json b/OAuth/i18n/zh-hans.json
index 9e11d1f7..466de9e5 100644
--- a/OAuth/i18n/zh-hans.json
+++ b/OAuth/i18n/zh-hans.json
@@ -3,11 +3,14 @@
"authors": [
"A2093064",
"Cwek",
+ "Diskdance",
"Duolaimi",
+ "GuoPC",
"Hzy980512",
"Impersonator 1",
"Josephine W.",
"LNDDYL",
+ "Lakejason0",
"Liuxinyu970226",
"Mys 721tx",
"Mywood",
@@ -17,14 +20,17 @@
"Shirayuki",
"Shizhao",
"Simon Shek",
+ "Stang",
+ "Tranve",
"VulpesVulpes825",
"Xiaomingyan",
"Xiplus",
"Yfdyh000"
]
},
- "oauth": "OAuth",
- "mwoauth-desc": "允许使用OAuth 1.0a 与OAuth 2.0 用作API授权",
+ "abusefilter-edit-builder-vars-oauth-consumer": "用于执行此变更的OAuth消费者",
+ "mwoauth-desc": "允许使用OAuth 1.0a与OAuth 2.0进行API授权",
+ "mwoauth-nosubpage-explanation": "OAuth 是一种机制,允许外部应用程序在收到用户的许可后识别{{SITENAME}}用户或代表他们行事。\n\n为了让这个页面做一些事情,需要更多的参数。如果您是从外部应用程序发送到这里的,那可能是由于该应用程序中的错误;你应该联系作者。",
"mwoauth-verified": "现在该应用以允许以您的名义访问MediaWiki。\n\n要完成这个过程,请为该应用提供这个校验值:'''$1'''",
"mwoauth-db-readonly": "OAuth数据库暂时锁定。请几分钟后重试。",
"mwoauth-missing-field": "缺少值为“$1”字段",
@@ -33,7 +39,7 @@
"mwoauth-field-hidden": "(这些信息已被隐藏)",
"mwoauth-field-private": "(这些信息是不公开的)",
"mwoauth-prefs-managegrants": "连接应用:",
- "mwoauth-prefs-managegrantslink": "管理$1个连接的{{PLURAL:$1|应用程序}}",
+ "mwoauth-prefs-managegrantslink": "管理{{PLURAL:$1|$1个连接的应用程序}}",
"mwoauth-consumer-allwikis": "本站的所有项目",
"mwoauth-consumer-key": "消费者密钥:",
"mwoauth-consumer-name": "应用名称:",
@@ -47,6 +53,7 @@
"mwoauth-consumer-owner-only-help": "选择此选项将导致consumer被自动批准,并同意由$1使用。这将不会被其他用户所使用,并且通常出现的授权流将不会运行。使用此consumer做出的操作将不会被标记。",
"mwoauth-consumer-description": "应用说明:",
"mwoauth-consumer-callbackurl": "OAuth“回调”URL:",
+ "mwoauth-consumer-callbackurl-warning": "(通配符端口)",
"mwoauth-consumer-callbackisprefix": "允许取用者在请求中指定一个回调并使用上面的 \"callback\" URL 作为一个必需的前缀。",
"mwoauth-consumer-granttypes": "请求的权限类型:",
"mwoauth-consumer-grantsneeded": "应用授权:",
@@ -83,12 +90,11 @@
"mwoauth-consumer-stage-suppressed": "已阻止",
"oauthconsumerregistration": "OAuth消费方注册",
"mwoauthconsumerregistration-navigation": "导航:",
- "mwoauthconsumerregistration-propose": "提议新消费者",
"mwoauthconsumerregistration-list": "我的消费者列表",
"mwoauthconsumerregistration-main": "主要",
- "mwoauthconsumerregistration-propose-text": "开发者应使用下面的表单提议新的OAuth应用程序(更多信息请参见[//www.mediawiki.org/wiki/Extension:OAuth 该扩展插件文档])。提交表单后,您将收到与您应用程序相关的令牌,它用于验证身份。OAuth管理员会审核并可能通过您的提议,之后您的程序才能正常访问。\n\n一些建议与提醒:\n* 如果可能,尝试使用较少的功能,避免目前不需要的功能。\n* 版本应存在于表单“major.minor.release”(最新的两个作为选项)并在需要时增加功能。\n* 如果可能,请提供RSA公钥(PEM格式);否则将会使用(较不安全的)私有领牌。\n* 您可使用项目ID限制应用程序访问此网站的单一项目(使用“ * ”访问所有项目)。",
+ "mwoauthconsumerregistration-propose-text": "您可以:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|题名一个OAuth 1.0a消费方]]。\n* [[Special:OAuthConsumerRegistration/propose/oauth2|题名一个OAuth 2.0客户]]。",
"mwoauthconsumerregistration-update-text": "使用下面的表格更新您控制的OAuth消费方信息。\n\n此处所有的值将覆盖之前设定。不要将字段留空,除非您要清除这些值。",
- "mwoauthconsumerregistration-maintext": "此页面用于让开发人员在此网站的注册信息中提议和更新OAuth新消费方应用程序。\n\n在此,您可以:\n* [[Special:OAuthConsumerRegistration/propose|为新消费方申请令牌]]。\n* [[Special:OAuthConsumerRegistration/list|管理您现有的消费方]]。\n\n关于OAuth的更多信息,请参见[//www.mediawiki.org/wiki/Extension:OAuth 扩展程序的说明文档]。",
+ "mwoauthconsumerregistration-maintext": "此页面用于让开发人员在此网站的注册信息中提议和更新OAuth新消费方应用程序。\n\n在此,您可以:\n* [[Special:OAuthConsumerRegistration/propose/oauth1a|为新OAuth 1.0a消费方申请令牌]]。\n* [[Special:OAuthConsumerRegistration/propose/oauth2|为新OAuth 2.0客户申请令牌]]。\n* [[Special:OAuthConsumerRegistration/list|管理您现有的消费方]]。\n\n关于OAuth的更多信息,请参见[https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth 扩展程序的说明文档]。",
"mwoauthconsumerregistration-propose-legend": "新OAuth消费方应用程序",
"mwoauthconsumerregistration-update-legend": "更新OAuth消费方应用程序",
"mwoauthconsumerregistration-propose-submit": "提议消费者",
@@ -105,9 +111,11 @@
"mwoauthconsumerregistration-resetsecretkey": "将密钥重置为一个新值",
"mwoauthconsumerregistration-proposed": "已收到您的OAuth消费方请求。\n\n您的消费方令牌是'''$1''',您的私有令牌是'''$2'''。''请保存令牌以供日后参考。''",
"mwoauthconsumerregistration-created-owner-only": "您的OAuth消费方已创建。\n\n您的令牌是:\n; 消费方令牌:$1\n; 消费方密钥:$2\n; 访问令牌:$3\n; 访问密钥:$4\n<em>请记住上述信息,以便今后参考。</em>",
+ "mwoauthconsumerregistration-created-owner-only-oauth2": "您的OAuth 2.0客户端已创建。\n\n你的令牌是:\n;客户端应用程序密钥:$1\n;客户端应用程序密码:$2\n;访问令牌:$3\n;<em>请记录这些以备将来参考。</em>",
"mwoauthconsumerregistration-updated": "已更新您的OAuth消费方注册信息。",
"mwoauthconsumerregistration-secretreset": "您已分配了'''$1'''的消费者密钥。''请保留好它以供今后参考。''",
"mwoauthconsumerregistration-secretreset-owner-only": "已重置您的OAuth消费方令牌。新的令牌是:\n; 消费方令牌:$1\n; 消费方密钥:$2\n; 访问令牌:$3\n; 访问密钥:$4\n<em>请记住上述信息,以便今后参考。</em>",
+ "mwoauthconsumerregistration-secretreset-owner-only-oauth2": "您的OAuth 2.0消费者令牌已重置。新令牌是:\n; 消费者令牌:$1\n; 消费者密码:$2\n; 访问令牌:$3\n<em>请记录这些以备将来参考。</em>",
"mwoauthconsumerregistration-need-emailconfirmed": "您必须确认您的电子邮件地址才能创建OAuth应用程序。请通过[[Special:Preferences|系统设置]]设置并确认您的电子邮件地址。",
"oauthmanageconsumers": "管理OAuth消费方",
"mwoauthmanageconsumers-notloggedin": "您必须登录后才能访问此页。",
@@ -178,11 +186,16 @@
"mwoauthlistconsumers-status-disabled": "停用",
"mwoauthlistconsumers-status-rejected": "拒绝",
"mwoauthlistconsumers-status-expired": "已过期",
+ "mwoauthlistconsumers-navigation": "导航:",
+ "mwoauthlistconsumers-update-link": "更新消费者",
+ "mwoauthlistconsumers-manage-link": "管理消费者",
+ "mwoauthlistconsumers-grants-link": "管理授权",
+ "mwoauthlistconsumers-rclink": "此应用程序的最近更改",
"oauthmanagemygrants": "管理连接的应用程序",
"mwoauthmanagemygrants-text": "此页面列出了可以使用您的账户的所有应用程序。这些应用程序的可访问范围取决于您授予这些应用程序可代表您操作时所允许的限制条件。如果您单独授予一个应用程序可代表您访问不同的姊妹项目,那么您将会在下面看到每个项目的单独配置。\n\n已连接的应用程序将通过 OAuth 协议访问您的账户。<span class=\"plainlinks\">([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:OAuth 详细了解有关已连接的应用程序])</span>",
"mwoauthmanagemygrants-navigation": "导航:",
"mwoauthmanagemygrants-showlist": "连接的应用程序列表",
- "mwoauthmanagemygrants-none": "没有应用程序连接到您的账户。",
+ "mwoauthmanagemygrants-none": "没有应用程序连接到您的账号。",
"mwoauthmanagemygrants-user": "发布者:",
"mwoauthmanagemygrants-description": "说明",
"mwoauthmanagemygrants-wikiallowed": "允许在项目上使用:",
@@ -200,9 +213,11 @@
"mwoauthmanagemygrants-action": "更新状态:",
"mwoauthmanagemygrants-confirm-submit": "更新授权令牌状态",
"mwoauthmanagemygrants-success-update": "您对此应用程序的参数设置已更新。",
- "mwoauthmanagemygrants-success-renounce": "已取消应用程序对您账户的访问权。",
+ "mwoauthmanagemygrants-success-renounce": "已取消应用程序对您账号的访问权。",
"mwoauthmanagemygrants-basic-tooltip": "为何我不能更新此功能?此功能向您提供可连接应用基本权限,它要求功能正常。如果您不希望此可连接应用拥有这些权限,您需要移除应用访问权。",
"mwoauthmanagemygrants-authonly-tooltip": "为什么我不能更新此权限?如果您不希望这个连接的应用程序拥有此权限,您应该移除应用程序的访问权。",
+ "mwoauthmanagemygrants-editslink": "{{GENDER:$1|您}}由此应用程序所做的编辑",
+ "mwoauthmanagemygrants-actionslink": "{{GENDER:$1|您}}由此应用程序所做的操作",
"logentry-mwoauthconsumer-propose": "$1{{GENDER:$2|申请建立}}一个OAuth消费方(消费方密钥$4)",
"logentry-mwoauthconsumer-update": "$1{{GENDER:$2|更新了}}一个OAuth消费方(消费方密钥$4)",
"logentry-mwoauthconsumer-approve": "$1{{GENDER:$2|批准了}}$3的OAuth消费方(消费方密钥$4)",
@@ -210,6 +225,14 @@
"logentry-mwoauthconsumer-disable": "$1{{GENDER:$2|禁用了}}$3的OAuth消费方(消费方密钥$4)",
"logentry-mwoauthconsumer-reenable": "$1{{GENDER:$2|重新启用了}}$3的OAuth消费方(消费方密钥$4)",
"logentry-mwoauthconsumer-create-owner-only": "$1{{GENDER:$2|创建了}}仅限主人的OAuth消费方(消费方密钥$4)",
+ "log-action-filter-mwoauthconsumer": "OAuth消费者操作的类型:",
+ "log-action-filter-mwoauthconsumer-approve": "OAuth消费者批准",
+ "log-action-filter-mwoauthconsumer-create-owner-only": "仅所有者的OAuth消费者创建",
+ "log-action-filter-mwoauthconsumer-disable": "OAuth消费者禁用",
+ "log-action-filter-mwoauthconsumer-propose": "OAuth消费者提案",
+ "log-action-filter-mwoauthconsumer-reenable": "OAuth消费者重新启用",
+ "log-action-filter-mwoauthconsumer-reject": "OAuth消费者拒绝",
+ "log-action-filter-mwoauthconsumer-update": "OAuth消费者更新",
"mwoauthconsumer-consumer-logpage": "OAuth消费方日志",
"mwoauthconsumer-consumer-logpagetext": "在册OAuth消费方的批准、拒绝和禁用日志。",
"mwoauth-bad-request-missing-params": "抱歉,配置此连接应用程序时出错。请联络应用程序的开发者。\n\n<span class=\"plainlinks mw-mwoautherror-details\">OAuth缺少参数,$1</span>",
@@ -244,9 +267,12 @@
"mwoauth-form-description-onewiki-nogrants": "您好$1,\n\n为了完成您的请求,'''$2'''需要权限以在''$4''代表您访问信息。我们不会对您的账户做出更改。",
"mwoauth-form-description-allwikis-privateinfo": "您好$1,\n\n為了完成您的請求,'''$2'''需要權限以在此網站所有項目上存取有關您的資訊,這包括您的真實姓名和電子郵件地址。我們不會對您的帳戶做出更改。",
"mwoauth-form-description-onewiki-privateinfo": "您好$1,\n\n为了完成您的请求,'''$2'''需要权限以在''$4''访问信息,这包括您的真实姓名和电子邮件地址。我们不会对您的账户做出更改。",
+ "mwoauth-form-description-allwikis-privateinfo-norealname": "你好$1,\n\n为了完成您的请求,'''$2'''需要在本网站的所有项目中访问有关您的信息,包括您的电子邮件地址。不会对您的帐户进行任何更改。",
+ "mwoauth-form-description-onewiki-privateinfo-norealname": "你好$1,\n\n为了完成您的请求,“$2”需要获得访问“$4”信息(包括您的电子邮件地址)的权限。不会对您的帐户进行任何更改。",
"mwoauth-form-button-approve": "允许",
"mwoauth-form-button-cancel": "取消",
"mwoauth-error": "应用程序连接错误",
+ "mwoauth-error-missing-callback-url-non-owner": "非所有者专用客户端需要callback_url",
"mwoauth-grants-heading": "已申请权限:",
"mwoauth-grants-nogrants": "应用程序并无任何权限请求。",
"mwoauth-acceptance-cancelled": "您已选择不允许“$1”连接您的账户。“$1”将不会工作除非您重新允许它。您可回到“$1”或[[Special:OAuthManageMyGrants|管理]]您的已连接应用程序。",
@@ -265,9 +291,11 @@
"right-mwoauthviewprivate": "查看私有OAuth数据",
"right-mwoauthmanagemygrants": "管理OAuth功能",
"action-mwoauthmanageconsumer": "管理OAuth消费者",
+ "action-mwoauthsuppress": "阻止OAuth消费者",
"action-mwoauthmanagemygrants": "管理您的OAuth功能",
"action-mwoauthproposeconsumer": "提议新的OAuth应用程序",
"action-mwoauthupdateownconsumer": "更新您控制的OAuth应用程序",
+ "action-mwoauthviewprivate": "查看私有OAuth数据",
"action-mwoauthviewsuppressed": "查看已阻止的OAuth应用程序",
"mwoauth-tag-reserved": "以<code>OAuth CID:</code>开头的标签被OAuth保留使用。",
"mwoauth-botpasswords-note": "<strong>注意:</strong><span class=\"plainlinks\">[$1 OAuth]</span>比机器人密码更安全,并当机器人支持它时应当首选使用。",
@@ -294,5 +322,36 @@
"notification-oauth-app-reject-primary-link": "查看应用",
"notification-oauth-app-disable-primary-link": "查看应用",
"notification-oauth-app-reenable-primary-link": "查看应用",
- "notification-oauth-app-body": "原因:$1"
+ "notification-oauth-app-body": "原因:$1",
+ "mwoauth-oauth-version": "OAuth协议版本",
+ "mwoauth-oauth2-is-confidential": "客户端保密",
+ "mwoauth-oauth2-is-confidential-help": "机密客户端是一种能够将客户端密码保密的应用程序。非机密客户端的安全性较低",
+ "mwoauth-oauth2-granttypes": "允许的OAuth2授权类型",
+ "mwoauth-oauth2-granttype-auth-code": "授权码",
+ "mwoauth-oauth2-granttype-refresh-token": "刷新令牌",
+ "mwoauth-oauth2-granttype-client-credentials": "客户端凭证",
+ "mwoauth-oauth2-error-create-at-no-user-approval": "无法创建访问令牌,用户未批准发布此访问令牌",
+ "mwoauth-oauth2-error-user-approval-deny": "用户拒绝了来自客户端应用程序的请求",
+ "mwoauth-oauth-unsupported-version": "OAuth版本$1不允许使用此端点",
+ "mwoauth-oauth2-error-unauthorized-scope": "此应用程序不允许范围“$1”",
+ "mwoauth-oauth2-error-owner-only-invalid-grant": "必须允许所有者专用客户端使用client_credentials",
+ "mwoauth-oauth2-unable-to-retrieve-access-token": "无法检索访问令牌:$1",
+ "mwoauth-oauth2-error-server-error": "授权服务器遇到了阻止它完成请求的意外情况。",
+ "mwoauth-oauth2-error-invalid-request": "请求缺少必需的参数、包含无效的参数值、包含不止一次的参数或格式不正确。",
+ "mwoauth-oauth2-error-unauthorized-client": "客户端无权使用此方法请求授权码。",
+ "mwoauth-oauth2-error-access-denied": "资源所有者或授权服务器拒绝了请求。",
+ "mwoauth-oauth2-error-unsupported-response-type": "授权服务器不支持通过这种方式获取授权码。",
+ "mwoauth-oauth2-error-invalid-scope": "请求的范围无效、未知或格式错误。",
+ "mwoauth-oauth2-error-temporarily-unavailable": "由于服务器的临时过载或维护,授权服务器当前无法处理请求。",
+ "mwoauth-oauth2-error-invalid-client": "客户端身份验证失败(例如,未知客户端、不包含客户端身份验证或不支持的身份验证方法)",
+ "mwoauth-oauth2-error-request-not-verified": "在验证请求之前尝试检索已验证的属性",
+ "mwoauth-oauth2-invalid-access-token": "无效的访问令牌",
+ "mwoauth-consumer-access-no-user": "消费者批准必须绑定到有效用户,给定ID为0的用户",
+ "mwoauth-login-required-reason": "您需要登录您的{{SITENAME}}帐户以授权应用程序访问它。",
+ "mwoauthconsumer-consumer-view": "查看此消费者",
+ "mwoauthconsumer-application-view": "查看此应用程序",
+ "grant-oauthmanageownclient": "管理您的OAuth客户端",
+ "mwoauth-consumer-user-mismatch": "您不能对不属于您的客户端执行操作",
+ "mwoauth-consumer-deleted-error": "您无法对已删除的客户端执行操作",
+ "mwoauth-consumer-submit-error": "保存消费者时发生错误"
}
diff --git a/OAuth/i18n/zh-hant.json b/OAuth/i18n/zh-hant.json
index 57cdb53a..69f417d9 100644
--- a/OAuth/i18n/zh-hant.json
+++ b/OAuth/i18n/zh-hant.json
@@ -38,6 +38,7 @@
"mwoauth-consumer-owner-only-help": "選擇此選項將會導致 consumer 被自動核准,且接受由$1使用。這不會讓其他使用者可用,且慣有的授權流程不會進行。採用此 consumer 的操作不會被標記。",
"mwoauth-consumer-description": "應用程式描述:",
"mwoauth-consumer-callbackurl": "OAuth「回呼」URL:",
+ "mwoauth-consumer-callbackurl-warning": "(通配埠)",
"mwoauth-consumer-callbackisprefix": "允許 Consumer 在請求中指定一個回呼並使用上面的「回呼」URL作為一個必需的前綴。",
"mwoauth-consumer-granttypes": "請求的權限類型:",
"mwoauth-consumer-grantsneeded": "適用的權限:",
@@ -74,7 +75,6 @@
"mwoauth-consumer-stage-suppressed": "已禁止",
"oauthconsumerregistration": "OAuth Consumer 註冊",
"mwoauthconsumerregistration-navigation": "導覽:",
- "mwoauthconsumerregistration-propose": "提出新的 Consumer 申請",
"mwoauthconsumerregistration-list": "我的 Consumer 清單",
"mwoauthconsumerregistration-main": "主頁",
"mwoauthconsumerregistration-propose-text": "開發人員應使用以下表單提出申請新的OAuth Consumer(請參考[https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:OAuth 擴充套件說明文件]取得更多詳細資訊)。在送出這個表單後,您將會收到一組權杖(Token),可用來讓MediaWiki識別您的應用程式。在這之前OAuth管理員需要先核准您的應用程式。\n\n以下有幾點建議要特別說明:\n* 盡可能減少授權,避免目前不需的授權。\n* 版本的格式為「major.minor.release」(最後兩項為選填)並且需隨著授權變更時遞增。\n* 若可能,請提供一組公開RSA金鑰(使用PEM格式),否則將會採用安全性較低的秘密密鑰。\n* 您可使用專案ID來限制Consumer在網站中能存取的專案(使用「*」代表所有專案)。",
@@ -248,7 +248,7 @@
"mwoauth-invalid-authorization-blocked-user": "您請求裡的認證標頭用在被封鎖的使用者",
"mwoauth-form-description-allwikis": "$1您好,\n\n為了完成您的請求,'''$2'''需要權限以您的身分在此網站的所有專案上執行以下動作:\n\n$4",
"mwoauth-form-description-onewiki": "$1您好,\n\n為了完成您的請求,'''$2'''需要權限使用你的身份在'''$4'''上執行以下動作:\n\n$5",
- "mwoauth-form-description-allwikis-nogrants": "$1您好,\n\n為了完成您的請求,'''$2'''需要權限以您的身分在此網站的所有專案上存取資訊。不會使用您的帳號做出任何修改。",
+ "mwoauth-form-description-allwikis-nogrants": "$1您好,\n\n為了完成您的請求,'''$2'''需要以您的身分在此網站的所有專案上存取資訊的權限。不會使用您的帳號做出任何修改。",
"mwoauth-form-description-onewiki-nogrants": "$1您好,\n\n為了完成您的請求,'''$2'''需要權限以您的身分在'''$4'''上存取資訊。不會使用您的帳號做出任何修改。",
"mwoauth-form-description-allwikis-privateinfo": "$1您好,\n\n為了完成您的請求,'''$2'''需要權限在此網站的所有專案上存取有關您的資訊,包含您的真實姓名與電子郵件地址。不會使用您的帳號做出任何修改。",
"mwoauth-form-description-onewiki-privateinfo": "$1您好,\n\n為了完成您的請求,'''$2'''需要權限在'''$4'''上存取有關您的資訊,包含您的真實姓名與電子郵件地址。不會使用您的帳號做出任何修改。",
@@ -257,6 +257,7 @@
"mwoauth-form-button-approve": "允許",
"mwoauth-form-button-cancel": "取消",
"mwoauth-error": "應用程式連接錯誤",
+ "mwoauth-error-missing-callback-url-non-owner": "非擁有者的客戶端需要 callback_url",
"mwoauth-grants-heading": "請求的權限:",
"mwoauth-grants-nogrants": "應用程式未請求任何權限。",
"mwoauth-acceptance-cancelled": "您已選擇不允許 \"$1\" 存取您的帳號,在您允許 \"$1\" 存取前將無法正常運作。 您可以返回 \"$1\" 或 [[Special:OAuthManageMyGrants|管理]] 您已連結的應用程式。",
@@ -333,5 +334,9 @@
"mwoauth-consumer-access-no-user": "Consumer 核准必須綁定有效的使用者,指定的使用者 ID 為 0",
"mwoauth-login-required-reason": "您需要登入到您的{{SITENAME}}帳號來授權應用程式以對其存取。",
"mwoauthconsumer-consumer-view": "檢視此 Consumer",
- "mwoauthconsumer-application-view": "檢視此應用程式"
+ "mwoauthconsumer-application-view": "檢視此應用程式",
+ "grant-oauthmanageownclient": "管理您的 OAuth 客戶端",
+ "mwoauth-consumer-user-mismatch": "您無法對不屬於您的客戶端執行操作",
+ "mwoauth-consumer-deleted-error": "您無法對已被刪除的客戶端執行操作",
+ "mwoauth-consumer-submit-error": "儲存 consumer 時發生錯誤。"
}
diff --git a/OAuth/maintenance/createOAuthConsumer.php b/OAuth/maintenance/createOAuthConsumer.php
index e97015bb..739921d7 100644
--- a/OAuth/maintenance/createOAuthConsumer.php
+++ b/OAuth/maintenance/createOAuthConsumer.php
@@ -17,11 +17,11 @@
* You can optionally output successful results as json using --jsonOnSuccess
*/
-namespace MediaWiki\Extensions\OAuth;
+namespace MediaWiki\Extension\OAuth;
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Control\ConsumerSubmitControl;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Control\ConsumerSubmitControl;
/**
* @ingroup Maintenance
@@ -75,11 +75,14 @@ class CreateOAuthConsumer extends \Maintenance {
'grants' => '["' . implode( '","', $this->getOption( 'grants' ) ) . '"]',
'granttype' => 'normal',
'ownerOnly' => false,
- 'oauth2IsConfidential' => false, // only support OAUth 1 for now
- 'oauth2GrantTypes' => null, // only support OAUth 1 for now
+ // only support OAuth 1 for now
+ 'oauth2IsConfidential' => false,
+ 'oauth2GrantTypes' => null,
'email' => $user->getEmail(),
- 'wiki' => '*', // All wikis
- 'rsaKey' => '', // Generate a key
+ // All wikis
+ 'wiki' => '*',
+ // Generate a key
+ 'rsaKey' => '',
'agreement' => true,
'restrictions' => \MWRestrictions::newDefault(),
];
@@ -87,7 +90,7 @@ class CreateOAuthConsumer extends \Maintenance {
$context = \RequestContext::getMain();
$context->setUser( $user );
- $dbw = Utils::getCentralDB( DB_MASTER );
+ $dbw = Utils::getCentralDB( DB_PRIMARY );
$control = new ConsumerSubmitControl( $context, $data, $dbw );
$status = $control->submit();
diff --git a/OAuth/maintenance/migrateCentralWiki.php b/OAuth/maintenance/migrateCentralWiki.php
index 9fdf2347..404b728d 100644
--- a/OAuth/maintenance/migrateCentralWiki.php
+++ b/OAuth/maintenance/migrateCentralWiki.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth;
+namespace MediaWiki\Extension\OAuth;
/**
* Migrate oauth_registered_consumer and oauth_accepted_consumer tables to a
@@ -25,9 +25,9 @@ if ( getenv( 'MW_INSTALL_PATH' ) ) {
require_once "$IP/maintenance/Maintenance.php";
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\ConsumerAcceptance;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthDAO;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\ConsumerAcceptance;
+use MediaWiki\Extension\OAuth\Backend\MWOAuthDAO;
use MediaWiki\MediaWikiServices;
class MigrateCentralWiki extends \Maintenance {
@@ -57,15 +57,14 @@ class MigrateCentralWiki extends \Maintenance {
$cmrClass = ConsumerAcceptance::class;
$type = 'grant';
} else {
- $this->error( "Invalid table name. Must be one of 'oauth_registered_consumer' " .
- "or 'oauth_accepted_consumer'.\n", 1 );
- throw new \LogicException();
+ $this->fatalError( "Invalid table name. Must be one of 'oauth_registered_consumer' " .
+ "or 'oauth_accepted_consumer'.\n" );
}
$lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
- $oldDb = $lbFactory->getMainLB( $oldWiki )->getConnectionRef( DB_MASTER, [], $oldWiki );
+ $oldDb = $lbFactory->getMainLB( $oldWiki )->getConnectionRef( DB_PRIMARY, [], $oldWiki );
$targetDb = $lbFactory->getMainLB( $targetWiki )
- ->getConnectionRef( DB_MASTER, [], $targetWiki );
+ ->getConnectionRef( DB_PRIMARY, [], $targetWiki );
$targetDb->daoReadOnly = false;
$newMax = $targetDb->selectField(
diff --git a/OAuth/maintenance/migrateCentralWikiLogs.php b/OAuth/maintenance/migrateCentralWikiLogs.php
index 49e1105c..eec7fd00 100644
--- a/OAuth/maintenance/migrateCentralWikiLogs.php
+++ b/OAuth/maintenance/migrateCentralWikiLogs.php
@@ -29,15 +29,15 @@ class MigrateCentralWikiLogs extends Maintenance {
public function execute() {
$oldWiki = $this->getOption( 'old' );
- $targetWiki = wfWikiID();
+ $targetWiki = WikiMap::getCurrentWikiId();
$this->output( "Moving OAuth logs from '$oldWiki' to '$targetWiki'\n" );
// We only read from $oldDb, but we do want to make sure we get the most recent logs.
$lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
- $oldDb = $lbFactory->getMainLB( $oldWiki )->getConnectionRef( DB_MASTER, [], $oldWiki );
+ $oldDb = $lbFactory->getMainLB( $oldWiki )->getConnectionRef( DB_PRIMARY, [], $oldWiki );
$targetDb = $lbFactory->getMainLB( $targetWiki )
- ->getConnectionRef( DB_MASTER, [], $targetWiki );
+ ->getConnectionRef( DB_PRIMARY, [], $targetWiki );
$targetMinTS = $targetDb->selectField(
'logging',
@@ -55,7 +55,6 @@ class MigrateCentralWikiLogs extends Maintenance {
$commentStore = CommentStore::getStore();
$commentQuery = $commentStore->getJoin( 'log_comment' );
- $actorQuery = ActorMigration::newMigration()->getJoin( 'log_user' );
do {
$conds = [ 'log_type' => 'mwoauthconsumer' ];
@@ -68,17 +67,20 @@ class MigrateCentralWikiLogs extends Maintenance {
}
$oldLoggs = $oldDb->select(
- [ 'logging' ] + $commentQuery['tables'] + $actorQuery['tables'],
+ [ 'logging', 'actor' ] + $commentQuery['tables'],
[
- 'log_id', 'log_action', 'log_timestamp', 'log_params', 'log_deleted'
- ] + $commentQuery['fields'] + $actorQuery['fields'],
+ 'log_id', 'log_action', 'log_timestamp', 'log_params', 'log_deleted',
+ 'actor_id', 'actor_name', 'actor_user'
+ ] + $commentQuery['fields'],
$conds,
__METHOD__,
[
'ORDER BY' => 'log_timestamp DESC',
'LIMIT' => $this->mBatchSize + 1,
],
- $commentQuery['joins'] + $actorQuery['joins']
+ [
+ 'actor' => [ 'JOIN', 'actor_id=log_actor' ]
+ ] + $commentQuery['joins']
);
$rowCount = $oldLoggs->numRows();
@@ -88,12 +90,12 @@ class MigrateCentralWikiLogs extends Maintenance {
$oldLoggs->seek( $rowCount - 2 );
$last = $oldLoggs->fetchObject();
if ( $first->log_timestamp === $last->log_timestamp ) {
- $this->error( "Batch size too low to avoid infinite loop.\n", 1 );
+ $this->fatalError( "Batch size too low to avoid infinite loop.\n" );
}
$extra = $oldLoggs->fetchObject();
if ( $last->log_timestamp === $extra->log_timestamp ) {
- $this->error( "We hit an edge case. Please increase the batch " .
- " size and restart the transfer.\n", 1 );
+ $this->fatalError( "We hit an edge case. Please increase the batch " .
+ " size and restart the transfer.\n" );
}
$oldLoggs->rewind();
}
@@ -108,21 +110,22 @@ class MigrateCentralWikiLogs extends Maintenance {
$lastMinTimestamp = $row->log_timestamp;
$this->output( "Migrating log {$row->log_id}...\n" );
- $logUser = User::newFromName( $row->log_user_text );
- if ( !$logUser->getId() ) {
+ if ( !$row->actor_user ) {
$this->output(
"Cannot transfer log_id: {$row->log_id}, the log user doesn't exist"
);
continue;
}
- $params = unserialize( $row->log_params );
+ $logUser = MediaWikiServices::getInstance()->getActorNormalization()
+ ->newActorFromRow( $row );
+ $params = LogEntryBase::extractParams( $row->log_params );
if ( !isset( $params['4:consumer'] ) ) {
$this->output( "Cannot transfer log_id: {$row->log_id}, param isn't correct" );
continue;
}
$logEntry = new ManualLogEntry( 'mwoauthconsumer', $row->log_action );
$logEntry->setPerformer( $logUser );
- $logEntry->setTarget( Title::makeTitleSafe( NS_USER, $row->log_user_text ) );
+ $logEntry->setTarget( Title::makeTitleSafe( NS_USER, $row->actor_name ) );
$logEntry->setComment( $commentStore->getComment( 'log_comment', $row )->text );
$logEntry->setParameters( $params );
$logEntry->setRelations( [
@@ -138,7 +141,7 @@ class MigrateCentralWikiLogs extends Maintenance {
$lbFactory->waitForReplication();
- } while ( $rowCount ); // This wastes an extra query, but keeps the logic simpler
+ } while ( $rowCount );
}
}
diff --git a/OAuth/maintenance/testOAuthConsumer.php b/OAuth/maintenance/testOAuthConsumer.php
index 8f8d7812..9e7d3189 100644
--- a/OAuth/maintenance/testOAuthConsumer.php
+++ b/OAuth/maintenance/testOAuthConsumer.php
@@ -1,12 +1,12 @@
<?php
-namespace MediaWiki\Extensions\OAuth;
+namespace MediaWiki\Extension\OAuth;
-use MediaWiki\Extensions\OAuth\Lib\OAuthConsumer;
-use MediaWiki\Extensions\OAuth\Lib\OAuthException;
-use MediaWiki\Extensions\OAuth\Lib\OAuthRequest;
-use MediaWiki\Extensions\OAuth\Lib\OAuthSignatureMethod_HMAC_SHA1;
-use MediaWiki\Extensions\OAuth\Lib\OAuthSignatureMethod_RSA_SHA1;
+use MediaWiki\Extension\OAuth\Lib\OAuthConsumer;
+use MediaWiki\Extension\OAuth\Lib\OAuthException;
+use MediaWiki\Extension\OAuth\Lib\OAuthRequest;
+use MediaWiki\Extension\OAuth\Lib\OAuthSignatureMethod_HMAC_SHA1;
+use MediaWiki\Extension\OAuth\Lib\OAuthSignatureMethod_RSA_SHA1;
/**
* @ingroup Maintenance
@@ -59,7 +59,10 @@ class TestOAuthConsumer extends \Maintenance {
if ( $rsaKeyFile ) {
try {
$sig_method = new class ( $rsaKeyFile ) extends OAuthSignatureMethod_RSA_SHA1 {
- private $privKey, $pubKey;
+ /** @var string */
+ private $privKey;
+ /** @var string */
+ private $pubKey;
public function __construct( $privKeyFile ) {
$key = file_get_contents( $privKeyFile );
@@ -93,7 +96,7 @@ class TestOAuthConsumer extends \Maintenance {
}
};
} catch ( OAuthException $ex ) {
- $this->error( $ex->getMessage(), 1 );
+ $this->fatalError( $ex->getMessage() );
}
} else {
$sig_method = new OAuthSignatureMethod_HMAC_SHA1();
@@ -123,7 +126,7 @@ class TestOAuthConsumer extends \Maintenance {
$token = json_decode( $data );
if ( !$token || !isset( $token->key ) ) {
- $this->error( 'Could not fetch token', 1 );
+ $this->fatalError( 'Could not fetch token' );
}
$this->output( "Visit $baseurl/authorize" .
diff --git a/OAuth/package-lock.json b/OAuth/package-lock.json
index 6363a353..84618991 100644
--- a/OAuth/package-lock.json
+++ b/OAuth/package-lock.json
@@ -1,400 +1,5063 @@
{
+ "name": "OAuth",
+ "lockfileVersion": 2,
"requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.8.0",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz",
- "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==",
+ "packages": {
+ "": {
+ "devDependencies": {
+ "eslint-config-wikimedia": "0.22.1",
+ "grunt": "1.5.3",
+ "grunt-banana-checker": "0.10.0",
+ "grunt-eslint": "24.0.0",
+ "grunt-stylelint": "0.18.0",
+ "stylelint-config-wikimedia": "0.13.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz",
+ "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==",
"dev": true,
- "requires": {
- "@babel/highlight": "^7.8.0"
+ "dependencies": {
+ "@babel/highlight": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/@babel/highlight": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
+ "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.14.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz",
+ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@csstools/selector-specificity": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz",
+ "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2",
+ "postcss-selector-parser": "^6.0.10"
+ }
+ },
+ "node_modules/@es-joy/jsdoccomment": {
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.20.1.tgz",
+ "integrity": "sha512-oeJK41dcdqkvdZy/HctKklJNkt/jh+av3PZARrZEl+fs/8HaHeeYoAvEwOV0u5I6bArTF17JEsTZMY359e/nfQ==",
+ "dev": true,
+ "dependencies": {
+ "comment-parser": "1.3.0",
+ "esquery": "^1.4.0",
+ "jsdoc-type-pratt-parser": "~2.2.3"
+ },
+ "engines": {
+ "node": "^12 || ^14 || ^16 || ^17"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
+ "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.3.2",
+ "globals": "^13.15.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
- "@babel/compat-data": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz",
- "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==",
+ "node_modules/@eslint/eslintrc/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
},
- "@babel/core": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.0.tgz",
- "integrity": "sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw==",
+ "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
- "requires": {
- "@babel/code-frame": "^7.12.13",
- "@babel/generator": "^7.14.0",
- "@babel/helper-compilation-targets": "^7.13.16",
- "@babel/helper-module-transforms": "^7.14.0",
- "@babel/helpers": "^7.14.0",
- "@babel/parser": "^7.14.0",
- "@babel/template": "^7.12.13",
- "@babel/traverse": "^7.14.0",
- "@babel/types": "^7.14.0",
- "convert-source-map": "^1.7.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.1.2",
- "semver": "^6.3.0",
- "source-map": "^0.5.0"
+ "dependencies": {
+ "argparse": "^2.0.1"
},
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
"dependencies": {
- "@babel/code-frame": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
- "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.12.13"
- }
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.9.5",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
+ "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "node_modules/@mdn/browser-compat-data": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.2.1.tgz",
+ "integrity": "sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==",
+ "dev": true
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@types/color-name": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
+ "dev": true
+ },
+ "node_modules/@types/minimatch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
+ "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
+ "dev": true
+ },
+ "node_modules/@types/minimist": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
+ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
+ "dev": true
+ },
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
+ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
+ "dev": true
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+ "dev": true
+ },
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
+ "node_modules/acorn": {
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
+ "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/array-differ": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz",
+ "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+ "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-slice": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+ "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ast-metadata-inferer": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.7.0.tgz",
+ "integrity": "sha512-OkMLzd8xelb3gmnp6ToFvvsHLtS6CbagTkFQvQ+ZYFe3/AIl9iKikNR9G7pY3GfOR/2Xc222hwBjzI7HLkE76Q==",
+ "dev": true,
+ "dependencies": {
+ "@mdn/browser-compat-data": "^3.3.14"
+ }
+ },
+ "node_modules/ast-metadata-inferer/node_modules/@mdn/browser-compat-data": {
+ "version": "3.3.14",
+ "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-3.3.14.tgz",
+ "integrity": "sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA==",
+ "dev": true
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
+ "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==",
+ "dev": true
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.2.tgz",
+ "integrity": "sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
},
- "@babel/highlight": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
- "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.14.0",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- }
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001366",
+ "electron-to-chromium": "^1.4.188",
+ "node-releases": "^2.0.6",
+ "update-browserslist-db": "^1.0.4"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/browserslist-config-wikimedia": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.4.0.tgz",
+ "integrity": "sha512-U/fmsaGlCKOqRIjKqXwQ44qFqiStngRTphj1Cf6IHV6J8OK8T0gu9dKc7Ljq4v7bwhnhN+YCCa4fA3nZlPNivQ==",
+ "dev": true
+ },
+ "node_modules/builtin-modules": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
+ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-keys": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+ "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "map-obj": "^4.0.0",
+ "quick-lru": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001367",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz",
+ "integrity": "sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
},
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
}
+ ]
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "@babel/generator": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.1.tgz",
- "integrity": "sha512-TMGhsXMXCP/O1WtQmZjpEYDhCYC9vFhayWZPJSZCGkPJgUqX0rF0wwtrYvnzVxIjcF80tkUertXVk5cwqi5cAQ==",
+ "node_modules/chalk/node_modules/ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
- "requires": {
- "@babel/types": "^7.14.1",
- "jsesc": "^2.5.1",
- "source-map": "^0.5.0"
+ "dependencies": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "@babel/helper-compilation-targets": {
- "version": "7.13.16",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz",
- "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==",
+ "node_modules/chalk/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
- "requires": {
- "@babel/compat-data": "^7.13.15",
- "@babel/helper-validator-option": "^7.12.17",
- "browserslist": "^4.14.5",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/chalk/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/chalk/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz",
+ "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==",
+ "dev": true
+ },
+ "node_modules/clean-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz",
+ "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/clone-regexp": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz",
+ "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==",
+ "dev": true,
+ "dependencies": {
+ "is-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "node_modules/colord": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz",
+ "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==",
+ "dev": true
+ },
+ "node_modules/colors": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/comment-parser": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.0.tgz",
+ "integrity": "sha512-hRpmWIKgzd81vn0ydoWoyPoALEOnF4wt8yKD35Ib1D6XC2siLiYaiqfGkYrunuKdsXGwpBpHU3+9r+RVw2NZfA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "node_modules/core-js": {
+ "version": "3.23.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.5.tgz",
+ "integrity": "sha512-7Vh11tujtAZy82da4duVreQysIoO2EvVrur7y6IzZkH1IHPSekuDi8Vuw1+YKjkbfWLRD7Nc9ICQ/sIUDutcyg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
+ "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-functions-list": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz",
+ "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ }
+ },
+ "node_modules/css-rule-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz",
+ "integrity": "sha512-qiio/Zkr8I19jh/XuzEkK8OKDQRTrEYaRyIHy4Bwh/tPUe0w8GcQs7r6x24Yc9lT+FbnZFYULxEIXCmaymguUQ==",
+ "dev": true,
+ "dependencies": {
+ "css-tokenize": "^1.0.1",
+ "duplexer2": "0.0.2",
+ "ldjson-stream": "^1.2.1",
+ "through2": "^0.6.3"
+ },
+ "bin": {
+ "css-rule-stream": "index.js"
+ }
+ },
+ "node_modules/css-rule-stream/node_modules/readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/css-rule-stream/node_modules/through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
+ "dev": true,
+ "dependencies": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ },
+ "node_modules/css-tokenize": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz",
+ "integrity": "sha512-gLmmbJdwH9HLY4bcA17lnZ8GgPwEXRbvxBJGHnkiB6gLhRpTzjkjtMIvz7YORGW/Ptv2oMk8b5g+u7mRD6Dd7A==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^1.0.33"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/dateformat": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
+ "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decamelize-keys": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
+ "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
+ "dev": true,
+ "dependencies": {
+ "decamelize": "^1.1.0",
+ "map-obj": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decamelize-keys/node_modules/map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "node_modules/detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/doiuse": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-4.4.1.tgz",
+ "integrity": "sha512-TUpr1/YNg20IB09tZmwGCTsTQoxj8jUld/hUZprZMj8vj0VpAJySXEWCr8WMvqvgzk0/kG/FxeSMGKode4UjPg==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.16.1",
+ "caniuse-lite": "^1.0.30001179",
+ "css-rule-stream": "^1.1.0",
+ "duplexer2": "0.0.2",
+ "ldjson-stream": "^1.2.1",
+ "multimatch": "^5.0.0",
+ "postcss": "^8.2.4",
+ "source-map": "^0.7.3",
+ "through2": "^4.0.2",
+ "yargs": "^16.2.0"
+ },
+ "bin": {
+ "doiuse": "cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/duplexer2": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+ "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==",
+ "dev": true,
+ "dependencies": {
+ "readable-stream": "~1.1.9"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.192",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.192.tgz",
+ "integrity": "sha512-8nCXyIQY9An88NXAp+PuPy5h3/w5ZY7Iu2lag65Q0XREprcat5F8gKhoHsBUnQcFuCRnmevpR8yEBYRU3d2HDw==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz",
+ "integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/eslintrc": "^1.3.0",
+ "@humanwhocodes/config-array": "^0.9.2",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.2",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^6.0.1",
+ "globals": "^13.15.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-wikimedia": {
+ "version": "0.22.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.22.1.tgz",
+ "integrity": "sha512-TtN+gWJrcW0i1sEu7vPE1tHpEilrMUuTxP6UK97Amvva/KDV9/tvRUifGhw0q5uBswp+HWgF12p8rq68hZqMbA==",
+ "dev": true,
+ "dependencies": {
+ "eslint": "^8.6.0",
+ "eslint-plugin-compat": "^4.0.2",
+ "eslint-plugin-es": "^4.1.0",
+ "eslint-plugin-jsdoc": "^37.7.1",
+ "eslint-plugin-json-es": "^1.5.4",
+ "eslint-plugin-mediawiki": "^0.3.0",
+ "eslint-plugin-mocha": "^9.0.0",
+ "eslint-plugin-no-jquery": "^2.7.0",
+ "eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-qunit": "^7.2.0",
+ "eslint-plugin-unicorn": "^40.1.0",
+ "eslint-plugin-vue": "^8.4.1",
+ "eslint-plugin-wdio": "^7.4.2",
+ "eslint-plugin-yml": "^0.13.0"
+ }
+ },
+ "node_modules/eslint-plugin-compat": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.0.2.tgz",
+ "integrity": "sha512-xqvoO54CLTVaEYGMzhu35Wzwk/As7rCvz/2dqwnFiWi0OJccEtGIn+5qq3zqIu9nboXlpdBN579fZcItC73Ycg==",
+ "dev": true,
+ "dependencies": {
+ "@mdn/browser-compat-data": "^4.1.5",
+ "ast-metadata-inferer": "^0.7.0",
+ "browserslist": "^4.16.8",
+ "caniuse-lite": "^1.0.30001304",
+ "core-js": "^3.16.2",
+ "find-up": "^5.0.0",
+ "lodash.memoize": "4.1.2",
+ "semver": "7.3.5"
+ },
+ "engines": {
+ "node": ">=9.x"
+ },
+ "peerDependencies": {
+ "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-compat/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-plugin-compat/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-plugin-compat/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-plugin-compat/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-plugin-es": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
+ "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
+ "dev": true,
+ "dependencies": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=4.19.1"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc": {
+ "version": "37.9.7",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-37.9.7.tgz",
+ "integrity": "sha512-8alON8yYcStY94o0HycU2zkLKQdcS+qhhOUNQpfONHHwvI99afbmfpYuPqf6PbLz5pLZldG3Te5I0RbAiTN42g==",
+ "dev": true,
+ "dependencies": {
+ "@es-joy/jsdoccomment": "~0.20.1",
+ "comment-parser": "1.3.0",
+ "debug": "^4.3.3",
+ "escape-string-regexp": "^4.0.0",
+ "esquery": "^1.4.0",
+ "regextras": "^0.8.0",
+ "semver": "^7.3.5",
+ "spdx-expression-parse": "^3.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || ^16 || ^17"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-plugin-json-es": {
+ "version": "1.5.7",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.7.tgz",
+ "integrity": "sha512-ehBHcCcJo4iViYx6vp3T+SmwzLIlVDzZNoVxN/txZIiPwDQ26mnYaN5iJ3imqN4l1b8z6rbxEH2kB9XDGxeU/w==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.1"
+ },
+ "peerDependencies": {
+ "eslint": ">= 7"
+ }
+ },
+ "node_modules/eslint-plugin-json-es/node_modules/eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-mediawiki": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.3.0.tgz",
+ "integrity": "sha512-Lhyj2PSkhDzYSc1PNbURysY/WoqvY0brw558ZInT3erzf5KUlro18MTKFdV+nlht475ZgnsfHsgfg6Ut2w1SVg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-plugin-vue": "^7.20.0",
+ "upath": "^2.0.1"
+ },
+ "peerDependencies": {
+ "eslint": ">=5.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-mediawiki/node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/eslint-plugin-mediawiki/node_modules/eslint-plugin-vue": {
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz",
+ "integrity": "sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==",
+ "dev": true,
+ "dependencies": {
+ "eslint-utils": "^2.1.0",
+ "natural-compare": "^1.4.0",
+ "semver": "^6.3.0",
+ "vue-eslint-parser": "^7.10.0"
+ },
+ "engines": {
+ "node": ">=8.10"
+ },
+ "peerDependencies": {
+ "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-mediawiki/node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-mediawiki/node_modules/espree": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
+ "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^7.1.1",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-mediawiki/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eslint-plugin-mediawiki/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-mediawiki/node_modules/vue-eslint-parser": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz",
+ "integrity": "sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "eslint-scope": "^5.1.1",
+ "eslint-visitor-keys": "^1.1.0",
+ "espree": "^6.2.1",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
"semver": "^6.3.0"
},
+ "engines": {
+ "node": ">=8.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-mocha": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz",
+ "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==",
+ "dev": true,
"dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
+ "eslint-utils": "^3.0.0",
+ "ramda": "^0.27.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-mocha/node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-plugin-mocha/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-no-jquery": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.7.0.tgz",
+ "integrity": "sha512-Aeg7dA6GTH1AcWLlBtWNzOU9efK5KpNi7b0EhBO0o0M+awyzguUUo8gF6hXGjQ9n5h8/uRtYv9zOqQkeC5CG0w==",
+ "dev": true,
+ "peerDependencies": {
+ "eslint": ">=2.3.0"
+ }
+ },
+ "node_modules/eslint-plugin-node": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
+ "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
+ "dev": true,
+ "dependencies": {
+ "eslint-plugin-es": "^3.0.0",
+ "eslint-utils": "^2.0.0",
+ "ignore": "^5.1.1",
+ "minimatch": "^3.0.4",
+ "resolve": "^1.10.1",
+ "semver": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=5.16.0"
+ }
+ },
+ "node_modules/eslint-plugin-node/node_modules/eslint-plugin-es": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
+ "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+ "dev": true,
+ "dependencies": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=4.19.1"
+ }
+ },
+ "node_modules/eslint-plugin-node/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-qunit": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.1.tgz",
+ "integrity": "sha512-L1yutkLqCgr70ZmMAbBKPvUOUwhKryZ0RaJKOzw72Bmn8no3JNBL9hhbX2aTvfZqYM/wLXIT0nICZiGrV4xVJw==",
+ "dev": true,
+ "dependencies": {
+ "eslint-utils": "^3.0.0",
+ "requireindex": "^1.2.0"
+ },
+ "engines": {
+ "node": "12.x || 14.x || >=16.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-qunit/node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-plugin-qunit/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-unicorn": {
+ "version": "40.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-40.1.0.tgz",
+ "integrity": "sha512-y5doK2DF9Sr5AqKEHbHxjFllJ167nKDRU01HDcWyv4Tnmaoe9iNxMrBnaybZvWZUaE3OC5Unu0lNIevYamloig==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.15.7",
+ "ci-info": "^3.3.0",
+ "clean-regexp": "^1.0.0",
+ "eslint-utils": "^3.0.0",
+ "esquery": "^1.4.0",
+ "indent-string": "^4.0.0",
+ "is-builtin-module": "^3.1.0",
+ "lodash": "^4.17.21",
+ "pluralize": "^8.0.0",
+ "read-pkg-up": "^7.0.1",
+ "regexp-tree": "^0.1.24",
+ "safe-regex": "^2.1.1",
+ "semver": "^7.3.5",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.32.0"
+ }
+ },
+ "node_modules/eslint-plugin-unicorn/node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-plugin-unicorn/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-vue": {
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
+ "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-utils": "^3.0.0",
+ "natural-compare": "^1.4.0",
+ "nth-check": "^2.0.1",
+ "postcss-selector-parser": "^6.0.9",
+ "semver": "^7.3.5",
+ "vue-eslint-parser": "^8.0.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-vue/node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-plugin-vue/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-wdio": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.20.6.tgz",
+ "integrity": "sha512-OAPKGDi68i/wYFjhqNGuSgHfMyl52XgKOODhL/pT88diEPyX9J3DQh5AaFbDXjCt3HISaA1K7EMQNChIwhG5Zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-yml": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-0.13.0.tgz",
+ "integrity": "sha512-rZvdnhe28jIbgSIZo3qYqkl9hKslyTDfMwqIGDzz873gxghzBw0yeFG+P7sMfOkFfpqwJzZy3IKe2cIiCp4FrA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.2",
+ "lodash": "^4.17.21",
+ "natural-compare": "^1.4.0",
+ "yaml-eslint-parser": "^0.5.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
+ "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.7.1",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eventemitter2": {
+ "version": "0.4.14",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
+ "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
+ "dev": true
+ },
+ "node_modules/execall": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz",
+ "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==",
+ "dev": true,
+ "dependencies": {
+ "clone-regexp": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==",
+ "dev": true,
+ "dependencies": {
+ "homedir-polyfill": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "node_modules/fastest-levenshtein": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+ "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/findup-sync": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
+ "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
+ "dev": true,
+ "dependencies": {
+ "glob": "~5.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/findup-sync/node_modules/glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "dependencies": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/fined": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
+ "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
+ "dev": true,
+ "dependencies": {
+ "expand-tilde": "^2.0.2",
+ "is-plain-object": "^2.0.3",
+ "object.defaults": "^1.1.0",
+ "object.pick": "^1.2.0",
+ "parse-filepath": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/flagged-respawn": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
+ "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
+ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
+ "dev": true
+ },
+ "node_modules/for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==",
+ "dev": true,
+ "dependencies": {
+ "for-in": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-stdin": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/getobject": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.0.tgz",
+ "integrity": "sha512-tbUz6AKKKr2YiMB+fLWIgq5ZeBOobop9YMMAU9dC54/ot2ksMXt3DOFyBuhZw6ptcVszEykgByK20j7W9jHFag==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "dependencies": {
+ "global-prefix": "^1.0.1",
+ "is-windows": "^1.0.1",
+ "resolve-dir": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==",
+ "dev": true,
+ "dependencies": {
+ "expand-tilde": "^2.0.2",
+ "homedir-polyfill": "^1.0.1",
+ "ini": "^1.3.4",
+ "is-windows": "^1.0.1",
+ "which": "^1.2.14"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/global-prefix/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.16.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz",
+ "integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globals/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globjoin": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
+ "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=",
+ "dev": true
+ },
+ "node_modules/grunt": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz",
+ "integrity": "sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==",
+ "dev": true,
+ "dependencies": {
+ "dateformat": "~3.0.3",
+ "eventemitter2": "~0.4.13",
+ "exit": "~0.1.2",
+ "findup-sync": "~0.3.0",
+ "glob": "~7.1.6",
+ "grunt-cli": "~1.4.3",
+ "grunt-known-options": "~2.0.0",
+ "grunt-legacy-log": "~3.0.0",
+ "grunt-legacy-util": "~2.0.1",
+ "iconv-lite": "~0.4.13",
+ "js-yaml": "~3.14.0",
+ "minimatch": "~3.0.4",
+ "mkdirp": "~1.0.4",
+ "nopt": "~3.0.6",
+ "rimraf": "~3.0.2"
+ },
+ "bin": {
+ "grunt": "bin/grunt"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/grunt-banana-checker": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.10.0.tgz",
+ "integrity": "sha512-Sx+P3zWjn4YmBCqzidnCEkYrACe1SLTIT8kKC6C3f21Hu6sm17U/V+re343cuK3U+iGZv15ux6bY+69buIbYrA==",
+ "dev": true,
+ "bin": {
+ "banana-checker": "src/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/grunt-cli": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz",
+ "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==",
+ "dev": true,
+ "dependencies": {
+ "grunt-known-options": "~2.0.0",
+ "interpret": "~1.1.0",
+ "liftup": "~3.0.1",
+ "nopt": "~4.0.1",
+ "v8flags": "~3.2.0"
+ },
+ "bin": {
+ "grunt": "bin/grunt"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/grunt-cli/node_modules/nopt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
+ "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
+ "dev": true,
+ "dependencies": {
+ "abbrev": "1",
+ "osenv": "^0.1.4"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ }
+ },
+ "node_modules/grunt-eslint": {
+ "version": "24.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-24.0.0.tgz",
+ "integrity": "sha512-WpTeBBFweyhMuPjGwRSQV9JFJ+EczIdlsc7Dd/1g78QVI1aZsk4g/H3e+3S5HEwsS1RKL2YZIrGj8hMLlBfN8w==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "eslint": "^8.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ },
+ "peerDependencies": {
+ "grunt": ">=1"
+ }
+ },
+ "node_modules/grunt-known-options": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz",
+ "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/grunt-legacy-log": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz",
+ "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==",
+ "dev": true,
+ "dependencies": {
+ "colors": "~1.1.2",
+ "grunt-legacy-log-utils": "~2.1.0",
+ "hooker": "~0.2.3",
+ "lodash": "~4.17.19"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/grunt-legacy-log-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz",
+ "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "~4.1.0",
+ "lodash": "~4.17.19"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/grunt-legacy-util": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz",
+ "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==",
+ "dev": true,
+ "dependencies": {
+ "async": "~3.2.0",
+ "exit": "~0.1.2",
+ "getobject": "~1.0.0",
+ "hooker": "~0.2.3",
+ "lodash": "~4.17.21",
+ "underscore.string": "~3.3.5",
+ "which": "~2.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/grunt-legacy-util/node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/grunt-stylelint": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.18.0.tgz",
+ "integrity": "sha512-Ks5OfRUCA6E1v5PkCQKYaMErHtoec/Ub0Vb1xvZ0CKm/1zzWKuqEu2ZVtFcQVDqrC5UM6AXaLHpsLiocVKAgbg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "stylelint": "14.x"
+ }
+ },
+ "node_modules/hard-rejection": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+ "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/homedir-polyfill": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+ "dev": true,
+ "dependencies": {
+ "parse-passwd": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/hooker": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
+ "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
+ "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/html-tags": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz",
+ "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
+ "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/import-lazy": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
+ "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/ini": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
+ "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==",
+ "dev": true
+ },
+ "node_modules/interpret": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+ "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==",
+ "dev": true
+ },
+ "node_modules/is-absolute": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
+ "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
+ "dev": true,
+ "dependencies": {
+ "is-relative": "^1.0.0",
+ "is-windows": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "node_modules/is-builtin-module": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz",
+ "integrity": "sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==",
+ "dev": true,
+ "dependencies": {
+ "builtin-modules": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+ "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-regexp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz",
+ "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-relative": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
+ "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
+ "dev": true,
+ "dependencies": {
+ "is-unc-path": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-unc-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
+ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
+ "dev": true,
+ "dependencies": {
+ "unc-path-regex": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+ "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsdoc-type-pratt-parser": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-2.2.5.tgz",
+ "integrity": "sha512-2a6eRxSxp1BW040hFvaJxhsCMI9lT8QB8t14t+NY5tC5rckIR0U9cr2tjOeaFirmEOy6MHvmJnY7zTBHq431Lw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/known-css-properties": {
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.25.0.tgz",
+ "integrity": "sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/ldjson-stream": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ldjson-stream/-/ldjson-stream-1.2.1.tgz",
+ "integrity": "sha512-xw/nNEXafuPSLu8NjjG3+atVVw+8U1APZAQylmwQn19Hgw6rC7QjHvP6MupnHWCrzSm9m0xs5QWkCLuRvBPjgQ==",
+ "dev": true,
+ "dependencies": {
+ "split2": "^0.2.1",
+ "through2": "^0.6.1"
+ }
+ },
+ "node_modules/ldjson-stream/node_modules/readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/ldjson-stream/node_modules/through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
+ "dev": true,
+ "dependencies": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/liftup": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz",
+ "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==",
+ "dev": true,
+ "dependencies": {
+ "extend": "^3.0.2",
+ "findup-sync": "^4.0.0",
+ "fined": "^1.2.0",
+ "flagged-respawn": "^1.0.1",
+ "is-plain-object": "^2.0.4",
+ "object.map": "^1.0.1",
+ "rechoir": "^0.7.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/liftup/node_modules/findup-sync": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz",
+ "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==",
+ "dev": true,
+ "dependencies": {
+ "detect-file": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "micromatch": "^4.0.2",
+ "resolve-dir": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+ "dev": true
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+ "dev": true
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
+ "dev": true
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/make-iterator": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
+ "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/map-obj": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz",
+ "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mathml-tag-names": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
+ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
+ "dev": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/meow": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
+ "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize": "^1.2.0",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/meow/node_modules/type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist-options": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+ "dev": true,
+ "dependencies": {
+ "arrify": "^1.0.1",
+ "is-plain-obj": "^1.1.0",
+ "kind-of": "^6.0.3"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/minimist-options/node_modules/is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/multimatch": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz",
+ "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==",
+ "dev": true,
+ "dependencies": {
+ "@types/minimatch": "^3.0.3",
+ "array-differ": "^3.0.0",
+ "array-union": "^2.1.0",
+ "arrify": "^2.0.1",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/multimatch/node_modules/arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
+ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+ "dev": true
+ },
+ "node_modules/nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ }
+ },
+ "node_modules/normalize-package-data": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+ "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+ "dev": true,
+ "dependencies": {
+ "hosted-git-info": "^4.0.1",
+ "is-core-module": "^2.5.0",
+ "semver": "^7.3.4",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-selector": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz",
+ "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==",
+ "dev": true
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/object.defaults": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+ "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==",
+ "dev": true,
+ "dependencies": {
+ "array-each": "^1.0.1",
+ "array-slice": "^1.0.0",
+ "for-own": "^1.0.0",
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object.map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+ "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==",
+ "dev": true,
+ "dependencies": {
+ "for-own": "^1.0.0",
+ "make-iterator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/osenv": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+ "dev": true,
+ "dependencies": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-filepath": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+ "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==",
+ "dev": true,
+ "dependencies": {
+ "is-absolute": "^1.0.0",
+ "map-cache": "^0.2.0",
+ "path-root": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-root": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==",
+ "dev": true,
+ "dependencies": {
+ "path-root-regex": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-root-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+ "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pluralize": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
+ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.14",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
+ "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
}
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
}
},
- "@babel/helper-function-name": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz",
- "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==",
+ "node_modules/postcss-less": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-6.0.0.tgz",
+ "integrity": "sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==",
"dev": true,
- "requires": {
- "@babel/helper-get-function-arity": "^7.12.13",
- "@babel/template": "^7.12.13",
- "@babel/types": "^7.12.13"
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3.5"
}
},
- "@babel/helper-get-function-arity": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz",
- "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==",
+ "node_modules/postcss-media-query-parser": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
+ "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
+ "dev": true
+ },
+ "node_modules/postcss-resolve-nested-selector": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
+ "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=",
+ "dev": true
+ },
+ "node_modules/postcss-safe-parser": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+ "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
"dev": true,
- "requires": {
- "@babel/types": "^7.12.13"
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3.3"
}
},
- "@babel/helper-member-expression-to-functions": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz",
- "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==",
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
"dev": true,
- "requires": {
- "@babel/types": "^7.13.12"
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "@babel/helper-module-imports": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz",
- "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==",
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true,
- "requires": {
- "@babel/types": "^7.13.12"
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "@babel/helper-module-transforms": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz",
- "integrity": "sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw==",
+ "node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true,
- "requires": {
- "@babel/helper-module-imports": "^7.13.12",
- "@babel/helper-replace-supers": "^7.13.12",
- "@babel/helper-simple-access": "^7.13.12",
- "@babel/helper-split-export-declaration": "^7.12.13",
- "@babel/helper-validator-identifier": "^7.14.0",
- "@babel/template": "^7.12.13",
- "@babel/traverse": "^7.14.0",
- "@babel/types": "^7.14.0"
+ "engines": {
+ "node": ">=6"
}
},
- "@babel/helper-optimise-call-expression": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz",
- "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==",
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true,
- "requires": {
- "@babel/types": "^7.12.13"
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/quick-lru": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
}
},
- "@babel/helper-replace-supers": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz",
- "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==",
+ "node_modules/ramda": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz",
+ "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==",
+ "dev": true
+ },
+ "node_modules/read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
"dev": true,
- "requires": {
- "@babel/helper-member-expression-to-functions": "^7.13.12",
- "@babel/helper-optimise-call-expression": "^7.12.13",
- "@babel/traverse": "^7.13.0",
- "@babel/types": "^7.13.12"
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "@babel/helper-simple-access": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz",
- "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==",
+ "node_modules/read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
"dev": true,
- "requires": {
- "@babel/types": "^7.13.12"
+ "dependencies": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "@babel/helper-split-export-declaration": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz",
- "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==",
+ "node_modules/read-pkg/node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "node_modules/read-pkg/node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
"dev": true,
- "requires": {
- "@babel/types": "^7.12.13"
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
}
},
- "@babel/helper-validator-identifier": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
- "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
+ "node_modules/read-pkg/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/read-pkg/node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/rechoir": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
+ "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
+ "dev": true,
+ "dependencies": {
+ "resolve": "^1.9.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "dev": true,
+ "dependencies": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/regexp-tree": {
+ "version": "0.1.24",
+ "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz",
+ "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==",
+ "dev": true,
+ "bin": {
+ "regexp-tree": "bin/regexp-tree"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/regextras": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz",
+ "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.1.14"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requireindex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
+ "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.5"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==",
+ "dev": true,
+ "dependencies": {
+ "expand-tilde": "^2.0.0",
+ "global-modules": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safe-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz",
+ "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==",
+ "dev": true,
+ "dependencies": {
+ "regexp-tree": "~0.1.1"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
- "@babel/helper-validator-option": {
- "version": "7.12.17",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz",
- "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==",
+ "node_modules/semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true
},
- "@babel/helpers": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz",
- "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==",
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true,
- "requires": {
- "@babel/template": "^7.12.13",
- "@babel/traverse": "^7.14.0",
- "@babel/types": "^7.14.0"
+ "engines": {
+ "node": ">=8"
}
},
- "@babel/highlight": {
- "version": "7.8.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz",
- "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==",
+ "node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
- "requires": {
- "chalk": "^2.0.0",
- "esutils": "^2.0.2",
- "js-tokens": "^4.0.0"
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+ "dev": true,
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
+ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+ "dev": true
+ },
+ "node_modules/specificity": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz",
+ "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
+ "dev": true,
+ "bin": {
+ "specificity": "bin/specificity"
+ }
+ },
+ "node_modules/split2": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-0.2.1.tgz",
+ "integrity": "sha512-D/oTExYAkC9nWleOCTOyNmAuzfAT/6rHGBA9LIK7FVnGo13CSvrKCUzKenwH6U1s2znY9MqH6v0UQTEDa3vJmg==",
+ "dev": true,
+ "dependencies": {
+ "through2": "~0.6.1"
+ }
+ },
+ "node_modules/split2/node_modules/readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/split2/node_modules/through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
+ "dev": true,
+ "dependencies": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "node_modules/string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
+ "dev": true
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "dev": true,
+ "dependencies": {
+ "min-indent": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/style-search": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
+ "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=",
+ "dev": true
+ },
+ "node_modules/stylelint": {
+ "version": "14.9.1",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.9.1.tgz",
+ "integrity": "sha512-RdAkJdPiLqHawCSnu21nE27MjNXaVd4WcOHA4vK5GtIGjScfhNnaOuWR2wWdfKFAvcWQPOYe311iveiVKSmwsA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@csstools/selector-specificity": "^2.0.1",
+ "balanced-match": "^2.0.0",
+ "colord": "^2.9.2",
+ "cosmiconfig": "^7.0.1",
+ "css-functions-list": "^3.1.0",
+ "debug": "^4.3.4",
+ "execall": "^2.0.0",
+ "fast-glob": "^3.2.11",
+ "fastest-levenshtein": "^1.0.12",
+ "file-entry-cache": "^6.0.1",
+ "get-stdin": "^8.0.0",
+ "global-modules": "^2.0.0",
+ "globby": "^11.1.0",
+ "globjoin": "^0.1.4",
+ "html-tags": "^3.2.0",
+ "ignore": "^5.2.0",
+ "import-lazy": "^4.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-plain-object": "^5.0.0",
+ "known-css-properties": "^0.25.0",
+ "mathml-tag-names": "^2.1.3",
+ "meow": "^9.0.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.14",
+ "postcss-media-query-parser": "^0.2.3",
+ "postcss-resolve-nested-selector": "^0.1.1",
+ "postcss-safe-parser": "^6.0.0",
+ "postcss-selector-parser": "^6.0.10",
+ "postcss-value-parser": "^4.2.0",
+ "resolve-from": "^5.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "style-search": "^0.1.0",
+ "supports-hyperlinks": "^2.2.0",
+ "svg-tags": "^1.0.0",
+ "table": "^6.8.0",
+ "v8-compile-cache": "^2.3.0",
+ "write-file-atomic": "^4.0.1"
+ },
+ "bin": {
+ "stylelint": "bin/stylelint.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/stylelint"
+ }
+ },
+ "node_modules/stylelint-config-recommended": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz",
+ "integrity": "sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==",
+ "dev": true,
+ "peerDependencies": {
+ "stylelint": "^14.4.0"
+ }
+ },
+ "node_modules/stylelint-config-wikimedia": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.13.0.tgz",
+ "integrity": "sha512-1R1g/uc53z2z39ejZMALwC6fTfSZhkzDjj1v8ODCWtLCiuqWuSf3HR1ZTXT5X5AtSbZq1W9+0p5HJp6rPVXkRg==",
+ "dev": true,
+ "dependencies": {
+ "browserslist-config-wikimedia": "0.4.0",
+ "postcss-less": "6.0.0",
+ "stylelint": "14.8.1",
+ "stylelint-config-recommended": "7.0.0",
+ "stylelint-no-unsupported-browser-features": "5.0.3"
+ },
+ "peerDependencies": {
+ "postcss-less": "^6.0.0"
+ }
+ },
+ "node_modules/stylelint-config-wikimedia/node_modules/balanced-match": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
+ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
+ "dev": true
+ },
+ "node_modules/stylelint-config-wikimedia/node_modules/global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "dev": true,
+ "dependencies": {
+ "global-prefix": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/stylelint-config-wikimedia/node_modules/global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "dev": true,
+ "dependencies": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/stylelint-config-wikimedia/node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stylelint-config-wikimedia/node_modules/known-css-properties": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.24.0.tgz",
+ "integrity": "sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA==",
+ "dev": true
+ },
+ "node_modules/stylelint-config-wikimedia/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/stylelint-config-wikimedia/node_modules/stylelint": {
+ "version": "14.8.1",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.8.1.tgz",
+ "integrity": "sha512-0YxTop3wTeEVmQWhS7jjLFaBkvfPmffRiJ6eFIDlK++f3OklaobTYFJu32E5u/cIrFLbcW52pLqrYpihA/y0/w==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^2.0.0",
+ "colord": "^2.9.2",
+ "cosmiconfig": "^7.0.1",
+ "css-functions-list": "^3.0.1",
+ "debug": "^4.3.4",
+ "execall": "^2.0.0",
+ "fast-glob": "^3.2.11",
+ "fastest-levenshtein": "^1.0.12",
+ "file-entry-cache": "^6.0.1",
+ "get-stdin": "^8.0.0",
+ "global-modules": "^2.0.0",
+ "globby": "^11.1.0",
+ "globjoin": "^0.1.4",
+ "html-tags": "^3.2.0",
+ "ignore": "^5.2.0",
+ "import-lazy": "^4.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-plain-object": "^5.0.0",
+ "known-css-properties": "^0.24.0",
+ "mathml-tag-names": "^2.1.3",
+ "meow": "^9.0.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "normalize-selector": "^0.2.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.12",
+ "postcss-media-query-parser": "^0.2.3",
+ "postcss-resolve-nested-selector": "^0.1.1",
+ "postcss-safe-parser": "^6.0.0",
+ "postcss-selector-parser": "^6.0.10",
+ "postcss-value-parser": "^4.2.0",
+ "resolve-from": "^5.0.0",
+ "specificity": "^0.4.1",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "style-search": "^0.1.0",
+ "supports-hyperlinks": "^2.2.0",
+ "svg-tags": "^1.0.0",
+ "table": "^6.8.0",
+ "v8-compile-cache": "^2.3.0",
+ "write-file-atomic": "^4.0.1"
+ },
+ "bin": {
+ "stylelint": "bin/stylelint.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/stylelint"
+ }
+ },
+ "node_modules/stylelint-config-wikimedia/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/stylelint-no-unsupported-browser-features": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-5.0.3.tgz",
+ "integrity": "sha512-FqfbOTk5UEkHsAKOkPH6SvajsfO9YuoWvKxd34tCRBZug9ZNeaPn141nyWkd+ncc8S1gVmO2+O6qVAMj9bvWww==",
+ "dev": true,
+ "dependencies": {
+ "doiuse": "^4.4.1",
+ "lodash": "^4.17.15",
+ "postcss": "^8.3.6"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "stylelint": ">=13.0.0"
+ }
+ },
+ "node_modules/stylelint/node_modules/balanced-match": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
+ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/stylelint/node_modules/global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "global-prefix": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/stylelint/node_modules/global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/stylelint/node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stylelint/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/stylelint/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz",
+ "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-tags": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+ "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
+ "dev": true
+ },
+ "node_modules/table": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
+ "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.1",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/table/node_modules/ajv": {
+ "version": "8.11.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
+ "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/table/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "node_modules/through2": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+ "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+ "dev": true,
+ "dependencies": {
+ "readable-stream": "3"
+ }
+ },
+ "node_modules/through2/node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/through2/node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/trim-newlines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/unc-path-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+ "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/underscore.string": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz",
+ "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "^1.0.3",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/upath": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz",
+ "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==",
+ "dev": true,
+ "engines": {
+ "node": ">=4",
+ "yarn": "*"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz",
+ "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "browserslist-lint": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "node_modules/v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "node_modules/v8flags": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
+ "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==",
+ "dev": true,
+ "dependencies": {
+ "homedir-polyfill": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/vue-eslint-parser": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
+ "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.2",
+ "eslint-scope": "^7.0.0",
+ "eslint-visitor-keys": "^3.1.0",
+ "espree": "^9.0.0",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "node_modules/write-file-atomic": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz",
+ "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==",
+ "dev": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.7"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
}
},
- "@babel/parser": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.1.tgz",
- "integrity": "sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q==",
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
- "@babel/template": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz",
- "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==",
+ "node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yaml-eslint-parser": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-0.5.0.tgz",
+ "integrity": "sha512-nJeyLA3YHAzhBTZbRAbu3W6xrSCucyxExmA+ZDtEdUFpGllxAZpto2Zxo2IG0r0eiuEiBM4e+wiAdxTziTq94g==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.0.0",
+ "lodash": "^4.17.21",
+ "yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/yaml-eslint-parser/node_modules/eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz",
+ "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.12.13",
- "@babel/parser": "^7.12.13",
- "@babel/types": "^7.12.13"
+ "@babel/highlight": "^7.14.5"
},
"dependencies": {
- "@babel/code-frame": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
- "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+ "@babel/highlight": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
+ "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
"dev": true,
"requires": {
- "@babel/highlight": "^7.12.13"
+ "@babel/helper-validator-identifier": "^7.14.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
}
},
- "@babel/highlight": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
- "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.0",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
}
}
}
},
- "@babel/traverse": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.0.tgz",
- "integrity": "sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA==",
+ "@babel/helper-validator-identifier": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz",
+ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==",
+ "dev": true
+ },
+ "@csstools/selector-specificity": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz",
+ "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==",
+ "dev": true,
+ "peer": true,
+ "requires": {}
+ },
+ "@es-joy/jsdoccomment": {
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.20.1.tgz",
+ "integrity": "sha512-oeJK41dcdqkvdZy/HctKklJNkt/jh+av3PZARrZEl+fs/8HaHeeYoAvEwOV0u5I6bArTF17JEsTZMY359e/nfQ==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.12.13",
- "@babel/generator": "^7.14.0",
- "@babel/helper-function-name": "^7.12.13",
- "@babel/helper-split-export-declaration": "^7.12.13",
- "@babel/parser": "^7.14.0",
- "@babel/types": "^7.14.0",
- "debug": "^4.1.0",
- "globals": "^11.1.0"
+ "comment-parser": "1.3.0",
+ "esquery": "^1.4.0",
+ "jsdoc-type-pratt-parser": "~2.2.3"
+ }
+ },
+ "@eslint/eslintrc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
+ "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.3.2",
+ "globals": "^13.15.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
},
"dependencies": {
- "@babel/code-frame": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
- "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
"requires": {
- "@babel/highlight": "^7.12.13"
+ "argparse": "^2.0.1"
}
},
- "@babel/highlight": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
- "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.0",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
+ "brace-expansion": "^1.1.7"
}
- },
- "globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true
}
}
},
- "@babel/types": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.1.tgz",
- "integrity": "sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA==",
+ "@humanwhocodes/config-array": {
+ "version": "0.9.5",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
+ "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.0",
- "to-fast-properties": "^2.0.0"
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
}
},
+ "@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "@mdn/browser-compat-data": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.2.1.tgz",
+ "integrity": "sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==",
+ "dev": true
+ },
"@nodelib/fs.scandir": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
- "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
"requires": {
- "@nodelib/fs.stat": "2.0.4",
+ "@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
}
},
"@nodelib/fs.stat": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
- "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true
},
"@nodelib/fs.walk": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
- "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
"requires": {
- "@nodelib/fs.scandir": "2.1.4",
+ "@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
}
},
- "@stylelint/postcss-css-in-js": {
- "version": "0.37.2",
- "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz",
- "integrity": "sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==",
- "dev": true,
- "requires": {
- "@babel/core": ">=7.9.0"
- }
- },
- "@stylelint/postcss-markdown": {
- "version": "0.36.2",
- "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz",
- "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==",
- "dev": true,
- "requires": {
- "remark": "^13.0.0",
- "unist-util-find-all-after": "^3.0.2"
- }
- },
"@types/color-name": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
"dev": true
},
- "@types/mdast": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz",
- "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==",
- "dev": true,
- "requires": {
- "@types/unist": "*"
- }
- },
"@types/minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==",
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
+ "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
"dev": true
},
"@types/minimist": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz",
- "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
+ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
"dev": true
},
"@types/normalize-package-data": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
- "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
+ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
"dev": true
},
"@types/parse-json": {
@@ -403,12 +5066,6 @@
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
"dev": true
},
- "@types/unist": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz",
- "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==",
- "dev": true
- },
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -416,42 +5073,34 @@
"dev": true
},
"acorn": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz",
- "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==",
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
+ "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
"dev": true
},
"acorn-jsx": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz",
- "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==",
- "dev": true
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "requires": {}
},
"ajv": {
- "version": "6.10.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
- "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
- "fast-deep-equal": "^2.0.1",
+ "fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
- "ansi-escapes": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz",
- "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==",
- "dev": true,
- "requires": {
- "type-fest": "^0.8.1"
- }
- },
"ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"ansi-styles": {
@@ -470,14 +5119,6 @@
"dev": true,
"requires": {
"sprintf-js": "~1.0.2"
- },
- "dependencies": {
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
- }
}
},
"array-differ": {
@@ -489,7 +5130,7 @@
"array-each": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
- "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
+ "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==",
"dev": true
},
"array-slice": {
@@ -510,10 +5151,27 @@
"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
"dev": true
},
+ "ast-metadata-inferer": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.7.0.tgz",
+ "integrity": "sha512-OkMLzd8xelb3gmnp6ToFvvsHLtS6CbagTkFQvQ+ZYFe3/AIl9iKikNR9G7pY3GfOR/2Xc222hwBjzI7HLkE76Q==",
+ "dev": true,
+ "requires": {
+ "@mdn/browser-compat-data": "^3.3.14"
+ },
+ "dependencies": {
+ "@mdn/browser-compat-data": {
+ "version": "3.3.14",
+ "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-3.3.14.tgz",
+ "integrity": "sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA==",
+ "dev": true
+ }
+ }
+ },
"astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
- "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true
},
"async": {
@@ -522,33 +5180,18 @@
"integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==",
"dev": true
},
- "autoprefixer": {
- "version": "9.8.6",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
- "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
- "dev": true,
- "requires": {
- "browserslist": "^4.12.0",
- "caniuse-lite": "^1.0.30001109",
- "colorette": "^1.2.1",
- "normalize-range": "^0.1.2",
- "num2fraction": "^1.2.2",
- "postcss": "^7.0.32",
- "postcss-value-parser": "^4.1.0"
- }
- },
- "bail": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
- "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
- "dev": true
- },
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
+ "boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -569,18 +5212,29 @@
}
},
"browserslist": {
- "version": "4.16.6",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
- "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.2.tgz",
+ "integrity": "sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001219",
- "colorette": "^1.2.2",
- "electron-to-chromium": "^1.3.723",
- "escalade": "^3.1.1",
- "node-releases": "^1.1.71"
+ "caniuse-lite": "^1.0.30001366",
+ "electron-to-chromium": "^1.4.188",
+ "node-releases": "^2.0.6",
+ "update-browserslist-db": "^1.0.4"
}
},
+ "browserslist-config-wikimedia": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.4.0.tgz",
+ "integrity": "sha512-U/fmsaGlCKOqRIjKqXwQ44qFqiStngRTphj1Cf6IHV6J8OK8T0gu9dKc7Ljq4v7bwhnhN+YCCa4fA3nZlPNivQ==",
+ "dev": true
+ },
+ "builtin-modules": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
+ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
+ "dev": true
+ },
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -605,61 +5259,78 @@
}
},
"caniuse-lite": {
- "version": "1.0.30001228",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz",
- "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==",
+ "version": "1.0.30001367",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz",
+ "integrity": "sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==",
"dev": true
},
"chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
- "character-entities": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
- "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
- "dev": true
- },
- "character-entities-legacy": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
- "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
- "dev": true
- },
- "character-reference-invalid": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
- "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
+ "ci-info": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz",
+ "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==",
"dev": true
},
- "chardet": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
- "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
- "dev": true
- },
- "cli-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
- "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "clean-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz",
+ "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==",
"dev": true,
"requires": {
- "restore-cursor": "^3.1.0"
+ "escape-string-regexp": "^1.0.5"
}
},
- "cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
- "dev": true
- },
"cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
@@ -695,10 +5366,10 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
- "colorette": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
- "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+ "colord": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz",
+ "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==",
"dev": true
},
"colors": {
@@ -707,31 +5378,34 @@
"integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
"dev": true
},
+ "comment-parser": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.0.tgz",
+ "integrity": "sha512-hRpmWIKgzd81vn0ydoWoyPoALEOnF4wt8yKD35Ib1D6XC2siLiYaiqfGkYrunuKdsXGwpBpHU3+9r+RVw2NZfA==",
+ "dev": true
+ },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
- "convert-source-map": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
- "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.1"
- }
+ "core-js": {
+ "version": "3.23.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.5.tgz",
+ "integrity": "sha512-7Vh11tujtAZy82da4duVreQysIoO2EvVrur7y6IzZkH1IHPSekuDi8Vuw1+YKjkbfWLRD7Nc9ICQ/sIUDutcyg==",
+ "dev": true
},
"core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"dev": true
},
"cosmiconfig": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
- "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
+ "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
"dev": true,
"requires": {
"@types/parse-json": "^4.0.0",
@@ -742,22 +5416,26 @@
}
},
"cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
"requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
}
},
+ "css-functions-list": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz",
+ "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==",
+ "dev": true
+ },
"css-rule-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz",
- "integrity": "sha1-N4bnGYmD2WWibjGVfgkHjLt3BaI=",
+ "integrity": "sha512-qiio/Zkr8I19jh/XuzEkK8OKDQRTrEYaRyIHy4Bwh/tPUe0w8GcQs7r6x24Yc9lT+FbnZFYULxEIXCmaymguUQ==",
"dev": true,
"requires": {
"css-tokenize": "^1.0.1",
@@ -769,7 +5447,7 @@
"readable-stream": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
@@ -778,16 +5456,10 @@
"string_decoder": "~0.10.x"
}
},
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- },
"through2": {
"version": "0.6.5",
"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
- "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
"dev": true,
"requires": {
"readable-stream": ">=1.0.33-1 <1.1.0-0",
@@ -799,31 +5471,11 @@
"css-tokenize": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz",
- "integrity": "sha1-RiXLHtohwUOFi3+B1oA8HSb8FL4=",
+ "integrity": "sha512-gLmmbJdwH9HLY4bcA17lnZ8GgPwEXRbvxBJGHnkiB6gLhRpTzjkjtMIvz7YORGW/Ptv2oMk8b5g+u7mRD6Dd7A==",
"dev": true,
"requires": {
"inherits": "^2.0.1",
"readable-stream": "^1.0.33"
- },
- "dependencies": {
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- }
}
},
"cssesc": {
@@ -839,12 +5491,12 @@
"dev": true
},
"debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "ms": "2.1.2"
}
},
"decamelize": {
@@ -880,7 +5532,7 @@
"detect-file": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
- "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==",
"dev": true
},
"dir-glob": {
@@ -917,117 +5569,21 @@
"source-map": "^0.7.3",
"through2": "^4.0.2",
"yargs": "^16.2.0"
- },
- "dependencies": {
- "postcss": {
- "version": "8.2.15",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz",
- "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==",
- "dev": true,
- "requires": {
- "colorette": "^1.2.2",
- "nanoid": "^3.1.23",
- "source-map": "^0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "source-map": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
- "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
- "dev": true
- }
- }
- },
- "dom-serializer": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
- "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
- "dev": true,
- "requires": {
- "domelementtype": "^2.0.1",
- "entities": "^2.0.0"
- },
- "dependencies": {
- "domelementtype": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
- "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
- "dev": true
- },
- "entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "dev": true
- }
- }
- },
- "domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
- "dev": true
- },
- "domhandler": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
- "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
- "dev": true,
- "requires": {
- "domelementtype": "1"
- }
- },
- "domutils": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
- "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
- "dev": true,
- "requires": {
- "dom-serializer": "0",
- "domelementtype": "1"
}
},
"duplexer2": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
- "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+ "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==",
"dev": true,
"requires": {
"readable-stream": "~1.1.9"
- },
- "dependencies": {
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- }
}
},
"electron-to-chromium": {
- "version": "1.3.727",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz",
- "integrity": "sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg==",
+ "version": "1.4.192",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.192.tgz",
+ "integrity": "sha512-8nCXyIQY9An88NXAp+PuPy5h3/w5ZY7Iu2lag65Q0XREprcat5F8gKhoHsBUnQcFuCRnmevpR8yEBYRU3d2HDw==",
"dev": true
},
"emoji-regex": {
@@ -1036,12 +5592,6 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
- "entities": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
- "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
- "dev": true
- },
"error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -1064,54 +5614,285 @@
"dev": true
},
"eslint": {
- "version": "6.8.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
- "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz",
+ "integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.0.0",
+ "@eslint/eslintrc": "^1.3.0",
+ "@humanwhocodes/config-array": "^0.9.2",
"ajv": "^6.10.0",
- "chalk": "^2.1.0",
- "cross-spawn": "^6.0.5",
- "debug": "^4.0.1",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
"doctrine": "^3.0.0",
- "eslint-scope": "^5.0.0",
- "eslint-utils": "^1.4.3",
- "eslint-visitor-keys": "^1.1.0",
- "espree": "^6.1.2",
- "esquery": "^1.0.1",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.2",
+ "esquery": "^1.4.0",
"esutils": "^2.0.2",
- "file-entry-cache": "^5.0.1",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
"functional-red-black-tree": "^1.0.1",
- "glob-parent": "^5.0.0",
- "globals": "^12.1.0",
- "ignore": "^4.0.6",
+ "glob-parent": "^6.0.1",
+ "globals": "^13.15.0",
+ "ignore": "^5.2.0",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
- "inquirer": "^7.0.0",
"is-glob": "^4.0.0",
- "js-yaml": "^3.13.1",
+ "js-yaml": "^4.1.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.3.0",
- "lodash": "^4.17.14",
- "minimatch": "^3.0.4",
- "mkdirp": "^0.5.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
- "optionator": "^0.8.3",
- "progress": "^2.0.0",
- "regexpp": "^2.0.1",
- "semver": "^6.1.2",
- "strip-ansi": "^5.2.0",
- "strip-json-comments": "^3.0.1",
- "table": "^5.2.3",
+ "optionator": "^0.9.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
},
"dependencies": {
- "ansi-regex": {
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ },
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ },
+ "js-yaml": {
"version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ }
+ }
+ },
+ "eslint-config-wikimedia": {
+ "version": "0.22.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.22.1.tgz",
+ "integrity": "sha512-TtN+gWJrcW0i1sEu7vPE1tHpEilrMUuTxP6UK97Amvva/KDV9/tvRUifGhw0q5uBswp+HWgF12p8rq68hZqMbA==",
+ "dev": true,
+ "requires": {
+ "eslint": "^8.6.0",
+ "eslint-plugin-compat": "^4.0.2",
+ "eslint-plugin-es": "^4.1.0",
+ "eslint-plugin-jsdoc": "^37.7.1",
+ "eslint-plugin-json-es": "^1.5.4",
+ "eslint-plugin-mediawiki": "^0.3.0",
+ "eslint-plugin-mocha": "^9.0.0",
+ "eslint-plugin-no-jquery": "^2.7.0",
+ "eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-qunit": "^7.2.0",
+ "eslint-plugin-unicorn": "^40.1.0",
+ "eslint-plugin-vue": "^8.4.1",
+ "eslint-plugin-wdio": "^7.4.2",
+ "eslint-plugin-yml": "^0.13.0"
+ }
+ },
+ "eslint-plugin-compat": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.0.2.tgz",
+ "integrity": "sha512-xqvoO54CLTVaEYGMzhu35Wzwk/As7rCvz/2dqwnFiWi0OJccEtGIn+5qq3zqIu9nboXlpdBN579fZcItC73Ycg==",
+ "dev": true,
+ "requires": {
+ "@mdn/browser-compat-data": "^4.1.5",
+ "ast-metadata-inferer": "^0.7.0",
+ "browserslist": "^4.16.8",
+ "caniuse-lite": "^1.0.30001304",
+ "core-js": "^3.16.2",
+ "find-up": "^5.0.0",
+ "lodash.memoize": "4.1.2",
+ "semver": "7.3.5"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^5.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ }
+ }
+ },
+ "eslint-plugin-es": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
+ "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ }
+ },
+ "eslint-plugin-jsdoc": {
+ "version": "37.9.7",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-37.9.7.tgz",
+ "integrity": "sha512-8alON8yYcStY94o0HycU2zkLKQdcS+qhhOUNQpfONHHwvI99afbmfpYuPqf6PbLz5pLZldG3Te5I0RbAiTN42g==",
+ "dev": true,
+ "requires": {
+ "@es-joy/jsdoccomment": "~0.20.1",
+ "comment-parser": "1.3.0",
+ "debug": "^4.3.3",
+ "escape-string-regexp": "^4.0.0",
+ "esquery": "^1.4.0",
+ "regextras": "^0.8.0",
+ "semver": "^7.3.5",
+ "spdx-expression-parse": "^3.0.1"
+ },
+ "dependencies": {
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-json-es": {
+ "version": "1.5.7",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.7.tgz",
+ "integrity": "sha512-ehBHcCcJo4iViYx6vp3T+SmwzLIlVDzZNoVxN/txZIiPwDQ26mnYaN5iJ3imqN4l1b8z6rbxEH2kB9XDGxeU/w==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.1"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-mediawiki": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.3.0.tgz",
+ "integrity": "sha512-Lhyj2PSkhDzYSc1PNbURysY/WoqvY0brw558ZInT3erzf5KUlro18MTKFdV+nlht475ZgnsfHsgfg6Ut2w1SVg==",
+ "dev": true,
+ "requires": {
+ "eslint-plugin-vue": "^7.20.0",
+ "upath": "^2.0.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ },
+ "eslint-plugin-vue": {
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz",
+ "integrity": "sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.1.0",
+ "natural-compare": "^1.4.0",
+ "semver": "^6.3.0",
+ "vue-eslint-parser": "^7.10.0"
+ }
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "espree": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
+ "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.1.1",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"dev": true
},
"semver": {
@@ -1120,141 +5901,246 @@
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
},
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "vue-eslint-parser": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz",
+ "integrity": "sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.1",
+ "eslint-scope": "^5.1.1",
+ "eslint-visitor-keys": "^1.1.0",
+ "espree": "^6.2.1",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^6.3.0"
+ }
+ }
+ }
+ },
+ "eslint-plugin-mocha": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz",
+ "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^3.0.0",
+ "ramda": "^0.27.1"
+ },
+ "dependencies": {
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
"dev": true,
"requires": {
- "ansi-regex": "^4.1.0"
+ "eslint-visitor-keys": "^2.0.0"
}
},
- "strip-json-comments": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
- "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
"dev": true
}
}
},
- "eslint-config-wikimedia": {
- "version": "0.15.3",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.15.3.tgz",
- "integrity": "sha512-MGfUwNoW2IckRismX3L8a/CI1CKkYyXHiIyAqiu27TCQwrDubryI+rtuuFYozauB3LC5WSIOnW2m1ZljtPvPPg==",
+ "eslint-plugin-no-jquery": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.7.0.tgz",
+ "integrity": "sha512-Aeg7dA6GTH1AcWLlBtWNzOU9efK5KpNi7b0EhBO0o0M+awyzguUUo8gF6hXGjQ9n5h8/uRtYv9zOqQkeC5CG0w==",
+ "dev": true,
+ "requires": {}
+ },
+ "eslint-plugin-node": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
+ "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
"dev": true,
"requires": {
- "eslint": "^6.8.0",
"eslint-plugin-es": "^3.0.0",
- "eslint-plugin-json": "^2.1.1",
- "eslint-plugin-mediawiki": "^0.2.3",
- "eslint-plugin-no-jquery": "^2.3.2",
- "eslint-plugin-qunit": "^4.0.0",
- "eslint-plugin-vue": "^6.1.2"
+ "eslint-utils": "^2.0.0",
+ "ignore": "^5.1.1",
+ "minimatch": "^3.0.4",
+ "resolve": "^1.10.1",
+ "semver": "^6.1.0"
+ },
+ "dependencies": {
+ "eslint-plugin-es": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
+ "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
}
},
- "eslint-plugin-es": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz",
- "integrity": "sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng==",
+ "eslint-plugin-qunit": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.1.tgz",
+ "integrity": "sha512-L1yutkLqCgr70ZmMAbBKPvUOUwhKryZ0RaJKOzw72Bmn8no3JNBL9hhbX2aTvfZqYM/wLXIT0nICZiGrV4xVJw==",
"dev": true,
"requires": {
- "eslint-utils": "^2.0.0",
- "regexpp": "^3.0.0"
+ "eslint-utils": "^3.0.0",
+ "requireindex": "^1.2.0"
},
"dependencies": {
"eslint-utils": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz",
- "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
"dev": true,
"requires": {
- "eslint-visitor-keys": "^1.1.0"
+ "eslint-visitor-keys": "^2.0.0"
}
},
- "regexpp": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
- "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
"dev": true
}
}
},
- "eslint-plugin-json": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-json/-/eslint-plugin-json-2.1.1.tgz",
- "integrity": "sha512-Ktsab8ij33V2KFLhh4alC1FYztdmbV32DeMZYYUCZm4kKLW1s4DrleKKgtbAHSJsmshCK5QGOZtfyc2r3jCRsg==",
+ "eslint-plugin-unicorn": {
+ "version": "40.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-40.1.0.tgz",
+ "integrity": "sha512-y5doK2DF9Sr5AqKEHbHxjFllJ167nKDRU01HDcWyv4Tnmaoe9iNxMrBnaybZvWZUaE3OC5Unu0lNIevYamloig==",
"dev": true,
"requires": {
- "lodash": "^4.17.15",
- "vscode-json-languageservice": "^3.5.1"
+ "@babel/helper-validator-identifier": "^7.15.7",
+ "ci-info": "^3.3.0",
+ "clean-regexp": "^1.0.0",
+ "eslint-utils": "^3.0.0",
+ "esquery": "^1.4.0",
+ "indent-string": "^4.0.0",
+ "is-builtin-module": "^3.1.0",
+ "lodash": "^4.17.21",
+ "pluralize": "^8.0.0",
+ "read-pkg-up": "^7.0.1",
+ "regexp-tree": "^0.1.24",
+ "safe-regex": "^2.1.1",
+ "semver": "^7.3.5",
+ "strip-indent": "^3.0.0"
+ },
+ "dependencies": {
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
+ }
}
},
- "eslint-plugin-mediawiki": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.2.3.tgz",
- "integrity": "sha512-/6CB/VdwZHIsPZ5gZJ3amwHUbEgbL6DZULXWTRwKoS+2q5t8TS1hu+EX83a1hPrxGWFusfV+bvgOi15aXVXi4Q==",
+ "eslint-plugin-vue": {
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
+ "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
"dev": true,
"requires": {
- "eslint-plugin-vue": "^6.2.2"
+ "eslint-utils": "^3.0.0",
+ "natural-compare": "^1.4.0",
+ "nth-check": "^2.0.1",
+ "postcss-selector-parser": "^6.0.9",
+ "semver": "^7.3.5",
+ "vue-eslint-parser": "^8.0.1"
+ },
+ "dependencies": {
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
+ }
}
},
- "eslint-plugin-no-jquery": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.3.2.tgz",
- "integrity": "sha512-8M9GByb/JOO+dktgbFeC/YAMaqlscInO3fH3A9fLxZduH1NTXsIAUrimas6zDwOLBvEXpRaEZycc2QAl+W+Agw==",
+ "eslint-plugin-wdio": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.20.6.tgz",
+ "integrity": "sha512-OAPKGDi68i/wYFjhqNGuSgHfMyl52XgKOODhL/pT88diEPyX9J3DQh5AaFbDXjCt3HISaA1K7EMQNChIwhG5Zg==",
"dev": true
},
- "eslint-plugin-qunit": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-4.0.0.tgz",
- "integrity": "sha512-+0i2xcYryUoLawi47Lp0iJKzkP931G5GXwIOq1KBKQc2pknV1VPjfE6b4mI2mR2RnL7WRoS30YjwC9SjQgJDXQ==",
- "dev": true
- },
- "eslint-plugin-vue": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz",
- "integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==",
+ "eslint-plugin-yml": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-0.13.0.tgz",
+ "integrity": "sha512-rZvdnhe28jIbgSIZo3qYqkl9hKslyTDfMwqIGDzz873gxghzBw0yeFG+P7sMfOkFfpqwJzZy3IKe2cIiCp4FrA==",
"dev": true,
"requires": {
+ "debug": "^4.3.2",
+ "lodash": "^4.17.21",
"natural-compare": "^1.4.0",
- "semver": "^5.6.0",
- "vue-eslint-parser": "^7.0.0"
+ "yaml-eslint-parser": "^0.5.0"
}
},
"eslint-scope": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
- "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
"dev": true,
"requires": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
}
},
"eslint-utils": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
- "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
"dev": true,
"requires": {
"eslint-visitor-keys": "^1.1.0"
}
},
"eslint-visitor-keys": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
- "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
"dev": true
},
"espree": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz",
- "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==",
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
+ "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
"dev": true,
"requires": {
- "acorn": "^7.1.0",
- "acorn-jsx": "^5.1.0",
- "eslint-visitor-keys": "^1.1.0"
+ "acorn": "^8.7.1",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ }
}
},
"esprima": {
@@ -1264,27 +6150,27 @@
"dev": true
},
"esquery": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
- "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
"dev": true,
"requires": {
- "estraverse": "^4.0.0"
+ "estraverse": "^5.1.0"
}
},
"esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"requires": {
- "estraverse": "^4.1.0"
+ "estraverse": "^5.2.0"
}
},
"estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true
},
"esutils": {
@@ -1317,7 +6203,7 @@
"expand-tilde": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
- "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==",
"dev": true,
"requires": {
"homedir-polyfill": "^1.0.1"
@@ -1329,35 +6215,34 @@
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true
},
- "external-editor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
- "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
- "dev": true,
- "requires": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
- }
- },
"fast-deep-equal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
- "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"fast-glob": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
- "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
+ "version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.0",
+ "glob-parent": "^5.1.2",
"merge2": "^1.3.0",
- "micromatch": "^4.0.2",
- "picomatch": "^2.2.1"
+ "micromatch": "^4.0.4"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
}
},
"fast-json-stable-stringify": {
@@ -1379,30 +6264,21 @@
"dev": true
},
"fastq": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz",
- "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==",
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
"dev": true,
"requires": {
"reusify": "^1.0.4"
}
},
- "figures": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz",
- "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==",
- "dev": true,
- "requires": {
- "escape-string-regexp": "^1.0.5"
- }
- },
"file-entry-cache": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
- "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"requires": {
- "flat-cache": "^2.0.1"
+ "flat-cache": "^3.0.4"
}
},
"fill-range": {
@@ -1468,32 +6344,31 @@
"dev": true
},
"flat-cache": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
- "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
"requires": {
- "flatted": "^2.0.0",
- "rimraf": "2.6.3",
- "write": "1.0.3"
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
}
},
"flatted": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz",
- "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
+ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
"dev": true
},
"for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
"dev": true
},
"for-own": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
- "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==",
"dev": true,
"requires": {
"for-in": "^1.0.1"
@@ -1517,12 +6392,6 @@
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"dev": true
},
- "gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "dev": true
- },
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@@ -1542,9 +6411,9 @@
"dev": true
},
"glob": {
- "version": "7.1.7",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
- "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
@@ -1556,63 +6425,78 @@
}
},
"glob-parent": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
- "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
"requires": {
- "is-glob": "^4.0.1"
+ "is-glob": "^4.0.3"
}
},
"global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
"dev": true,
"requires": {
- "global-prefix": "^3.0.0"
+ "global-prefix": "^1.0.1",
+ "is-windows": "^1.0.1",
+ "resolve-dir": "^1.0.0"
}
},
"global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==",
"dev": true,
"requires": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
+ "expand-tilde": "^2.0.2",
+ "homedir-polyfill": "^1.0.1",
+ "ini": "^1.3.4",
+ "is-windows": "^1.0.1",
+ "which": "^1.2.14"
+ },
+ "dependencies": {
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
}
},
"globals": {
- "version": "12.3.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz",
- "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==",
+ "version": "13.16.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz",
+ "integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==",
"dev": true,
"requires": {
- "type-fest": "^0.8.1"
+ "type-fest": "^0.20.2"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ }
}
},
"globby": {
- "version": "11.0.3",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz",
- "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==",
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true,
"requires": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
- "fast-glob": "^3.1.1",
- "ignore": "^5.1.4",
- "merge2": "^1.3.0",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
"slash": "^3.0.0"
- },
- "dependencies": {
- "ignore": {
- "version": "5.1.8",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
- "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
- "dev": true
- }
}
},
"globjoin": {
@@ -1621,19 +6505,10 @@
"integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=",
"dev": true
},
- "gonzales-pe": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz",
- "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
"grunt": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.4.0.tgz",
- "integrity": "sha512-yRFc0GVCDu9yxqOFzpuXQ2pEdgtLDnFv5Qz54jfIcNnpJ8Z7B7P7kPkT4VMuRvm+N+QOsI8C4v/Q0DSaoj3LgQ==",
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz",
+ "integrity": "sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==",
"dev": true,
"requires": {
"dateformat": "~3.0.3",
@@ -1641,8 +6516,8 @@
"exit": "~0.1.2",
"findup-sync": "~0.3.0",
"glob": "~7.1.6",
- "grunt-cli": "~1.4.2",
- "grunt-known-options": "~1.1.1",
+ "grunt-cli": "~1.4.3",
+ "grunt-known-options": "~2.0.0",
"grunt-legacy-log": "~3.0.0",
"grunt-legacy-util": "~2.0.1",
"iconv-lite": "~0.4.13",
@@ -1651,80 +6526,53 @@
"mkdirp": "~1.0.4",
"nopt": "~3.0.6",
"rimraf": "~3.0.2"
+ }
+ },
+ "grunt-banana-checker": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.10.0.tgz",
+ "integrity": "sha512-Sx+P3zWjn4YmBCqzidnCEkYrACe1SLTIT8kKC6C3f21Hu6sm17U/V+re343cuK3U+iGZv15ux6bY+69buIbYrA==",
+ "dev": true
+ },
+ "grunt-cli": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz",
+ "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==",
+ "dev": true,
+ "requires": {
+ "grunt-known-options": "~2.0.0",
+ "interpret": "~1.1.0",
+ "liftup": "~3.0.1",
+ "nopt": "~4.0.1",
+ "v8flags": "~3.2.0"
},
"dependencies": {
- "grunt-cli": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.2.tgz",
- "integrity": "sha512-wsu6BZh7KCnfeaSkDrKIAvOlqGKxNRTZjc8xfZlvxCByQIqUfZ31kh5uHpPnhQ4NdVgvaWaVxa1LUbVU80nACw==",
+ "nopt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
+ "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
"dev": true,
"requires": {
- "grunt-known-options": "~1.1.1",
- "interpret": "~1.1.0",
- "liftup": "~3.0.1",
- "nopt": "~4.0.1",
- "v8flags": "~3.2.0"
- },
- "dependencies": {
- "nopt": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
- "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
- "dev": true,
- "requires": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- }
- }
- }
- },
- "js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
+ "abbrev": "1",
+ "osenv": "^0.1.4"
}
}
}
},
- "grunt-banana-checker": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.9.0.tgz",
- "integrity": "sha512-SqPiB6OazWqR8USL0NymtuT5Br3mD9WBBsM1rHC/3wIi2SrZNM6/+j9CIeuEM5oCn+AtO2Y0+rzzFyOdC9afAg==",
- "dev": true
- },
"grunt-eslint": {
- "version": "22.0.0",
- "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-22.0.0.tgz",
- "integrity": "sha512-I7vIU4x/mb20fmA6TAmLx6Wzn7mfs8ZXeuk7LbP2ujKVFV7KZmJ3qXUyqe2wnD+v/74Rs5uYOZrLL8EoBmlG9Q==",
+ "version": "24.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-24.0.0.tgz",
+ "integrity": "sha512-WpTeBBFweyhMuPjGwRSQV9JFJ+EczIdlsc7Dd/1g78QVI1aZsk4g/H3e+3S5HEwsS1RKL2YZIrGj8hMLlBfN8w==",
"dev": true,
"requires": {
- "chalk": "^2.1.0",
- "eslint": "^6.0.1"
+ "chalk": "^4.1.2",
+ "eslint": "^8.0.1"
}
},
"grunt-known-options": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
- "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz",
+ "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==",
"dev": true
},
"grunt-legacy-log": {
@@ -1747,57 +6595,6 @@
"requires": {
"chalk": "~4.1.0",
"lodash": "~4.17.19"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
- "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
}
},
"grunt-legacy-util": {
@@ -1820,77 +6617,16 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
}
}
},
"grunt-stylelint": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.15.0.tgz",
- "integrity": "sha512-1G5kbT3Y6OtAqgIv/XErtI6ai1t1UdtQWXxUV5Gd900PQoEzu/WrBYhGNAXdb/9nAsNWNjFHQjtdXQtZcDmobA==",
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.18.0.tgz",
+ "integrity": "sha512-Ks5OfRUCA6E1v5PkCQKYaMErHtoec/Ub0Vb1xvZ0CKm/1zzWKuqEu2ZVtFcQVDqrC5UM6AXaLHpsLiocVKAgbg==",
"dev": true,
"requires": {
- "chalk": "^3.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
+ "chalk": "^4.1.2"
}
},
"hard-rejection": {
@@ -1939,25 +6675,11 @@
}
},
"html-tags": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz",
- "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz",
+ "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==",
"dev": true
},
- "htmlparser2": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
- "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
- "dev": true,
- "requires": {
- "domelementtype": "^1.3.1",
- "domhandler": "^2.3.0",
- "domutils": "^1.5.1",
- "entities": "^1.1.1",
- "inherits": "^2.0.1",
- "readable-stream": "^3.1.1"
- }
- },
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -1968,9 +6690,9 @@
}
},
"ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
"dev": true
},
"import-fresh": {
@@ -2012,59 +6734,21 @@
}
},
"inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
"ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
+ "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==",
"dev": true
},
- "inquirer": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.3.tgz",
- "integrity": "sha512-+OiOVeVydu4hnCGLCSX+wedovR/Yzskv9BFqUNNKq9uU2qg7LCcCo3R86S2E7WLo0y/x2pnEZfZe1CoYnORUAw==",
- "dev": true,
- "requires": {
- "ansi-escapes": "^4.2.1",
- "chalk": "^2.4.2",
- "cli-cursor": "^3.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^3.0.3",
- "figures": "^3.0.0",
- "lodash": "^4.17.15",
- "mute-stream": "0.0.8",
- "run-async": "^2.2.0",
- "rxjs": "^6.5.3",
- "string-width": "^4.1.0",
- "strip-ansi": "^5.1.0",
- "through": "^2.3.6"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
"interpret": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
- "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+ "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==",
"dev": true
},
"is-absolute": {
@@ -2077,53 +6761,34 @@
"is-windows": "^1.0.1"
}
},
- "is-alphabetical": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
- "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
- "dev": true
- },
- "is-alphanumerical": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
- "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
- "dev": true,
- "requires": {
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0"
- }
- },
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
"dev": true
},
- "is-buffer": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
- "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
- "dev": true
+ "is-builtin-module": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz",
+ "integrity": "sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "^3.0.0"
+ }
},
"is-core-module": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
- "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+ "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
"dev": true,
"requires": {
"has": "^1.0.3"
}
},
- "is-decimal": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
- "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
- "dev": true
- },
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true
},
"is-fullwidth-code-point": {
@@ -2133,32 +6798,20 @@
"dev": true
},
"is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"requires": {
"is-extglob": "^2.1.1"
}
},
- "is-hexadecimal": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
- "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
- "dev": true
- },
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
- "is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
- "dev": true
- },
"is-plain-object": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -2168,12 +6821,6 @@
"isobject": "^3.0.1"
}
},
- "is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
- "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
- "dev": true
- },
"is-regexp": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz",
@@ -2189,12 +6836,6 @@
"is-unc-path": "^1.0.0"
}
},
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
"is-unc-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
@@ -2204,12 +6845,6 @@
"unc-path-regex": "^0.1.2"
}
},
- "is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
- "dev": true
- },
"is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
@@ -2219,7 +6854,7 @@
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
"dev": true
},
"isexe": {
@@ -2231,7 +6866,7 @@
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
"dev": true
},
"js-tokens": {
@@ -2241,19 +6876,19 @@
"dev": true
},
"js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+ "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
}
},
- "jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "jsdoc-type-pratt-parser": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-2.2.5.tgz",
+ "integrity": "sha512-2a6eRxSxp1BW040hFvaJxhsCMI9lT8QB8t14t+NY5tC5rckIR0U9cr2tjOeaFirmEOy6MHvmJnY7zTBHq431Lw==",
"dev": true
},
"json-parse-even-better-errors": {
@@ -2274,21 +6909,6 @@
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
- "json5": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
- "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "jsonc-parser": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz",
- "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==",
- "dev": true
- },
"kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@@ -2296,15 +6916,16 @@
"dev": true
},
"known-css-properties": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.20.0.tgz",
- "integrity": "sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw==",
- "dev": true
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.25.0.tgz",
+ "integrity": "sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==",
+ "dev": true,
+ "peer": true
},
"ldjson-stream": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ldjson-stream/-/ldjson-stream-1.2.1.tgz",
- "integrity": "sha1-kb7O2lrE7SsX5kn7d356v6AYnCs=",
+ "integrity": "sha512-xw/nNEXafuPSLu8NjjG3+atVVw+8U1APZAQylmwQn19Hgw6rC7QjHvP6MupnHWCrzSm9m0xs5QWkCLuRvBPjgQ==",
"dev": true,
"requires": {
"split2": "^0.2.1",
@@ -2314,7 +6935,7 @@
"readable-stream": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
@@ -2323,16 +6944,10 @@
"string_decoder": "~0.10.x"
}
},
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- },
"through2": {
"version": "0.6.5",
"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
- "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
"dev": true,
"requires": {
"readable-stream": ">=1.0.33-1 <1.1.0-0",
@@ -2342,13 +6957,13 @@
}
},
"levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
"requires": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
}
},
"liftup": {
@@ -2378,16 +6993,6 @@
"micromatch": "^4.0.2",
"resolve-dir": "^1.0.1"
}
- },
- "resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
- }
}
}
},
@@ -2412,83 +7017,22 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
- "lodash.clonedeep": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
- "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+ "lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+ "dev": true
+ },
+ "lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
"lodash.truncate": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
- "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
- "dev": true
- },
- "log-symbols": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
- "dev": true,
- "requires": {
- "chalk": "^4.1.0",
- "is-unicode-supported": "^0.1.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
- "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "longest-streak": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
- "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
+ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
"dev": true
},
"lru-cache": {
@@ -2512,7 +7056,7 @@
"map-cache": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
"dev": true
},
"map-obj": {
@@ -2527,47 +7071,15 @@
"integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
"dev": true
},
- "mdast-util-from-markdown": {
- "version": "0.8.5",
- "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
- "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
- "dev": true,
- "requires": {
- "@types/mdast": "^3.0.0",
- "mdast-util-to-string": "^2.0.0",
- "micromark": "~2.11.0",
- "parse-entities": "^2.0.0",
- "unist-util-stringify-position": "^2.0.0"
- }
- },
- "mdast-util-to-markdown": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
- "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "longest-streak": "^2.0.0",
- "mdast-util-to-string": "^2.0.0",
- "parse-entities": "^2.0.0",
- "repeat-string": "^1.0.0",
- "zwitch": "^1.0.0"
- }
- },
- "mdast-util-to-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
- "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
- "dev": true
- },
"meow": {
- "version": "8.1.2",
- "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
- "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
+ "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
"dev": true,
"requires": {
"@types/minimist": "^1.2.0",
"camelcase-keys": "^6.2.2",
+ "decamelize": "^1.2.0",
"decamelize-keys": "^1.1.0",
"hard-rejection": "^2.1.0",
"minimist-options": "4.1.0",
@@ -2593,32 +7105,16 @@
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true
},
- "micromark": {
- "version": "2.11.4",
- "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
- "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
- "dev": true,
- "requires": {
- "debug": "^4.0.0",
- "parse-entities": "^2.0.0"
- }
- },
"micromatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
"dev": true,
"requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.0.5"
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
}
},
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true
- },
"min-indent": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
@@ -2634,12 +7130,6 @@
"brace-expansion": "^1.1.7"
}
},
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
- },
"minimist-options": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
@@ -2660,13 +7150,10 @@
}
},
"mkdirp": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz",
- "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true
},
"ms": {
"version": "2.1.2",
@@ -2695,16 +7182,10 @@
}
}
},
- "mute-stream": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
- "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
- "dev": true
- },
"nanoid": {
- "version": "3.1.23",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
- "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
"dev": true
},
"natural-compare": {
@@ -2713,16 +7194,10 @@
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true
},
- "nice-try": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
- "dev": true
- },
"node-releases": {
- "version": "1.1.71",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz",
- "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==",
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
+ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
"dev": true
},
"nopt": {
@@ -2735,60 +7210,42 @@
}
},
"normalize-package-data": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz",
- "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+ "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
"dev": true,
"requires": {
"hosted-git-info": "^4.0.1",
- "resolve": "^1.20.0",
+ "is-core-module": "^2.5.0",
"semver": "^7.3.4",
"validate-npm-package-license": "^3.0.1"
- },
- "dependencies": {
- "resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
- }
- },
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
}
},
- "normalize-range": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true
},
"normalize-selector": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz",
- "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=",
+ "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==",
"dev": true
},
- "num2fraction": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
- "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
- "dev": true
+ "nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "requires": {
+ "boolbase": "^1.0.0"
+ }
},
"object.defaults": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
- "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==",
"dev": true,
"requires": {
"array-each": "^1.0.1",
@@ -2800,7 +7257,7 @@
"object.map": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
- "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+ "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==",
"dev": true,
"requires": {
"for-own": "^1.0.0",
@@ -2810,7 +7267,7 @@
"object.pick": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
"dev": true,
"requires": {
"isobject": "^3.0.1"
@@ -2825,39 +7282,30 @@
"wrappy": "1"
}
},
- "onetime": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
- "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
- "dev": true,
- "requires": {
- "mimic-fn": "^2.1.0"
- }
- },
"optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
"dev": true,
"requires": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
}
},
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
"dev": true
},
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
"dev": true
},
"osenv": {
@@ -2903,24 +7351,10 @@
"callsites": "^3.0.0"
}
},
- "parse-entities": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
- "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
- "dev": true,
- "requires": {
- "character-entities": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "character-reference-invalid": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-hexadecimal": "^1.0.0"
- }
- },
"parse-filepath": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
- "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+ "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==",
"dev": true,
"requires": {
"is-absolute": "^1.0.0",
@@ -2943,7 +7377,7 @@
"parse-passwd": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
- "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
"dev": true
},
"path-exists": {
@@ -2959,21 +7393,21 @@
"dev": true
},
"path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true
},
"path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"path-root": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
- "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==",
"dev": true,
"requires": {
"path-root-regex": "^0.1.0"
@@ -2982,7 +7416,7 @@
"path-root-regex": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
- "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
+ "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==",
"dev": true
},
"path-type": {
@@ -2991,57 +7425,41 @@
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true
},
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
"picomatch": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
- "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true
},
- "postcss": {
- "version": "7.0.35",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
- "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.2",
- "source-map": "^0.6.1",
- "supports-color": "^6.1.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
+ "pluralize": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
+ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
+ "dev": true
},
- "postcss-html": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz",
- "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==",
+ "postcss": {
+ "version": "8.4.14",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
+ "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
"dev": true,
"requires": {
- "htmlparser2": "^3.10.0"
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
}
},
"postcss-less": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz",
- "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-6.0.0.tgz",
+ "integrity": "sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==",
"dev": true,
- "requires": {
- "postcss": "^7.0.14"
- }
+ "requires": {}
},
"postcss-media-query-parser": {
"version": "0.2.3",
@@ -3056,65 +7474,32 @@
"dev": true
},
"postcss-safe-parser": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz",
- "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==",
- "dev": true,
- "requires": {
- "postcss": "^7.0.26"
- }
- },
- "postcss-sass": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz",
- "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==",
- "dev": true,
- "requires": {
- "gonzales-pe": "^4.3.0",
- "postcss": "^7.0.21"
- }
- },
- "postcss-scss": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz",
- "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+ "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
"dev": true,
- "requires": {
- "postcss": "^7.0.6"
- }
+ "requires": {}
},
"postcss-selector-parser": {
- "version": "6.0.6",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
- "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
"dev": true,
"requires": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
}
},
- "postcss-syntax": {
- "version": "0.36.2",
- "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz",
- "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==",
- "dev": true
- },
"postcss-value-parser": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
- "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
"prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
- "dev": true
- },
- "progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true
},
"punycode": {
@@ -3135,6 +7520,12 @@
"integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
"dev": true
},
+ "ramda": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz",
+ "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==",
+ "dev": true
+ },
"read-pkg": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
@@ -3165,6 +7556,12 @@
"validate-npm-package-license": "^3.0.1"
}
},
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
"type-fest": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
@@ -3185,20 +7582,21 @@
}
},
"readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
"dev": true,
"requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
}
},
"rechoir": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
- "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
+ "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
"dev": true,
"requires": {
"resolve": "^1.9.0"
@@ -3214,51 +7612,28 @@
"strip-indent": "^3.0.0"
}
},
- "regexpp": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
- "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
+ "regexp-tree": {
+ "version": "0.1.24",
+ "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz",
+ "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==",
"dev": true
},
- "remark": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
- "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
- "dev": true,
- "requires": {
- "remark-parse": "^9.0.0",
- "remark-stringify": "^9.0.0",
- "unified": "^9.1.0"
- }
- },
- "remark-parse": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
- "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
- "dev": true,
- "requires": {
- "mdast-util-from-markdown": "^0.8.0"
- }
- },
- "remark-stringify": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz",
- "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==",
- "dev": true,
- "requires": {
- "mdast-util-to-markdown": "^0.6.0"
- }
+ "regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true
},
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "regextras": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz",
+ "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==",
"dev": true
},
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true
},
"require-from-string": {
@@ -3267,49 +7642,31 @@
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true
},
+ "requireindex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
+ "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
+ "dev": true
+ },
"resolve": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
- "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==",
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
"dev": true,
"requires": {
- "path-parse": "^1.0.6"
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
}
},
"resolve-dir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
- "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==",
"dev": true,
"requires": {
"expand-tilde": "^2.0.0",
"global-modules": "^1.0.0"
- },
- "dependencies": {
- "global-modules": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
- "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
- "dev": true,
- "requires": {
- "global-prefix": "^1.0.1",
- "is-windows": "^1.0.1",
- "resolve-dir": "^1.0.0"
- }
- },
- "global-prefix": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
- "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
- "dev": true,
- "requires": {
- "expand-tilde": "^2.0.2",
- "homedir-polyfill": "^1.0.1",
- "ini": "^1.3.4",
- "is-windows": "^1.0.1",
- "which": "^1.2.14"
- }
- }
}
},
"resolve-from": {
@@ -3318,16 +7675,6 @@
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true
},
- "restore-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
- "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
- "dev": true,
- "requires": {
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2"
- }
- },
"reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -3335,37 +7682,12 @@
"dev": true
},
"rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
"glob": "^7.1.3"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
- "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- }
- }
- },
- "run-async": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
- "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
- "dev": true,
- "requires": {
- "is-promise": "^2.1.0"
}
},
"run-parallel": {
@@ -3377,21 +7699,21 @@
"queue-microtask": "^1.2.2"
}
},
- "rxjs": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
- "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz",
+ "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==",
"dev": true,
"requires": {
- "tslib": "^1.9.0"
+ "regexp-tree": "~0.1.1"
}
},
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -3399,30 +7721,33 @@
"dev": true
},
"semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
- "dev": true
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
},
"shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"requires": {
- "shebang-regex": "^1.0.0"
+ "shebang-regex": "^3.0.0"
}
},
"shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true
},
"signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true
},
"slash": {
@@ -3432,28 +7757,52 @@
"dev": true
},
"slice-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
- "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.0",
- "astral-regex": "^1.0.0",
- "is-fullwidth-code-point": "^2.0.0"
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
},
"dependencies": {
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
}
}
},
"source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "dev": true
+ },
+ "source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"dev": true
},
"spdx-correct": {
@@ -3483,9 +7832,9 @@
}
},
"spdx-license-ids": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz",
- "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==",
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
+ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
"dev": true
},
"specificity": {
@@ -3497,7 +7846,7 @@
"split2": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/split2/-/split2-0.2.1.tgz",
- "integrity": "sha1-At2smtwD7Au3jBKC7Aecpuha6QA=",
+ "integrity": "sha512-D/oTExYAkC9nWleOCTOyNmAuzfAT/6rHGBA9LIK7FVnGo13CSvrKCUzKenwH6U1s2znY9MqH6v0UQTEDa3vJmg==",
"dev": true,
"requires": {
"through2": "~0.6.1"
@@ -3506,7 +7855,7 @@
"readable-stream": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
@@ -3515,16 +7864,10 @@
"string_decoder": "~0.10.x"
}
},
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- },
"through2": {
"version": "0.6.5",
"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
- "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
"dev": true,
"requires": {
"readable-stream": ">=1.0.33-1 <1.1.0-0",
@@ -3534,63 +7877,35 @@
}
},
"sprintf-js": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
- "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
"dev": true
},
"string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "dev": true
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.2.0"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true
- }
+ "strip-ansi": "^6.0.1"
}
},
"strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"requires": {
- "ansi-regex": "^5.0.0"
+ "ansi-regex": "^5.0.1"
}
},
"strip-indent": {
@@ -3602,6 +7917,12 @@
"min-indent": "^1.0.0"
}
},
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
"style-search": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
@@ -3609,169 +7930,165 @@
"dev": true
},
"stylelint": {
- "version": "13.8.0",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.8.0.tgz",
- "integrity": "sha512-iHH3dv3UI23SLDrH4zMQDjLT9/dDIz/IpoFeuNxZmEx86KtfpjDOscxLTFioQyv+2vQjPlRZnK0UoJtfxLICXQ==",
- "dev": true,
- "requires": {
- "@stylelint/postcss-css-in-js": "^0.37.2",
- "@stylelint/postcss-markdown": "^0.36.2",
- "autoprefixer": "^9.8.6",
- "balanced-match": "^1.0.0",
- "chalk": "^4.1.0",
- "cosmiconfig": "^7.0.0",
- "debug": "^4.2.0",
+ "version": "14.9.1",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.9.1.tgz",
+ "integrity": "sha512-RdAkJdPiLqHawCSnu21nE27MjNXaVd4WcOHA4vK5GtIGjScfhNnaOuWR2wWdfKFAvcWQPOYe311iveiVKSmwsA==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "@csstools/selector-specificity": "^2.0.1",
+ "balanced-match": "^2.0.0",
+ "colord": "^2.9.2",
+ "cosmiconfig": "^7.0.1",
+ "css-functions-list": "^3.1.0",
+ "debug": "^4.3.4",
"execall": "^2.0.0",
- "fast-glob": "^3.2.4",
+ "fast-glob": "^3.2.11",
"fastest-levenshtein": "^1.0.12",
- "file-entry-cache": "^6.0.0",
+ "file-entry-cache": "^6.0.1",
"get-stdin": "^8.0.0",
"global-modules": "^2.0.0",
- "globby": "^11.0.1",
+ "globby": "^11.1.0",
"globjoin": "^0.1.4",
- "html-tags": "^3.1.0",
- "ignore": "^5.1.8",
+ "html-tags": "^3.2.0",
+ "ignore": "^5.2.0",
"import-lazy": "^4.0.0",
"imurmurhash": "^0.1.4",
- "known-css-properties": "^0.20.0",
- "lodash": "^4.17.20",
- "log-symbols": "^4.0.0",
+ "is-plain-object": "^5.0.0",
+ "known-css-properties": "^0.25.0",
"mathml-tag-names": "^2.1.3",
- "meow": "^8.0.0",
- "micromatch": "^4.0.2",
- "normalize-selector": "^0.2.0",
- "postcss": "^7.0.35",
- "postcss-html": "^0.36.0",
- "postcss-less": "^3.1.4",
+ "meow": "^9.0.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.14",
"postcss-media-query-parser": "^0.2.3",
"postcss-resolve-nested-selector": "^0.1.1",
- "postcss-safe-parser": "^4.0.2",
- "postcss-sass": "^0.4.4",
- "postcss-scss": "^2.1.1",
- "postcss-selector-parser": "^6.0.4",
- "postcss-syntax": "^0.36.2",
- "postcss-value-parser": "^4.1.0",
+ "postcss-safe-parser": "^6.0.0",
+ "postcss-selector-parser": "^6.0.10",
+ "postcss-value-parser": "^4.2.0",
"resolve-from": "^5.0.0",
- "slash": "^3.0.0",
- "specificity": "^0.4.1",
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
"style-search": "^0.1.0",
- "sugarss": "^2.0.0",
+ "supports-hyperlinks": "^2.2.0",
"svg-tags": "^1.0.0",
- "table": "^6.0.3",
- "v8-compile-cache": "^2.2.0",
- "write-file-atomic": "^3.0.3"
+ "table": "^6.8.0",
+ "v8-compile-cache": "^2.3.0",
+ "write-file-atomic": "^4.0.1"
},
"dependencies": {
- "ajv": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.3.0.tgz",
- "integrity": "sha512-RYE7B5An83d7eWnDR8kbdaIFqmKCNsP16ay1hDbJEU+sa0e3H9SebskCt0Uufem6cfAVu7Col6ubcn/W+Sm8/Q==",
+ "balanced-match": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
+ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
"dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
+ "peer": true
},
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
"dev": true,
+ "peer": true,
"requires": {
- "color-convert": "^2.0.1"
+ "global-prefix": "^3.0.0"
}
},
- "astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true
- },
- "chalk": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
- "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
"dev": true,
+ "peer": true,
"requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
}
},
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
+ "peer": true
},
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "peer": true
},
- "debug": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
- "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
+ "peer": true,
"requires": {
- "ms": "2.1.2"
+ "isexe": "^2.0.0"
}
- },
- "fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ }
+ }
+ },
+ "stylelint-config-recommended": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz",
+ "integrity": "sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==",
+ "dev": true,
+ "requires": {}
+ },
+ "stylelint-config-wikimedia": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.13.0.tgz",
+ "integrity": "sha512-1R1g/uc53z2z39ejZMALwC6fTfSZhkzDjj1v8ODCWtLCiuqWuSf3HR1ZTXT5X5AtSbZq1W9+0p5HJp6rPVXkRg==",
+ "dev": true,
+ "requires": {
+ "browserslist-config-wikimedia": "0.4.0",
+ "postcss-less": "6.0.0",
+ "stylelint": "14.8.1",
+ "stylelint-config-recommended": "7.0.0",
+ "stylelint-no-unsupported-browser-features": "5.0.3"
+ },
+ "dependencies": {
+ "balanced-match": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
+ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
"dev": true
},
- "file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
"dev": true,
"requires": {
- "flat-cache": "^3.0.4"
+ "global-prefix": "^3.0.0"
}
},
- "flat-cache": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
"dev": true,
"requires": {
- "flatted": "^3.1.0",
- "rimraf": "^3.0.2"
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
}
},
- "flatted": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
- "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"dev": true
},
- "ignore": {
- "version": "5.1.8",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
- "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
- "dev": true
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "known-css-properties": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.24.0.tgz",
+ "integrity": "sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA==",
"dev": true
},
"resolve-from": {
@@ -3780,104 +8097,75 @@
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true
},
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "stylelint": {
+ "version": "14.8.1",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.8.1.tgz",
+ "integrity": "sha512-0YxTop3wTeEVmQWhS7jjLFaBkvfPmffRiJ6eFIDlK++f3OklaobTYFJu32E5u/cIrFLbcW52pLqrYpihA/y0/w==",
"dev": true,
"requires": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
+ "balanced-match": "^2.0.0",
+ "colord": "^2.9.2",
+ "cosmiconfig": "^7.0.1",
+ "css-functions-list": "^3.0.1",
+ "debug": "^4.3.4",
+ "execall": "^2.0.0",
+ "fast-glob": "^3.2.11",
+ "fastest-levenshtein": "^1.0.12",
+ "file-entry-cache": "^6.0.1",
+ "get-stdin": "^8.0.0",
+ "global-modules": "^2.0.0",
+ "globby": "^11.1.0",
+ "globjoin": "^0.1.4",
+ "html-tags": "^3.2.0",
+ "ignore": "^5.2.0",
+ "import-lazy": "^4.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-plain-object": "^5.0.0",
+ "known-css-properties": "^0.24.0",
+ "mathml-tag-names": "^2.1.3",
+ "meow": "^9.0.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "normalize-selector": "^0.2.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.12",
+ "postcss-media-query-parser": "^0.2.3",
+ "postcss-resolve-nested-selector": "^0.1.1",
+ "postcss-safe-parser": "^6.0.0",
+ "postcss-selector-parser": "^6.0.10",
+ "postcss-value-parser": "^4.2.0",
+ "resolve-from": "^5.0.0",
+ "specificity": "^0.4.1",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "style-search": "^0.1.0",
+ "supports-hyperlinks": "^2.2.0",
+ "svg-tags": "^1.0.0",
+ "table": "^6.8.0",
+ "v8-compile-cache": "^2.3.0",
+ "write-file-atomic": "^4.0.1"
}
},
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "table": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/table/-/table-6.7.0.tgz",
- "integrity": "sha512-SAM+5p6V99gYiiy2gT5ArdzgM1dLDed0nkrWmG6Fry/bUS/m9x83BwpJUOf1Qj/x2qJd+thL6IkIx7qPGRxqBw==",
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"requires": {
- "ajv": "^8.0.1",
- "lodash.clonedeep": "^4.5.0",
- "lodash.truncate": "^4.4.2",
- "slice-ansi": "^4.0.0",
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0"
+ "isexe": "^2.0.0"
}
- },
- "v8-compile-cache": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
- "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
- "dev": true
}
}
},
- "stylelint-config-wikimedia": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.10.3.tgz",
- "integrity": "sha512-+n082jsEfX4v+ra5F6RfsEnjG6VymnHc613yJeyQAJtigL/+B5XDduVmtXk5vPZ01s0eXTOzVuK0aJ98ofmkoA==",
- "dev": true,
- "requires": {
- "stylelint": "13.8.0",
- "stylelint-no-unsupported-browser-features": "4.1.4"
- }
- },
"stylelint-no-unsupported-browser-features": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-4.1.4.tgz",
- "integrity": "sha512-GORR+/z4KkWP9SWO4fLmC5WAIjDClShSfwCYTuAB9cT8GE+rtOXeAqw5RyXuN9BLIBAPjeO2W7LFIrWUH8x7FA==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-5.0.3.tgz",
+ "integrity": "sha512-FqfbOTk5UEkHsAKOkPH6SvajsfO9YuoWvKxd34tCRBZug9ZNeaPn141nyWkd+ncc8S1gVmO2+O6qVAMj9bvWww==",
"dev": true,
"requires": {
- "doiuse": "^4.3.1",
+ "doiuse": "^4.4.1",
"lodash": "^4.17.15",
- "postcss": "^8.1.4"
- },
- "dependencies": {
- "postcss": {
- "version": "8.2.15",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz",
- "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==",
- "dev": true,
- "requires": {
- "colorette": "^1.2.2",
- "nanoid": "^3.1.23",
- "source-map": "^0.6.1"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "sugarss": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz",
- "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==",
- "dev": true,
- "requires": {
- "postcss": "^7.0.2"
+ "postcss": "^8.3.6"
}
},
"supports-color": {
@@ -3889,6 +8177,39 @@
"has-flag": "^3.0.0"
}
},
+ "supports-hyperlinks": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz",
+ "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true
+ },
"svg-tags": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
@@ -3896,54 +8217,35 @@
"dev": true
},
"table": {
- "version": "5.4.6",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
- "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
+ "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
"dev": true,
"requires": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
+ "ajv": "^8.0.1",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
},
"dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "ajv": {
+ "version": "8.11.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
+ "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
"dev": true,
"requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
}
},
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
}
}
},
@@ -3953,12 +8255,6 @@
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
"dev": true
},
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
- "dev": true
- },
"through2": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
@@ -3966,23 +8262,30 @@
"dev": true,
"requires": {
"readable-stream": "3"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ }
+ }
}
},
- "tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "dev": true,
- "requires": {
- "os-tmpdir": "~1.0.2"
- }
- },
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
- "dev": true
- },
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -3993,30 +8296,18 @@
}
},
"trim-newlines": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
- "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
- "dev": true
- },
- "trough": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
- "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
- "dev": true
- },
- "tslib": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
- "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
"dev": true
},
"type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"requires": {
- "prelude-ls": "~1.1.2"
+ "prelude-ls": "^1.2.1"
}
},
"type-fest": {
@@ -4025,19 +8316,10 @@
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true
},
- "typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "dev": true,
- "requires": {
- "is-typedarray": "^1.0.0"
- }
- },
"unc-path-regex": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
- "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
+ "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==",
"dev": true
},
"underscore.string": {
@@ -4050,48 +8332,26 @@
"util-deprecate": "^1.0.2"
}
},
- "unified": {
- "version": "9.2.1",
- "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz",
- "integrity": "sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==",
- "dev": true,
- "requires": {
- "bail": "^1.0.0",
- "extend": "^3.0.0",
- "is-buffer": "^2.0.0",
- "is-plain-obj": "^2.0.0",
- "trough": "^1.0.0",
- "vfile": "^4.0.0"
- }
- },
- "unist-util-find-all-after": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz",
- "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==",
- "dev": true,
- "requires": {
- "unist-util-is": "^4.0.0"
- }
- },
- "unist-util-is": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
- "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
+ "upath": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz",
+ "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==",
"dev": true
},
- "unist-util-stringify-position": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
- "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
+ "update-browserslist-db": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz",
+ "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==",
"dev": true,
"requires": {
- "@types/unist": "^2.0.2"
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
}
},
"uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
- "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"requires": {
"punycode": "^2.1.0"
@@ -4104,9 +8364,9 @@
"dev": true
},
"v8-compile-cache": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
- "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
"v8flags": {
@@ -4128,83 +8388,33 @@
"spdx-expression-parse": "^3.0.0"
}
},
- "vfile": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
- "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "is-buffer": "^2.0.0",
- "unist-util-stringify-position": "^2.0.0",
- "vfile-message": "^2.0.0"
- }
- },
- "vfile-message": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
- "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-stringify-position": "^2.0.0"
- }
- },
- "vscode-json-languageservice": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.5.2.tgz",
- "integrity": "sha512-9cUvBq00O08lpWVVOx6tQ1yLxCHss79nsUdEAVYGomRyMbnPBmc0AkYPcXI9WK1EM6HBo0R9Zo3NjFhcICpy4A==",
- "dev": true,
- "requires": {
- "jsonc-parser": "^2.2.1",
- "vscode-languageserver-textdocument": "^1.0.1",
- "vscode-languageserver-types": "^3.15.1",
- "vscode-nls": "^4.1.1",
- "vscode-uri": "^2.1.1"
- }
- },
- "vscode-languageserver-textdocument": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz",
- "integrity": "sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA==",
- "dev": true
- },
- "vscode-languageserver-types": {
- "version": "3.15.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz",
- "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==",
- "dev": true
- },
- "vscode-nls": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.2.tgz",
- "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==",
- "dev": true
- },
- "vscode-uri": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.1.tgz",
- "integrity": "sha512-eY9jmGoEnVf8VE8xr5znSah7Qt1P/xsCdErz+g8HYZtJ7bZqKH5E3d+6oVNm1AC/c6IHUDokbmVXKOi4qPAC9A==",
- "dev": true
- },
"vue-eslint-parser": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.0.0.tgz",
- "integrity": "sha512-yR0dLxsTT7JfD2YQo9BhnQ6bUTLsZouuzt9SKRP7XNaZJV459gvlsJo4vT2nhZ/2dH9j3c53bIx9dnqU2prM9g==",
- "dev": true,
- "requires": {
- "debug": "^4.1.1",
- "eslint-scope": "^5.0.0",
- "eslint-visitor-keys": "^1.1.0",
- "espree": "^6.1.2",
- "esquery": "^1.0.1",
- "lodash": "^4.17.15"
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
+ "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.3.2",
+ "eslint-scope": "^7.0.0",
+ "eslint-visitor-keys": "^3.1.0",
+ "espree": "^9.0.0",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.5"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ }
}
},
"which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"requires": {
"isexe": "^2.0.0"
@@ -4259,25 +8469,14 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
- "write": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
- "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
- "dev": true,
- "requires": {
- "mkdirp": "^0.5.1"
- }
- },
"write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz",
+ "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==",
"dev": true,
"requires": {
"imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
+ "signal-exit": "^3.0.7"
}
},
"xtend": {
@@ -4304,6 +8503,25 @@
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
"dev": true
},
+ "yaml-eslint-parser": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-0.5.0.tgz",
+ "integrity": "sha512-nJeyLA3YHAzhBTZbRAbu3W6xrSCucyxExmA+ZDtEdUFpGllxAZpto2Zxo2IG0r0eiuEiBM4e+wiAdxTziTq94g==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^3.0.0",
+ "lodash": "^4.17.21",
+ "yaml": "^1.10.2"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ }
+ }
+ },
"yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
@@ -4320,15 +8538,15 @@
}
},
"yargs-parser": {
- "version": "20.2.7",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz",
- "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==",
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
"dev": true
},
- "zwitch": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
- "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
+ "yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true
}
}
diff --git a/OAuth/package.json b/OAuth/package.json
index a7754cea..29eb939c 100644
--- a/OAuth/package.json
+++ b/OAuth/package.json
@@ -4,11 +4,11 @@
"test": "grunt test"
},
"devDependencies": {
- "eslint-config-wikimedia": "0.15.3",
- "grunt": "1.4.0",
- "grunt-banana-checker": "0.9.0",
- "grunt-eslint": "22.0.0",
- "grunt-stylelint": "0.15.0",
- "stylelint-config-wikimedia": "0.10.3"
+ "eslint-config-wikimedia": "0.22.1",
+ "grunt": "1.5.3",
+ "grunt-banana-checker": "0.10.0",
+ "grunt-eslint": "24.0.0",
+ "grunt-stylelint": "0.18.0",
+ "stylelint-config-wikimedia": "0.13.0"
}
}
diff --git a/OAuth/resources/modules/ext.MWOAuth.AuthorizeDialog.js b/OAuth/resources/modules/ext.MWOAuth.AuthorizeDialog.js
index 6e1eda4f..524c001c 100644
--- a/OAuth/resources/modules/ext.MWOAuth.AuthorizeDialog.js
+++ b/OAuth/resources/modules/ext.MWOAuth.AuthorizeDialog.js
@@ -1,5 +1,6 @@
/**
* OAuth JavaScript
+ *
* @author Aaron Schulz 2013
*/
( function () {
@@ -7,29 +8,20 @@
var mwoauth = {
init: function () {
- var form = $( '#mw-mwoauth-authorize-dialog' ),
- accept = $( '#mw-mwoauth-accept' );
- form.find( '.mw-htmlform-submit-buttons' ).addClass( 'mw-ui-flush-right' );
- form.dialog( {
- dialogClass: 'mw-mwoauth-authorize-jQuery-dialog',
- width: 0.3 * $( window ).width(),
- title: mw.msg( 'mwoauth-desc' ),
- draggable: false,
- resizable: false,
- open: function () {
- $( window ).scrollTop( 0 );
- },
- create: function () {
- $( this ).parents( '.ui-dialog:first' )
- .find( '.ui-dialog-content' ).css( 'padding', '20px' );
- $( this ).css( 'maxHeight', 0.9 * $( window ).height() );
- $( this ).css( 'background-color', '#fff' );
- $( this ).css( 'border', '1px #ccc' );
- $( this ).dialog( 'option', 'modal', true );
- }
+ var $form = $( '#mw-mwoauth-authorize-form' );
+
+ OO.ui.getWindowManager().openWindow( 'message', {
+ message: $form,
+ size: 'medium',
+ actions: []
+ } ).opening.then( function () {
+ // Appending the <form> to a <label> makes the whole form a click target
+ // for 'Allow', so move it out of the <label>
+ OO.ui.getWindowManager().getCurrentWindow().text.$element.append( $form );
} );
- form.submit( function () {
- accept.prop( 'disabled', true );
+
+ $form.on( 'submit', function () {
+ $( '#mw-mwoauth-accept' ).prop( 'disabled', true );
} );
}
};
diff --git a/OAuth/resources/modules/ext.MWOAuth.AuthorizeForm.css b/OAuth/resources/modules/ext.MWOAuth.AuthorizeForm.css
deleted file mode 100644
index 0f17df2d..00000000
--- a/OAuth/resources/modules/ext.MWOAuth.AuthorizeForm.css
+++ /dev/null
@@ -1,38 +0,0 @@
-#mw-mwoauth-authorize-form {
- font-size: 1em;
- color: #333;
-}
-
-#mw-mwoauth-authorize-form > a {
- font-size: 0.8em;
-}
-
-#mw-mwoauth-authorize-form > p {
- font-size: 1.4em;
- padding-left: 1em;
-}
-
-#mw-mwoauth-authorize-form > ul {
- padding-top: 0.5em;
- line-height: 1em;
-}
-
-#mw-mwoauth-authorize-form span.mw-grantgroup {
- font-weight: bold;
- font-size: 1.2em;
-}
-
-input.mw-mwoauth-authorize-button {
- float: right;
- margin-left: 0.7em;
- margin-right: 0.7em;
- margin-bottom: 0.5em;
-}
-
-.client-js #mw-mwoauth-authorize-dialog {
- display: none; /* no flicker */
-}
-
-.mw-mwoauth-authorize-jQuery-dialog .ui-dialog-titlebar {
- display: none;
-}
diff --git a/OAuth/resources/modules/ext.MWOAuth.AuthorizeForm.less b/OAuth/resources/modules/ext.MWOAuth.AuthorizeForm.less
new file mode 100644
index 00000000..a2d96a11
--- /dev/null
+++ b/OAuth/resources/modules/ext.MWOAuth.AuthorizeForm.less
@@ -0,0 +1,59 @@
+#mw-mwoauth-authorize-form {
+ /* Unify font size across various skins */
+ /* stylelint-disable-next-line declaration-property-unit-disallowed-list */
+ font-size: 14px;
+ color: #333;
+
+ > a {
+ font-size: 0.8em;
+ }
+
+ > p {
+ font-size: 1.2em;
+ line-height: 1.4;
+ }
+
+ > ul {
+ padding-top: 0.5em;
+ line-height: 1em;
+ }
+
+ span.mw-grantgroup {
+ font-weight: bold;
+ font-size: 1.2em;
+ }
+
+ .mw-htmlform-ooui-header {
+ margin-top: 0;
+ }
+
+ .client-js .mw-body-content & {
+ display: none; /* no flicker */
+ }
+
+ .mw-htmlform-submit-buttons {
+ display: inline-block;
+ margin-right: 1em;
+ }
+
+ .oo-ui-messageDialog-text & { /* stylelint-disable-line no-descending-specificity */
+ .mw-htmlform-submit-buttons {
+ float: right;
+ margin-right: 0;
+ margin-top: 0;
+ }
+
+ &:after {
+ content: '';
+ clear: both;
+ display: block;
+ }
+ }
+}
+
+input.mw-mwoauth-authorize-button {
+ float: right;
+ margin-left: 0.7em;
+ margin-right: 0.7em;
+ margin-bottom: 0.5em;
+}
diff --git a/OAuth/resources/modules/ext.MWOAuth.BasicStyles.css b/OAuth/resources/modules/ext.MWOAuth.BasicStyles.css
deleted file mode 100644
index 82789cf5..00000000
--- a/OAuth/resources/modules/ext.MWOAuth.BasicStyles.css
+++ /dev/null
@@ -1,61 +0,0 @@
-.mw-mwoauthconsumerregistration-body,
-.mw-mwoauthmanageconsumers-body {
- background-color: #f0f0f0;
-}
-
-.mw-mwoauthmanageconsumers-proposed,
-.mw-mwoauthmanagemygrants-proposed,
-.mw-mwoauthconsumerregistration-proposed {
- background-color: #b7b8e1;
-}
-
-.mw-mwoauthmanageconsumers-rejected,
-.mw-mwoauthmanagemygrants-rejected,
-.mw-mwoauthconsumerregistration-rejected {
- background-color: #e1b7ba;
-}
-
-.mw-mwoauthmanageconsumers-expired,
-.mw-mwoauthmanagemygrants-expired,
-.mw-mwoauthconsumerregistration-expired {
- background-color: #e1cdb7;
-}
-
-.mw-mwoauthmanageconsumers-approved,
-.mw-mwoauthmanagemygrants-approved,
-.mw-mwoauthconsumerregistration-approved {
- background-color: #bae1b7;
-}
-
-.mw-mwoauthmanageconsumers-disabled,
-.mw-mwoauthmanagemygrants-disabled,
-.mw-mwoauthconsumerregistration-disabled {
- background-color: #ceb7e1;
-}
-
-.mw-mwoauthmanagemygrants-list-item {
- margin-bottom: 1em;
-}
-
-.mw-mwoautherror-details {
- color: #72777d;
- font-size: 0.7em;
-}
-
-span.mw-grantgroup {
- font-weight: bold;
-}
-
-.mw-htmlform-field-HTMLInfoField .mw-mwoauth-infotable dt,
-.mw-mwoauth-infotable span.mw-grantgroup {
- font-weight: normal;
-}
-
-/* grant descriptions inside an infotable */
-.mw-mwoauth-infotable dl {
- margin-top: 0;
-}
-
-dl.mw-mwoauth-infotable dl dd {
- font-size: 0.9em;
-}
diff --git a/OAuth/resources/modules/ext.MWOAuth.BasicStyles.less b/OAuth/resources/modules/ext.MWOAuth.BasicStyles.less
new file mode 100644
index 00000000..f62a8697
--- /dev/null
+++ b/OAuth/resources/modules/ext.MWOAuth.BasicStyles.less
@@ -0,0 +1,55 @@
+.mw-mwoauthconsumerregistration-body,
+.mw-mwoauthmanageconsumers-body {
+ background-color: #f0f0f0;
+}
+
+.mw-mwoauthmanageconsumers,
+.mw-mwoauthmanagemygrants,
+.mw-mwoauthconsumerregistration {
+ &-proposed {
+ background-color: #b7b8e1;
+ }
+
+ &-rejected {
+ background-color: #e1b7ba;
+ }
+
+ &-expired {
+ background-color: #e1cdb7;
+ }
+
+ &-approved {
+ background-color: #bae1b7;
+ }
+
+ &-disabled {
+ background-color: #ceb7e1;
+ }
+}
+
+.mw-mwoauthmanagemygrants-list-item {
+ margin-bottom: 1em;
+}
+
+.mw-mwoautherror-details {
+ color: #72777d;
+ font-size: 0.7em;
+}
+
+span.mw-grantgroup {
+ font-weight: bold;
+}
+
+.mw-htmlform-field-HTMLInfoField .mw-mwoauth-infotable dt,
+.mw-mwoauth-infotable span.mw-grantgroup {
+ font-weight: normal;
+}
+
+/* grant descriptions inside an infotable */
+.mw-mwoauth-infotable dl {
+ margin-top: 0;
+}
+
+dl.mw-mwoauth-infotable dl dd {
+ font-size: 0.9em;
+}
diff --git a/OAuth/schema/OAuth.sql b/OAuth/schema/OAuth.sql
deleted file mode 100644
index 01e326da..00000000
--- a/OAuth/schema/OAuth.sql
+++ /dev/null
@@ -1,114 +0,0 @@
--- (c) Aaron Schulz, 2013
-
--- Replace /*_*/ with the proper prefix
-
--- These tables should belong in one central DB per wiki-farm
-
--- Client consumers (proposed as well as and accepted)
-CREATE TABLE IF NOT EXISTS /*_*/oauth_registered_consumer (
- -- Immutable fields below:
- -- Consumer ID (1:1 with oarc_consumer_key)
- oarc_id integer unsigned NOT NULL PRIMARY KEY auto_increment,
- -- OAuth consumer key and secret (or RSA key)
- oarc_consumer_key varbinary(32) NOT NULL,
- -- Name of the application
- oarc_name varchar(128) binary NOT NULL,
- -- (Central) user id of the user who proposed the application
- oarc_user_id integer unsigned NOT NULL,
- -- Version of the application
- oarc_version varbinary(32) NOT NULL,
- -- Callback URL
- oarc_callback_url blob NOT NULL,
- -- Is the consumer allowed to specify a callback URL? (See MWOAuthServer::checkCallback().)
- oarc_callback_is_prefix tinyblob NULL DEFAULT NULL,
- -- Application description
- oarc_description blob NOT NULL,
- -- Contact email address
- oarc_email varchar(255) binary NOT NULL,
- -- Confirmation of contact email address
- oarc_email_authenticated varbinary(14) NULL,
- -- Did the owner accept the developer agreement?
- oarc_developer_agreement tinyint NOT NULL DEFAULT 0,
- -- Is this consumer owner-only
- oarc_owner_only tinyint NOT NULL DEFAULT 0,
- -- What wiki this is allowed on (a single wiki or '*' for all)
- oarc_wiki varbinary(32) NOT NULL,
- -- Grants needed for client consumers
- oarc_grants blob NOT NULL,
- -- Timestamp of consumer proposal
- oarc_registration varbinary(14) NOT NULL,
-
- -- Mutable fields below:
- oarc_secret_key varbinary(32) NULL,
- oarc_rsa_key blob NULL,
- -- JSON blob of allowed IP ranges
- oarc_restrictions blob NOT NULL,
- -- Stage in registration pipeline:
- -- (0=proposed, 1=approved, 2=rejected, 3=expired, 4=disabled)
- oarc_stage tinyint unsigned NOT NULL DEFAULT 0,
- -- Timestamp of the last stage change
- oarc_stage_timestamp varbinary(14) NOT NULL,
- -- Whether this consumer is suppressed (hidden)
- oarc_deleted tinyint unsigned NOT NULL DEFAULT 0,
- -- Version of OAuth protocol this consumer uses
- oarc_oauth_version TINYINT NOT NULL DEFAULT 1,
- -- Allowed OAuth 2.0 grant types
- oarc_oauth2_allowed_grants BLOB NULL,
- -- OAuth2 flag indicating if consumer can be trusted with keeping secrets
- oarc_oauth2_is_confidential TINYINT NOT NULL DEFAULT 1
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/oarc_consumer_key
- ON /*_*/oauth_registered_consumer (oarc_consumer_key);
-CREATE UNIQUE INDEX /*i*/oarc_name_version_user
- ON /*_*/oauth_registered_consumer (oarc_name,oarc_user_id,oarc_version);
-CREATE INDEX /*i*/oarc_user_id ON /*_*/oauth_registered_consumer (oarc_user_id);
-CREATE INDEX /*i*/oarc_stage_timestamp
- ON /*_*/oauth_registered_consumer (oarc_stage,oarc_stage_timestamp);
-
--- Grant approvals by users for consumers
-CREATE TABLE IF NOT EXISTS /*_*/oauth_accepted_consumer (
- oaac_id integer unsigned NOT NULL PRIMARY KEY auto_increment,
- -- The name of a wiki or "*"
- oaac_wiki varchar(255) binary NOT NULL,
- -- Key to the user who approved the consumer (on the central wiki)
- oaac_user_id integer unsigned NOT NULL,
- -- Key to the consumer
- oaac_consumer_id integer unsigned NOT NULL,
- -- Tokens for the consumer to act on behave of the user
- oaac_access_token varbinary(32) NOT NULL,
- oaac_access_secret varbinary(32) NOT NULL,
- -- JSON blob of actually accepted grants
- oaac_grants blob NOT NULL,
- -- Timestamp of grant approval by the user
- oaac_accepted varbinary(14) NOT NULL,
- -- Version of OAuth protocol this consumer uses
- oaac_oauth_version TINYINT NOT NULL DEFAULT 1
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/oaac_access_token
- ON /*_*/oauth_accepted_consumer (oaac_access_token);
-CREATE UNIQUE INDEX /*i*/oaac_user_consumer_wiki
- ON /*_*/oauth_accepted_consumer (oaac_user_id,oaac_consumer_id,oaac_wiki);
-CREATE INDEX /*i*/oaac_consumer_user
- ON /*_*/oauth_accepted_consumer (oaac_consumer_id,oaac_user_id);
-CREATE INDEX /*i*/oaac_user_id ON /*_*/oauth_accepted_consumer (oaac_user_id,oaac_id);
-
--- Access tokens used on OAuth2 requests
-CREATE TABLE IF NOT EXISTS /*_*/oauth2_access_tokens (
- oaat_id integer unsigned NOT NULL PRIMARY KEY auto_increment,
- -- Access token identifier
- oaat_identifier varchar(255) NOT NULL,
- -- Expiration timestamp
- oaat_expires varbinary(14) NOT NULL,
- -- Identifier of the acceptance that allows this access token to be created
- oaat_acceptance_id integer unsigned NOT NULL,
- -- Indicates if the access token has been revoked
- oaat_revoked tinyint NOT NULL DEFAULT 0
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/oaat_identifier
- ON /*_*/oauth2_access_tokens (oaat_identifier);
-
-CREATE INDEX /*i*/oaat_acceptance_id
- ON /*_*/oauth2_access_tokens (oaat_acceptance_id);
diff --git a/OAuth/schema/mysql/callback_is_prefix.sql b/OAuth/schema/mysql/callback_is_prefix.sql
deleted file mode 100644
index 75881861..00000000
--- a/OAuth/schema/mysql/callback_is_prefix.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE /*_*/oauth_registered_consumer ADD COLUMN `oarc_callback_is_prefix` tinyblob NULL DEFAULT NULL AFTER `oarc_callback_url`;
diff --git a/OAuth/schema/mysql/developer_agreement.sql b/OAuth/schema/mysql/developer_agreement.sql
deleted file mode 100644
index 742af2c3..00000000
--- a/OAuth/schema/mysql/developer_agreement.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE /*_*/oauth_registered_consumer ADD COLUMN `oarc_developer_agreement` tinyint NOT NULL DEFAULT 0 AFTER `oarc_email_authenticated`;
diff --git a/OAuth/schema/mysql/owner_only.sql b/OAuth/schema/mysql/owner_only.sql
deleted file mode 100644
index f231f419..00000000
--- a/OAuth/schema/mysql/owner_only.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE /*_*/oauth_registered_consumer ADD COLUMN `oarc_owner_only` tinyint NOT NULL DEFAULT 0 AFTER `oarc_developer_agreement`;
diff --git a/OAuth/schema/mysql/patch-oauth_accepted_consumer-timestamp.sql b/OAuth/schema/mysql/patch-oauth_accepted_consumer-timestamp.sql
new file mode 100644
index 00000000..d80fd841
--- /dev/null
+++ b/OAuth/schema/mysql/patch-oauth_accepted_consumer-timestamp.sql
@@ -0,0 +1,2 @@
+ALTER TABLE /*_*/oauth_accepted_consumer
+CHANGE oaac_accepted oaac_accepted BINARY(14) NOT NULL; \ No newline at end of file
diff --git a/OAuth/schema/mysql/patch-oauth_registered_consumer-timestamp.sql b/OAuth/schema/mysql/patch-oauth_registered_consumer-timestamp.sql
new file mode 100644
index 00000000..fc2617ac
--- /dev/null
+++ b/OAuth/schema/mysql/patch-oauth_registered_consumer-timestamp.sql
@@ -0,0 +1,4 @@
+ALTER TABLE /*_*/oauth_registered_consumer
+CHANGE oarc_email_authenticated oarc_email_authenticated BINARY(14) NULL,
+CHANGE oarc_registration oarc_registration BINARY(14) NOT NULL,
+CHANGE oarc_stage_timestamp oarc_stage_timestamp BINARY(14) NOT NULL; \ No newline at end of file
diff --git a/OAuth/schema/mysql/tables-generated.sql b/OAuth/schema/mysql/tables-generated.sql
new file mode 100644
index 00000000..b1e6ccf2
--- /dev/null
+++ b/OAuth/schema/mysql/tables-generated.sql
@@ -0,0 +1,71 @@
+-- This file is automatically generated using maintenance/generateSchemaSql.php.
+-- Source: schema/tables.json
+-- Do not modify this file directly.
+-- See https://www.mediawiki.org/wiki/Manual:Schema_changes
+CREATE TABLE /*_*/oauth_registered_consumer (
+ oarc_id INT UNSIGNED AUTO_INCREMENT NOT NULL,
+ oarc_consumer_key VARBINARY(32) NOT NULL,
+ oarc_name VARBINARY(128) NOT NULL,
+ oarc_user_id INT UNSIGNED NOT NULL,
+ oarc_version VARBINARY(32) NOT NULL,
+ oarc_callback_url BLOB NOT NULL,
+ oarc_callback_is_prefix TINYBLOB DEFAULT NULL,
+ oarc_description BLOB NOT NULL,
+ oarc_email VARBINARY(255) NOT NULL,
+ oarc_email_authenticated BINARY(14) DEFAULT NULL,
+ oarc_developer_agreement TINYINT DEFAULT 0 NOT NULL,
+ oarc_owner_only TINYINT DEFAULT 0 NOT NULL,
+ oarc_wiki VARBINARY(32) NOT NULL,
+ oarc_grants BLOB NOT NULL,
+ oarc_registration BINARY(14) NOT NULL,
+ oarc_secret_key VARBINARY(32) DEFAULT NULL,
+ oarc_rsa_key BLOB DEFAULT NULL,
+ oarc_restrictions BLOB NOT NULL,
+ oarc_stage TINYINT UNSIGNED DEFAULT 0 NOT NULL,
+ oarc_stage_timestamp BINARY(14) NOT NULL,
+ oarc_deleted TINYINT UNSIGNED DEFAULT 0 NOT NULL,
+ oarc_oauth_version TINYINT DEFAULT 1 NOT NULL,
+ oarc_oauth2_allowed_grants BLOB DEFAULT NULL,
+ oarc_oauth2_is_confidential TINYINT DEFAULT 1 NOT NULL,
+ UNIQUE INDEX oarc_consumer_key (oarc_consumer_key),
+ UNIQUE INDEX oarc_name_version_user (
+ oarc_name, oarc_user_id, oarc_version
+ ),
+ INDEX oarc_user_id (oarc_user_id),
+ INDEX oarc_stage_timestamp (
+ oarc_stage, oarc_stage_timestamp
+ ),
+ PRIMARY KEY(oarc_id)
+) /*$wgDBTableOptions*/;
+
+
+CREATE TABLE /*_*/oauth_accepted_consumer (
+ oaac_id INT UNSIGNED AUTO_INCREMENT NOT NULL,
+ oaac_wiki VARBINARY(255) NOT NULL,
+ oaac_user_id INT UNSIGNED NOT NULL,
+ oaac_consumer_id INT UNSIGNED NOT NULL,
+ oaac_access_token VARBINARY(32) NOT NULL,
+ oaac_access_secret VARBINARY(32) NOT NULL,
+ oaac_grants BLOB NOT NULL,
+ oaac_accepted BINARY(14) NOT NULL,
+ oaac_oauth_version TINYINT DEFAULT 1 NOT NULL,
+ UNIQUE INDEX oaac_access_token (oaac_access_token),
+ UNIQUE INDEX oaac_user_consumer_wiki (
+ oaac_user_id, oaac_consumer_id, oaac_wiki
+ ),
+ INDEX oaac_consumer_user (oaac_consumer_id, oaac_user_id),
+ INDEX oaac_user_id (oaac_user_id, oaac_id),
+ PRIMARY KEY(oaac_id)
+) /*$wgDBTableOptions*/;
+
+
+CREATE TABLE /*_*/oauth2_access_tokens (
+ oaat_id INT UNSIGNED AUTO_INCREMENT NOT NULL,
+ oaat_identifier VARCHAR(255) NOT NULL,
+ oaat_expires VARBINARY(14) NOT NULL,
+ oaat_acceptance_id INT UNSIGNED NOT NULL,
+ oaat_revoked TINYINT DEFAULT 0 NOT NULL,
+ UNIQUE INDEX oaat_identifier (oaat_identifier),
+ INDEX oaat_acceptance_id (oaat_acceptance_id),
+ PRIMARY KEY(oaat_id)
+) /*$wgDBTableOptions*/;
diff --git a/OAuth/schema/oauth2_access_tokens.sql b/OAuth/schema/oauth2_access_tokens.sql
index 73fdf86d..c2a177e5 100644
--- a/OAuth/schema/oauth2_access_tokens.sql
+++ b/OAuth/schema/oauth2_access_tokens.sql
@@ -5,8 +5,8 @@ CREATE TABLE IF NOT EXISTS /*_*/oauth2_access_tokens (
oaat_identifier varchar(255) NOT NULL,
-- Expiration timestamp
oaat_expires varbinary(14) NOT NULL,
- -- Identifier of the acceptance that allows this access token to be created
- oaat_acceptance_id integer unsigned NOT NULL,
+ -- Identifier of the acceptance that allows this access token to be created
+ oaat_acceptance_id integer unsigned NOT NULL,
-- Indicates if the access token has been revoked
oaat_revoked tinyint NOT NULL DEFAULT 0
) /*$wgDBTableOptions*/;
@@ -15,4 +15,4 @@ CREATE UNIQUE INDEX /*i*/oaat_identifier
ON /*_*/oauth2_access_tokens (oaat_identifier);
CREATE INDEX /*i*/oaat_acceptance_id
- ON /*_*/oauth2_access_tokens (oaat_acceptance_id);
+ ON /*_*/oauth2_access_tokens (oaat_acceptance_id);
diff --git a/OAuth/schema/oauth2_allowed_grants.sql b/OAuth/schema/oauth2_allowed_grants.sql
index 993cd15f..1275e867 100644
--- a/OAuth/schema/oauth2_allowed_grants.sql
+++ b/OAuth/schema/oauth2_allowed_grants.sql
@@ -1,2 +1,2 @@
ALTER TABLE /*_*/oauth_registered_consumer
- ADD oarc_oauth2_allowed_grants BLOB NULL;
+ ADD oarc_oauth2_allowed_grants BLOB NULL;
diff --git a/OAuth/schema/oauth2_is_confidential.sql b/OAuth/schema/oauth2_is_confidential.sql
index 1864eed2..320811f5 100644
--- a/OAuth/schema/oauth2_is_confidential.sql
+++ b/OAuth/schema/oauth2_is_confidential.sql
@@ -1,2 +1,2 @@
ALTER TABLE /*_*/oauth_registered_consumer
- ADD oarc_oauth2_is_confidential TINYINT NOT NULL DEFAULT 1;
+ ADD oarc_oauth2_is_confidential TINYINT NOT NULL DEFAULT 1;
diff --git a/OAuth/schema/oauth_version_accepted.sql b/OAuth/schema/oauth_version_accepted.sql
index 440d645c..05836fb3 100644
--- a/OAuth/schema/oauth_version_accepted.sql
+++ b/OAuth/schema/oauth_version_accepted.sql
@@ -1,2 +1,2 @@
ALTER TABLE /*_*/oauth_accepted_consumer
- ADD oaac_oauth_version TINYINT NOT NULL DEFAULT 1;
+ ADD oaac_oauth_version TINYINT NOT NULL DEFAULT 1;
diff --git a/OAuth/schema/postgres/tables-generated.sql b/OAuth/schema/postgres/tables-generated.sql
new file mode 100644
index 00000000..b56d82b3
--- /dev/null
+++ b/OAuth/schema/postgres/tables-generated.sql
@@ -0,0 +1,81 @@
+-- This file is automatically generated using maintenance/generateSchemaSql.php.
+-- Source: schema/tables.json
+-- Do not modify this file directly.
+-- See https://www.mediawiki.org/wiki/Manual:Schema_changes
+CREATE TABLE oauth_registered_consumer (
+ oarc_id SERIAL NOT NULL,
+ oarc_consumer_key TEXT NOT NULL,
+ oarc_name TEXT NOT NULL,
+ oarc_user_id INT NOT NULL,
+ oarc_version TEXT NOT NULL,
+ oarc_callback_url TEXT NOT NULL,
+ oarc_callback_is_prefix TEXT DEFAULT NULL,
+ oarc_description TEXT NOT NULL,
+ oarc_email TEXT NOT NULL,
+ oarc_email_authenticated TIMESTAMPTZ DEFAULT NULL,
+ oarc_developer_agreement SMALLINT DEFAULT 0 NOT NULL,
+ oarc_owner_only SMALLINT DEFAULT 0 NOT NULL,
+ oarc_wiki TEXT NOT NULL,
+ oarc_grants TEXT NOT NULL,
+ oarc_registration TIMESTAMPTZ NOT NULL,
+ oarc_secret_key TEXT DEFAULT NULL,
+ oarc_rsa_key TEXT DEFAULT NULL,
+ oarc_restrictions TEXT NOT NULL,
+ oarc_stage SMALLINT DEFAULT 0 NOT NULL,
+ oarc_stage_timestamp TIMESTAMPTZ NOT NULL,
+ oarc_deleted SMALLINT DEFAULT 0 NOT NULL,
+ oarc_oauth_version SMALLINT DEFAULT 1 NOT NULL,
+ oarc_oauth2_allowed_grants TEXT DEFAULT NULL,
+ oarc_oauth2_is_confidential SMALLINT DEFAULT 1 NOT NULL,
+ PRIMARY KEY(oarc_id)
+);
+
+CREATE UNIQUE INDEX oarc_consumer_key ON oauth_registered_consumer (oarc_consumer_key);
+
+CREATE UNIQUE INDEX oarc_name_version_user ON oauth_registered_consumer (
+ oarc_name, oarc_user_id, oarc_version
+);
+
+CREATE INDEX oarc_user_id ON oauth_registered_consumer (oarc_user_id);
+
+CREATE INDEX oarc_stage_timestamp ON oauth_registered_consumer (
+ oarc_stage, oarc_stage_timestamp
+);
+
+
+CREATE TABLE oauth_accepted_consumer (
+ oaac_id SERIAL NOT NULL,
+ oaac_wiki TEXT NOT NULL,
+ oaac_user_id INT NOT NULL,
+ oaac_consumer_id INT NOT NULL,
+ oaac_access_token TEXT NOT NULL,
+ oaac_access_secret TEXT NOT NULL,
+ oaac_grants TEXT NOT NULL,
+ oaac_accepted TIMESTAMPTZ NOT NULL,
+ oaac_oauth_version SMALLINT DEFAULT 1 NOT NULL,
+ PRIMARY KEY(oaac_id)
+);
+
+CREATE UNIQUE INDEX oaac_access_token ON oauth_accepted_consumer (oaac_access_token);
+
+CREATE UNIQUE INDEX oaac_user_consumer_wiki ON oauth_accepted_consumer (
+ oaac_user_id, oaac_consumer_id, oaac_wiki
+);
+
+CREATE INDEX oaac_consumer_user ON oauth_accepted_consumer (oaac_consumer_id, oaac_user_id);
+
+CREATE INDEX oaac_user_id ON oauth_accepted_consumer (oaac_user_id, oaac_id);
+
+
+CREATE TABLE oauth2_access_tokens (
+ oaat_id SERIAL NOT NULL,
+ oaat_identifier VARCHAR(255) NOT NULL,
+ oaat_expires TIMESTAMPTZ NOT NULL,
+ oaat_acceptance_id INT NOT NULL,
+ oaat_revoked SMALLINT DEFAULT 0 NOT NULL,
+ PRIMARY KEY(oaat_id)
+);
+
+CREATE UNIQUE INDEX oaat_identifier ON oauth2_access_tokens (oaat_identifier);
+
+CREATE INDEX oaat_acceptance_id ON oauth2_access_tokens (oaat_acceptance_id);
diff --git a/OAuth/schema/sqlite/callback_is_prefix.sql b/OAuth/schema/sqlite/callback_is_prefix.sql
deleted file mode 100644
index 13d84457..00000000
--- a/OAuth/schema/sqlite/callback_is_prefix.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE /*_*/oauth_registered_consumer ADD COLUMN `oarc_callback_is_prefix` tinyblob NULL DEFAULT NULL;
diff --git a/OAuth/schema/sqlite/developer_agreement.sql b/OAuth/schema/sqlite/developer_agreement.sql
deleted file mode 100644
index 000bedec..00000000
--- a/OAuth/schema/sqlite/developer_agreement.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE /*_*/oauth_registered_consumer ADD COLUMN `oarc_developer_agreement` tinyint NOT NULL DEFAULT 0;
diff --git a/OAuth/schema/sqlite/owner_only.sql b/OAuth/schema/sqlite/owner_only.sql
deleted file mode 100644
index c0ddbfa0..00000000
--- a/OAuth/schema/sqlite/owner_only.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE /*_*/oauth_registered_consumer ADD COLUMN `oarc_owner_only` tinyint NOT NULL DEFAULT 0;
diff --git a/OAuth/schema/sqlite/patch-oauth_accepted_consumer-timestamp.sql b/OAuth/schema/sqlite/patch-oauth_accepted_consumer-timestamp.sql
new file mode 100644
index 00000000..2946b9ee
--- /dev/null
+++ b/OAuth/schema/sqlite/patch-oauth_accepted_consumer-timestamp.sql
@@ -0,0 +1,17 @@
+DROP INDEX oaac_access_token;
+DROP INDEX oaac_user_consumer_wiki;
+DROP INDEX oaac_consumer_user;
+DROP INDEX oaac_user_id;
+CREATE TEMPORARY TABLE /*_*/__temp__oauth_accepted_consumer AS
+SELECT oaac_id, oaac_wiki, oaac_user_id, oaac_consumer_id, oaac_access_token, oaac_access_secret, oaac_grants, oaac_accepted, oaac_oauth_version
+FROM /*_*/oauth_accepted_consumer;
+DROP TABLE /*_*/oauth_accepted_consumer;
+CREATE TABLE /*_*/oauth_accepted_consumer ( oaac_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, oaac_wiki BLOB NOT NULL, oaac_user_id INTEGER UNSIGNED NOT NULL, oaac_consumer_id INTEGER UNSIGNED NOT NULL, oaac_access_token BLOB NOT NULL, oaac_access_secret BLOB NOT NULL, oaac_grants BLOB NOT NULL, oaac_accepted BLOB NOT NULL, oaac_oauth_version SMALLINT DEFAULT 1 NOT NULL );
+INSERT INTO /*_*/oauth_accepted_consumer ( oaac_id, oaac_wiki, oaac_user_id, oaac_consumer_id, oaac_access_token, oaac_access_secret, oaac_grants, oaac_accepted, oaac_oauth_version )
+SELECT oaac_id, oaac_wiki, oaac_user_id, oaac_consumer_id, oaac_access_token, oaac_access_secret, oaac_grants, oaac_accepted, oaac_oauth_version
+FROM /*_*/__temp__oauth_accepted_consumer;
+DROP TABLE /*_*/__temp__oauth_accepted_consumer;
+CREATE UNIQUE INDEX oaac_access_token ON /*_*/oauth_accepted_consumer (oaac_access_token);
+CREATE UNIQUE INDEX oaac_user_consumer_wiki ON /*_*/oauth_accepted_consumer ( oaac_user_id, oaac_consumer_id, oaac_wiki );
+CREATE INDEX oaac_consumer_user ON /*_*/oauth_accepted_consumer (oaac_consumer_id, oaac_user_id);
+CREATE INDEX oaac_user_id ON /*_*/oauth_accepted_consumer (oaac_user_id, oaac_id); \ No newline at end of file
diff --git a/OAuth/schema/sqlite/patch-oauth_registered_consumer-timestamp.sql b/OAuth/schema/sqlite/patch-oauth_registered_consumer-timestamp.sql
new file mode 100644
index 00000000..e10da9a4
--- /dev/null
+++ b/OAuth/schema/sqlite/patch-oauth_registered_consumer-timestamp.sql
@@ -0,0 +1,17 @@
+DROP INDEX oarc_consumer_key;
+DROP INDEX oarc_name_version_user;
+DROP INDEX oarc_user_id;
+DROP INDEX oarc_stage_timestamp;
+CREATE TEMPORARY TABLE /*_*/__temp__oauth_registered_consumer AS
+SELECT oarc_id, oarc_consumer_key, oarc_name, oarc_user_id, oarc_version, oarc_callback_url, oarc_callback_is_prefix, oarc_description, oarc_email, oarc_email_authenticated, oarc_developer_agreement, oarc_owner_only, oarc_wiki, oarc_grants, oarc_registration, oarc_secret_key, oarc_rsa_key, oarc_restrictions, oarc_stage, oarc_stage_timestamp, oarc_deleted, oarc_oauth_version, oarc_oauth2_allowed_grants, oarc_oauth2_is_confidential
+FROM /*_*/oauth_registered_consumer;
+DROP TABLE /*_*/oauth_registered_consumer;
+CREATE TABLE /*_*/oauth_registered_consumer ( oarc_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, oarc_consumer_key BLOB NOT NULL, oarc_name BLOB NOT NULL, oarc_user_id INTEGER UNSIGNED NOT NULL, oarc_version BLOB NOT NULL, oarc_callback_url BLOB NOT NULL, oarc_callback_is_prefix BLOB DEFAULT NULL, oarc_description BLOB NOT NULL, oarc_email BLOB NOT NULL, oarc_email_authenticated BLOB NULL, oarc_developer_agreement SMALLINT DEFAULT 0 NOT NULL, oarc_owner_only SMALLINT DEFAULT 0 NOT NULL, oarc_wiki BLOB NOT NULL, oarc_grants BLOB NOT NULL, oarc_registration BLOB NOT NULL, oarc_secret_key BLOB DEFAULT NULL, oarc_rsa_key BLOB DEFAULT NULL, oarc_restrictions BLOB NOT NULL, oarc_stage SMALLINT UNSIGNED DEFAULT 0 NOT NULL, oarc_stage_timestamp BLOB NOT NULL, oarc_deleted SMALLINT UNSIGNED DEFAULT 0 NOT NULL, oarc_oauth_version SMALLINT DEFAULT 1 NOT NULL, oarc_oauth2_allowed_grants BLOB DEFAULT NULL, oarc_oauth2_is_confidential SMALLINT DEFAULT 1 NOT NULL );
+INSERT INTO /*_*/oauth_registered_consumer ( oarc_id, oarc_consumer_key, oarc_name, oarc_user_id, oarc_version, oarc_callback_url, oarc_callback_is_prefix, oarc_description, oarc_email, oarc_email_authenticated, oarc_developer_agreement, oarc_owner_only, oarc_wiki, oarc_grants, oarc_registration, oarc_secret_key, oarc_rsa_key, oarc_restrictions, oarc_stage, oarc_stage_timestamp, oarc_deleted, oarc_oauth_version, oarc_oauth2_allowed_grants, oarc_oauth2_is_confidential )
+SELECT oarc_id, oarc_consumer_key, oarc_name, oarc_user_id, oarc_version, oarc_callback_url, oarc_callback_is_prefix, oarc_description, oarc_email, oarc_email_authenticated, oarc_developer_agreement, oarc_owner_only, oarc_wiki, oarc_grants, oarc_registration, oarc_secret_key, oarc_rsa_key, oarc_restrictions, oarc_stage, oarc_stage_timestamp, oarc_deleted, oarc_oauth_version, oarc_oauth2_allowed_grants, oarc_oauth2_is_confidential
+FROM /*_*/__temp__oauth_registered_consumer;
+DROP TABLE /*_*/__temp__oauth_registered_consumer;
+CREATE UNIQUE INDEX oarc_consumer_key ON /*_*/oauth_registered_consumer (oarc_consumer_key);
+CREATE UNIQUE INDEX oarc_name_version_user ON /*_*/oauth_registered_consumer ( oarc_name, oarc_user_id, oarc_version );
+CREATE INDEX oarc_user_id ON /*_*/oauth_registered_consumer (oarc_user_id);
+CREATE INDEX oarc_stage_timestamp ON /*_*/oauth_registered_consumer ( oarc_stage, oarc_stage_timestamp ); \ No newline at end of file
diff --git a/OAuth/schema/sqlite/tables-generated.sql b/OAuth/schema/sqlite/tables-generated.sql
new file mode 100644
index 00000000..09cec815
--- /dev/null
+++ b/OAuth/schema/sqlite/tables-generated.sql
@@ -0,0 +1,69 @@
+-- This file is automatically generated using maintenance/generateSchemaSql.php.
+-- Source: schema/tables.json
+-- Do not modify this file directly.
+-- See https://www.mediawiki.org/wiki/Manual:Schema_changes
+CREATE TABLE /*_*/oauth_registered_consumer (
+ oarc_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+ oarc_consumer_key BLOB NOT NULL, oarc_name BLOB NOT NULL,
+ oarc_user_id INTEGER UNSIGNED NOT NULL,
+ oarc_version BLOB NOT NULL, oarc_callback_url BLOB NOT NULL,
+ oarc_callback_is_prefix BLOB DEFAULT NULL,
+ oarc_description BLOB NOT NULL, oarc_email BLOB NOT NULL,
+ oarc_email_authenticated BLOB DEFAULT NULL,
+ oarc_developer_agreement SMALLINT DEFAULT 0 NOT NULL,
+ oarc_owner_only SMALLINT DEFAULT 0 NOT NULL,
+ oarc_wiki BLOB NOT NULL, oarc_grants BLOB NOT NULL,
+ oarc_registration BLOB NOT NULL, oarc_secret_key BLOB DEFAULT NULL,
+ oarc_rsa_key BLOB DEFAULT NULL, oarc_restrictions BLOB NOT NULL,
+ oarc_stage SMALLINT UNSIGNED DEFAULT 0 NOT NULL,
+ oarc_stage_timestamp BLOB NOT NULL,
+ oarc_deleted SMALLINT UNSIGNED DEFAULT 0 NOT NULL,
+ oarc_oauth_version SMALLINT DEFAULT 1 NOT NULL,
+ oarc_oauth2_allowed_grants BLOB DEFAULT NULL,
+ oarc_oauth2_is_confidential SMALLINT DEFAULT 1 NOT NULL
+);
+
+CREATE UNIQUE INDEX oarc_consumer_key ON /*_*/oauth_registered_consumer (oarc_consumer_key);
+
+CREATE UNIQUE INDEX oarc_name_version_user ON /*_*/oauth_registered_consumer (
+ oarc_name, oarc_user_id, oarc_version
+);
+
+CREATE INDEX oarc_user_id ON /*_*/oauth_registered_consumer (oarc_user_id);
+
+CREATE INDEX oarc_stage_timestamp ON /*_*/oauth_registered_consumer (
+ oarc_stage, oarc_stage_timestamp
+);
+
+
+CREATE TABLE /*_*/oauth_accepted_consumer (
+ oaac_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+ oaac_wiki BLOB NOT NULL, oaac_user_id INTEGER UNSIGNED NOT NULL,
+ oaac_consumer_id INTEGER UNSIGNED NOT NULL,
+ oaac_access_token BLOB NOT NULL, oaac_access_secret BLOB NOT NULL,
+ oaac_grants BLOB NOT NULL, oaac_accepted BLOB NOT NULL,
+ oaac_oauth_version SMALLINT DEFAULT 1 NOT NULL
+);
+
+CREATE UNIQUE INDEX oaac_access_token ON /*_*/oauth_accepted_consumer (oaac_access_token);
+
+CREATE UNIQUE INDEX oaac_user_consumer_wiki ON /*_*/oauth_accepted_consumer (
+ oaac_user_id, oaac_consumer_id, oaac_wiki
+);
+
+CREATE INDEX oaac_consumer_user ON /*_*/oauth_accepted_consumer (oaac_consumer_id, oaac_user_id);
+
+CREATE INDEX oaac_user_id ON /*_*/oauth_accepted_consumer (oaac_user_id, oaac_id);
+
+
+CREATE TABLE /*_*/oauth2_access_tokens (
+ oaat_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+ oaat_identifier VARCHAR(255) NOT NULL,
+ oaat_expires BLOB NOT NULL,
+ oaat_acceptance_id INTEGER UNSIGNED NOT NULL,
+ oaat_revoked SMALLINT DEFAULT 0 NOT NULL
+);
+
+CREATE UNIQUE INDEX oaat_identifier ON /*_*/oauth2_access_tokens (oaat_identifier);
+
+CREATE INDEX oaat_acceptance_id ON /*_*/oauth2_access_tokens (oaat_acceptance_id);
diff --git a/OAuth/schema/tables.json b/OAuth/schema/tables.json
new file mode 100644
index 00000000..779993ea
--- /dev/null
+++ b/OAuth/schema/tables.json
@@ -0,0 +1,308 @@
+[
+ {
+ "name": "oauth_registered_consumer",
+ "comment": "Client consumers (proposed as well as and accepted)",
+ "columns": [
+ {
+ "name": "oarc_id",
+ "comment": "Immutable fields below: Consumer ID (1:1 with oarc_consumer_key)",
+ "type": "integer",
+ "options": { "autoincrement": true, "notnull": true, "unsigned": true }
+ },
+ {
+ "name": "oarc_consumer_key",
+ "comment": "OAuth consumer key and secret (or RSA key)",
+ "type": "binary",
+ "options": { "notnull": true, "length": 32 }
+ },
+ {
+ "name": "oarc_name",
+ "comment": "Name of the application",
+ "type": "binary",
+ "options": { "notnull": true, "length": 128 }
+ },
+ {
+ "name": "oarc_user_id",
+ "comment": "(Central) user id of the user who proposed the application",
+ "type": "integer",
+ "options": { "notnull": true, "unsigned": true }
+ },
+ {
+ "name": "oarc_version",
+ "comment": "Version of the application",
+ "type": "binary",
+ "options": { "notnull": true, "length": 32 }
+ },
+ {
+ "name": "oarc_callback_url",
+ "comment": "Callback URL",
+ "type": "blob",
+ "options": { "notnull": true, "length": 65530 }
+ },
+ {
+ "name": "oarc_callback_is_prefix",
+ "comment": "Is the consumer allowed to specify a callback URL? (See MWOAuthServer::checkCallback().)",
+ "type": "blob",
+ "options": { "notnull": false, "length": 255 }
+ },
+ {
+ "name": "oarc_description",
+ "comment": "Application description",
+ "type": "blob",
+ "options": { "notnull": true, "length": 65530 }
+ },
+ {
+ "name": "oarc_email",
+ "comment": "Contact email address",
+ "type": "binary",
+ "options": { "notnull": true, "length": 255 }
+ },
+ {
+ "name": "oarc_email_authenticated",
+ "comment": "Confirmation of contact email address",
+ "type": "mwtimestamp",
+ "options": { "notnull": false }
+ },
+ {
+ "name": "oarc_developer_agreement",
+ "comment": "Did the owner accept the developer agreement?",
+ "type": "mwtinyint",
+ "options": { "notnull": true, "default": 0 }
+ },
+ {
+ "name": "oarc_owner_only",
+ "comment": "Is this consumer owner-only",
+ "type": "mwtinyint",
+ "options": { "notnull": true, "default": 0 }
+ },
+ {
+ "name": "oarc_wiki",
+ "comment": "What wiki this is allowed on (a single wiki or '*' for all)",
+ "type": "binary",
+ "options": { "notnull": true, "length": 32 }
+ },
+ {
+ "name": "oarc_grants",
+ "comment": "Grants needed for client consumers",
+ "type": "blob",
+ "options": { "notnull": true, "length": 65530 }
+ },
+ {
+ "name": "oarc_registration",
+ "comment": "Timestamp of consumer proposal",
+ "type": "mwtimestamp",
+ "options": { "notnull": true }
+ },
+ {
+ "name": "oarc_secret_key",
+ "comment": "Mutable field",
+ "type": "binary",
+ "options": { "notnull": false, "length": 32 }
+ },
+ {
+ "name": "oarc_rsa_key",
+ "comment": "Mutable field",
+ "type": "blob",
+ "options": { "notnull": false, "length": 65530 }
+ },
+ {
+ "name": "oarc_restrictions",
+ "comment": "JSON blob of allowed IP ranges",
+ "type": "blob",
+ "options": { "notnull": true, "length": 65530 }
+ },
+ {
+ "name": "oarc_stage",
+ "comment": "Stage in registration pipeline: (0=proposed, 1=approved, 2=rejected, 3=expired, 4=disabled)",
+ "type": "mwtinyint",
+ "options": { "notnull": true, "unsigned": true, "default": 0 }
+ },
+ {
+ "name": "oarc_stage_timestamp",
+ "comment": "Timestamp of the last stage change",
+ "type": "mwtimestamp",
+ "options": { "notnull": true }
+ },
+ {
+ "name": "oarc_deleted",
+ "comment": "Whether this consumer is suppressed (hidden)",
+ "type": "mwtinyint",
+ "options": { "notnull": true, "unsigned": true, "default": 0 }
+ },
+ {
+ "name": "oarc_oauth_version",
+ "comment": "Version of OAuth protocol this consumer uses",
+ "type": "mwtinyint",
+ "options": { "notnull": true, "default": 1 }
+ },
+ {
+ "name": "oarc_oauth2_allowed_grants",
+ "comment": "Allowed OAuth 2.0 grant types",
+ "type": "blob",
+ "options": { "notnull": false, "length": 65530 }
+ },
+ {
+ "name": "oarc_oauth2_is_confidential",
+ "comment": "OAuth2 flag indicating if consumer can be trusted with keeping secrets",
+ "type": "mwtinyint",
+ "options": { "notnull": true, "default": 1 }
+ }
+ ],
+ "indexes": [
+ {
+ "name": "oarc_consumer_key",
+ "columns": [ "oarc_consumer_key" ],
+ "unique": true
+ },
+ {
+ "name": "oarc_name_version_user",
+ "columns": [ "oarc_name", "oarc_user_id", "oarc_version" ],
+ "unique": true
+ },
+ {
+ "name": "oarc_user_id",
+ "columns": [ "oarc_user_id" ],
+ "unique": false
+ },
+ {
+ "name": "oarc_stage_timestamp",
+ "columns": [ "oarc_stage", "oarc_stage_timestamp" ],
+ "unique": false
+ }
+ ],
+ "pk": [ "oarc_id" ]
+ },
+ {
+ "name": "oauth_accepted_consumer",
+ "comment": "Grant approvals by users for consumers",
+ "columns": [
+ {
+ "name": "oaac_id",
+ "type": "integer",
+ "options": { "autoincrement": true, "notnull": true, "unsigned": true }
+ },
+ {
+ "name": "oaac_wiki",
+ "comment": "The name of a wiki or '*'",
+ "type": "binary",
+ "options": { "notnull": true, "length": 255 }
+ },
+ {
+ "name": "oaac_user_id",
+ "comment": "Key to the user who approved the consumer (on the central wiki)",
+ "type": "integer",
+ "options": { "notnull": true, "unsigned": true }
+ },
+ {
+ "name": "oaac_consumer_id",
+ "comment": "Key to the consumer",
+ "type": "integer",
+ "options": { "notnull": true, "unsigned": true }
+ },
+ {
+ "name": "oaac_access_token",
+ "comment": "Tokens for the consumer to act on behave of the user",
+ "type": "binary",
+ "options": { "notnull": true, "length": 32 }
+ },
+ {
+ "name": "oaac_access_secret",
+ "comment": "Tokens for the consumer to act on behave of the user",
+ "type": "binary",
+ "options": { "notnull": true, "length": 32 }
+ },
+ {
+ "name": "oaac_grants",
+ "comment": "JSON blob of actually accepted grants",
+ "type": "blob",
+ "options": { "notnull": true, "length": 65530 }
+ },
+ {
+ "name": "oaac_accepted",
+ "comment": "Timestamp of grant approval by the user",
+ "type": "mwtimestamp",
+ "options": { "notnull": true }
+ },
+ {
+ "name": "oaac_oauth_version",
+ "comment": "Version of OAuth protocol this consumer uses",
+ "type": "mwtinyint",
+ "options": { "notnull": true, "default": 1 }
+ }
+ ],
+ "indexes": [
+ {
+ "name": "oaac_access_token",
+ "columns": [ "oaac_access_token" ],
+ "unique": true
+ },
+ {
+ "name": "oaac_user_consumer_wiki",
+ "columns": [ "oaac_user_id", "oaac_consumer_id", "oaac_wiki" ],
+ "unique": true
+ },
+ {
+ "name": "oaac_consumer_user",
+ "columns": [ "oaac_consumer_id", "oaac_user_id" ],
+ "unique": false
+ },
+ {
+ "name": "oaac_user_id",
+ "columns": [ "oaac_user_id", "oaac_id" ],
+ "unique": false
+ }
+ ],
+ "pk": [ "oaac_id" ]
+ },
+ {
+ "name": "oauth2_access_tokens",
+ "comment": "Access tokens used on OAuth2 requests",
+ "columns": [
+ {
+ "name": "oaat_id",
+ "type": "integer",
+ "options": { "autoincrement": true, "notnull": true, "unsigned": true }
+ },
+ {
+ "name": "oaat_identifier",
+ "comment": "Access token identifier",
+ "type": "string",
+ "options": { "notnull": true, "length": 255 }
+ },
+ {
+ "name": "oaat_expires",
+ "comment": "Expiration timestamp",
+ "type": "mwtimestamp",
+ "options": {
+ "notnull": true,
+ "CustomSchemaOptions": { "allowInfinite": true }
+ }
+ },
+ {
+ "name": "oaat_acceptance_id",
+ "comment": "Identifier of the acceptance that allows this access token to be created",
+ "type": "integer",
+ "options": { "notnull": true, "unsigned": true }
+ },
+ {
+ "name": "oaat_revoked",
+ "comment": "Indicates if the access token has been revoked",
+ "type": "mwtinyint",
+ "options": { "notnull": true, "default": 0 }
+ }
+ ],
+ "indexes": [
+ {
+ "name": "oaat_identifier",
+ "columns": [ "oaat_identifier" ],
+ "unique": true
+ },
+ {
+ "name": "oaat_acceptance_id",
+ "columns": [ "oaat_acceptance_id" ],
+ "unique": false
+ }
+ ],
+ "pk": [ "oaat_id" ]
+ }
+]
diff --git a/OAuth/src/AuthorizationProvider/AccessToken.php b/OAuth/src/AuthorizationProvider/AccessToken.php
index de4fd0e2..923e1b0d 100644
--- a/OAuth/src/AuthorizationProvider/AccessToken.php
+++ b/OAuth/src/AuthorizationProvider/AccessToken.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\AuthorizationProvider;
+namespace MediaWiki\Extension\OAuth\AuthorizationProvider;
use League\OAuth2\Server\Exception\OAuthServerException;
use Psr\Http\Message\ResponseInterface;
diff --git a/OAuth/src/AuthorizationProvider/AuthorizationProvider.php b/OAuth/src/AuthorizationProvider/AuthorizationProvider.php
index 0d26e44c..24290ec7 100644
--- a/OAuth/src/AuthorizationProvider/AuthorizationProvider.php
+++ b/OAuth/src/AuthorizationProvider/AuthorizationProvider.php
@@ -1,15 +1,15 @@
<?php
-namespace MediaWiki\Extensions\OAuth\AuthorizationProvider;
+namespace MediaWiki\Extension\OAuth\AuthorizationProvider;
use Config;
use DateInterval;
use Exception;
use League\OAuth2\Server\AuthorizationServer;
use League\OAuth2\Server\Grant\GrantTypeInterface;
-use MediaWiki\Extensions\OAuth\AuthorizationServerFactory;
-use MediaWiki\Extensions\OAuth\Repository\AuthCodeRepository;
-use MediaWiki\Extensions\OAuth\Repository\RefreshTokenRepository;
+use MediaWiki\Extension\OAuth\AuthorizationServerFactory;
+use MediaWiki\Extension\OAuth\Repository\AuthCodeRepository;
+use MediaWiki\Extension\OAuth\Repository\RefreshTokenRepository;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
use Psr\Http\Message\ServerRequestInterface;
@@ -87,7 +87,7 @@ abstract class AuthorizationProvider implements IAuthorizationProvider {
/**
* @return GrantTypeInterface
*/
- abstract protected function getGrant() : GrantTypeInterface;
+ abstract protected function getGrant(): GrantTypeInterface;
/**
* @return GrantTypeInterface
@@ -117,18 +117,14 @@ abstract class AuthorizationProvider implements IAuthorizationProvider {
* @return RefreshTokenRepository
*/
protected function getRefreshTokenRepo() {
- /** @var RefreshTokenRepository $repo */
- $repo = RefreshTokenRepository::factory();
- return $repo;
+ return RefreshTokenRepository::factory();
}
/**
* @return AuthCodeRepository
*/
protected function getAuthCodeRepo() {
- /** @var AuthCodeRepository $repo */
- $repo = AuthCodeRepository::factory();
- return $repo;
+ return AuthCodeRepository::factory();
}
/**
diff --git a/OAuth/src/AuthorizationProvider/Grant/AuthorizationCodeAccessTokens.php b/OAuth/src/AuthorizationProvider/Grant/AuthorizationCodeAccessTokens.php
index ab2d7aac..52bf78ab 100644
--- a/OAuth/src/AuthorizationProvider/Grant/AuthorizationCodeAccessTokens.php
+++ b/OAuth/src/AuthorizationProvider/Grant/AuthorizationCodeAccessTokens.php
@@ -1,12 +1,12 @@
<?php
-namespace MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant;
+namespace MediaWiki\Extension\OAuth\AuthorizationProvider\Grant;
use DateInterval;
use Exception;
use League\OAuth2\Server\Grant\AuthCodeGrant;
use League\OAuth2\Server\Grant\GrantTypeInterface;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\AccessToken;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\AccessToken;
class AuthorizationCodeAccessTokens extends AccessToken {
diff --git a/OAuth/src/AuthorizationProvider/Grant/AuthorizationCodeAuthorization.php b/OAuth/src/AuthorizationProvider/Grant/AuthorizationCodeAuthorization.php
index f1faab83..6b532120 100644
--- a/OAuth/src/AuthorizationProvider/Grant/AuthorizationCodeAuthorization.php
+++ b/OAuth/src/AuthorizationProvider/Grant/AuthorizationCodeAuthorization.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant;
+namespace MediaWiki\Extension\OAuth\AuthorizationProvider\Grant;
use DateInterval;
use Exception;
@@ -8,9 +8,9 @@ use League\OAuth2\Server\Exception\OAuthServerException;
use League\OAuth2\Server\Grant\AuthCodeGrant;
use League\OAuth2\Server\Grant\GrantTypeInterface;
use League\OAuth2\Server\RequestTypes\AuthorizationRequest;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\AuthorizationProvider;
-use MediaWiki\Extensions\OAuth\Entity\ClientEntity;
-use MediaWiki\Extensions\OAuth\Entity\UserEntity;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\AuthorizationProvider;
+use MediaWiki\Extension\OAuth\Entity\ClientEntity;
+use MediaWiki\Extension\OAuth\Entity\UserEntity;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
diff --git a/OAuth/src/AuthorizationProvider/Grant/ClientCredentials.php b/OAuth/src/AuthorizationProvider/Grant/ClientCredentials.php
index 086889f3..0005c0ad 100644
--- a/OAuth/src/AuthorizationProvider/Grant/ClientCredentials.php
+++ b/OAuth/src/AuthorizationProvider/Grant/ClientCredentials.php
@@ -1,10 +1,10 @@
<?php
-namespace MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant;
+namespace MediaWiki\Extension\OAuth\AuthorizationProvider\Grant;
use League\OAuth2\Server\Grant\ClientCredentialsGrant;
use League\OAuth2\Server\Grant\GrantTypeInterface;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\AccessToken;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\AccessToken;
class ClientCredentials extends AccessToken {
diff --git a/OAuth/src/AuthorizationProvider/Grant/RefreshToken.php b/OAuth/src/AuthorizationProvider/Grant/RefreshToken.php
index 7fbec0cf..ea46bf77 100644
--- a/OAuth/src/AuthorizationProvider/Grant/RefreshToken.php
+++ b/OAuth/src/AuthorizationProvider/Grant/RefreshToken.php
@@ -1,11 +1,11 @@
<?php
-namespace MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant;
+namespace MediaWiki\Extension\OAuth\AuthorizationProvider\Grant;
use Exception;
use League\OAuth2\Server\Grant\GrantTypeInterface;
use League\OAuth2\Server\Grant\RefreshTokenGrant;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\AccessToken;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\AccessToken;
class RefreshToken extends AccessToken {
diff --git a/OAuth/src/AuthorizationProvider/IAccessTokenProvider.php b/OAuth/src/AuthorizationProvider/IAccessTokenProvider.php
index 56f330f3..9b4e05e0 100644
--- a/OAuth/src/AuthorizationProvider/IAccessTokenProvider.php
+++ b/OAuth/src/AuthorizationProvider/IAccessTokenProvider.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\AuthorizationProvider;
+namespace MediaWiki\Extension\OAuth\AuthorizationProvider;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -14,5 +14,5 @@ interface IAccessTokenProvider extends IAuthorizationProvider {
* @return ResponseInterface
*/
public function getAccessTokens( ServerRequestInterface $request,
- ResponseInterface $response ) : ResponseInterface;
+ ResponseInterface $response ): ResponseInterface;
}
diff --git a/OAuth/src/AuthorizationProvider/IAuthorizationProvider.php b/OAuth/src/AuthorizationProvider/IAuthorizationProvider.php
index 70cfb4b8..b8e0ab97 100644
--- a/OAuth/src/AuthorizationProvider/IAuthorizationProvider.php
+++ b/OAuth/src/AuthorizationProvider/IAuthorizationProvider.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\AuthorizationProvider;
+namespace MediaWiki\Extension\OAuth\AuthorizationProvider;
use User;
diff --git a/OAuth/src/AuthorizationServerFactory.php b/OAuth/src/AuthorizationServerFactory.php
index 36abbb4c..7a24669d 100644
--- a/OAuth/src/AuthorizationServerFactory.php
+++ b/OAuth/src/AuthorizationServerFactory.php
@@ -1,12 +1,13 @@
<?php
-namespace MediaWiki\Extensions\OAuth;
+namespace MediaWiki\Extension\OAuth;
use InvalidArgumentException;
use League\OAuth2\Server\AuthorizationServer;
-use MediaWiki\Extensions\OAuth\Repository\AccessTokenRepository;
-use MediaWiki\Extensions\OAuth\Repository\ClientRepository;
-use MediaWiki\Extensions\OAuth\Repository\ScopeRepository;
+use MediaWiki\Extension\OAuth\Repository\AccessTokenRepository;
+use MediaWiki\Extension\OAuth\Repository\ClaimStore;
+use MediaWiki\Extension\OAuth\Repository\ClientRepository;
+use MediaWiki\Extension\OAuth\Repository\ScopeRepository;
use MediaWiki\MediaWikiServices;
class AuthorizationServerFactory {
@@ -14,6 +15,8 @@ class AuthorizationServerFactory {
protected $privateKey;
/** @var string */
protected $encryptionKey;
+ /** @var string */
+ private $canonicalServer;
/**
* @return static
@@ -24,15 +27,20 @@ class AuthorizationServerFactory {
$mainConfig = $services->getMainConfig();
$privateKey = $extConfig->get( 'OAuth2PrivateKey' );
$encryptionKey = $extConfig->get( 'OAuthSecretKey' ) ?? $mainConfig->get( 'SecretKey' );
-
- return new static( $privateKey, $encryptionKey );
+ $canonicalServer = $mainConfig->get( 'CanonicalServer' );
+ return new static( $privateKey, $encryptionKey, $canonicalServer );
}
/**
* @param string $privateKey
* @param string $encryptionKey
+ * @param string $canonicalServer
*/
- public function __construct( $privateKey, $encryptionKey ) {
+ public function __construct(
+ string $privateKey,
+ string $encryptionKey,
+ string $canonicalServer
+ ) {
$this->privateKey = $privateKey;
$this->encryptionKey = trim( $encryptionKey );
@@ -40,6 +48,8 @@ class AuthorizationServerFactory {
// Empty encryption key would not break the workflow, but would cause security issues
throw new InvalidArgumentException( 'Encryption key must be set' );
}
+
+ $this->canonicalServer = $canonicalServer;
}
/**
@@ -48,10 +58,12 @@ class AuthorizationServerFactory {
public function getAuthorizationServer() {
return new AuthorizationServer(
new ClientRepository(),
- new AccessTokenRepository(),
+ new AccessTokenRepository( $this->canonicalServer ),
new ScopeRepository(),
$this->privateKey,
- $this->encryptionKey
+ $this->encryptionKey,
+ null,
+ new ClaimStore()
);
}
}
diff --git a/OAuth/src/Backend/AbuseFilterHookHandler.php b/OAuth/src/Backend/AbuseFilterHookHandler.php
new file mode 100644
index 00000000..beb86fd8
--- /dev/null
+++ b/OAuth/src/Backend/AbuseFilterHookHandler.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Extension\OAuth\Backend;
+
+use MediaWiki\Extension\AbuseFilter\Hooks\AbuseFilterBuilderHook;
+use MediaWiki\Extension\AbuseFilter\Hooks\AbuseFilterComputeVariableHook;
+use MediaWiki\Extension\AbuseFilter\Hooks\AbuseFilterGenerateUserVarsHook;
+use MediaWiki\Extension\AbuseFilter\Variables\VariableHolder;
+use MediaWiki\Extension\OAuth\SessionProvider;
+use RecentChange;
+use User;
+
+/**
+ * @author Taavi "Majavah" Väänänen <hi@taavi.wtf>
+ */
+class AbuseFilterHookHandler implements
+ AbuseFilterBuilderHook,
+ AbuseFilterComputeVariableHook,
+ AbuseFilterGenerateUserVarsHook
+{
+ public function onAbuseFilter_builder( array &$realValues ) {
+ // Uses: 'abusefilter-edit-builder-vars-oauth-consumer'
+ $realValues['vars']['oauth_consumer'] = 'oauth-consumer';
+ }
+
+ public function onAbuseFilter_computeVariable(
+ string $method,
+ VariableHolder $vars,
+ array $parameters,
+ ?string &$result
+ ) {
+ if ( $method !== 'oauth-consumer' ) {
+ return true;
+ }
+
+ /** @var User $user */
+ $user = $parameters['user'];
+
+ $session = $user->getRequest()->getSession();
+
+ if (
+ // SessionProvider here refers to the OAuth session provider class
+ $session->getProvider() instanceof SessionProvider
+ // consumerId is only set if the consumer is not owner-only (which is what we want)
+ && isset( $session->getProviderMetadata()['consumerId'] )
+ ) {
+ $result = $session->getProviderMetadata()['consumerId'];
+ }
+
+ return false;
+ }
+
+ public function onAbuseFilter_generateUserVars( VariableHolder $vars, User $user, ?RecentChange $rc ) {
+ $vars->setLazyLoadVar(
+ 'oauth_consumer',
+ 'oauth-consumer',
+ [ 'user' => $user ]
+ );
+ }
+}
diff --git a/OAuth/src/Backend/Consumer.php b/OAuth/src/Backend/Consumer.php
index 071ca0ce..fc4402ca 100644
--- a/OAuth/src/Backend/Consumer.php
+++ b/OAuth/src/Backend/Consumer.php
@@ -19,20 +19,28 @@
* http://www.gnu.org/copyleft/gpl.html
*/
-namespace MediaWiki\Extensions\OAuth\Backend;
+namespace MediaWiki\Extension\OAuth\Backend;
use FormatJson;
-use MediaWiki\Extensions\OAuth\Entity\ClientEntity as OAuth2Client;
+use IContextSource;
+use Linker;
+use LogicException;
+use MediaWiki\Extension\OAuth\Entity\ClientEntity as OAuth2Client;
+use MediaWiki\MediaWikiServices;
+use Message;
use MWException;
+use MWRestrictions;
+use SpecialPage;
use User;
+use WikiMap;
use Wikimedia\Rdbms\DBConnRef;
/**
* Representation of an OAuth consumer.
*/
abstract class Consumer extends MWOAuthDAO {
- const OAUTH_VERSION_1 = 1;
- const OAUTH_VERSION_2 = 2;
+ public const OAUTH_VERSION_1 = 1;
+ public const OAUTH_VERSION_2 = 2;
/** @var array Backwards-compatibility grant mappings */
public static $mapBackCompatGrants = [
@@ -56,7 +64,7 @@ abstract class Consumer extends MWOAuthDAO {
/** @var string OAuth callback URL for authorization step */
protected $callbackUrl;
/**
- * @var int OAuth callback URL is a prefix and we allow all URLs which
+ * @var bool OAuth callback URL is a prefix and we allow all URLs which
* have callbackUrl as the prefix
*/
protected $callbackIsPrefix;
@@ -64,13 +72,13 @@ abstract class Consumer extends MWOAuthDAO {
protected $description;
/** @var string Publisher email address */
protected $email;
- /** @var string TS_MW timestamp of when email address was confirmed */
+ /** @var string|null TS_MW timestamp of when email address was confirmed */
protected $emailAuthenticated;
- /** @var int User accepted the developer agreement */
+ /** @var bool User accepted the developer agreement */
protected $developerAgreement;
- /** @var int Consumer is for use by the owner only */
+ /** @var bool Consumer is for use by the owner only */
protected $ownerOnly;
- /** @var string Version of the OAuth protocol */
+ /** @var int Version of the OAuth protocol */
protected $oauthVersion;
/** @var string Wiki ID the application can be used on (or "*" for all) */
protected $wiki;
@@ -88,7 +96,7 @@ abstract class Consumer extends MWOAuthDAO {
protected $stage;
/** @var string TS_MW timestamp of last stage change */
protected $stageTimestamp;
- /** @var int Indicates (if non-zero) this consumer's information is suppressed */
+ /** @var bool Indicates this consumer's information is suppressed */
protected $deleted;
/** @var bool Indicates whether the client (consumer) is able to keep the secret */
protected $oauth2IsConfidential;
@@ -96,11 +104,11 @@ abstract class Consumer extends MWOAuthDAO {
protected $oauth2GrantTypes;
/* Stages that registered consumer takes (stored in DB) */
- const STAGE_PROPOSED = 0;
- const STAGE_APPROVED = 1;
- const STAGE_REJECTED = 2;
- const STAGE_EXPIRED = 3;
- const STAGE_DISABLED = 4;
+ public const STAGE_PROPOSED = 0;
+ public const STAGE_APPROVED = 1;
+ public const STAGE_REJECTED = 2;
+ public const STAGE_EXPIRED = 3;
+ public const STAGE_DISABLED = 4;
/**
* Maps stage ids to human-readable names which describe them as a state
@@ -203,9 +211,9 @@ abstract class Consumer extends MWOAuthDAO {
/**
* @param DBConnRef $db
- * @param string $key
+ * @param string|null $key
* @param int $flags MWOAuthConsumer::READ_* bitfield
- * @return Consumer|bool
+ * @return Consumer|false
*/
public static function newFromKey( DBConnRef $db, $key, $flags = 0 ) {
$row = $db->selectRow( static::getTable(),
@@ -323,9 +331,10 @@ abstract class Consumer extends MWOAuthDAO {
}
/**
- * When true, getCallbackUrl() returns a prefix; the callback URL can be provided by the caller
- * as long as the prefix matches. When false, the callback URL will be determined by
- * getCallbackUrl().
+ * When false, the callback URL will be determined by getCallbackUrl(). When true,
+ * getCallbackUrl() returns a prefix; the callback URL must be provided by the caller
+ * and must match the prefix. For the exact definition of "match", see
+ * MWOAuthServer::checkCallback().
* @return bool
*/
public function getCallbackIsPrefix() {
@@ -352,7 +361,7 @@ abstract class Consumer extends MWOAuthDAO {
/**
* Date of verifying the email, in TS_MW format. In practice this will be the same as
* getRegistration().
- * @return string
+ * @return string|null
*/
public function getEmailAuthenticated() {
return $this->get( 'emailAuthenticated' );
@@ -409,7 +418,7 @@ abstract class Consumer extends MWOAuthDAO {
/**
* Secret key used to derive the consumer secret for HMAC-SHA1 signed OAuth requests.
- * The actual consumer secret will be calculated via MWOAuthUtils::hmacDBSecret() to mitigate
+ * The actual consumer secret will be calculated via Utils::hmacDBSecret() to mitigate
* DB leaks.
* @return string
*/
@@ -418,7 +427,7 @@ abstract class Consumer extends MWOAuthDAO {
}
/**
- * Public RSA key for RSA-SHA1 signerd OAuth requests.
+ * Public RSA key for RSA-SHA1 signed OAuth requests.
* @return string
*/
public function getRsaKey() {
@@ -427,7 +436,7 @@ abstract class Consumer extends MWOAuthDAO {
/**
* Application restrictions (such as allowed IPs).
- * @return \MWRestrictions
+ * @return MWRestrictions
*/
public function getRestrictions() {
return $this->get( 'restrictions' );
@@ -489,7 +498,7 @@ abstract class Consumer extends MWOAuthDAO {
* Users might want more grants on some wikis than on "*". Note that the reverse would not
* make sense, since the consumer could just use the "*" acceptance if it has more grants.
*
- * @param \User $mwUser (local wiki user) User who may or may not have authorizations
+ * @param User $mwUser (local wiki user) User who may or may not have authorizations
* @param string $wikiId
* @throws MWOAuthException
* @return ConsumerAcceptance|bool
@@ -503,8 +512,8 @@ abstract class Consumer extends MWOAuthDAO {
'mwoauthserver-invalid-user',
[
$this->getName(),
- \Message::rawParam(
- \Linker::makeExternalLink(
+ Message::rawParam(
+ Linker::makeExternalLink(
'https://www.mediawiki.org/wiki/Help:OAuth/Errors#E008',
'E008',
true
@@ -557,9 +566,9 @@ abstract class Consumer extends MWOAuthDAO {
global $wgBlockDisablesLogin;
// Check that user and consumer are in good standing
- if ( $mwUser->isLocked() || $wgBlockDisablesLogin && $mwUser->isBlocked() ) {
+ if ( $mwUser->isLocked() || $wgBlockDisablesLogin && $mwUser->getBlock() ) {
throw new MWOAuthException( 'mwoauthserver-insufficient-rights', [
- \Message::rawParam( \Linker::makeExternalLink(
+ Message::rawParam( Linker::makeExternalLink(
'https://www.mediawiki.org/wiki/Help:OAuth/Errors#E007',
'E007',
true
@@ -569,7 +578,7 @@ abstract class Consumer extends MWOAuthDAO {
if ( $this->getDeleted() ) {
throw new MWOAuthException( 'mwoauthserver-bad-consumer-key', [
- \Message::rawParam( \Linker::makeExternalLink(
+ Message::rawParam( Linker::makeExternalLink(
'https://www.mediawiki.org/wiki/Help:OAuth/Errors#E006',
'E006',
true
@@ -582,8 +591,8 @@ abstract class Consumer extends MWOAuthDAO {
);
throw new MWOAuthException(
'mwoauthserver-bad-consumer',
- [ $this->getName(), Utils::getCentralUserTalk( $owner ), \Message::rawParam(
- \Linker::makeExternalLink(
+ [ $this->getName(), Utils::getCentralUserTalk( $owner ), Message::rawParam(
+ Linker::makeExternalLink(
'https://www.mediawiki.org/wiki/Help:OAuth/Errors#E005',
'E005',
true
@@ -593,10 +602,10 @@ abstract class Consumer extends MWOAuthDAO {
} elseif ( $this->getOwnerOnly() ) {
throw new MWOAuthException( 'mwoauthserver-consumer-owner-only', [
$this->getName(),
- \SpecialPage::getTitleFor(
+ SpecialPage::getTitleFor(
'OAuthConsumerRegistration', 'update/' . $this->getConsumerKey()
),
- \Message::rawParam( \Linker::makeExternalLink(
+ Message::rawParam( Linker::makeExternalLink(
'https://www.mediawiki.org/wiki/Help:OAuth/Errors#E010',
'E010',
true
@@ -621,8 +630,8 @@ abstract class Consumer extends MWOAuthDAO {
'mwoauthserver-invalid-user',
[
$this->getName(),
- \Message::rawParam(
- \Linker::makeExternalLink(
+ Message::rawParam(
+ Linker::makeExternalLink(
'https://www.mediawiki.org/wiki/Help:OAuth/Errors#E008',
'E008',
true
@@ -632,9 +641,9 @@ abstract class Consumer extends MWOAuthDAO {
);
}
- $dbw = Utils::getCentralDB( DB_MASTER );
+ $dbw = Utils::getCentralDB( DB_PRIMARY );
// Check if this authorization exists
- $cmra = $this->getCurrentAuthorization( $mwUser, wfWikiID() );
+ $cmra = $this->getCurrentAuthorization( $mwUser, WikiMap::getCurrentWikiId() );
if ( $update ) {
// This should be an update to an existing authorization
@@ -675,10 +684,10 @@ abstract class Consumer extends MWOAuthDAO {
* - Approved for owner-only use and is owned by $user
* - Still pending approval and is owned by $user
*
- * @param \User $user
+ * @param User $user
* @return bool
*/
- public function isUsableBy( \User $user ) {
+ public function isUsableBy( User $user ) {
if ( $this->stage === self::STAGE_APPROVED && !$this->getOwnerOnly() ) {
return true;
} elseif ( $this->stage === self::STAGE_PROPOSED || $this->stage === self::STAGE_APPROVED ) {
@@ -696,8 +705,8 @@ abstract class Consumer extends MWOAuthDAO {
$this->registration = wfTimestamp( TS_MW, $this->registration );
$this->stage = (int)$this->stage;
$this->stageTimestamp = wfTimestamp( TS_MW, $this->stageTimestamp );
- $this->emailAuthenticated = wfTimestamp( TS_MW, $this->emailAuthenticated );
- $this->grants = (array)$this->grants; // sanity
+ $this->emailAuthenticated = wfTimestampOrNull( TS_MW, $this->emailAuthenticated );
+ $this->grants = (array)$this->grants;
$this->callbackIsPrefix = (bool)$this->callbackIsPrefix;
$this->ownerOnly = (bool)$this->ownerOnly;
$this->oauthVersion = (int)$this->oauthVersion;
@@ -717,7 +726,7 @@ abstract class Consumer extends MWOAuthDAO {
$row['oarc_registration'] = $db->timestamp( $row['oarc_registration'] );
$row['oarc_stage_timestamp'] = $db->timestamp( $row['oarc_stage_timestamp'] );
$row['oarc_restrictions'] = $row['oarc_restrictions']->toJson();
- $row['oarc_grants'] = \FormatJson::encode( $row['oarc_grants'] );
+ $row['oarc_grants'] = FormatJson::encode( $row['oarc_grants'] );
$row['oarc_email_authenticated'] =
$db->timestampOrNull( $row['oarc_email_authenticated'] );
$row['oarc_oauth2_allowed_grants'] = FormatJson::encode(
@@ -730,8 +739,8 @@ abstract class Consumer extends MWOAuthDAO {
$row['oarc_registration'] = wfTimestamp( TS_MW, $row['oarc_registration'] );
$row['oarc_stage'] = (int)$row['oarc_stage'];
$row['oarc_stage_timestamp'] = wfTimestamp( TS_MW, $row['oarc_stage_timestamp'] );
- $row['oarc_restrictions'] = \MWRestrictions::newFromJson( $row['oarc_restrictions'] );
- $row['oarc_grants'] = \FormatJson::decode( $row['oarc_grants'], true );
+ $row['oarc_restrictions'] = MWRestrictions::newFromJson( $row['oarc_restrictions'] );
+ $row['oarc_grants'] = FormatJson::decode( $row['oarc_grants'], true );
$row['oarc_user_id'] = (int)$row['oarc_user_id'];
$row['oarc_email_authenticated'] =
wfTimestampOrNull( TS_MW, $row['oarc_email_authenticated'] );
@@ -764,13 +773,15 @@ abstract class Consumer extends MWOAuthDAO {
} elseif ( $prop === 'callback_url' ) {
return $this->callbackUrl;
} else {
- throw new \LogicException( 'Direct property access attempt: ' . $prop );
+ throw new LogicException( 'Direct property access attempt: ' . $prop );
}
}
- protected function userCanSee( $name, \IContextSource $context ) {
+ protected function userCanSee( $name, IContextSource $context ) {
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+
if ( $this->getDeleted()
- && !$context->getUser()->isAllowed( 'mwoauthviewsuppressed' )
+ && !$permissionManager->userHasRight( $context->getUser(), 'mwoauthviewsuppressed' )
) {
return $context->msg( 'mwoauth-field-hidden' );
} else {
@@ -778,23 +789,27 @@ abstract class Consumer extends MWOAuthDAO {
}
}
- protected function userCanSeePrivate( $name, \IContextSource $context ) {
- if ( !$context->getUser()->isAllowed( 'mwoauthviewprivate' ) ) {
+ protected function userCanSeePrivate( $name, IContextSource $context ) {
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+
+ if ( !$permissionManager->userHasRight( $context->getUser(), 'mwoauthviewprivate' ) ) {
return $context->msg( 'mwoauth-field-private' );
} else {
return $this->userCanSee( $name, $context );
}
}
- protected function userCanSeeEmail( $name, \IContextSource $context ) {
- if ( !$context->getUser()->isAllowed( 'mwoauthmanageconsumer' ) ) {
+ protected function userCanSeeEmail( $name, IContextSource $context ) {
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+
+ if ( !$permissionManager->userHasRight( $context->getUser(), 'mwoauthmanageconsumer' ) ) {
return $context->msg( 'mwoauth-field-private' );
} else {
return $this->userCanSee( $name, $context );
}
}
- protected function userCanSeeSecret( $name, \IContextSource $context ) {
+ protected function userCanSeeSecret( $name, IContextSource $context ) {
return $context->msg( 'mwoauth-field-private' );
}
}
diff --git a/OAuth/src/Backend/ConsumerAcceptance.php b/OAuth/src/Backend/ConsumerAcceptance.php
index da90914b..8a2d81e3 100644
--- a/OAuth/src/Backend/ConsumerAcceptance.php
+++ b/OAuth/src/Backend/ConsumerAcceptance.php
@@ -1,7 +1,8 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Backend;
+namespace MediaWiki\Extension\OAuth\Backend;
+use MediaWiki\MediaWikiServices;
use Wikimedia\Rdbms\DBConnRef;
/**
@@ -84,7 +85,7 @@ class ConsumerAcceptance extends MWOAuthDAO {
/**
* @param DBConnRef $db
* @param string $token Access token
- * @param int $flags MWOAuthConsumerAcceptance::READ_* bitfield
+ * @param int $flags ConsumerAcceptance::READ_* bitfield
* @return ConsumerAcceptance|bool
*/
public static function newFromToken( DBConnRef $db, $token, $flags = 0 ) {
@@ -106,11 +107,11 @@ class ConsumerAcceptance extends MWOAuthDAO {
/**
* @param DBConnRef $db
- * @param string $userId of user who authorized (central wiki's id)
+ * @param int $userId of user who authorized (central wiki's id)
* @param Consumer $consumer
* @param string $wiki wiki associated with the acceptance
- * @param int $flags MWOAuthConsumerAcceptance::READ_* bitfield
- * @param string $oauthVersion
+ * @param int $flags ConsumerAcceptance::READ_* bitfield
+ * @param int $oauthVersion
* @return ConsumerAcceptance|bool
*/
public static function newFromUserConsumerWiki(
@@ -120,7 +121,7 @@ class ConsumerAcceptance extends MWOAuthDAO {
$row = $db->selectRow( static::getTable(),
array_values( static::getFieldColumnMap() ),
[
- 'oaac_user_id' => (int)$userId,
+ 'oaac_user_id' => $userId,
'oaac_consumer_id' => $consumer->getId(),
'oaac_oauth_version' => $oauthVersion,
'oaac_wiki' => (string)$wiki
@@ -181,7 +182,7 @@ class ConsumerAcceptance extends MWOAuthDAO {
/**
* Secret key used to derive the access secret for the OAuth protocol.
- * The actual access secret will be calculated via MWOAuthUtils::hmacDBSecret() to mitigate
+ * The actual access secret will be calculated via Utils::hmacDBSecret() to mitigate
* DB leaks.
* @return string
*/
@@ -216,7 +217,7 @@ class ConsumerAcceptance extends MWOAuthDAO {
$this->userId = (int)$this->userId;
$this->consumerId = (int)$this->consumerId;
$this->accepted = wfTimestamp( TS_MW, $this->accepted );
- $this->grants = (array)$this->grants; // sanity
+ $this->grants = (array)$this->grants;
}
protected function encodeRow( DBConnRef $db, $row ) {
@@ -251,8 +252,10 @@ class ConsumerAcceptance extends MWOAuthDAO {
protected function userCanSee( $name, \IContextSource $context ) {
$centralUserId = Utils::getCentralIdFromLocalUser( $context->getUser() );
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+
if ( $this->userId != $centralUserId
- && !$context->getUser()->isAllowed( 'mwoauthviewprivate' )
+ && !$permissionManager->userHasRight( $context->getUser(), 'mwoauthviewprivate' )
) {
return $context->msg( 'mwoauth-field-private' );
} else {
@@ -261,7 +264,9 @@ class ConsumerAcceptance extends MWOAuthDAO {
}
protected function userCanSeePrivate( $name, \IContextSource $context ) {
- if ( !$context->getUser()->isAllowed( 'mwoauthviewprivate' ) ) {
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+
+ if ( !$permissionManager->userHasRight( $context->getUser(), 'mwoauthviewprivate' ) ) {
return $context->msg( 'mwoauth-field-private' );
} else {
return $this->userCanSee( $name, $context );
diff --git a/OAuth/src/Backend/Hooks.php b/OAuth/src/Backend/Hooks.php
index 39bbeb97..f0f4660c 100644
--- a/OAuth/src/Backend/Hooks.php
+++ b/OAuth/src/Backend/Hooks.php
@@ -1,10 +1,13 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Backend;
+namespace MediaWiki\Extension\OAuth\Backend;
-use MediaWiki\Extensions\OAuth\Frontend\OAuthLogFormatter;
+use MediaWiki\Extension\OAuth\Frontend\OAuthLogFormatter;
use MediaWiki\MediaWikiServices;
use MediaWiki\Storage\NameTableAccessException;
+use Status;
+use User;
+use WikiMap;
/**
* Class containing hooked functions for an OAuth environment
@@ -64,11 +67,11 @@ EOK;
* Reserve change tags that look like an OAuth change tag.
*
* @param string $tag
- * @param \User|null $user
- * @param \Status &$status
+ * @param User|null $user
+ * @param Status &$status
* @return bool
*/
- public static function onChangeTagCanCreate( $tag, ?\User $user, \Status &$status ) {
+ public static function onChangeTagCanCreate( $tag, ?User $user, Status &$status ) {
if ( Utils::isReservedTagName( $tag ) ) {
$status->fatal( 'mwoauth-tag-reserved' );
}
@@ -89,18 +92,8 @@ EOK;
return true;
}
- public static function onCentralAuthGlobalUserMerged( $oldname, $newname, $oldid, $newid ) {
- global $wgMWOAuthSharedUserIDs;
-
- if ( $wgMWOAuthSharedUserIDs && $oldid && $newid ) {
- self::doUserIdMerge( $oldid, $newid );
- }
-
- return true;
- }
-
protected static function doUserIdMerge( $oldid, $newid ) {
- $dbw = Utils::getCentralDB( DB_MASTER );
+ $dbw = Utils::getCentralDB( DB_PRIMARY );
// Merge any consumers register to this user
$dbw->update( 'oauth_registered_consumer',
[ 'oarc_user_id' => $newid ],
@@ -140,7 +133,7 @@ EOK;
$conds = [
$db->makeList( [
'oarc_wiki = ' . $db->addQuotes( '*' ),
- 'oarc_wiki = ' . $db->addQuotes( wfWikiId() ),
+ 'oarc_wiki = ' . $db->addQuotes( WikiMap::getCurrentWikiId() ),
], LIST_OR ),
'oarc_deleted' => 0,
];
@@ -201,7 +194,7 @@ EOK;
if ( $wgMWOAuthCentralWiki === false ) {
// Treat each wiki as its own "central wiki" as there is no actual one
- $wgMWOAuthCentralWiki = wfWikiId(); // default
+ $wgMWOAuthCentralWiki = WikiMap::getCurrentWikiId();
} else {
// There is actually a central wiki, requiring global user IDs via hook
$wgMWOAuthSharedUserIDs = true;
diff --git a/OAuth/src/Backend/MWOAuthDAO.php b/OAuth/src/Backend/MWOAuthDAO.php
index b0c60b1c..3f5654ea 100644
--- a/OAuth/src/Backend/MWOAuthDAO.php
+++ b/OAuth/src/Backend/MWOAuthDAO.php
@@ -1,8 +1,16 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Backend;
+namespace MediaWiki\Extension\OAuth\Backend;
+use Exception;
+use IContextSource;
+use IDBAccessObject;
+use LogicException;
use MediaWiki\Logger\LoggerFactory;
+use Message;
+use MWException;
+use Psr\Log\LoggerInterface;
+use stdClass;
use Wikimedia\Rdbms\DBConnRef;
use Wikimedia\Rdbms\DBError;
use Wikimedia\Rdbms\DBReadOnlyError;
@@ -29,20 +37,22 @@ use Wikimedia\Rdbms\DBReadOnlyError;
/**
* Representation of a Data Access Object
*/
-abstract class MWOAuthDAO implements \IDBAccessObject {
- private $daoOrigin = 'new'; // string; object construction origin
- private $daoPending = true; // bool; whether fields changed or the field is new
+abstract class MWOAuthDAO implements IDBAccessObject {
+ /** @var string object construction origin */
+ private $daoOrigin = 'new';
+ /** @var bool whether fields changed or the field is new */
+ private $daoPending = true;
- /** @var \Psr\Log\LoggerInterface */
+ /** @var LoggerInterface */
protected $logger;
/**
- * @throws \LogicException
+ * @throws LogicException
*/
final protected function __construct() {
$fields = array_keys( static::getFieldPermissionChecks() );
if ( array_diff( $fields, $this->getFieldNames() ) ) {
- throw new \LogicException( "Invalid field(s) defined in access check methods." );
+ throw new LogicException( "Invalid field(s) defined in access check methods." );
}
$this->logger = LoggerFactory::getInstance( 'OAuth' );
}
@@ -73,7 +83,7 @@ abstract class MWOAuthDAO implements \IDBAccessObject {
/**
* @param DBConnRef $db
- * @param array|\stdClass $row
+ * @param array|stdClass $row
* @return static
*/
final public static function newFromRow( DBConnRef $db, $row ) {
@@ -113,11 +123,11 @@ abstract class MWOAuthDAO implements \IDBAccessObject {
*
* @param string $name
* @return mixed
- * @throws \LogicException
+ * @throws LogicException
*/
final public function get( $name ) {
if ( !static::hasField( $name ) ) {
- throw new \LogicException( "Object has no '$name' field." );
+ throw new LogicException( "Object has no '$name' field." );
}
return $this->$name;
}
@@ -128,7 +138,7 @@ abstract class MWOAuthDAO implements \IDBAccessObject {
* @param string $name
* @param mixed $value
* @return mixed The old value
- * @throws \Exception
+ * @throws Exception
*/
final public function setField( $name, $value ) {
$old = $this->setFields( [ $name => $value ] );
@@ -139,14 +149,14 @@ abstract class MWOAuthDAO implements \IDBAccessObject {
* Set the values for a set of fields
*
* @param array $values (field => value) map
- * @throws \LogicException
+ * @throws LogicException
* @return array Map of old values
*/
final public function setFields( array $values ) {
$old = [];
foreach ( $values as $name => $value ) {
if ( !static::hasField( $name ) ) {
- throw new \LogicException( "Object has no '$name' field." );
+ throw new LogicException( "Object has no '$name' field." );
}
$old[$name] = $this->$name;
$this->$name = $value;
@@ -189,7 +199,7 @@ abstract class MWOAuthDAO implements \IDBAccessObject {
return $dbw->affectedRows() > 0;
} else {
$this->logger->debug( get_class( $this ) . ': skipping DB update; object unchanged.' );
- return false; // short-circuit
+ return false;
}
} else {
$this->logger->debug( get_class( $this ) . ': performing DB update; new object.' );
@@ -206,7 +216,8 @@ abstract class MWOAuthDAO implements \IDBAccessObject {
$row,
__METHOD__
);
- if ( $afield !== null ) { // update field for auto-increment field
+ if ( $afield !== null ) {
+ // update field for auto-increment field
$this->$afield = $dbw->insertId();
}
$this->daoPending = false;
@@ -247,12 +258,12 @@ abstract class MWOAuthDAO implements \IDBAccessObject {
* - table : a table name
* - fieldColumnMap : a map of field names to column names
*
- * @throws \MWException
+ * @throws MWException
* @return array
*/
protected static function getSchema() {
// Note: declaring this abstract raises E_STRICT
- throw new \MWException( "getSchema() not defined in " . get_class() );
+ throw new MWException( "getSchema() not defined in " . get_class() );
}
/**
@@ -266,12 +277,12 @@ abstract class MWOAuthDAO implements \IDBAccessObject {
* @see MWOAuthDAO::userCanAccess()
* @see MWOAuthDAOAccessControl
*
- * @throws \LogicException Subclasses must override
+ * @throws LogicException Subclasses must override
* @return array Map of (field name => name of method that checks access)
*/
protected static function getFieldPermissionChecks() {
// Note: declaring this abstract raises E_STRICT
- throw new \LogicException( "getFieldPermissionChecks() not defined in " . get_class() );
+ throw new LogicException( "getFieldPermissionChecks() not defined in " . get_class() );
}
/**
@@ -335,12 +346,12 @@ abstract class MWOAuthDAO implements \IDBAccessObject {
/**
* @param array $values
- * @throws \MWException
+ * @throws MWException
*/
final protected function loadFromValues( array $values ) {
foreach ( static::getFieldColumnMap() as $field => $column ) {
if ( !array_key_exists( $field, $values ) ) {
- throw new \MWException( get_class( $this ) . " requires '$field' field." );
+ throw new MWException( get_class( $this ) . " requires '$field' field." );
}
$this->$field = $values[$field];
}
@@ -358,7 +369,7 @@ abstract class MWOAuthDAO implements \IDBAccessObject {
/**
* @param DBConnRef $db
- * @param \stdClass|array $row
+ * @param stdClass|array $row
* @return void
*/
final protected function loadFromRow( DBConnRef $db, $row ) {
@@ -412,10 +423,10 @@ abstract class MWOAuthDAO implements \IDBAccessObject {
* @see MWOAuthDAOAccessControl
*
* @param string $name
- * @param \IContextSource $context
- * @return \Message|true Returns on success or a Message if the user lacks access
+ * @param IContextSource $context
+ * @return Message|true Returns on success or a Message if the user lacks access
*/
- final public function userCanAccess( $name, \IContextSource $context ) {
+ final public function userCanAccess( $name, IContextSource $context ) {
$map = static::getFieldPermissionChecks();
if ( isset( $map[$name] ) ) {
$method = $map[$name];
@@ -428,16 +439,17 @@ abstract class MWOAuthDAO implements \IDBAccessObject {
/**
* Get the current conflict token value for a user
*
- * @param \IContextSource $context
+ * @param IContextSource $context
* @return string Hex token
*/
- final public function getChangeToken( \IContextSource $context ) {
+ final public function getChangeToken( IContextSource $context ) {
$map = [];
foreach ( $this->getFieldNames() as $field ) {
if ( $this->userCanAccess( $field, $context ) ) {
$map[$field] = $this->$field;
} else {
- $map[$field] = null; // don't convey this information
+ // don't convey this information
+ $map[$field] = null;
}
}
return hash_hmac(
@@ -450,11 +462,11 @@ abstract class MWOAuthDAO implements \IDBAccessObject {
/**
* Compare an old change token to the current one
*
- * @param \IContextSource $context
+ * @param IContextSource $context
* @param string $oldToken
* @return bool Whether the current is unchanged
*/
- final public function checkChangeToken( \IContextSource $context, $oldToken ) {
+ final public function checkChangeToken( IContextSource $context, $oldToken ) {
return ( $this->getChangeToken( $context ) === $oldToken );
}
diff --git a/OAuth/src/Backend/MWOAuthDataStore.php b/OAuth/src/Backend/MWOAuthDataStore.php
index 76c33522..c3532f60 100644
--- a/OAuth/src/Backend/MWOAuthDataStore.php
+++ b/OAuth/src/Backend/MWOAuthDataStore.php
@@ -1,41 +1,56 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Backend;
+namespace MediaWiki\Extension\OAuth\Backend;
-use MediaWiki\Extensions\OAuth\Lib\OAuthConsumer;
-use MediaWiki\Extensions\OAuth\Lib\OAuthDataStore;
+use BagOStuff;
+use Linker;
+use MediaWiki\Extension\OAuth\Lib\OAuthConsumer;
+use MediaWiki\Extension\OAuth\Lib\OAuthDataStore;
use MediaWiki\Logger\LoggerFactory;
+use Message;
+use MWCryptRand;
+use Psr\Log\LoggerInterface;
use Wikimedia\Rdbms\DBConnRef;
class MWOAuthDataStore extends OAuthDataStore {
/** @var DBConnRef DB for the consumer/grant registry */
protected $centralReplica;
- /** @var DBConnRef|null Master DB for repeated lookup in case of replication lag problems;
- * null if there is no separate master and replica DB
+ /** @var DBConnRef|null Primary DB for repeated lookup in case of replication lag problems;
+ * null if there is no separate primary DB and replica DB
*/
- protected $centralMaster;
+ protected $centralPrimary;
- /** @var \BagOStuff Cache for Tokens and Nonces */
- protected $cache;
+ /** @var BagOStuff Cache for tokens */
+ protected $tokenCache;
- /** @var \Psr\Log\LoggerInterface */
+ /** @var BagOStuff Cache for nonces */
+ protected $nonceCache;
+
+ /** @var LoggerInterface */
protected $logger;
/**
* @param DBConnRef $centralReplica Central DB replica
- * @param DBConnRef|null $centralMaster Central DB master (if different)
- * @param \BagOStuff $cache
+ * @param DBConnRef|null $centralPrimary Central DB primary (if different)
+ * @param BagOStuff $tokenCache
+ * @param BagOStuff $nonceCache
*/
- public function __construct( DBConnRef $centralReplica, $centralMaster, \BagOStuff $cache ) {
- if ( $centralMaster !== null && !( $centralMaster instanceof DBConnRef ) ) {
+ public function __construct(
+ DBConnRef $centralReplica,
+ $centralPrimary,
+ \BagOStuff $tokenCache,
+ \BagOStuff $nonceCache
+ ) {
+ if ( $centralPrimary !== null && !( $centralPrimary instanceof DBConnRef ) ) {
throw new \InvalidArgumentException(
- __METHOD__ . ': $centralMaster must be a DB or null'
+ __METHOD__ . ': $centralPrimary must be a DB or null'
);
}
$this->centralReplica = $centralReplica;
- $this->centralMaster = $centralMaster;
- $this->cache = $cache;
+ $this->centralPrimary = $centralPrimary;
+ $this->tokenCache = $tokenCache;
+ $this->nonceCache = $nonceCache;
$this->logger = LoggerFactory::getInstance( 'OAuth' );
}
@@ -62,7 +77,7 @@ class MWOAuthDataStore extends OAuthDataStore {
$this->logger->debug( __METHOD__ . ": Looking up $token_type token '$token'" );
if ( $token_type === 'request' ) {
- $returnToken = $this->cache->get( Utils::getCacheKey(
+ $returnToken = $this->tokenCache->get( Utils::getCacheKey(
'token',
$consumer->key,
$token_type,
@@ -70,7 +85,7 @@ class MWOAuthDataStore extends OAuthDataStore {
) );
if ( $returnToken === '**USED**' ) {
throw new MWOAuthException( 'mwoauthdatastore-request-token-already-used', [
- \Message::rawParam( \Linker::makeExternalLink(
+ Message::rawParam( Linker::makeExternalLink(
'https://www.mediawiki.org/wiki/Help:OAuth/Errors#E009',
'E009',
true
@@ -79,7 +94,7 @@ class MWOAuthDataStore extends OAuthDataStore {
}
if ( $token === null || !( $returnToken instanceof MWOAuthToken ) ) {
throw new MWOAuthException( 'mwoauthdatastore-request-token-not-found', [
- \Message::rawParam( \Linker::makeExternalLink(
+ Message::rawParam( Linker::makeExternalLink(
'https://www.mediawiki.org/wiki/Help:OAuth/Errors#E004',
'E004',
true
@@ -88,9 +103,9 @@ class MWOAuthDataStore extends OAuthDataStore {
}
} elseif ( $token_type === 'access' ) {
$cmra = ConsumerAcceptance::newFromToken( $this->centralReplica, $token );
- if ( !$cmra && $this->centralMaster ) {
- // try master in case there is replication lag T124942
- $cmra = ConsumerAcceptance::newFromToken( $this->centralMaster, $token );
+ if ( !$cmra && $this->centralPrimary ) {
+ // try primary database in case there is replication lag T124942
+ $cmra = ConsumerAcceptance::newFromToken( $this->centralPrimary, $token );
}
if ( !$cmra ) {
throw new MWOAuthException( 'mwoauthdatastore-access-token-not-found' );
@@ -127,7 +142,12 @@ class MWOAuthDataStore extends OAuthDataStore {
// Do an add for the key associated with this nonce to check if it was already used.
// Set timeout 5 minutes in the future of the timestamp as OAuthServer does. Use the
// timestamp so the client can also expire their nonce records after 5 mins.
- if ( !$this->cache->add( $key, 1, $timestamp + 300 ) ) {
+ if ( !$this->nonceCache->add( $key, 1, $timestamp + 300 ) ) {
+ // T308861
+ $key = preg_replace(
+ "/(oauth_token_secret\=\w+:)/",
+ "oauth_token_secret=[REDACTED]:",
+ $key );
$this->logger->info( "$key exists, so nonce has been used by this consumer+token" );
return true;
}
@@ -142,8 +162,8 @@ class MWOAuthDataStore extends OAuthDataStore {
*/
public static function newToken() {
return new MWOAuthToken(
- \MWCryptRand::generateHex( 32 ),
- \MWCryptRand::generateHex( 32 )
+ MWCryptRand::generateHex( 32 ),
+ MWCryptRand::generateHex( 32 )
);
}
@@ -163,9 +183,11 @@ class MWOAuthDataStore extends OAuthDataStore {
$cacheCallbackKey = Utils::getCacheKey(
'callback', $consumer->key, 'request', $token->key
);
- $this->cache->add( $cacheConsumerKey, $consumer->key, 600 ); // 10 minutes. Kindof arbitray.
- $this->cache->add( $cacheTokenKey, $token, 600 ); // 10 minutes. Kindof arbitray.
- $this->cache->add( $cacheCallbackKey, $callback, 600 ); // 10 minutes. Kindof arbitray.
+
+ // 600s == 10 minutes. Kind of arbitrary.
+ $this->tokenCache->add( $cacheConsumerKey, $consumer->key, 600 );
+ $this->tokenCache->add( $cacheTokenKey, $token, 600 );
+ $this->tokenCache->add( $cacheCallbackKey, $callback, 600 );
$this->logger->debug( __METHOD__ .
": New request token {$token->key} for {$consumer->key} with callback {$callback}" );
return $token;
@@ -174,13 +196,12 @@ class MWOAuthDataStore extends OAuthDataStore {
/**
* Return a consumer key associated with the given request token.
*
- * @param MWOAuthToken $requestToken the request token
+ * @param string $requestToken the request token
* @return string|false the consumer key or false if nothing is stored for the request token
*/
public function getConsumerKey( $requestToken ) {
$cacheKey = Utils::getCacheKey( 'consumer', 'request', $requestToken );
- $consumerKey = $this->cache->get( $cacheKey );
- return $consumerKey;
+ return $this->tokenCache->get( $cacheKey );
}
/**
@@ -196,11 +217,11 @@ class MWOAuthDataStore extends OAuthDataStore {
*/
public function getCallbackUrl( $consumerKey, $requestKey ) {
$cacheKey = Utils::getCacheKey( 'callback', $consumerKey, 'request', $requestKey );
- $callback = $this->cache->get( $cacheKey );
+ $callback = $this->tokenCache->get( $cacheKey );
if ( $callback === null || !is_string( $callback ) ) {
throw new MWOAuthException( 'mwoauthdatastore-callback-not-found' );
}
- $this->cache->delete( $cacheKey );
+ $this->tokenCache->delete( $cacheKey );
return $callback;
}
@@ -227,7 +248,7 @@ class MWOAuthDataStore extends OAuthDataStore {
$cacheKey = Utils::getCacheKey( 'token',
$consumer->getConsumerKey(), 'request', $token->key );
$accessToken = $this->lookup_token( $consumer, 'access', $token->getAccessKey() );
- $this->cache->set( $cacheKey, '**USED**', 600 );
+ $this->tokenCache->set( $cacheKey, '**USED**', 600 );
$this->logger->debug( __METHOD__ .
": New access token {$accessToken->key} for {$consumer->key}" );
return $accessToken;
@@ -241,7 +262,8 @@ class MWOAuthDataStore extends OAuthDataStore {
*/
public function updateRequestToken( $token, $consumer ) {
$cacheKey = Utils::getCacheKey( 'token', $consumer->key, 'request', $token->key );
- $this->cache->set( $cacheKey, $token, 600 ); // 10 more minutes. Kindof arbitray.
+ // 10 more minutes. Kind of arbitrary.
+ $this->tokenCache->set( $cacheKey, $token, 600 );
}
/**
diff --git a/OAuth/src/Backend/MWOAuthException.php b/OAuth/src/Backend/MWOAuthException.php
index 844bb210..a42f1ff1 100644
--- a/OAuth/src/Backend/MWOAuthException.php
+++ b/OAuth/src/Backend/MWOAuthException.php
@@ -1,11 +1,14 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Backend;
+namespace MediaWiki\Extension\OAuth\Backend;
-use MediaWiki\Extensions\OAuth\Lib\OAuthException;
+use MediaWiki\Extension\OAuth\Lib\OAuthException;
class MWOAuthException extends OAuthException {
- public $msg, $params;
+ /** @var string */
+ public $msg;
+ /** @var array|null */
+ public $params;
/**
* Exception that may be shown to an end user
diff --git a/OAuth/src/Backend/MWOAuthRequest.php b/OAuth/src/Backend/MWOAuthRequest.php
index 00dec824..1b16fddb 100644
--- a/OAuth/src/Backend/MWOAuthRequest.php
+++ b/OAuth/src/Backend/MWOAuthRequest.php
@@ -1,10 +1,9 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Backend;
+namespace MediaWiki\Extension\OAuth\Backend;
-use MediaWiki\Extensions\OAuth\Lib\OAuthRequest;
-use MediaWiki\Extensions\OAuth\Lib\OAuthUtil;
-use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\Extension\OAuth\Lib\OAuthRequest;
+use MediaWiki\Extension\OAuth\Lib\OAuthUtil;
/**
* @file
@@ -15,6 +14,7 @@ use MediaWiki\Logger\LoggerFactory;
*/
class MWOAuthRequest extends OAuthRequest {
+ /** @var string|false */
private $sourceIP;
public function __construct( $httpMethod, $httpUrl, $parameters, $sourcIP = false ) {
@@ -23,15 +23,11 @@ class MWOAuthRequest extends OAuthRequest {
}
public function getConsumerKey() {
- $key = '';
- if ( isset( $this->parameters['oauth_consumer_key'] ) ) {
- $key = $this->parameters['oauth_consumer_key'];
- }
- return $key;
+ return $this->parameters['oauth_consumer_key'] ?? '';
}
/**
- * Track the source IP of the request, so we can enforce the IP whitelist
+ * Track the source IP of the request, so we can enforce the allowed IP list
* @return string $ip the ip of the source
*/
public function getSourceIP() {
@@ -41,7 +37,6 @@ class MWOAuthRequest extends OAuthRequest {
public static function fromRequest( \WebRequest $request ) {
$httpMethod = strtoupper( $request->getMethod() );
$httpUrl = $request->getFullRequestURL();
- $logger = LoggerFactory::getInstance( 'OAuth' );
// Find request headers
$requestHeaders = Utils::getHeaders();
diff --git a/OAuth/src/Backend/MWOAuthServer.php b/OAuth/src/Backend/MWOAuthServer.php
index f57c8492..26a29394 100644
--- a/OAuth/src/Backend/MWOAuthServer.php
+++ b/OAuth/src/Backend/MWOAuthServer.php
@@ -1,8 +1,12 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Backend;
+namespace MediaWiki\Extension\OAuth\Backend;
-use MediaWiki\Extensions\OAuth\Lib\OAuthServer;
+use Linker;
+use MediaWiki\Extension\OAuth\Lib\OAuthServer;
+use Message;
+use SpecialPage;
+use User;
class MWOAuthServer extends OAuthServer {
/** @var MWOAuthDataStore */
@@ -11,7 +15,7 @@ class MWOAuthServer extends OAuthServer {
/**
* Return a consumer key associated with the given request token.
*
- * @param MWOAuthToken $requestToken the request token
+ * @param string $requestToken the request token
* @return string|false the consumer key or false if nothing is stored for the request token
*/
public function getConsumerKey( $requestToken ) {
@@ -36,10 +40,10 @@ class MWOAuthServer extends OAuthServer {
if ( $consumer->getOwnerOnly() ) {
throw new MWOAuthException( 'mwoauthserver-consumer-owner-only', [
$consumer->getName(),
- \SpecialPage::getTitleFor(
+ SpecialPage::getTitleFor(
'OAuthConsumerRegistration', 'update/' . $consumer->getConsumerKey()
),
- \Message::rawParam( \Linker::makeExternalLink(
+ Message::rawParam( Linker::makeExternalLink(
'https://www.mediawiki.org/wiki/Help:OAuth/Errors#E010',
'E010',
true
@@ -50,7 +54,7 @@ class MWOAuthServer extends OAuthServer {
// Consumer must have a key for us to verify
if ( !$consumer->getSecretKey() && !$consumer->getRsaKey() ) {
throw new MWOAuthException( 'mwoauthserver-consumer-no-secret', [
- \Message::rawParam( \Linker::makeExternalLink(
+ Message::rawParam( Linker::makeExternalLink(
'https://www.mediawiki.org/wiki/Help:OAuth/Errors#E011',
'E011',
true
@@ -88,7 +92,9 @@ class MWOAuthServer extends OAuthServer {
* client can provide a callback and the configured callback must be
* a prefix of the supplied callback. The matching performed here is based
* on parsed URL components rather than strict string matching. Protocol
- * upgrades from http to https are also allowed.
+ * upgrades from http to https are also allowed, and the registered callback
+ * can be made to match any port number, by specifying port 1. (This is
+ * less secure, and only meant for demo consumers for local development.)
*
* @param Consumer $consumer
* @param string $callback
@@ -124,9 +130,13 @@ class MWOAuthServer extends OAuthServer {
self::looseSchemeMatch( $knownCallback['scheme'], $reqCallback['scheme'] ) &&
// Host must match exactly
$knownCallback['host'] === $reqCallback['host'] &&
- // Port must be either missing from both or an exact match
- static::getOrNull( 'port', $knownCallback ) ===
- static::getOrNull( 'port', $reqCallback ) &&
+ // Port must be either missing from both or an exact match,
+ // unless the registered callback allows any port, which is specified
+ // by using port 1.
+ ( static::getOrNull( 'port', $knownCallback ) === 1 ||
+ static::getOrNull( 'port', $knownCallback ) ===
+ static::getOrNull( 'port', $reqCallback )
+ ) &&
// Path must be an exact match if query is provided in the
// registered callback. Otherwise it must be a prefix match if
// provided in the registered callback or anything if no path was
@@ -182,7 +192,6 @@ class MWOAuthServer extends OAuthServer {
private static function componentMatches(
$part, $expect, $got, $exact = false
) {
- $match = false;
if ( !array_key_exists( $part, $expect ) ) {
// Anything in the request is ok if we do not have the URL part in
// the expected values
@@ -194,8 +203,7 @@ class MWOAuthServer extends OAuthServer {
} else {
$want = (string)$expect[$part];
$have = (string)$got[$part];
- $len = strlen( $want );
- $match = $want === substr( $have, 0, $len );
+ $match = strpos( $have, $want ) === 0;
}
return $match;
}
@@ -218,10 +226,10 @@ class MWOAuthServer extends OAuthServer {
if ( $consumer->getOwnerOnly() ) {
throw new MWOAuthException( 'mwoauthserver-consumer-owner-only', [
$consumer->getName(),
- \SpecialPage::getTitleFor(
+ SpecialPage::getTitleFor(
'OAuthConsumerRegistration', 'update/' . $consumer->getConsumerKey()
),
- \Message::rawParam( \Linker::makeExternalLink(
+ Message::rawParam( Linker::makeExternalLink(
'https://www.mediawiki.org/wiki/Help:OAuth/Errors#E010',
'E010',
true
@@ -232,7 +240,7 @@ class MWOAuthServer extends OAuthServer {
// Consumer must have a key for us to verify
if ( !$consumer->getSecretKey() && !$consumer->getRsaKey() ) {
throw new MWOAuthException( 'mwoauthserver-consumer-no-secret', [
- \Message::rawParam( \Linker::makeExternalLink(
+ Message::rawParam( Linker::makeExternalLink(
'https://www.mediawiki.org/wiki/Help:OAuth/Errors#E011',
'E011',
true
@@ -255,9 +263,7 @@ class MWOAuthServer extends OAuthServer {
// Rev A change
$verifier = $request->get_parameter( 'oauth_verifier' );
$this->logger->debug( __METHOD__ . ": verify code is '$verifier'" );
- $new_token = $this->data_store->new_access_token( $token, $consumer, $verifier );
-
- return $new_token;
+ return $this->data_store->new_access_token( $token, $consumer, $verifier );
}
/**
@@ -292,11 +298,11 @@ class MWOAuthServer extends OAuthServer {
*
* @param string $consumerKey
* @param string $requestTokenKey
- * @param \User $mwUser
+ * @param User $mwUser
* @param bool $update
* @return string
*/
- public function authorize( $consumerKey, $requestTokenKey, \User $mwUser, $update ) {
+ public function authorize( $consumerKey, $requestTokenKey, User $mwUser, $update ) {
$dbr = Utils::getCentralDB( DB_REPLICA );
$consumer = Consumer::newFromKey( $dbr, $consumerKey );
return $consumer->authorize( $mwUser, $update, $consumer->getGrants(), $requestTokenKey );
@@ -314,14 +320,14 @@ class MWOAuthServer extends OAuthServer {
* Users might want more grants on some wikis than on "*". Note that the reverse would not
* make sense, since the consumer could just use the "*" acceptance if it has more grants.
*
- * @param \User $mwUser (local wiki user) User who may or may not have authorizations
+ * @param User $mwUser (local wiki user) User who may or may not have authorizations
* @param Consumer $consumer
* @param string $wikiId
* @throws MWOAuthException
* @return ConsumerAcceptance
* @deprecated Use MWOAuthConsumer::getCurrentAuthorization(...)
*/
- public function getCurrentAuthorization( \User $mwUser, $consumer, $wikiId ) {
+ public function getCurrentAuthorization( User $mwUser, $consumer, $wikiId ) {
wfDeprecated( __METHOD__ );
return $consumer->getCurrentAuthorization( $mwUser, $wikiId );
}
diff --git a/OAuth/src/Backend/MWOAuthSignatureMethod_RSA_SHA1.php b/OAuth/src/Backend/MWOAuthSignatureMethod_RSA_SHA1.php
index 46e7b63f..a1cae2a4 100644
--- a/OAuth/src/Backend/MWOAuthSignatureMethod_RSA_SHA1.php
+++ b/OAuth/src/Backend/MWOAuthSignatureMethod_RSA_SHA1.php
@@ -1,11 +1,11 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Backend;
+namespace MediaWiki\Extension\OAuth\Backend;
-use MediaWiki\Extensions\OAuth\Lib\OAuthDataStore;
-use MediaWiki\Extensions\OAuth\Lib\OAuthException;
-use MediaWiki\Extensions\OAuth\Lib\OAuthRequest;
-use MediaWiki\Extensions\OAuth\Lib\OAuthSignatureMethod_RSA_SHA1;
+use MediaWiki\Extension\OAuth\Lib\OAuthDataStore;
+use MediaWiki\Extension\OAuth\Lib\OAuthException;
+use MediaWiki\Extension\OAuth\Lib\OAuthRequest;
+use MediaWiki\Extension\OAuth\Lib\OAuthSignatureMethod_RSA_SHA1;
class MWOAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod_RSA_SHA1 {
/** @var MWOAuthDataStore */
diff --git a/OAuth/src/Backend/MWOAuthToken.php b/OAuth/src/Backend/MWOAuthToken.php
index 82315403..61c36edf 100644
--- a/OAuth/src/Backend/MWOAuthToken.php
+++ b/OAuth/src/Backend/MWOAuthToken.php
@@ -1,13 +1,13 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Backend;
+namespace MediaWiki\Extension\OAuth\Backend;
-use MediaWiki\Extensions\OAuth\Lib\OAuthToken;
+use MediaWiki\Extension\OAuth\Lib\OAuthToken;
class MWOAuthToken extends OAuthToken {
- // Keep the verification code here
+ /** @var string|null Keep the verification code here */
protected $code;
- // Token to find grant in oauth_accepted_consumer
+ /** @var string|null Token to find grant in oauth_accepted_consumer */
protected $accessTokenKey;
public function addVerifyCode( $code ) {
diff --git a/OAuth/src/Backend/OAuth1Consumer.php b/OAuth/src/Backend/OAuth1Consumer.php
index 452c9f9c..f6612487 100644
--- a/OAuth/src/Backend/OAuth1Consumer.php
+++ b/OAuth/src/Backend/OAuth1Consumer.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Backend;
+namespace MediaWiki\Extension\OAuth\Backend;
use MWException;
use User;
@@ -40,7 +40,7 @@ class OAuth1Consumer extends Consumer {
* @param User $mwUser
* @param bool $update
* @param array $grants
- * @param null $requestTokenKey
+ * @param string|null $requestTokenKey
* @return string
* @throws MWOAuthException
* @throws MWException
diff --git a/OAuth/src/Backend/UpdaterHooks.php b/OAuth/src/Backend/UpdaterHooks.php
index 47eaae74..ab4341d2 100644
--- a/OAuth/src/Backend/UpdaterHooks.php
+++ b/OAuth/src/Backend/UpdaterHooks.php
@@ -1,47 +1,33 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Backend;
+namespace MediaWiki\Extension\OAuth\Backend;
+
+use DatabaseUpdater;
/**
* Class containing updater functions for an OAuth environment
*/
class UpdaterHooks {
/**
- * @param \DatabaseUpdater $updater
+ * @param DatabaseUpdater $updater
* @return bool
*/
- public static function addSchemaUpdates( \DatabaseUpdater $updater ) {
+ public static function addSchemaUpdates( DatabaseUpdater $updater ) {
if ( !Utils::isCentralWiki() ) {
- return true; // no tables to add
+ // no tables to add
+ return true;
}
$dbType = $updater->getDB()->getType();
- if ( $dbType == 'mysql' || $dbType == 'sqlite' ) {
-
- $updater->addExtensionTable(
- 'oauth_registered_consumer',
- self::getPath( 'OAuth.sql', $dbType )
- );
-
- $updater->addExtensionField(
- 'oauth_registered_consumer',
- 'oarc_callback_is_prefix',
- self::getPath( 'callback_is_prefix.sql', $dbType )
- );
-
- $updater->addExtensionField(
- 'oauth_registered_consumer',
- 'oarc_developer_agreement',
- self::getPath( 'developer_agreement.sql', $dbType )
- );
+ $updater->addExtensionTable(
+ 'oauth_registered_consumer',
+ self::getPath( 'tables-generated.sql', $dbType )
+ );
- $updater->addExtensionField(
- 'oauth_registered_consumer',
- 'oarc_owner_only',
- self::getPath( 'owner_only.sql', $dbType )
- );
+ if ( $dbType == 'mysql' || $dbType == 'sqlite' ) {
+ // 1.35
$updater->addExtensionField(
'oauth_registered_consumer',
'oarc_oauth_version',
@@ -77,6 +63,19 @@ class UpdaterHooks {
self::getPath( 'index_on_oaat_acceptance_id.sql', $dbType )
);
+ // 1.39
+ $updater->modifyExtensionField(
+ 'oauth_accepted_consumer',
+ 'oaac_accepted',
+ self::getPath( 'patch-oauth_accepted_consumer-timestamp.sql', $dbType )
+ );
+
+ $updater->modifyExtensionField(
+ 'oauth_registered_consumer',
+ 'oarc_email_authenticated',
+ self::getPath( 'patch-oauth_registered_consumer-timestamp.sql', $dbType )
+ );
+
}
return true;
}
diff --git a/OAuth/src/Backend/Utils.php b/OAuth/src/Backend/Utils.php
index 7c6bafd7..cf7fccae 100644
--- a/OAuth/src/Backend/Utils.php
+++ b/OAuth/src/Backend/Utils.php
@@ -1,11 +1,20 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Backend;
+namespace MediaWiki\Extension\OAuth\Backend;
+use AutoCommitUpdate;
+use CentralIdLookup;
+use DeferredUpdates;
use EchoEvent;
-use MediaWiki\Extensions\OAuth\Lib\OAuthSignatureMethod_HMAC_SHA1;
+use MediaWiki\Extension\OAuth\Lib\OAuthSignatureMethod_HMAC_SHA1;
use MediaWiki\MediaWikiServices;
+use MWException;
+use ObjectCache;
+use RequestContext;
+use Title;
use User;
+use WebRequest;
+use WikiMap;
use Wikimedia\Rdbms\DBConnRef;
use Wikimedia\Rdbms\IDatabase;
@@ -22,25 +31,38 @@ class Utils {
public static function isCentralWiki() {
global $wgMWOAuthCentralWiki;
- return ( wfWikiId() === $wgMWOAuthCentralWiki );
+ return ( WikiMap::getCurrentWikiId() === $wgMWOAuthCentralWiki );
}
/**
- * @param int $index DB_MASTER/DB_REPLICA
+ * @return string|bool
+ */
+ public static function getCentralWiki() {
+ global $wgMWOAuthCentralWiki;
+
+ return $wgMWOAuthCentralWiki;
+ }
+
+ /**
+ * @param int $index DB_PRIMARY/DB_REPLICA
* @return DBConnRef
*/
public static function getCentralDB( $index ) {
- global $wgMWOAuthCentralWiki, $wgMWOAuthReadOnly;
+ global $wgMWOAuthReadOnly;
$lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
- // T244415: Use the master if there were changes
- if ( $index === DB_REPLICA && $lbFactory->hasOrMadeRecentMasterChanges() ) {
- $index = DB_MASTER;
+ // T244415: Use the primary database if there were changes
+ if ( $index === DB_REPLICA && $lbFactory->hasOrMadeRecentPrimaryChanges() ) {
+ $index = DB_PRIMARY;
+ }
+ $wikiId = self::getCentralWiki();
+ if ( WikiMap::isCurrentWikiId( $wikiId ) ) {
+ $wikiId = false;
}
- $db = $lbFactory->getMainLB( $wgMWOAuthCentralWiki )->getLazyConnectionRef(
- $index, [], $wgMWOAuthCentralWiki );
+ $db = $lbFactory->getMainLB( $wikiId )->getConnectionRef(
+ $index, [], $wikiId );
$db->daoReadOnly = $wgMWOAuthReadOnly;
return $db;
}
@@ -53,7 +75,19 @@ class Utils {
global $wgSessionCacheType;
$sessionCacheType = $wgMWOAuthSessionCacheType ?? $wgSessionCacheType;
- return \ObjectCache::getInstance( $sessionCacheType );
+ return ObjectCache::getInstance( $sessionCacheType );
+ }
+
+ /**
+ * Get the cache type for OAuth 1.0 nonces
+ * @return \BagOStuff
+ */
+ public static function getNonceCache() {
+ global $wgMWOAuthNonceCacheType, $wgMWOAuthSessionCacheType, $wgSessionCacheType;
+
+ $cacheType = $wgMWOAuthNonceCacheType
+ ?? $wgMWOAuthSessionCacheType ?? $wgSessionCacheType;
+ return ObjectCache::getInstance( $cacheType );
}
/**
@@ -89,7 +123,7 @@ class Utils {
* @return array Header name => value
*/
public static function getHeaders() {
- $request = \RequestContext::getMain()->getRequest();
+ $request = RequestContext::getMain()->getRequest();
$headers = $request->getAllHeaders();
$out = [];
@@ -106,15 +140,13 @@ class Utils {
/**
* Test this request for an OAuth Authorization header
- * @param \WebRequest $request the MediaWiki request
+ * @param WebRequest $request the MediaWiki request
* @return bool true if a header was found
*/
- public static function hasOAuthHeaders( \WebRequest $request ) {
+ public static function hasOAuthHeaders( WebRequest $request ) {
$header = $request->getHeader( 'Authorization' );
- if ( $header !== false && substr( $header, 0, 6 ) == 'OAuth ' ) {
- return true;
- }
- return false;
+
+ return $header !== false && strpos( $header, 'OAuth ' ) === 0;
}
/**
@@ -142,11 +174,11 @@ class Utils {
$cutoff = time() - $wgMWOAuthRequestExpirationAge;
$fname = __METHOD__;
- \DeferredUpdates::addUpdate(
- new \AutoCommitUpdate(
+ DeferredUpdates::addUpdate(
+ new AutoCommitUpdate(
$dbw,
__METHOD__,
- function ( IDatabase $dbw ) use ( $cutoff, $fname ) {
+ static function ( IDatabase $dbw ) use ( $cutoff, $fname ) {
$dbw->update(
'oauth_registered_consumer',
[
@@ -174,14 +206,15 @@ class Utils {
public static function getWikiIdName( $wikiId ) {
if ( $wikiId === '*' ) {
return wfMessage( 'mwoauth-consumer-allwikis' )->text();
- } else {
- $host = \WikiMap::getWikiName( $wikiId );
- if ( strpos( $host, '.' ) ) {
- return $host; // e.g. "en.wikipedia.org"
- } else {
- return $wikiId;
- }
}
+
+ $host = WikiMap::getWikiName( $wikiId );
+ if ( strpos( $host, '.' ) ) {
+ // e.g. "en.wikipedia.org"
+ return $host;
+ }
+
+ return $wikiId;
}
/**
@@ -218,8 +251,8 @@ class Utils {
public static function newMWOAuthDataStore() {
$lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
$dbr = self::getCentralDB( DB_REPLICA );
- $dbw = $lb->getServerCount() > 1 ? self::getCentralDB( DB_MASTER ) : null;
- return new MWOAuthDataStore( $dbr, $dbw, self::getSessionCache() );
+ $dbw = $lb->getServerCount() > 1 ? self::getCentralDB( DB_PRIMARY ) : null;
+ return new MWOAuthDataStore( $dbr, $dbw, self::getSessionCache(), self::getNonceCache() );
}
/**
@@ -233,23 +266,28 @@ class Utils {
public static function getCentralUserNameFromId( $userId, $audience = false ) {
global $wgMWOAuthSharedUserIDs, $wgMWOAuthSharedUserSource;
- if ( $wgMWOAuthSharedUserIDs ) { // global ID required via hook
- $lookup = \CentralIdLookup::factory( $wgMWOAuthSharedUserSource );
+ // global ID required via hook
+ if ( $wgMWOAuthSharedUserIDs ) {
+ $lookup = MediaWikiServices::getInstance()
+ ->getCentralIdLookupFactory()
+ ->getLookup( $wgMWOAuthSharedUserSource );
$name = $lookup->nameFromCentralId(
$userId,
$audience === 'raw'
- ? \CentralIdLookup::AUDIENCE_RAW
- : ( $audience ?: \CentralIdLookup::AUDIENCE_PUBLIC )
+ ? CentralIdLookup::AUDIENCE_RAW
+ : ( $audience ?: CentralIdLookup::AUDIENCE_PUBLIC )
);
if ( $name === null ) {
$name = false;
}
} else {
$name = '';
- $user = \User::newFromId( $userId );
+ $user = User::newFromId( $userId );
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+
if ( $audience === 'raw'
|| !$user->isHidden()
- || ( $audience instanceof \User && $audience->isAllowed( 'hideuser' ) )
+ || ( $audience instanceof User && $permissionManager->userHasRight( $audience, 'hideuser' ) )
) {
$name = $user->getName();
}
@@ -262,37 +300,40 @@ class Utils {
* Given a central wiki user ID, get a local User object
*
* @param int $userId
- * @throws \MWException
- * @return \User|bool User or false if not found
+ * @throws MWException
+ * @return User|bool User or false if not found
*/
public static function getLocalUserFromCentralId( $userId ) {
global $wgMWOAuthSharedUserIDs, $wgMWOAuthSharedUserSource;
- if ( $wgMWOAuthSharedUserIDs ) { // global ID required via hook
- $lookup = \CentralIdLookup::factory( $wgMWOAuthSharedUserSource );
+ // global ID required via hook
+ if ( $wgMWOAuthSharedUserIDs ) {
+ $lookup = MediaWikiServices::getInstance()
+ ->getCentralIdLookupFactory()
+ ->getLookup( $wgMWOAuthSharedUserSource );
$user = $lookup->localUserFromCentralId( $userId );
if ( $user === null || !$lookup->isAttached( $user ) ) {
- $user = false;
+ return false;
}
- } else {
- $user = \User::newFromId( $userId );
+ return User::newFromIdentity( $user );
}
- return $user;
+ return User::newFromId( $userId );
}
/**
* Given a local User object, get the user ID for that user on the central wiki
*
- * @param \User $user
- * @throws \MWException
+ * @param User $user
+ * @throws MWException
* @return int|bool ID or false if not found
*/
public static function getCentralIdFromLocalUser( \User $user ) {
global $wgMWOAuthSharedUserIDs, $wgMWOAuthSharedUserSource;
- if ( $wgMWOAuthSharedUserIDs ) { // global ID required via hook
- // T227688 do not rely on array autocreation for non-stdClass
+ // global ID required via hook
+ if ( $wgMWOAuthSharedUserIDs ) {
+ // T227688 do not rely on array auto-creation for non-stdClass
if ( !isset( $user->oAuthUserData ) ) {
$user->oAuthUserData = [];
}
@@ -301,7 +342,9 @@ class Utils {
// @phan-suppress-next-line PhanTypeArraySuspiciousNullable
$id = $user->oAuthUserData['centralId'];
} else {
- $lookup = \CentralIdLookup::factory( $wgMWOAuthSharedUserSource );
+ $lookup = MediaWikiServices::getInstance()
+ ->getCentralIdLookupFactory()
+ ->getLookup( $wgMWOAuthSharedUserSource );
if ( !$lookup->isAttached( $user ) ) {
$id = false;
} else {
@@ -323,22 +366,25 @@ class Utils {
/**
* Given a username, get the user ID for that user on the central wiki.
* @param string $username
- * @throws \MWException
+ * @throws MWException
* @return int|bool ID or false if not found
*/
public static function getCentralIdFromUserName( $username ) {
global $wgMWOAuthSharedUserIDs, $wgMWOAuthSharedUserSource;
- if ( $wgMWOAuthSharedUserIDs ) { // global ID required via hook
- $lookup = \CentralIdLookup::factory( $wgMWOAuthSharedUserSource );
+ // global ID required via hook
+ if ( $wgMWOAuthSharedUserIDs ) {
+ $lookup = MediaWikiServices::getInstance()
+ ->getCentralIdLookupFactory()
+ ->getLookup( $wgMWOAuthSharedUserSource );
$id = $lookup->centralIdFromName( $username );
if ( $id === 0 ) {
$id = false;
}
} else {
$id = false;
- $user = \User::newFromName( $username );
- if ( $user instanceof \User && $user->getId() > 0 ) {
+ $user = User::newFromName( $username );
+ if ( $user instanceof User && $user->getId() > 0 ) {
$id = $user->getId();
}
}
@@ -379,12 +425,12 @@ class Utils {
global $wgMWOAuthCentralWiki, $wgMWOAuthSharedUserIDs;
if ( $wgMWOAuthSharedUserIDs ) {
- $url = \WikiMap::getForeignURL(
+ $url = WikiMap::getForeignURL(
$wgMWOAuthCentralWiki,
"User_talk:$username"
);
} else {
- $url = \Title::makeTitleSafe( NS_USER_TALK, $username )->getFullURL();
+ $url = Title::makeTitleSafe( NS_USER_TALK, $username )->getFullURL();
}
return $url;
}
@@ -396,7 +442,9 @@ class Utils {
public static function grantsAreValid( array $grants ) {
// Remove our special grants before calling the core method
$grants = array_diff( $grants, [ 'mwoauth-authonly', 'mwoauth-authonlyprivate' ] );
- return \MWGrants::grantsAreValid( $grants );
+ return MediaWikiServices::getInstance()
+ ->getGrantsInfo()
+ ->grantsAreValid( $grants );
}
/**
@@ -450,7 +498,7 @@ class Utils {
* @return bool
*/
public static function isReservedTagName( $tagName ) {
- return strpos( strtolower( $tagName ), 'oauth cid:' ) === 0;
+ return stripos( $tagName, 'oauth cid:' ) === 0;
}
/**
diff --git a/OAuth/src/Control/ConsumerAcceptanceAccessControl.php b/OAuth/src/Control/ConsumerAcceptanceAccessControl.php
index 43551f79..f88fcb6c 100644
--- a/OAuth/src/Control/ConsumerAcceptanceAccessControl.php
+++ b/OAuth/src/Control/ConsumerAcceptanceAccessControl.php
@@ -1,12 +1,12 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Control;
+namespace MediaWiki\Extension\OAuth\Control;
-use MediaWiki\Extensions\OAuth\Backend\ConsumerAcceptance;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Backend\ConsumerAcceptance;
+use MediaWiki\Extension\OAuth\Backend\Utils;
class ConsumerAcceptanceAccessControl extends DAOAccessControl {
- // accessor fields copied from MWOAuthConsumerAcceptance, except they can return a Message
+ // accessor fields copied from ConsumerAcceptance, except they can return a Message
// on access error
/**
@@ -57,7 +57,7 @@ class ConsumerAcceptanceAccessControl extends DAOAccessControl {
/**
* Secret key used to derive the access secret for the OAuth protocol.
- * The actual access secret will be calculated via MWOAuthUtils::hmacDBSecret() to mitigate
+ * The actual access secret will be calculated via Utils::hmacDBSecret() to mitigate
* DB leaks.
* Returns a Message when the user does not have permission to see this field.
* @return string|\Message
@@ -91,7 +91,7 @@ class ConsumerAcceptanceAccessControl extends DAOAccessControl {
* @return string|\Message
*/
public function getWikiName() {
- return $this->get( 'wiki', function ( $wikiId ) {
+ return $this->get( 'wiki', static function ( $wikiId ) {
return Utils::getWikiIdName( $wikiId );
} );
}
@@ -100,6 +100,7 @@ class ConsumerAcceptanceAccessControl extends DAOAccessControl {
* @return ConsumerAcceptance
*/
public function getDAO() {
+ // @phan-suppress-next-line PhanTypeMismatchReturnSuperType
return $this->dao;
}
}
diff --git a/OAuth/src/Control/ConsumerAcceptanceSubmitControl.php b/OAuth/src/Control/ConsumerAcceptanceSubmitControl.php
index ce7d3fcb..91607dd3 100644
--- a/OAuth/src/Control/ConsumerAcceptanceSubmitControl.php
+++ b/OAuth/src/Control/ConsumerAcceptanceSubmitControl.php
@@ -19,15 +19,16 @@
* http://www.gnu.org/copyleft/gpl.html
*/
-namespace MediaWiki\Extensions\OAuth\Control;
-
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\ConsumerAcceptance;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthException;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Lib\OAuthException;
-use MediaWiki\Extensions\OAuth\Repository\AccessTokenRepository;
+namespace MediaWiki\Extension\OAuth\Control;
+
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\ConsumerAcceptance;
+use MediaWiki\Extension\OAuth\Backend\MWOAuthException;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Lib\OAuthException;
+use MediaWiki\Extension\OAuth\Repository\AccessTokenRepository;
use MediaWiki\Logger\LoggerFactory;
+use Mediawiki\MediaWikiServices;
use Wikimedia\Rdbms\DBConnRef;
/**
@@ -48,7 +49,7 @@ class ConsumerAcceptanceSubmitControl extends SubmitControl {
/**
* @param \IContextSource $context
* @param array $params
- * @param DBConnRef $dbw Result of MWOAuthUtils::getCentralDB( DB_MASTER )
+ * @param DBConnRef $dbw Result of Utils::getCentralDB( DB_PRIMARY )
* @param int $oauthVersion
*/
public function __construct(
@@ -63,7 +64,7 @@ class ConsumerAcceptanceSubmitControl extends SubmitControl {
$required = [
'update' => [
'acceptanceId' => '/^\d+$/',
- 'grants' => function ( $s ) {
+ 'grants' => static function ( $s ) {
$grants = \FormatJson::decode( $s, true );
return is_array( $grants ) && Utils::grantsAreValid( $grants );
}
@@ -90,22 +91,27 @@ class ConsumerAcceptanceSubmitControl extends SubmitControl {
protected function checkBasePermissions() {
$user = $this->getUser();
+ $services = MediaWikiServices::getInstance();
+ $permissionManager = $services->getPermissionManager();
+ $readOnlyMode = $services->getReadOnlyMode();
+
if ( !$user->getID() ) {
return $this->failure( 'not_logged_in', 'badaccess-group0' );
- } elseif ( !$user->isAllowed( 'mwoauthmanagemygrants' ) ) {
+ } elseif ( !$permissionManager->userHasRight( $user, 'mwoauthmanagemygrants' ) ) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
- } elseif ( wfReadOnly() ) {
- return $this->failure( 'readonly', 'readonlytext', wfReadOnlyReason() );
+ } elseif ( $readOnlyMode->isReadOnly() ) {
+ return $this->failure( 'readonly', 'readonlytext', $readOnlyMode->getReason() );
}
return $this->success();
}
protected function processAction( $action ) {
- $user = $this->getUser(); // proposer or admin
- $dbw = $this->dbw; // convenience
+ // proposer or admin
+ $user = $this->getUser();
+ $dbw = $this->dbw;
$centralUserId = Utils::getCentralIdFromLocalUser( $user );
- if ( !$centralUserId ) { // sanity
+ if ( !$centralUserId ) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
}
@@ -161,13 +167,18 @@ class ConsumerAcceptanceSubmitControl extends SubmitControl {
}
$cmr = Consumer::newFromId( $dbw, $cmra->getConsumerId() );
- $grants = \FormatJson::decode( $this->vals['grants'], true ); // requested grants
+ // requested grants
+ $grants = \FormatJson::decode( $this->vals['grants'], true );
$grants = array_unique( array_intersect(
array_merge(
- \MWGrants::getHiddenGrants(), // implied grants
- $grants // requested grants
+ // implied grants
+ MediaWikiServices::getInstance()
+ ->getGrantsInfo()
+ ->getHiddenGrants(),
+ $grants
),
- $cmr->getGrants() // Only keep the applicable ones
+ // Only keep the applicable ones
+ $cmr->getGrants()
) );
LoggerFactory::getInstance( 'OAuth' )->info(
@@ -181,7 +192,7 @@ class ConsumerAcceptanceSubmitControl extends SubmitControl {
]
);
$cmra->setFields( [
- 'grants' => array_intersect( $grants, $cmr->getGrants() ) // sanity
+ 'grants' => array_intersect( $grants, $cmr->getGrants() )
] );
$cmra->save( $dbw );
diff --git a/OAuth/src/Control/ConsumerAccessControl.php b/OAuth/src/Control/ConsumerAccessControl.php
index 01ed9648..444d1ce2 100644
--- a/OAuth/src/Control/ConsumerAccessControl.php
+++ b/OAuth/src/Control/ConsumerAccessControl.php
@@ -1,10 +1,10 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Control;
+namespace MediaWiki\Extension\OAuth\Control;
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Entity\ClientEntity;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Entity\ClientEntity;
class ConsumerAccessControl extends DAOAccessControl {
// accessor fields copied from MWOAuthConsumer, except they can return a Message on access error
@@ -106,8 +106,9 @@ class ConsumerAccessControl extends DAOAccessControl {
/**
* Date of verifying the email, in TS_MW format. In practice this will be the same as
* getRegistration().
+ * Returns null if the timestamp is not set.
* Returns a Message when the user does not have permission to see this field.
- * @return string|\Message
+ * @return string|null|\Message
*/
public function getEmailAuthenticated() {
return $this->get( 'emailAuthenticated' );
@@ -164,7 +165,7 @@ class ConsumerAccessControl extends DAOAccessControl {
/**
* Secret key used to derive the consumer secret for HMAC-SHA1 signed OAuth requests.
- * The actual consumer secret will be calculated via MWOAuthUtils::hmacDBSecret() to mitigate
+ * The actual consumer secret will be calculated via Utils::hmacDBSecret() to mitigate
* DB leaks.
* Returns a Message when the user does not have permission to see this field.
* @return string|\Message
@@ -174,7 +175,7 @@ class ConsumerAccessControl extends DAOAccessControl {
}
/**
- * Public RSA key for RSA-SHA1 signerd OAuth requests.
+ * Public RSA key for RSA-SHA1 signed OAuth requests.
* Returns a Message when the user does not have permission to see this field.
* @return string|\Message
*/
@@ -228,7 +229,7 @@ class ConsumerAccessControl extends DAOAccessControl {
* @return string|\Message
*/
public function getUserName( $audience = false ) {
- return $this->get( 'userId', function ( $id ) use ( $audience ) {
+ return $this->get( 'userId', static function ( $id ) use ( $audience ) {
return Utils::getCentralUserNameFromId( $id, $audience );
} );
}
@@ -238,7 +239,7 @@ class ConsumerAccessControl extends DAOAccessControl {
* @return string|\Message
*/
public function getWikiName() {
- return $this->get( 'wiki', function ( $wikiId ) {
+ return $this->get( 'wiki', static function ( $wikiId ) {
return Utils::getWikiIdName( $wikiId );
} );
}
@@ -257,6 +258,7 @@ class ConsumerAccessControl extends DAOAccessControl {
* @return Consumer|ClientEntity
*/
public function getDAO() {
+ // @phan-suppress-next-line PhanTypeMismatchReturnSuperType
return $this->dao;
}
}
diff --git a/OAuth/src/Control/ConsumerSubmitControl.php b/OAuth/src/Control/ConsumerSubmitControl.php
index 514be3a0..0cac2091 100644
--- a/OAuth/src/Control/ConsumerSubmitControl.php
+++ b/OAuth/src/Control/ConsumerSubmitControl.php
@@ -1,16 +1,30 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Control;
+namespace MediaWiki\Extension\OAuth\Control;
use Composer\Semver\VersionParser;
+use EchoEvent;
+use Exception;
use ExtensionRegistry;
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\ConsumerAcceptance;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthDataStore;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Entity\ClientEntity;
+use FormatJson;
+use IContextSource;
+use LogicException;
+use ManualLogEntry;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\ConsumerAcceptance;
+use MediaWiki\Extension\OAuth\Backend\MWOAuthDataStore;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Entity\ClientEntity;
use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
+use MWCryptRand;
+use MWException;
+use Sanitizer;
+use SpecialPage;
+use Title;
use UnexpectedValueException;
+use User;
+use WikiMap;
use Wikimedia\Rdbms\DBConnRef;
/**
@@ -58,17 +72,17 @@ class ConsumerSubmitControl extends SubmitControl {
private const BLOB_SIZE = 65535;
/**
- * @param \IContextSource $context
+ * @param IContextSource $context
* @param array $params
- * @param DBConnRef $dbw Result of MWOAuthUtils::getCentralDB( DB_MASTER )
+ * @param DBConnRef $dbw Result of Utils::getCentralDB( DB_PRIMARY )
*/
- public function __construct( \IContextSource $context, array $params, DBConnRef $dbw ) {
+ public function __construct( IContextSource $context, array $params, DBConnRef $dbw ) {
parent::__construct( $context, $params );
$this->dbw = $dbw;
}
protected function getRequiredFields() {
- $validateRsaKey = function ( $s ) {
+ $validateRsaKey = static function ( $s ) {
if ( trim( $s ) === '' ) {
return true;
}
@@ -80,10 +94,8 @@ class ConsumerSubmitControl extends SubmitControl {
return false;
}
$info = openssl_pkey_get_details( $key );
- if ( $info['type'] !== OPENSSL_KEYTYPE_RSA ) {
- return false;
- }
- return true;
+
+ return ( $info['type'] === OPENSSL_KEYTYPE_RSA );
};
$suppress = [ 'suppress' => '/^[01]$/' ];
@@ -93,15 +105,15 @@ class ConsumerSubmitControl extends SubmitControl {
'changeToken' => '/^[0-9a-f]{40}$/'
];
- $validateBlobSize = function ( $s ) {
- return strlen( $s ) < self::BLOB_SIZE;
+ $validateBlobSize = static function ( $s ) {
+ return strlen( $s ?? '' ) < self::BLOB_SIZE;
};
return [
// Proposer (application administrator) actions:
- 'propose' => [
- 'name' => '/^.{1,128}$/',
- 'version' => function ( $s ) {
+ 'propose' => [
+ 'name' => '/^.{1,128}$/',
+ 'version' => static function ( $s ) {
if ( strlen( $s ) > 32 ) {
return false;
}
@@ -113,41 +125,48 @@ class ConsumerSubmitControl extends SubmitControl {
return false;
}
},
- 'callbackUrl' => function ( $s, $vals ) {
- if ( strlen( $s ) > 2000 ) {
+ 'oauthVersion' => static function ( $i ) {
+ return in_array( $i, [ Consumer::OAUTH_VERSION_1, Consumer::OAUTH_VERSION_2 ] );
+ },
+ 'callbackUrl' => static function ( $s, $vals ) {
+ if ( strlen( $s ?? '' ) > 2000 ) {
return false;
}
return $vals['ownerOnly'] || wfParseUrl( $s ) !== false;
},
- 'description' => $validateBlobSize,
- 'email' => function ( $s ) {
- return \Sanitizer::validateEmail( $s );
+ 'description' => $validateBlobSize,
+ 'email' => static function ( $s ) {
+ return Sanitizer::validateEmail( $s );
},
- 'wiki' => function ( $s ) {
+ 'wiki' => static function ( $s ) {
global $wgConf;
return ( $s === '*'
|| in_array( $s, $wgConf->getLocalDatabases() )
|| array_search( $s, Utils::getAllWikiNames() ) !== false
);
},
- 'granttype' => '/^(authonly|authonlyprivate|normal)$/',
- 'grants' => function ( $s ) {
+ 'oauth2GrantTypes' => static function ( $a, $vals ) {
+ // OAuth 2 apps must have at least one grant type
+ return $vals['oauthVersion'] == Consumer::OAUTH_VERSION_1 || count( $a ) > 0;
+ },
+ 'granttype' => '/^(authonly|authonlyprivate|normal)$/',
+ 'grants' => static function ( $s ) {
if ( strlen( $s ) > self::BLOB_SIZE ) {
return false;
}
- $grants = \FormatJson::decode( $s, true );
+ $grants = FormatJson::decode( $s, true );
return is_array( $grants ) && Utils::grantsAreValid( $grants );
},
'restrictions' => $validateBlobSize,
- 'rsaKey' => $validateRsaKey,
- 'agreement' => function ( $s ) {
+ 'rsaKey' => $validateRsaKey,
+ 'agreement' => static function ( $s ) {
return ( $s == true );
},
],
- 'update' => array_merge( $base, [
+ 'update' => array_merge( $base, [
'restrictions' => $validateBlobSize,
- 'rsaKey' => $validateRsaKey,
- 'resetSecret' => function ( $s ) {
+ 'rsaKey' => $validateRsaKey,
+ 'resetSecret' => static function ( $s ) {
return is_bool( $s );
},
] ),
@@ -162,32 +181,36 @@ class ConsumerSubmitControl extends SubmitControl {
protected function checkBasePermissions() {
global $wgBlockDisablesLogin;
$user = $this->getUser();
+ $readOnlyMode = MediaWikiServices::getInstance()->getReadOnlyMode();
if ( !$user->getId() ) {
return $this->failure( 'not_logged_in', 'badaccess-group0' );
- } elseif ( $user->isLocked() || $wgBlockDisablesLogin && $user->isBlocked() ) {
+ } elseif ( $user->isLocked() || $wgBlockDisablesLogin && $user->getBlock() ) {
return $this->failure( 'user_blocked', 'badaccess-group0' );
- } elseif ( wfReadOnly() ) {
- return $this->failure( 'readonly', 'readonlytext', wfReadOnlyReason() );
- } elseif ( !Utils::isCentralWiki() ) { // sanity
+ } elseif ( $readOnlyMode->isReadOnly() ) {
+ return $this->failure( 'readonly', 'readonlytext', $readOnlyMode->getReason() );
+ } elseif ( !Utils::isCentralWiki() ) {
// This logs consumer changes to the local logging table on the central wiki
- throw new \LogicException( "This can only be used from the OAuth management wiki." );
+ throw new LogicException( "This can only be used from the OAuth management wiki." );
}
return $this->success();
}
protected function processAction( $action ) {
$context = $this->getContext();
- $user = $this->getUser(); // proposer or admin
- $dbw = $this->dbw; // convenience
+ // proposer or admin
+ $user = $this->getUser();
+ $dbw = $this->dbw;
$centralUserId = Utils::getCentralIdFromLocalUser( $user );
- if ( !$centralUserId ) { // sanity
+ if ( !$centralUserId ) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
}
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+
switch ( $action ) {
case 'propose':
- if ( !$user->isAllowed( 'mwoauthproposeconsumer' ) ) {
+ if ( !$permissionManager->userHasRight( $user, 'mwoauthproposeconsumer' ) ) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
} elseif ( !$user->isEmailConfirmed() ) {
return $this->failure( 'email_not_confirmed', 'mwoauth-consumer-email-unconfirmed' );
@@ -221,7 +244,7 @@ class ConsumerSubmitControl extends SubmitControl {
// Handle owner-only mode
if ( $this->vals['ownerOnly'] ) {
- $this->vals['callbackUrl'] = \SpecialPage::getTitleFor( 'OAuth', 'verified' )
+ $this->vals['callbackUrl'] = SpecialPage::getTitleFor( 'OAuth', 'verified' )
->getLocalURL();
$this->vals['callbackIsPrefix'] = '';
$stage = Consumer::STAGE_APPROVED;
@@ -240,8 +263,11 @@ class ConsumerSubmitControl extends SubmitControl {
break;
case 'normal':
$grants = array_unique( array_merge(
- \MWGrants::getHiddenGrants(), // implied grants
- \FormatJson::decode( $this->vals['grants'], true )
+ // implied grants
+ MediaWikiServices::getInstance()
+ ->getGrantsInfo()
+ ->getHiddenGrants(),
+ FormatJson::decode( $this->vals['grants'], true )
) );
break;
}
@@ -249,13 +275,13 @@ class ConsumerSubmitControl extends SubmitControl {
$now = wfTimestampNow();
$cmr = Consumer::newFromArray(
[
- 'id' => null, // auto-increment
- 'consumerKey' => \MWCryptRand::generateHex( 32 ),
+ 'id' => null,
+ 'consumerKey' => MWCryptRand::generateHex( 32 ),
'userId' => $centralUserId,
'email' => $user->getEmail(),
- 'emailAuthenticated' => $now, // see above
+ 'emailAuthenticated' => $now,
'developerAgreement' => 1,
- 'secretKey' => \MWCryptRand::generateHex( 32 ),
+ 'secretKey' => MWCryptRand::generateHex( 32 ),
'registration' => $now,
'stage' => $stage,
'stageTimestamp' => $now,
@@ -272,7 +298,7 @@ class ConsumerSubmitControl extends SubmitControl {
);
} else {
$this->makeLogEntry( $dbw, $cmr, $action, $user, $this->vals['description'] );
- $this->notify( $cmr, $user, $action, null );
+ $this->notify( $cmr, $user, $action, '' );
}
// If it's owner-only, automatically accept it for the user too.
@@ -295,7 +321,7 @@ class ConsumerSubmitControl extends SubmitControl {
// OAuth2 client
try {
$accessToken = $cmr->getOwnerOnlyAccessToken( $cmra );
- } catch ( \Exception $ex ) {
+ } catch ( Exception $ex ) {
return $this->failure(
'unable_to_retrieve_access_token',
'mwoauth-oauth2-unable-to-retrieve-access-token',
@@ -307,7 +333,7 @@ class ConsumerSubmitControl extends SubmitControl {
return $this->success( [ 'consumer' => $cmr, 'accessToken' => $accessToken ] );
case 'update':
- if ( !$user->isAllowed( 'mwoauthupdateownconsumer' ) ) {
+ if ( !$permissionManager->userHasRight( $user, 'mwoauthupdateownconsumer' ) ) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
}
@@ -321,8 +347,9 @@ class ConsumerSubmitControl extends SubmitControl {
&& $cmr->getStage() !== Consumer::STAGE_PROPOSED
) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
- } elseif ( $cmr->getDeleted() && !$user->isAllowed( 'mwoauthsuppress' ) ) {
- return $this->failure( 'permission_denied', 'badaccess-group0' ); // sanity
+ } elseif ( $cmr->getDeleted()
+ && !$permissionManager->userHasRight( $user, 'mwoauthsuppress' ) ) {
+ return $this->failure( 'permission_denied', 'badaccess-group0' );
} elseif ( !$cmr->checkChangeToken( $context, $this->vals['changeToken'] ) ) {
return $this->failure( 'change_conflict', 'mwoauth-consumer-conflict' );
}
@@ -331,7 +358,7 @@ class ConsumerSubmitControl extends SubmitControl {
'rsaKey' => $this->vals['rsaKey'],
'restrictions' => $this->vals['restrictions'],
'secretKey' => $this->vals['resetSecret']
- ? \MWCryptRand::generateHex( 32 )
+ ? MWCryptRand::generateHex( 32 )
: $cmr->getSecretKey(),
] );
@@ -341,10 +368,9 @@ class ConsumerSubmitControl extends SubmitControl {
$this->notify( $cmr, $user, $action, $this->vals['reason'] );
}
- $cmra = null;
$accessToken = null;
if ( $cmr->getOwnerOnly() && $this->vals['resetSecret'] ) {
- $cmra = $cmr->getCurrentAuthorization( $user, wfWikiID() );
+ $cmra = $cmr->getCurrentAuthorization( $user, WikiMap::getCurrentWikiId() );
$accessToken = MWOAuthDataStore::newToken();
$fields = [
'wiki' => $cmr->getWiki(),
@@ -372,7 +398,7 @@ class ConsumerSubmitControl extends SubmitControl {
return $this->success( [ 'consumer' => $cmr, 'accessToken' => $accessToken ] );
case 'approve':
- if ( !$user->isAllowed( 'mwoauthmanageconsumer' ) ) {
+ if ( !$permissionManager->userHasRight( $user, 'mwoauthmanageconsumer' ) ) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
}
@@ -385,7 +411,7 @@ class ConsumerSubmitControl extends SubmitControl {
Consumer::STAGE_REJECTED,
] ) ) {
return $this->failure( 'not_proposed', 'mwoauth-consumer-not-proposed' );
- } elseif ( $cmr->getDeleted() && !$user->isAllowed( 'mwoauthsuppress' ) ) {
+ } elseif ( $cmr->getDeleted() && !$permissionManager->userHasRight( $user, 'mwoauthsuppress' ) ) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
} elseif ( !$cmr->checkChangeToken( $context, $this->vals['changeToken'] ) ) {
return $this->failure( 'change_conflict', 'mwoauth-consumer-conflict' );
@@ -404,7 +430,7 @@ class ConsumerSubmitControl extends SubmitControl {
return $this->success( $cmr );
case 'reject':
- if ( !$user->isAllowed( 'mwoauthmanageconsumer' ) ) {
+ if ( !$permissionManager->userHasRight( $user, 'mwoauthmanageconsumer' ) ) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
}
@@ -413,9 +439,9 @@ class ConsumerSubmitControl extends SubmitControl {
return $this->failure( 'invalid_consumer_key', 'mwoauth-invalid-consumer-key' );
} elseif ( $cmr->getStage() !== Consumer::STAGE_PROPOSED ) {
return $this->failure( 'not_proposed', 'mwoauth-consumer-not-proposed' );
- } elseif ( $cmr->getDeleted() && !$user->isAllowed( 'mwoauthsuppress' ) ) {
+ } elseif ( $cmr->getDeleted() && !$permissionManager->userHasRight( $user, 'mwoauthsuppress' ) ) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
- } elseif ( $this->vals['suppress'] && !$user->isAllowed( 'mwoauthsuppress' ) ) {
+ } elseif ( $this->vals['suppress'] && !$permissionManager->userHasRight( $user, 'mwoauthsuppress' ) ) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
} elseif ( !$cmr->checkChangeToken( $context, $this->vals['changeToken'] ) ) {
return $this->failure( 'change_conflict', 'mwoauth-consumer-conflict' );
@@ -434,9 +460,9 @@ class ConsumerSubmitControl extends SubmitControl {
return $this->success( $cmr );
case 'disable':
- if ( !$user->isAllowed( 'mwoauthmanageconsumer' ) ) {
+ if ( !$permissionManager->userHasRight( $user, 'mwoauthmanageconsumer' ) ) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
- } elseif ( $this->vals['suppress'] && !$user->isAllowed( 'mwoauthsuppress' ) ) {
+ } elseif ( $this->vals['suppress'] && !$permissionManager->userHasRight( $user, 'mwoauthsuppress' ) ) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
}
@@ -447,7 +473,7 @@ class ConsumerSubmitControl extends SubmitControl {
&& $cmr->getDeleted() == $this->vals['suppress']
) {
return $this->failure( 'not_approved', 'mwoauth-consumer-not-approved' );
- } elseif ( $cmr->getDeleted() && !$user->isAllowed( 'mwoauthsuppress' ) ) {
+ } elseif ( $cmr->getDeleted() && !$permissionManager->userHasRight( $user, 'mwoauthsuppress' ) ) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
} elseif ( !$cmr->checkChangeToken( $context, $this->vals['changeToken'] ) ) {
return $this->failure( 'change_conflict', 'mwoauth-consumer-conflict' );
@@ -466,7 +492,7 @@ class ConsumerSubmitControl extends SubmitControl {
return $this->success( $cmr );
case 'reenable':
- if ( !$user->isAllowed( 'mwoauthmanageconsumer' ) ) {
+ if ( !$permissionManager->userHasRight( $user, 'mwoauthmanageconsumer' ) ) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
}
@@ -475,7 +501,7 @@ class ConsumerSubmitControl extends SubmitControl {
return $this->failure( 'invalid_consumer_key', 'mwoauth-invalid-consumer-key' );
} elseif ( $cmr->getStage() !== Consumer::STAGE_DISABLED ) {
return $this->failure( 'not_disabled', 'mwoauth-consumer-not-disabled' );
- } elseif ( $cmr->getDeleted() && !$user->isAllowed( 'mwoauthsuppress' ) ) {
+ } elseif ( $cmr->getDeleted() && !$permissionManager->userHasRight( $user, 'mwoauthsuppress' ) ) {
return $this->failure( 'permission_denied', 'badaccess-group0' );
} elseif ( !$cmr->checkChangeToken( $context, $this->vals['changeToken'] ) ) {
return $this->failure( 'change_conflict', 'mwoauth-consumer-conflict' );
@@ -499,24 +525,24 @@ class ConsumerSubmitControl extends SubmitControl {
/**
* @param DBConnRef $db
* @param int $userId
- * @return \Title
+ * @return Title
*/
protected function getLogTitle( DBConnRef $db, $userId ) {
$name = Utils::getCentralUserNameFromId( $userId );
- return \Title::makeTitleSafe( NS_USER, $name );
+ return Title::makeTitleSafe( NS_USER, $name );
}
/**
* @param DBConnRef $dbw
* @param Consumer $cmr
* @param string $action
- * @param \User $performer
+ * @param User $performer
* @param string $comment
*/
protected function makeLogEntry(
- $dbw, Consumer $cmr, $action, \User $performer, $comment
+ $dbw, Consumer $cmr, $action, User $performer, $comment
) {
- $logEntry = new \ManualLogEntry( 'mwoauthconsumer', $action );
+ $logEntry = new ManualLogEntry( 'mwoauthconsumer', $action );
$logEntry->setPerformer( $performer );
$target = $this->getLogTitle( $dbw, $cmr->getUserId() );
$logEntry->setTarget( $target );
@@ -541,14 +567,14 @@ class ConsumerSubmitControl extends SubmitControl {
/**
* @param Consumer $cmr Consumer which was the subject of the action
- * @param \User $user User who performed the action
+ * @param User $user User who performed the action
* @param string $actionType Action type
* @param string $comment
- * @throws \MWException
+ * @throws MWException
*/
protected function notify( $cmr, $user, $actionType, $comment ) {
if ( !in_array( $actionType, self::$actions, true ) ) {
- throw new \MWException( "Invalid action type: $actionType" );
+ throw new MWException( "Invalid action type: $actionType" );
} elseif ( !ExtensionRegistry::getInstance()->isLoaded( 'Echo' ) ) {
return;
} elseif ( !Utils::isCentralWiki() ) {
@@ -556,7 +582,7 @@ class ConsumerSubmitControl extends SubmitControl {
return;
}
- \EchoEvent::create( [
+ EchoEvent::create( [
'type' => 'oauth-app-' . $actionType,
'agent' => $user,
'extra' => [
diff --git a/OAuth/src/Control/DAOAccessControl.php b/OAuth/src/Control/DAOAccessControl.php
index d0d8d7e0..be420c97 100644
--- a/OAuth/src/Control/DAOAccessControl.php
+++ b/OAuth/src/Control/DAOAccessControl.php
@@ -18,9 +18,9 @@
* http://www.gnu.org/copyleft/gpl.html
*/
-namespace MediaWiki\Extensions\OAuth\Control;
+namespace MediaWiki\Extension\OAuth\Control;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthDAO;
+use MediaWiki\Extension\OAuth\Backend\MWOAuthDAO;
use Message;
/**
@@ -103,7 +103,8 @@ class DAOAccessControl extends \ContextSource {
final public function get( $name, $sCallback = null ) {
$msg = $this->dao->userCanAccess( $name, $this->getContext() );
if ( $msg !== true ) {
- return $msg; // should be a Message object
+ // should be a Message object
+ return $msg;
} else {
$value = $this->dao->get( $name );
return $sCallback ? call_user_func( $sCallback, $value ) : $value;
diff --git a/OAuth/src/Control/SubmitControl.php b/OAuth/src/Control/SubmitControl.php
index e80a30d5..cf64c532 100644
--- a/OAuth/src/Control/SubmitControl.php
+++ b/OAuth/src/Control/SubmitControl.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Control;
+namespace MediaWiki\Extension\OAuth\Control;
/**
* (c) Aaron Schulz 2013, GPL
@@ -88,22 +88,22 @@ abstract class SubmitControl extends \ContextSource {
public function registerValidators( array $descriptors ) {
foreach ( $descriptors as $field => &$description ) {
if ( array_key_exists( 'validation-callback', $description ) ) {
- continue; // already set to something
+ // already set to something
+ continue;
}
- $control = $this;
$description['validation-callback'] =
- function ( $value, $allValues, $form ) use ( $control, $field ) {
- return $control->validateFieldInternal( $field, $value, $allValues, $form );
+ function ( $value, $allValues, $form ) use ( $field ) {
+ return $this->validateFieldInternal( $field, $value, $allValues, $form );
};
}
return $descriptors;
}
/**
- * This method should not be called outside MWOAuthSubmitControl
+ * This method should not be called outside SubmitControl
*
* @param string $field
- * @param string $value
+ * @param mixed $value
* @param array $allValues
* @param \HTMLForm $form
* @throws \MWException
@@ -113,18 +113,19 @@ abstract class SubmitControl extends \ContextSource {
if ( !isset( $allValues['action'] ) && isset( $this->vals['action'] ) ) {
// The action may be derived, especially for multi-button forms.
// Such an HTMLForm will not have an action key set in $allValues.
- $allValues['action'] = $this->vals['action']; // injected
+ $allValues['action'] = $this->vals['action'];
}
if ( !isset( $allValues['action'] ) ) {
throw new \MWException( "No form action defined; cannot validate fields." );
}
$validators = $this->getRequiredFields();
if ( !isset( $validators[$allValues['action']][$field] ) ) {
- return true; // nothing to check
+ // nothing to check
+ return true;
}
$validator = $validators[$allValues['action']][$field];
- $isValid = is_string( $validator ) // regex
- ? preg_match( $validator, $value )
+ $isValid = is_string( $validator )
+ ? preg_match( $validator, $value ?? '' )
: $validator( $value, $allValues );
if ( !$isValid ) {
$errorMessage = $this->msg( 'mwoauth-invalid-field-' . $field );
@@ -176,14 +177,16 @@ abstract class SubmitControl extends \ContextSource {
if ( !isset( $this->vals[$field] ) ) {
// @TODO: check for field-specific message first
return $this->failure( "missing_field_$field", 'mwoauth-missing-field', $field );
- } elseif ( !is_scalar( $this->vals[$field] ) && $field !== 'restrictions' ) {
+ } elseif ( !is_scalar( $this->vals[$field] )
+ && !in_array( $field, [ 'restrictions', 'oauth2GrantTypes' ], true )
+ ) {
// @TODO: check for field-specific message first
return $this->failure( "invalid_field_$field", 'mwoauth-invalid-field', $field );
}
if ( is_string( $this->vals[$field] ) ) {
- $this->vals[$field] = trim( $this->vals[$field] ); // trim all input
+ $this->vals[$field] = trim( $this->vals[$field] );
}
- $valid = is_string( $validator ) // regex
+ $valid = is_string( $validator )
? preg_match( $validator, $this->vals[$field] )
: $validator( $this->vals[$field], $this->vals );
if ( !$valid ) {
diff --git a/OAuth/src/Entity/AccessTokenEntity.php b/OAuth/src/Entity/AccessTokenEntity.php
index f7ab4f3a..64bc8b6f 100644
--- a/OAuth/src/Entity/AccessTokenEntity.php
+++ b/OAuth/src/Entity/AccessTokenEntity.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Entity;
+namespace MediaWiki\Extension\OAuth\Entity;
use InvalidArgumentException;
use League\OAuth2\Server\CryptKey;
@@ -10,11 +10,12 @@ use League\OAuth2\Server\Entities\Traits\AccessTokenTrait;
use League\OAuth2\Server\Entities\Traits\EntityTrait;
use League\OAuth2\Server\Entities\Traits\TokenEntityTrait;
use League\OAuth2\Server\Exception\OAuthServerException;
-use MediaWiki\Extensions\OAuth\Backend\ConsumerAcceptance;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Backend\ConsumerAcceptance;
+use MediaWiki\Extension\OAuth\Backend\Utils;
use MediaWiki\MediaWikiServices;
use Throwable;
use User;
+use WikiMap;
class AccessTokenEntity implements AccessTokenEntityInterface {
use AccessTokenTrait;
@@ -36,16 +37,22 @@ class AccessTokenEntity implements AccessTokenEntityInterface {
/**
* @param ClientEntity $clientEntity
* @param ScopeEntityInterface[] $scopes
+ * @param string $issuer
* @param string|null $userIdentifier
+ * @throws OAuthServerException
*/
public function __construct(
- ClientEntity $clientEntity, array $scopes, $userIdentifier = null
+ ClientEntity $clientEntity,
+ array $scopes,
+ string $issuer,
+ $userIdentifier = null
) {
$this->approval = $this->setApprovalFromClientScopesUser(
$clientEntity, $scopes, $userIdentifier
);
$this->setClient( $clientEntity );
+ $this->setIssuer( $issuer );
if ( $clientEntity->getOwnerOnly() ) {
if ( $userIdentifier !== null && $userIdentifier !== $clientEntity->getUserId() ) {
throw new InvalidArgumentException(
@@ -113,7 +120,7 @@ class AccessTokenEntity implements AccessTokenEntityInterface {
}
try {
$user = Utils::getLocalUserFromCentralId( $userIdentifier );
- $approval = $clientEntity->getCurrentAuthorization( $user, wfWikiID() );
+ $approval = $clientEntity->getCurrentAuthorization( $user, WikiMap::getCurrentWikiId() );
} catch ( Throwable $ex ) {
return false;
}
@@ -124,7 +131,7 @@ class AccessTokenEntity implements AccessTokenEntityInterface {
$approvedScopes = $approval->getGrants();
$notApproved = array_filter(
$scopes,
- function ( ScopeEntityInterface $scope ) use ( $approvedScopes ) {
+ static function ( ScopeEntityInterface $scope ) use ( $approvedScopes ) {
return !in_array( $scope->getIdentifier(), $approvedScopes, true );
}
);
diff --git a/OAuth/src/Entity/AuthCodeEntity.php b/OAuth/src/Entity/AuthCodeEntity.php
index 41d4266b..bf78714e 100644
--- a/OAuth/src/Entity/AuthCodeEntity.php
+++ b/OAuth/src/Entity/AuthCodeEntity.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Entity;
+namespace MediaWiki\Extension\OAuth\Entity;
use JsonSerializable;
use League\OAuth2\Server\Entities\AuthCodeEntityInterface;
@@ -13,7 +13,7 @@ class AuthCodeEntity implements AuthCodeEntityInterface, JsonSerializable {
use EntityTrait;
use AuthCodeTrait;
- public function jsonSerialize() {
+ public function jsonSerialize(): array {
return [
'user' => $this->getUserIdentifier(),
'client' => $this->getClient()->getIdentifier(),
diff --git a/OAuth/src/Entity/ClaimEntity.php b/OAuth/src/Entity/ClaimEntity.php
new file mode 100644
index 00000000..ef2787d1
--- /dev/null
+++ b/OAuth/src/Entity/ClaimEntity.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace MediaWiki\Extension\OAuth\Entity;
+
+use League\OAuth2\Server\Entities\ClaimEntityInterface;
+use League\OAuth2\Server\Entities\Traits\ClaimEntityTrait;
+
+class ClaimEntity implements ClaimEntityInterface {
+ use ClaimEntityTrait;
+
+ /**
+ * ClaimEntity constructor.
+ * @param string $name
+ * @param mixed $value
+ */
+ public function __construct( string $name, $value ) {
+ $this->name = $name;
+ $this->value = $value;
+ }
+}
diff --git a/OAuth/src/Entity/ClientEntity.php b/OAuth/src/Entity/ClientEntity.php
index ef62ab50..08e097e1 100644
--- a/OAuth/src/Entity/ClientEntity.php
+++ b/OAuth/src/Entity/ClientEntity.php
@@ -1,21 +1,21 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Entity;
+namespace MediaWiki\Extension\OAuth\Entity;
use Exception;
use League\OAuth2\Server\Entities\AccessTokenEntityInterface;
-use League\OAuth2\Server\Entities\ClientEntityInterface;
use League\OAuth2\Server\Entities\ScopeEntityInterface;
use League\OAuth2\Server\Exception\OAuthServerException;
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\ConsumerAcceptance;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthException;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Repository\AccessTokenRepository;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\ConsumerAcceptance;
+use MediaWiki\Extension\OAuth\Backend\MWOAuthException;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Repository\AccessTokenRepository;
+use MediaWiki\Extension\OAuth\Repository\ClaimStore;
use MWException;
use User;
-class ClientEntity extends Consumer implements ClientEntityInterface {
+class ClientEntity extends Consumer implements MWClientEntityInterface {
/**
* Returns the registered redirect URI (as a string).
@@ -107,8 +107,13 @@ class ClientEntity extends Consumer implements ClientEntityInterface {
return static::OAUTH_VERSION_2;
}
+ /**
+ * @param null|string $secret
+ * @return bool
+ */
private function isSecretValid( $secret ) {
- return hash_equals( $secret, Utils::hmacDBSecret( $this->secretKey ) );
+ return is_string( $secret )
+ && hash_equals( $secret, Utils::hmacDBSecret( $this->secretKey ) );
}
/**
@@ -142,7 +147,7 @@ class ClientEntity extends Consumer implements ClientEntityInterface {
* Should never be called outside of client registration/manage code
*
* @param ConsumerAcceptance $approval
- * @param bool $revokeExisting - Delete all existing tokens
+ * @param bool $revokeExisting Delete all existing tokens
*
* @return AccessTokenEntityInterface
* @throws MWOAuthException
@@ -152,11 +157,12 @@ class ClientEntity extends Consumer implements ClientEntityInterface {
public function getOwnerOnlyAccessToken(
ConsumerAcceptance $approval, $revokeExisting = false
) {
+ $grantType = 'client_credentials';
if (
count( $this->getAllowedGrants() ) !== 1 ||
- $this->getAllowedGrants()[0] !== 'client_credentials'
+ $this->getAllowedGrants()[0] !== $grantType
) {
- // sanity - make sure client is allowed *only* client_credentials grant,
+ // make sure client is allowed *only* client_credentials grant,
// so that this AT cannot be used in other grant type requests
throw new MWOAuthException( 'mwoauth-oauth2-error-owner-only-invalid-grant' );
}
@@ -168,6 +174,11 @@ class ClientEntity extends Consumer implements ClientEntityInterface {
/** @var AccessTokenEntity $accessToken */
$accessToken = $accessTokenRepo->getNewToken( $this, $this->getScopes(), $approval->getUserId() );
'@phan-var AccessTokenEntity $accessToken';
+ $claimStore = new ClaimStore();
+ $claims = $claimStore->getClaims( $grantType, $this );
+ foreach ( $claims as $claim ) {
+ $accessToken->addClaim( $claim );
+ }
$accessToken->setExpiryDateTime( ( new \DateTimeImmutable() )->add(
new \DateInterval( 'P1000Y' )
) );
diff --git a/OAuth/src/Entity/MWClientEntityInterface.php b/OAuth/src/Entity/MWClientEntityInterface.php
new file mode 100644
index 00000000..5ee945c5
--- /dev/null
+++ b/OAuth/src/Entity/MWClientEntityInterface.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace MediaWiki\Extension\OAuth\Entity;
+
+use League\OAuth2\Server\Entities\ClientEntityInterface;
+
+/**
+ * Interface MWClientEntityInterface
+ *
+ * Empty interface used by ClientEntity and OAuthClaimStoreGetClaimsHook to not leak ClientEntityInterface to
+ * other extensions that depend on this OAuth extension.
+ */
+interface MWClientEntityInterface extends ClientEntityInterface {
+
+}
diff --git a/OAuth/src/Entity/RefreshTokenEntity.php b/OAuth/src/Entity/RefreshTokenEntity.php
index 701b2aa7..a32d4bd9 100644
--- a/OAuth/src/Entity/RefreshTokenEntity.php
+++ b/OAuth/src/Entity/RefreshTokenEntity.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Entity;
+namespace MediaWiki\Extension\OAuth\Entity;
use JsonSerializable;
use League\OAuth2\Server\Entities\RefreshTokenEntityInterface;
@@ -11,7 +11,7 @@ class RefreshTokenEntity implements RefreshTokenEntityInterface, JsonSerializabl
use RefreshTokenTrait;
use EntityTrait;
- public function jsonSerialize() {
+ public function jsonSerialize(): array {
return [
'identifier' => $this->getIdentifier(),
'accessToken' => $this->getAccessToken()->getIdentifier(),
diff --git a/OAuth/src/Entity/ScopeEntity.php b/OAuth/src/Entity/ScopeEntity.php
index 8b3843d6..40dd979f 100644
--- a/OAuth/src/Entity/ScopeEntity.php
+++ b/OAuth/src/Entity/ScopeEntity.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Entity;
+namespace MediaWiki\Extension\OAuth\Entity;
use League\OAuth2\Server\Entities\ScopeEntityInterface;
use League\OAuth2\Server\Entities\Traits\EntityTrait;
@@ -20,7 +20,7 @@ class ScopeEntity implements ScopeEntityInterface {
/**
* @return string
*/
- public function jsonSerialize() {
+ public function jsonSerialize(): string {
return $this->getIdentifier();
}
}
diff --git a/OAuth/src/Entity/UserEntity.php b/OAuth/src/Entity/UserEntity.php
index 73c803b0..42747cbc 100644
--- a/OAuth/src/Entity/UserEntity.php
+++ b/OAuth/src/Entity/UserEntity.php
@@ -1,9 +1,9 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Entity;
+namespace MediaWiki\Extension\OAuth\Entity;
use League\OAuth2\Server\Entities\UserEntityInterface;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Backend\Utils;
use MWException;
use User;
@@ -31,7 +31,7 @@ class UserEntity implements UserEntityInterface {
}
/**
- * @param string $identifier
+ * @param int $identifier
*/
public function __construct( $identifier ) {
$this->identifier = $identifier;
@@ -40,7 +40,7 @@ class UserEntity implements UserEntityInterface {
/**
* Return the user's identifier.
*
- * @return mixed
+ * @return int
*/
public function getIdentifier() {
return $this->identifier;
diff --git a/OAuth/src/Exception/ClientApprovalDenyException.php b/OAuth/src/Exception/ClientApprovalDenyException.php
index ad32b10d..e29e51da 100644
--- a/OAuth/src/Exception/ClientApprovalDenyException.php
+++ b/OAuth/src/Exception/ClientApprovalDenyException.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Exception;
+namespace MediaWiki\Extension\OAuth\Exception;
use League\OAuth2\Server\Exception\OAuthServerException;
diff --git a/OAuth/src/Frontend/EchoOAuthStageChangePresentationModel.php b/OAuth/src/Frontend/EchoOAuthStageChangePresentationModel.php
index f27c039b..d13e01ef 100644
--- a/OAuth/src/Frontend/EchoOAuthStageChangePresentationModel.php
+++ b/OAuth/src/Frontend/EchoOAuthStageChangePresentationModel.php
@@ -1,11 +1,11 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Frontend;
+namespace MediaWiki\Extension\OAuth\Frontend;
use EchoAttributeManager;
use EchoEventPresentationModel;
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\Utils;
use MWException;
use SpecialPage;
use User;
@@ -22,7 +22,7 @@ class EchoOAuthStageChangePresentationModel extends EchoEventPresentationModel {
/**
* Helper function for $wgEchoNotifications
- * @param string $action One of the actions from MWOAuthConsumerSubmitControl::$actions
+ * @param string $action One of the actions from ConsumerSubmitControl::$actions
* @return array
*/
public static function getDefinition( $action ) {
@@ -112,7 +112,7 @@ class EchoOAuthStageChangePresentationModel extends EchoEventPresentationModel {
}
/**
- * @return string
+ * @return string|false
*/
protected function getConsumerName() {
$consumer = $this->getConsumer();
diff --git a/OAuth/src/Frontend/OAuthLogFormatter.php b/OAuth/src/Frontend/OAuthLogFormatter.php
index a078954c..1e3926bc 100644
--- a/OAuth/src/Frontend/OAuthLogFormatter.php
+++ b/OAuth/src/Frontend/OAuthLogFormatter.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Frontend;
+namespace MediaWiki\Extension\OAuth\Frontend;
use LogEntry;
use LogFormatter;
@@ -23,7 +23,8 @@ class OAuthLogFormatter extends LogFormatter {
protected function getMessageParameters() {
$params = parent::getMessageParameters();
- if ( isset( $params[3] ) ) { // sanity
+ if ( isset( $params[3] ) ) {
+ // @phan-suppress-next-line SecurityCheck-DoubleEscaped
$params[3] = $this->getConsumerLink( $params[3] );
}
return $params;
diff --git a/OAuth/src/Frontend/Pagers/ListConsumersPager.php b/OAuth/src/Frontend/Pagers/ListConsumersPager.php
index 1e04844c..683f1073 100644
--- a/OAuth/src/Frontend/Pagers/ListConsumersPager.php
+++ b/OAuth/src/Frontend/Pagers/ListConsumersPager.php
@@ -1,9 +1,11 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Frontend\Pagers;
+namespace MediaWiki\Extension\OAuth\Frontend\Pagers;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Frontend\SpecialPages\SpecialMWOAuthListConsumers;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Frontend\SpecialPages\SpecialMWOAuthListConsumers;
+
+use Mediawiki\MediaWikiServices;
/**
* (c) Aaron Schulz 2013, GPL
@@ -26,8 +28,6 @@ use MediaWiki\Extensions\OAuth\Frontend\SpecialPages\SpecialMWOAuthListConsumers
/**
* Query to list out consumers
- *
- * @TODO: use UserCache
*/
class ListConsumersPager extends \AlphabeticPager {
/** @var SpecialMWOAuthListConsumers */
@@ -40,26 +40,28 @@ class ListConsumersPager extends \AlphabeticPager {
$this->mForm = $form;
$this->mConds = $conds;
- $this->mIndexField = null;
+ $indexField = null;
if ( $name !== '' ) {
$this->mConds['oarc_name'] = $name;
- $this->mIndexField = 'oarc_id';
+ $indexField = 'oarc_id';
}
if ( $centralUserID !== null ) {
$this->mConds['oarc_user_id'] = $centralUserID;
- $this->mIndexField = 'oarc_id';
+ $indexField = 'oarc_id';
}
if ( $stage >= 0 ) {
$this->mConds['oarc_stage'] = $stage;
- if ( !$this->mIndexField ) {
- $this->mIndexField = 'oarc_stage_timestamp';
+ if ( !$indexField ) {
+ $indexField = 'oarc_stage_timestamp';
}
}
- if ( !$this->mIndexField ) {
- $this->mIndexField = 'oarc_id';
+ if ( !$indexField ) {
+ $indexField = 'oarc_id';
}
+ $this->mIndexField = $indexField;
- if ( !$this->getUser()->isAllowed( 'mwoauthviewsuppressed' ) ) {
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+ if ( !$permissionManager->userHasRight( $this->getUser(), 'mwoauthviewsuppressed' ) ) {
$this->mConds['oarc_deleted'] = 0;
}
diff --git a/OAuth/src/Frontend/Pagers/ListMyConsumersPager.php b/OAuth/src/Frontend/Pagers/ListMyConsumersPager.php
index 47d9bf1c..734f6a3b 100644
--- a/OAuth/src/Frontend/Pagers/ListMyConsumersPager.php
+++ b/OAuth/src/Frontend/Pagers/ListMyConsumersPager.php
@@ -1,9 +1,9 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Frontend\Pagers;
+namespace MediaWiki\Extension\OAuth\Frontend\Pagers;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Frontend\SpecialPages\SpecialMWOAuthConsumerRegistration;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Frontend\SpecialPages\SpecialMWOAuthConsumerRegistration;
/**
* (c) Aaron Schulz 2013, GPL
@@ -24,10 +24,10 @@ use MediaWiki\Extensions\OAuth\Frontend\SpecialPages\SpecialMWOAuthConsumerRegis
* http://www.gnu.org/copyleft/gpl.html
*/
+use MediaWiki\MediaWikiServices;
+
/**
* Query to list out consumers
- *
- * @TODO: use UserCache
*/
class ListMyConsumersPager extends \ReverseChronologicalPager {
/** @var SpecialMWOAuthConsumerRegistration */
@@ -40,7 +40,9 @@ class ListMyConsumersPager extends \ReverseChronologicalPager {
$this->mForm = $form;
$this->mConds = $conds;
$this->mConds['oarc_user_id'] = $centralUserId;
- if ( !$this->getUser()->isAllowed( 'mwoauthviewsuppressed' ) ) {
+
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+ if ( !$permissionManager->userHasRight( $this->getUser(), 'mwoauthviewsuppressed' ) ) {
$this->mConds['oarc_deleted'] = 0;
}
diff --git a/OAuth/src/Frontend/Pagers/ManageConsumersPager.php b/OAuth/src/Frontend/Pagers/ManageConsumersPager.php
index ab181cfe..d9ac9806 100644
--- a/OAuth/src/Frontend/Pagers/ManageConsumersPager.php
+++ b/OAuth/src/Frontend/Pagers/ManageConsumersPager.php
@@ -1,9 +1,9 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Frontend\Pagers;
+namespace MediaWiki\Extension\OAuth\Frontend\Pagers;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Frontend\SpecialPages\SpecialMWOAuthManageConsumers;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Frontend\SpecialPages\SpecialMWOAuthManageConsumers;
/**
* (c) Aaron Schulz 2013, GPL
@@ -24,10 +24,10 @@ use MediaWiki\Extensions\OAuth\Frontend\SpecialPages\SpecialMWOAuthManageConsume
* http://www.gnu.org/copyleft/gpl.html
*/
+use MediaWiki\MediaWikiServices;
+
/**
* Query to list out consumers
- *
- * @TODO: use UserCache
*/
class ManageConsumersPager extends \ReverseChronologicalPager {
/** @var SpecialMWOAuthManageConsumers */
@@ -40,7 +40,9 @@ class ManageConsumersPager extends \ReverseChronologicalPager {
$this->mForm = $form;
$this->mConds = $conds;
$this->mConds['oarc_stage'] = $stage;
- if ( !$this->getUser()->isAllowed( 'mwoauthviewsuppressed' ) ) {
+
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+ if ( !$permissionManager->userHasRight( $this->getUser(), 'mwoauthviewsuppressed' ) ) {
$this->mConds['oarc_deleted'] = 0;
}
diff --git a/OAuth/src/Frontend/Pagers/ManageMyGrantsPager.php b/OAuth/src/Frontend/Pagers/ManageMyGrantsPager.php
index fbd6c425..0d17296f 100644
--- a/OAuth/src/Frontend/Pagers/ManageMyGrantsPager.php
+++ b/OAuth/src/Frontend/Pagers/ManageMyGrantsPager.php
@@ -1,9 +1,9 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Frontend\Pagers;
+namespace MediaWiki\Extension\OAuth\Frontend\Pagers;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Frontend\SpecialPages\SpecialMWOAuthManageMyGrants;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Frontend\SpecialPages\SpecialMWOAuthManageMyGrants;
/**
* (c) Aaron Schulz 2013, GPL
@@ -24,13 +24,16 @@ use MediaWiki\Extensions\OAuth\Frontend\SpecialPages\SpecialMWOAuthManageMyGrant
* http://www.gnu.org/copyleft/gpl.html
*/
+use MediaWiki\MediaWikiServices;
+
/**
* Query to list out consumers that have an access token for this user
- *
- * @TODO: use UserCache
*/
class ManageMyGrantsPager extends \ReverseChronologicalPager {
- public $mForm, $mConds;
+ /** @var SpecialMWOAuthManageMyGrants */
+ public $mForm;
+ /** @var array */
+ public $mConds;
/**
* @param SpecialMWOAuthManageMyGrants $form
@@ -42,7 +45,9 @@ class ManageMyGrantsPager extends \ReverseChronologicalPager {
$this->mConds = $conds;
$this->mConds[] = 'oaac_consumer_id = oarc_id';
$this->mConds['oaac_user_id'] = $centralUserId;
- if ( !$this->getUser()->isAllowed( 'mwoauthviewsuppressed' ) ) {
+
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+ if ( !$permissionManager->userHasRight( $this->getUser(), 'mwoauthviewsuppressed' ) ) {
$this->mConds['oarc_deleted'] = 0;
}
diff --git a/OAuth/src/Frontend/SpecialPages/SpecialMWOAuth.php b/OAuth/src/Frontend/SpecialPages/SpecialMWOAuth.php
index 18a22c85..0e2c8890 100644
--- a/OAuth/src/Frontend/SpecialPages/SpecialMWOAuth.php
+++ b/OAuth/src/Frontend/SpecialPages/SpecialMWOAuth.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Frontend\SpecialPages;
+namespace MediaWiki\Extension\OAuth\Frontend\SpecialPages;
/**
* (c) Chris Steipp, Aaron Schulz 2013, GPL
@@ -22,20 +22,24 @@ namespace MediaWiki\Extensions\OAuth\Frontend\SpecialPages;
*/
use Firebase\JWT\JWT;
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\ConsumerAcceptance;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthException;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthRequest;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthToken;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Control\ConsumerAcceptanceSubmitControl;
-use MediaWiki\Extensions\OAuth\Control\ConsumerAccessControl;
-use MediaWiki\Extensions\OAuth\Lib\OAuthException;
-use MediaWiki\Extensions\OAuth\Lib\OAuthToken;
-use MediaWiki\Extensions\OAuth\Lib\OAuthUtil;
-use MediaWiki\Extensions\OAuth\UserStatementProvider;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\ConsumerAcceptance;
+use MediaWiki\Extension\OAuth\Backend\MWOAuthException;
+use MediaWiki\Extension\OAuth\Backend\MWOAuthRequest;
+use MediaWiki\Extension\OAuth\Backend\MWOAuthToken;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Control\ConsumerAcceptanceSubmitControl;
+use MediaWiki\Extension\OAuth\Control\ConsumerAccessControl;
+use MediaWiki\Extension\OAuth\Lib\OAuthException;
+use MediaWiki\Extension\OAuth\Lib\OAuthToken;
+use MediaWiki\Extension\OAuth\Lib\OAuthUtil;
+use MediaWiki\Extension\OAuth\UserStatementProvider;
use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\Permissions\GrantsLocalization;
+use OOUI;
use Psr\Log\LoggerInterface;
+use Title;
+use WikiMap;
/**
* Page that handles OAuth consumer authorization and token exchange
@@ -44,12 +48,19 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
/** @var LoggerInterface */
protected $logger;
+ /** @var GrantsLocalization */
+ private $grantsLocalization;
+
/** @var int Defaults to OAuth1 */
protected $oauthVersion = Consumer::OAUTH_VERSION_1;
- public function __construct() {
+ /**
+ * @param GrantsLocalization $grantsLocalization
+ */
+ public function __construct( GrantsLocalization $grantsLocalization ) {
parent::__construct( 'OAuth' );
$this->logger = LoggerFactory::getInstance( 'OAuth' );
+ $this->grantsLocalization = $grantsLocalization;
}
public function doesWrites() {
@@ -66,17 +77,21 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
}
public function execute( $subpage ) {
- global $wgMWOAuthSecureTokenTransfer, $wgMWOAuthReadOnly, $wgBlockDisablesLogin;
-
$this->setHeaders();
$user = $this->getUser();
$request = $this->getRequest();
- $this->getOutput()->disallowUserJs();
+
+ $output = $this->getOutput();
+ $output->disallowUserJs();
+
+ $config = $this->getConfig();
+
$format = $request->getVal( 'format', 'raw' );
+ '@phan-var string $format';
try {
- if ( $wgMWOAuthReadOnly &&
+ if ( $config->get( 'MWOAuthReadOnly' ) &&
!in_array( $subpage, [ 'verified', 'grants', 'identify' ] )
) {
throw new MWOAuthException( 'mwoauth-db-readonly' );
@@ -93,6 +108,7 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
$token = $oauthServer->fetch_request_token( $oauthRequest );
$this->returnToken( $token, $format );
break;
+
case 'approve':
$this->assertOAuthVersion( Consumer::OAUTH_VERSION_2 );
$format = 'html';
@@ -102,7 +118,8 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
if ( $user->isAnon() ) {
// Should not happen, as user login status will already be checked at this point
// Just redirect back to REST, it will then redirect to login
- return $this->redirectToREST();
+ $this->redirectToREST();
+ return;
}
if ( $request->wasPosted() && $request->getCheck( 'cancel' ) ) {
$this->showCancelPage( $clientId );
@@ -113,10 +130,11 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
}
break;
+
case 'authorize':
case 'authenticate':
$this->assertOAuthVersion( Consumer::OAUTH_VERSION_1 );
- $format = 'html'; // for exceptions
+ $format = 'html';
$requestToken = $request->getVal( 'requestToken',
$request->getVal( 'oauth_token' ) );
@@ -129,18 +147,17 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
if ( $user->isAnon() ) {
// Login required on provider wiki
$this->requireLogin( 'mwoauth-login-required-reason' );
+ } elseif ( $request->wasPosted() && $request->getCheck( 'cancel' ) ) {
+ // Show acceptance cancellation confirmation
+ $this->showCancelPage( $consumerKey );
} else {
- if ( $request->wasPosted() && $request->getCheck( 'cancel' ) ) {
- // Show acceptance cancellation confirmation
- $this->showCancelPage( $consumerKey );
- } else {
- // Show form and redirect on submission for authorization
- $this->handleAuthorizationForm(
- $requestToken, $consumerKey, $subpage === 'authenticate'
- );
- }
+ // Show form and redirect on submission for authorization
+ $this->handleAuthorizationForm(
+ $requestToken, $consumerKey, $subpage === 'authenticate'
+ );
}
break;
+
case 'token':
$this->assertOAuthVersion( Consumer::OAUTH_VERSION_1 );
$oauthServer = Utils::newMWOAuthServer();
@@ -150,15 +167,15 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
// We want to use HTTPS when returning the credentials. But
// for RSA we don't need to return a token secret, so HTTP is ok.
- if ( $wgMWOAuthSecureTokenTransfer && !$isRsa
+ if ( $config->get( 'MWOAuthSecureTokenTransfer' ) && !$isRsa
&& $request->detectProtocol() == 'http'
&& substr( wfExpandUrl( '/', PROTO_HTTPS ), 0, 8 ) === 'https://'
) {
$redirUrl = str_replace(
'http://', 'https://', $request->getFullRequestURL()
);
- $this->getOutput()->redirect( $redirUrl );
- $this->getOutput()->addVaryHeader( 'X-Forwarded-Proto' );
+ $output->redirect( $redirUrl );
+ $output->addVaryHeader( 'X-Forwarded-Proto' );
break;
}
@@ -169,9 +186,10 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
}
$this->returnToken( $token, $format );
break;
+
case 'verified':
$this->assertOAuthVersion( Consumer::OAUTH_VERSION_1 );
- $format = 'html'; // for exceptions
+ $format = 'html';
$verifier = $request->getVal( 'oauth_verifier' );
$requestToken = $request->getVal( 'oauth_token' );
if ( !$verifier || !$requestToken ) {
@@ -183,7 +201,7 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
) )
] );
}
- $this->getOutput()->addSubtitle( $this->msg( 'mwoauth-desc' )->escaped() );
+ $output->addSubtitle( $this->msg( 'mwoauth-desc' )->escaped() );
$this->showResponse(
$this->msg( 'mwoauth-verified',
wfEscapeWikiText( $verifier ),
@@ -192,15 +210,18 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
$format
);
break;
+
case 'grants':
$this->assertOAuthVersion( Consumer::OAUTH_VERSION_1 );
// Backwards compatibility
$listGrants = \SpecialPage::getTitleFor( 'ListGrants' );
- $this->getOutput()->redirect( $listGrants->getFullURL() );
+ $output->redirect( $listGrants->getFullURL() );
break;
+
case 'identify':
$this->assertOAuthVersion( Consumer::OAUTH_VERSION_1 );
- $format = 'json'; // we only return JWT, so we assume json
+ // we only return JWT, so we assume json
+ $format = 'json';
$server = Utils::newMWOAuthServer();
$oauthRequest = MWOAuthRequest::fromRequest( $request );
// verify_request throws an exception if anything isn't verified
@@ -208,11 +229,11 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
/** @var Consumer $consumer */
/** @var MWOAuthToken $token */
- $wiki = wfWikiID();
+ $wiki = WikiMap::getCurrentWikiId();
$dbr = Utils::getCentralDB( DB_REPLICA );
$access = ConsumerAcceptance::newFromToken( $dbr, $token->key );
$localUser = Utils::getLocalUserFromCentralId( $access->getUserId() );
- if ( !$localUser || !$localUser->isLoggedIn() ) {
+ if ( !$localUser || !$localUser->isRegistered() ) {
throw new MWOAuthException( 'mwoauth-invalid-authorization-invalid-user', [
\Message::rawParam( \Linker::makeExternalLink(
'https://www.mediawiki.org/wiki/Help:OAuth/Errors#E008',
@@ -221,7 +242,7 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
) )
] );
} elseif ( $localUser->isLocked() ||
- $wgBlockDisablesLogin && $localUser->isBlocked()
+ $config->get( 'BlockDisablesLogin' ) && $localUser->getBlock()
) {
throw new MWOAuthException( 'mwoauth-invalid-authorization-blocked-user' );
}
@@ -239,23 +260,30 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
// We know the identity of the user who granted the authorization
$this->outputJWT( $localUser, $consumer, $oauthRequest, $format, $access );
break;
+
case 'rest_redirect':
$query = $this->getRequest()->getQueryValues();
+ if ( !array_key_exists( 'rest_url', $query ) ) {
+ throw new OAuthException( 'Invalid redirect' );
+ }
$restUrl = $query['rest_url'];
- unset( $query['title'] );
- unset( $query['rest_url'] );
-
- $target = wfExpandUrl( $restUrl );
+ // make sure there's no way to change the domain
+ if ( $restUrl[0] !== '/' ) {
+ $restUrl = '/' . $restUrl;
+ }
+ $target = wfGetServerUrl( PROTO_CURRENT ) . $restUrl;
- $this->getOutput()->redirect( wfAppendQuery( $target, $query ) );
+ $output->redirect( $target );
break;
+
case '':
- $output = $this->getOutput();
$this->addHelpLink( 'Help:OAuth' );
$output->addWikiMsg( 'mwoauth-nosubpage-explanation' );
break;
+
default:
$format = $request->getVal( 'format', 'html' );
+ '@phan-var string $format';
$dbr = Utils::getCentralDB( DB_REPLICA );
$cmrAc = ConsumerAccessControl::wrap(
Consumer::newFromKey(
@@ -303,7 +331,7 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
);
}
- $this->getOutput()->addModuleStyles( 'ext.MWOAuth.styles' );
+ $output->addModuleStyles( 'ext.MWOAuth.styles' );
}
/**
@@ -328,12 +356,14 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
return;
}
- $this->getOutput()->addSubtitle( $this->msg( 'mwoauth-desc' )->escaped() );
- $this->getOutput()->addWikiMsg(
+ $output = $this->getOutput();
+
+ $output->addSubtitle( $this->msg( 'mwoauth-desc' )->escaped() );
+ $output->addWikiMsg(
'mwoauth-acceptance-cancelled',
$cmrAc->getName()
);
- $this->getOutput()->addReturnTo( \Title::newMainPage() );
+ $output->addReturnTo( \Title::newMainPage() );
}
/**
@@ -357,13 +387,20 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
$this->showResponse( $JWT, $format );
}
+ /**
+ * @param string|null $requestToken
+ * @param string|null $consumerKey
+ * @param bool $authenticate
+ */
protected function handleAuthorizationForm( $requestToken, $consumerKey, $authenticate ) {
- $this->getOutput()->addSubtitle( $this->msg( 'mwoauth-desc' )->escaped() );
+ $output = $this->getOutput();
+
+ $output->addSubtitle( $this->msg( 'mwoauth-desc' )->escaped() );
$user = $this->getUser();
$oauthServer = Utils::newMWOAuthServer();
- if ( !$consumerKey && $this->oauthVersion === Consumer::OAUTH_VERSION_1 ) {
+ if ( !$consumerKey && $requestToken && $this->oauthVersion === Consumer::OAUTH_VERSION_1 ) {
$consumerKey = $oauthServer->getConsumerKey( $requestToken );
}
@@ -393,7 +430,7 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
);
}
- $existing = $cmrAc->getDAO()->getCurrentAuthorization( $user, wfWikiID() );
+ $existing = $cmrAc->getDAO()->getCurrentAuthorization( $user, WikiMap::getCurrentWikiId() );
// If only authentication was requested, and the existing authorization
// matches, and the only grants are 'mwoauth-authonly' or 'mwoauth-authonlyprivate',
@@ -411,21 +448,16 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
$callback = $cmrAc->getDAO()->authorize(
$user, false, $cmrAc->getDAO()->getGrants(), $requestToken
);
- $this->getOutput()->redirect( $callback );
+ $output->redirect( $callback );
}
return;
}
- $this->getOutput()->addModuleStyles(
- [ 'mediawiki.ui', 'mediawiki.ui.button', 'ext.MWOAuth.Styles' ]
- );
- $this->getOutput()->addModules( 'ext.MWOAuth.AuthorizeDialog' );
-
$control = new ConsumerAcceptanceSubmitControl(
- $this->getContext(), [], Utils::getCentralDB( DB_MASTER ), $this->oauthVersion
+ $this->getContext(), [], Utils::getCentralDB( DB_PRIMARY ), $this->oauthVersion
);
- $form = \HTMLForm::factory( 'table',
+ $form = \HTMLForm::factory( 'ooui',
$control->registerValidators( $this->getRequestValidators( [
'existing' => $existing,
'consumerKey' => $consumerKey,
@@ -434,8 +466,8 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
$this->getContext()
);
$form->setSubmitCallback(
- function ( array $data, \IContextSource $context ) use ( $control ) {
- if ( $context->getRequest()->getCheck( 'cancel' ) ) { // sanity
+ static function ( array $data, \IContextSource $context ) use ( $control ) {
+ if ( $context->getRequest()->getCheck( 'cancel' ) ) {
throw new \MWException( 'Received request for a form cancellation.' );
}
$control->setInputParameters( $data );
@@ -470,7 +502,7 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
$grants = $this->getRequestedGrants( $cmrAc );
}
- $grantsText = \MWGrants::getGrantsWikiText( $grants, $this->getLanguage() );
+ $grantsText = $this->grantsLocalization->getGrantsWikiText( $grants, $this->getLanguage() );
if ( $grantsText === "\n" ) {
if ( in_array( 'mwoauth-authonlyprivate', $cmrAc->getGrants(), true ) ) {
$msgKey .= '-privateinfo';
@@ -497,24 +529,35 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
'value' => $this->msg( 'mwoauth-form-button-approve' )->text(),
'id' => 'mw-mwoauth-accept',
'attribs' => [
- 'class' => 'mw-mwoauth-authorize-button mw-ui-button mw-ui-progressive'
- ]
+ 'class' => 'mw-mwoauth-authorize-button'
+ ],
+ 'flags' => [ 'primary', 'progressive' ],
] );
$form->addButton( [
'name' => 'cancel',
'value' => $this->msg( 'mwoauth-form-button-cancel' )->text(),
'attribs' => [
- 'class' => 'mw-mwoauth-authorize-button mw-ui-button mw-ui-quiet'
- ]
+ 'class' => 'mw-mwoauth-authorize-button'
+ ],
+ 'framed' => false,
] );
- $form->addFooterText( $this->getSkin()->privacyLink() );
+ $form->addFooterText( $this->makePrivacyLink() );
+
+ $out = $this->getOutput();
+ $out->enableOOUI();
+ $out->addModuleStyles( 'ext.MWOAuth.AuthorizeForm' );
+ $out->addModules( 'ext.MWOAuth.AuthorizeDialog' );
- $this->getOutput()->addHTML(
- '<div id="mw-mwoauth-authorize-dialog" class="mw-ui-container">' );
- $status = $form->show();
+ $form->prepareForm();
+ $status = $form->tryAuthorizedSubmit();
+
+ $out->addHtml( new OOUI\PanelLayout( [
+ 'id' => 'mw-mwoauth-authorize-panel',
+ 'expanded' => false,
+ 'content' => new OOUI\HtmlSnippet( $form->getHTML( $status ) ),
+ ] ) );
- $this->getOutput()->addHTML( '</div>' );
if ( $status instanceof \Status && $status->isOK() ) {
if ( $this->oauthVersion === Consumer::OAUTH_VERSION_2 ) {
$this->redirectToREST( [
@@ -523,7 +566,7 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
} else {
// Redirect to callback url
// @phan-suppress-next-line PhanTypeArraySuspiciousNullable
- $this->getOutput()->redirect( $status->value['result']['callbackUrl'] );
+ $output->redirect( $status->value['result']['callbackUrl'] );
}
}
}
@@ -551,8 +594,9 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
);
$returnToQuery = wfArrayToCgi( $returnToQuery );
- $this->getOutput()->disable();
- $this->getOutput()->getRequest()->response()->header(
+ $output = $this->getOutput();
+ $output->disable();
+ $output->getRequest()->response()->header(
'Location: ' . "$expanded?{$returnToQuery}"
);
}
@@ -687,7 +731,7 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
private function showResponse( $data, $format ) {
$out = $this->getOutput();
if ( $format == 'raw' || $format == 'json' ) {
- $this->getOutput()->disable();
+ $out->disable();
// Cancel output buffering and gzipping if set
wfResetOutputBuffers();
// We must not allow the output to be Squid cached
@@ -702,7 +746,7 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
$response->header( 'Content-type: text/plain' );
}
print $data;
- } elseif ( $format == 'html' ) { // html
+ } elseif ( $format == 'html' ) {
$out->addHTML( $data );
}
}
@@ -721,7 +765,7 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
* Get the requested OAuth version from the request
*
* @param \WebRequest $request
- * @return string
+ * @return int
*/
private function determineOAuthVersion( \WebRequest $request ) {
$this->oauthVersion = $request->getInt( 'oauth_version', Consumer::OAUTH_VERSION_1 );
@@ -730,15 +774,37 @@ class SpecialMWOAuth extends \UnlistedSpecialPage {
}
/**
- * @param string $allowed Allowed version
+ * @param int $allowed Allowed version
* @throws MWOAuthException
*/
private function assertOAuthVersion( $allowed ) {
if ( $this->oauthVersion !== $allowed ) {
throw new MWOAuthException(
'mwoauth-oauth-unsupported-version',
- $this->oauthVersion
+ [ $this->oauthVersion ]
);
}
}
+
+ private function makePrivacyLink() {
+ // If the link description has been disabled in the default language,
+ if ( $this->msg( 'privacy' )->inContentLanguage()->isDisabled() ) {
+ // then it is disabled, for all languages.
+ $title = null;
+ } else {
+ // Otherwise, we display the link for the user, described in their
+ // language (which may or may not be the same as the default language),
+ // but we make the link target be the one site-wide page.
+ $title = Title::newFromText( $this->msg( 'privacypage' )->inContentLanguage()->text() );
+ }
+
+ if ( !$title ) {
+ return '';
+ }
+
+ return $this->getLinkRenderer()->makeKnownLink(
+ $title,
+ $this->msg( 'privacy' )->text()
+ );
+ }
}
diff --git a/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthConsumerRegistration.php b/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthConsumerRegistration.php
index c49d07dd..bf1b3ae2 100644
--- a/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthConsumerRegistration.php
+++ b/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthConsumerRegistration.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Frontend\SpecialPages;
+namespace MediaWiki\Extension\OAuth\Frontend\SpecialPages;
/**
* (c) Aaron Schulz 2013, GPL
@@ -21,23 +21,40 @@ namespace MediaWiki\Extensions\OAuth\Frontend\SpecialPages;
* http://www.gnu.org/copyleft/gpl.html
*/
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Control\ConsumerAccessControl;
-use MediaWiki\Extensions\OAuth\Control\ConsumerSubmitControl;
-use MediaWiki\Extensions\OAuth\Frontend\Pagers\ListMyConsumersPager;
-use MediaWiki\Extensions\OAuth\Frontend\UIUtils;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Control\ConsumerAccessControl;
+use MediaWiki\Extension\OAuth\Control\ConsumerSubmitControl;
+use MediaWiki\Extension\OAuth\Frontend\Pagers\ListMyConsumersPager;
+use MediaWiki\Extension\OAuth\Frontend\UIUtils;
use MediaWiki\MediaWikiServices;
+use MediaWiki\Permissions\GrantsInfo;
+use MediaWiki\Permissions\GrantsLocalization;
use User;
+use WikiMap;
use Wikimedia\Rdbms\DBConnRef;
/**
* Page that has registration request form and consumer update form
*/
class SpecialMWOAuthConsumerRegistration extends \SpecialPage {
+ /** @var GrantsInfo */
+ private $grantsInfo;
- public function __construct() {
+ /** @var GrantsLocalization */
+ private $grantsLocalization;
+
+ /**
+ * @param GrantsInfo $grantsInfo
+ * @param GrantsLocalization $grantsLocalization
+ */
+ public function __construct(
+ GrantsInfo $grantsInfo,
+ GrantsLocalization $grantsLocalization
+ ) {
parent::__construct( 'OAuthConsumerRegistration' );
+ $this->grantsInfo = $grantsInfo;
+ $this->grantsLocalization = $grantsLocalization;
}
public function doesWrites() {
@@ -53,8 +70,6 @@ class SpecialMWOAuthConsumerRegistration extends \SpecialPage {
}
public function execute( $par ) {
- global $wgMWOAuthSecureTokenTransfer, $wgMWOAuthReadOnly;
-
$this->requireLogin();
$this->checkPermissions();
@@ -65,7 +80,7 @@ class SpecialMWOAuthConsumerRegistration extends \SpecialPage {
// Redirect to HTTPs if attempting to access this page via HTTP.
// Proposals and updates to consumers can involve sending new secrets.
- if ( $wgMWOAuthSecureTokenTransfer
+ if ( $this->getConfig()->get( 'MWOAuthSecureTokenTransfer' )
&& $request->detectProtocol() == 'http'
&& substr( wfExpandUrl( '/', PROTO_HTTPS ), 0, 8 ) === 'https://'
) {
@@ -84,270 +99,58 @@ class SpecialMWOAuthConsumerRegistration extends \SpecialPage {
throw new \UserBlockedError( $block );
}
$this->checkReadOnly();
- if ( !$this->getUser()->isLoggedIn() ) {
+ if ( !$this->getUser()->isRegistered() ) {
throw new \UserNotLoggedIn();
}
- // Format is Special:OAuthConsumerRegistration[/propose|/list|/update/<consumer key>]
- $navigation = explode( '/', $par );
- $action = $navigation[0] ?? null;
- $consumerKey = $navigation[1] ?? null;
+ // Format is Special:OAuthConsumerRegistration[/propose/<oauth1a|oauth2>|/list|/update/<consumer key>]
+ $navigation = $par !== null ? explode( '/', $par ) : [];
+ $action = $navigation[0] ?? '';
+ $subPage = $navigation[1] ?? '';
- if ( $wgMWOAuthReadOnly && $action !== 'list' ) {
+ if ( $this->getConfig()->get( 'MWOAuthReadOnly' ) && $action !== 'list' ) {
throw new \ErrorPageError( 'mwoauth-error', 'mwoauth-db-readonly' );
}
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+
switch ( $action ) {
case 'propose':
- if ( !$user->isAllowed( 'mwoauthproposeconsumer' ) ) {
+ if ( !$permissionManager->userHasRight( $user, 'mwoauthproposeconsumer' ) ) {
throw new \PermissionsError( 'mwoauthproposeconsumer' );
}
- $allWikis = Utils::getAllWikiNames();
-
- $showGrants = \MWGrants::getValidGrants();
- $grantLinks = array_map( 'MWGrants::getGrantsLink', $showGrants );
-
- $config = MediaWikiServices::getInstance()->getConfigFactory()->makeConfig( 'mwoauth' );
-
- $dbw = Utils::getCentralDB( DB_MASTER ); // @TODO: lazy handle
- $control = new ConsumerSubmitControl( $this->getContext(), [], $dbw );
- $form = \HTMLForm::factory( 'ooui',
- $control->registerValidators( [
- 'name' => [
- 'type' => 'text',
- 'label-message' => 'mwoauth-consumer-name',
- 'size' => '45',
- 'required' => true
- ],
- 'version' => [
- 'type' => 'text',
- 'label-message' => 'mwoauth-consumer-version',
- 'required' => true,
- 'default' => "1.0"
- ],
- 'oauthVersion' => [
- 'type' => 'select',
- 'label-message' => 'mwoauth-oauth-version',
- 'options' => [
- $this->msg( 'mwoauth-oauth-version-1' )->escaped() =>
- Consumer::OAUTH_VERSION_1,
- $this->msg( 'mwoauth-oauth-version-2' )->escaped() =>
- Consumer::OAUTH_VERSION_2
- ],
- 'required' => true,
- 'default' => Consumer::OAUTH_VERSION_1
- ],
- 'description' => [
- 'type' => 'textarea',
- 'label-message' => 'mwoauth-consumer-description',
- 'required' => true,
- 'rows' => 5
- ],
- 'ownerOnly' => [
- 'type' => 'check',
- 'label-message' => [ 'mwoauth-consumer-owner-only', $user->getName() ],
- 'help-message' => [ 'mwoauth-consumer-owner-only-help', $user->getName() ],
- ],
- 'callbackUrl' => [
- 'type' => 'text',
- 'label-message' => 'mwoauth-consumer-callbackurl',
- 'required' => true,
- 'hide-if' => [ '!==', 'ownerOnly', '' ],
- ],
- 'callbackIsPrefix' => [
- 'type' => 'check',
- 'label-message' => 'mwoauth-consumer-callbackisprefix',
- 'required' => true,
- 'hide-if' => [ '!==', 'ownerOnly', '' ],
- ],
- 'email' => [
- 'type' => 'text',
- 'label-message' => 'mwoauth-consumer-email',
- 'required' => true,
- 'readonly' => true,
- 'default' => $user->getEmail(),
- 'help-message' => 'mwoauth-consumer-email-help',
- ],
- 'wiki' => [
- 'type' => $allWikis ? 'combobox' : 'select',
- 'options' => [
- $this->msg( 'mwoauth-consumer-allwikis' )->escaped() => '*',
- $this->msg( 'mwoauth-consumer-wiki-thiswiki', wfWikiID() )
- ->escaped() => wfWikiID()
- ] + array_flip( $allWikis ),
- 'label-message' => 'mwoauth-consumer-wiki',
- 'required' => true,
- 'default' => '*'
- ],
- 'oauth2IsConfidential' => [
- 'type' => 'check',
- 'label-message' => 'mwoauth-oauth2-is-confidential',
- 'help-message' => 'mwoauth-oauth2-is-confidential-help',
- 'hide-if' => [ '!==', 'oauthVersion', (string)Consumer::OAUTH_VERSION_2 ],
- 'default' => 1
- ],
- 'oauth2GrantTypes' => [
- 'type' => 'multiselect',
- 'label-message' => 'mwoauth-oauth2-granttypes',
- 'hide-if' => [ 'OR',
- [ '!==', 'oauthVersion', (string)Consumer::OAUTH_VERSION_2 ],
- [ '!==', 'ownerOnly', '' ]
- ],
- 'options' => array_filter( [
- $this->msg( 'mwoauth-oauth2-granttype-auth-code' )->escaped() =>
- 'authorization_code',
- $this->msg( 'mwoauth-oauth2-granttype-refresh-token' )->escaped() =>
- 'refresh_token',
- $this->msg( 'mwoauth-oauth2-granttype-client-credentials' )->escaped() =>
- 'client_credentials',
- ], function ( $grantType ) use ( $config ) {
- return in_array( $grantType, $config->get( 'OAuth2EnabledGrantTypes' ) );
- } ),
- 'dropdown' => true,
- 'required' => true,
- 'default' => [ 'authorization_code', 'refresh_token' ]
- ],
- 'granttype' => [
- 'type' => 'radio',
- 'options-messages' => [
- 'grant-mwoauth-authonly' => 'authonly',
- 'grant-mwoauth-authonlyprivate' => 'authonlyprivate',
- 'mwoauth-granttype-normal' => 'normal',
- ],
- 'label-message' => 'mwoauth-consumer-granttypes',
- 'default' => 'normal',
- ],
- 'grants' => [
- 'type' => 'checkmatrix',
- 'label-message' => 'mwoauth-consumer-grantsneeded',
- 'help-message' => 'mwoauth-consumer-grantshelp',
- 'hide-if' => [ '!==', 'granttype', 'normal' ],
- 'columns' => [
- $this->msg( 'mwoauth-consumer-required-grant' )->escaped() => 'grant'
- ],
- 'rows' => array_combine(
- $grantLinks,
- $showGrants
- ),
- 'tooltips' => array_combine(
- $grantLinks,
- array_map(
- function ( $rights ) use ( $lang ) {
- return $lang->semicolonList( array_map(
- '\User::getRightDescription', $rights ) );
- },
- array_intersect_key(
- \MWGrants::getRightsByGrant(), array_flip( $showGrants )
- )
- )
- ),
- 'force-options-on' => array_map(
- function ( $g ) {
- return "grant-$g";
- },
- \MWGrants::getHiddenGrants()
- ),
- 'validation-callback' => null, // different format
- ],
- 'restrictions' => [
- 'class' => 'HTMLRestrictionsField',
- 'required' => true,
- 'default' => \MWRestrictions::newDefault(),
- ],
- 'rsaKey' => [
- 'type' => 'textarea',
- 'label-message' => 'mwoauth-consumer-rsakey',
- 'help-message' => 'mwoauth-consumer-rsakey-help',
- 'required' => false,
- 'default' => '',
- 'rows' => 5,
- 'hide-if' => [ '===', 'oauthVersion', (string)Consumer::OAUTH_VERSION_2 ]
- ],
- 'agreement' => [
- 'type' => 'check',
- 'label-message' => 'mwoauth-consumer-developer-agreement',
- 'required' => true,
- ],
- 'action' => [
- 'type' => 'hidden',
- 'default' => 'propose'
- ]
- ] ),
- $this->getContext()
- );
- $form->setSubmitCallback(
- function ( array $data, \IContextSource $context ) use ( $control ) {
- $data['grants'] = \FormatJson::encode( // adapt form to controller
- preg_replace( '/^grant-/', '', $data['grants'] ) );
- // 'callbackUrl' must be present,
- // otherwise MWOAuthSubmitControl::validateFields() fails.
- if ( $data['ownerOnly'] && !isset( $data['callbackUrl'] ) ) {
- $data['callbackUrl'] = '';
- }
- // Force all ownerOnly clients to use client_credentials
- if ( $data['ownerOnly'] ) {
- $data['oauth2GrantTypes'] = [ 'client_credentials' ];
- }
-
- $control->setInputParameters( $data );
- return $control->submit();
- }
- );
- $form->setWrapperLegendMsg( 'mwoauthconsumerregistration-propose-legend' );
- $form->setSubmitTextMsg( 'mwoauthconsumerregistration-propose-submit' );
- $form->addPreText(
- $this->msg( 'mwoauthconsumerregistration-propose-text' )->parseAsBlock() );
+ if ( $subPage === '' ) {
+ $this->getOutput()->addWikiMsg( 'mwoauthconsumerregistration-propose-text' );
+ break;
+ }
- $status = $form->show();
- if ( $status instanceof \Status && $status->isOK() ) {
- /** @var Consumer $cmr */
- // @phan-suppress-next-line PhanTypeArraySuspiciousNullable
- $cmr = $status->value['result']['consumer'];
- if ( $cmr->getOwnerOnly() ) {
- // @phan-suppress-next-line PhanTypeArraySuspiciousNullable
- $accessToken = $status->value['result']['accessToken'];
- if ( $cmr->getOAuthVersion() === Consumer::OAUTH_VERSION_2 ) {
- // If we just add raw AT to the page, it would go 3000px wide
- $accessToken = \Html::element( 'span', [
- 'style' => 'overflow-wrap: break-word'
- ], (string)$accessToken );
-
- $this->getOutput()->addWikiMsg(
- 'mwoauthconsumerregistration-created-owner-only-oauth2',
- $cmr->getConsumerKey(),
- Utils::hmacDBSecret( $cmr->getSecretKey() ),
- \Message::rawParam( $accessToken )
- );
- } else {
- $this->getOutput()->addWikiMsg(
- 'mwoauthconsumerregistration-created-owner-only',
- $cmr->getConsumerKey(),
- Utils::hmacDBSecret( $cmr->getSecretKey() ),
- $accessToken->key,
- Utils::hmacDBSecret( $accessToken->secret )
- );
- }
- } else {
- $this->getOutput()->addWikiMsg( 'mwoauthconsumerregistration-proposed',
- $cmr->getConsumerKey(),
- Utils::hmacDBSecret( $cmr->getSecretKey() ) );
- }
- $this->getOutput()->returnToMain();
+ $allWikis = Utils::getAllWikiNames();
+ $showGrants = $this->grantsInfo->getValidGrants();
+ $grantLinks = array_map( [ $this->grantsLocalization, 'getGrantsLink' ], $showGrants );
+ if ( $subPage === 'oauth2' ) {
+ $this->proposeOAuth2( $user, $allWikis, $lang, $showGrants, $grantLinks );
+ break;
+ } elseif ( $subPage === 'oauth1a' ) {
+ $this->proposeOAuth1( $user, $allWikis, $lang, $showGrants, $grantLinks );
+ break;
+ } else {
+ $this->getOutput()->redirect( 'Special:OAuthConsumerRegistration/propose' );
}
break;
case 'update':
- if ( !$user->isAllowed( 'mwoauthupdateownconsumer' ) ) {
+ if ( !$permissionManager->userHasRight( $user, 'mwoauthupdateownconsumer' ) ) {
throw new \PermissionsError( 'mwoauthupdateownconsumer' );
}
$dbr = Utils::getCentralDB( DB_REPLICA );
$cmrAc = ConsumerAccessControl::wrap(
- Consumer::newFromKey( $dbr, $consumerKey ), $this->getContext() );
+ Consumer::newFromKey( $dbr, $subPage ), $this->getContext() );
if ( !$cmrAc ) {
$this->getOutput()->addWikiMsg( 'mwoauth-invalid-consumer-key' );
break;
- } elseif ( $cmrAc->getDAO()->getDeleted() && !$user->isAllowed( 'mwoauthviewsuppressed' ) ) {
+ } elseif ( $cmrAc->getDAO()->getDeleted()
+ && !$permissionManager->userHasRight( $user, 'mwoauthviewsuppressed' ) ) {
throw new \PermissionsError( 'mwoauthviewsuppressed' );
} elseif ( $cmrAc->getDAO()->getUserId() !== $centralUserId ) {
// Do not show private information to other users
@@ -356,7 +159,7 @@ class SpecialMWOAuthConsumerRegistration extends \SpecialPage {
}
$oldSecretKey = $cmrAc->getDAO()->getSecretKey();
- $dbw = Utils::getCentralDB( DB_MASTER ); // @TODO: lazy handle
+ $dbw = Utils::getCentralDB( DB_PRIMARY );
$control = new ConsumerSubmitControl( $this->getContext(), [], $dbw );
$form = \HTMLForm::factory( 'ooui',
$control->registerValidators( [
@@ -367,8 +170,8 @@ class SpecialMWOAuthConsumerRegistration extends \SpecialPage {
'mwoauth-consumer-name' => $cmrAc->getName(),
'mwoauth-consumer-version' => $cmrAc->getVersion(),
'mwoauth-oauth-version' => $cmrAc->getOAuthVersion() === Consumer::OAUTH_VERSION_2 ?
- wfMessage( 'mwoauth-oauth-version-2' )->text() :
- wfMessage( 'mwoauth-oauth-version-1' )->text(),
+ $this->msg( 'mwoauth-oauth-version-2' )->text() :
+ $this->msg( 'mwoauth-oauth-version-1' )->text(),
'mwoauth-consumer-key' => $cmrAc->getConsumerKey(),
], $this->getContext() ),
],
@@ -410,7 +213,7 @@ class SpecialMWOAuthConsumerRegistration extends \SpecialPage {
$this->getContext()
);
$form->setSubmitCallback(
- function ( array $data, \IContextSource $context ) use ( $control ) {
+ static function ( array $data, \IContextSource $context ) use ( $control ) {
$control->setInputParameters( $data );
return $control->submit();
}
@@ -427,7 +230,8 @@ class SpecialMWOAuthConsumerRegistration extends \SpecialPage {
$cmr = $status->value['result']['consumer'];
$this->getOutput()->addWikiMsg( 'mwoauthconsumerregistration-updated' );
$curSecretKey = $cmr->getSecretKey();
- if ( $oldSecretKey !== $curSecretKey ) { // token reset?
+ // token reset?
+ if ( $oldSecretKey !== $curSecretKey ) {
if ( $cmr->getOwnerOnly() ) {
// @phan-suppress-next-line PhanTypeArraySuspiciousNullable
$accessToken = $status->value['result']['accessToken'];
@@ -482,15 +286,15 @@ class SpecialMWOAuthConsumerRegistration extends \SpecialPage {
$this->getOutput()->addWikiMsg( "mwoauthconsumerregistration-none" );
}
# Every 30th view, prune old deleted items
- if ( 0 == mt_rand( 0, 29 ) ) {
- Utils::runAutoMaintenance( Utils::getCentralDB( DB_MASTER ) );
+ if ( mt_rand( 0, 29 ) == 0 ) {
+ Utils::runAutoMaintenance( Utils::getCentralDB( DB_PRIMARY ) );
}
break;
default:
$this->getOutput()->addWikiMsg( 'mwoauthconsumerregistration-maintext' );
}
- $this->addSubtitleLinks( $action, $consumerKey );
+ $this->addSubtitleLinks( $action, $subPage );
$this->getOutput()->addModuleStyles( 'ext.MWOAuth.styles' );
}
@@ -499,37 +303,56 @@ class SpecialMWOAuthConsumerRegistration extends \SpecialPage {
* Show navigation links
*
* @param string $action
- * @param string $consumerKey
+ * @param string $subPage
* @return void
*/
- protected function addSubtitleLinks( $action, $consumerKey ) {
+ protected function addSubtitleLinks( $action, $subPage ) {
$listLinks = [];
- if ( $consumerKey || $action !== 'propose' ) {
- $listLinks[] = \Linker::linkKnown(
- $this->getPageTitle( 'propose' ),
- $this->msg( 'mwoauthconsumerregistration-propose' )->escaped() );
+ if ( $action === 'propose' && $subPage ) {
+ if ( $subPage === 'oauth1a' ) {
+ $listLinks[] = $this->msg( 'mwoauthconsumerregistration-propose-oauth1a' )->escaped();
+ $listLinks[] = $this->getLinkRenderer()->makeKnownLink(
+ $this->getPageTitle( 'propose/oauth2' ),
+ $this->msg( 'mwoauthconsumerregistration-propose-oauth2' )->text()
+ );
+ } elseif ( $subPage === 'oauth2' ) {
+ $listLinks[] = $this->getLinkRenderer()->makeKnownLink(
+ $this->getPageTitle( 'propose/oauth1a' ),
+ $this->msg( 'mwoauthconsumerregistration-propose-oauth1a' )->text()
+ );
+ $listLinks[] = $this->msg( 'mwoauthconsumerregistration-propose-oauth2' )->escaped();
+ }
} else {
- $listLinks[] = $this->msg( 'mwoauthconsumerregistration-propose' )->escaped();
+ $listLinks[] = $this->getLinkRenderer()->makeKnownLink(
+ $this->getPageTitle( 'propose/oauth1a' ),
+ $this->msg( 'mwoauthconsumerregistration-propose-oauth1a' )->text()
+ );
+ $listLinks[] = $this->getLinkRenderer()->makeKnownLink(
+ $this->getPageTitle( 'propose/oauth2' ),
+ $this->msg( 'mwoauthconsumerregistration-propose-oauth2' )->text()
+ );
}
- if ( $consumerKey || $action !== 'list' ) {
- $listLinks[] = \Linker::linkKnown(
+ if ( $subPage || $action !== 'list' ) {
+ $listLinks[] = $this->getLinkRenderer()->makeKnownLink(
$this->getPageTitle( 'list' ),
- $this->msg( 'mwoauthconsumerregistration-list' )->escaped() );
+ $this->msg( 'mwoauthconsumerregistration-list' )->text()
+ );
} else {
$listLinks[] = $this->msg( 'mwoauthconsumerregistration-list' )->escaped();
}
- if ( $consumerKey && $action == 'update' ) {
- $listLinks[] = \Linker::linkKnown(
- \SpecialPage::getTitleFor( 'OAuthListConsumers', "view/$consumerKey" ),
- $this->msg( 'mwoauthconsumer-consumer-view' )->escaped() );
+ if ( $subPage && $action == 'update' ) {
+ $listLinks[] = $this->getLinkRenderer()->makeKnownLink(
+ \SpecialPage::getTitleFor( 'OAuthListConsumers', "view/$subPage" ),
+ $this->msg( 'mwoauthconsumer-consumer-view' )->text()
+ );
}
$linkHtml = $this->getLanguage()->pipeList( $listLinks );
$viewall = $this->msg( 'parentheses' )->rawParams(
- \Linker::linkKnown(
+ $this->getLinkRenderer()->makeKnownLink(
$this->getPageTitle(),
- $this->msg( 'mwoauthconsumerregistration-main' )->escaped()
+ $this->msg( 'mwoauthconsumerregistration-main' )->text()
)
)->escaped();
@@ -549,14 +372,14 @@ class SpecialMWOAuthConsumerRegistration extends \SpecialPage {
$cmrKey = $cmrAc->getConsumerKey();
$links = [];
- $links[] = \Linker::linkKnown(
+ $links[] = $this->getLinkRenderer()->makeKnownLink(
\SpecialPage::getTitleFor( 'OAuthListConsumers', "view/$cmrKey" ),
- $this->msg( 'mwoauthlistconsumers-view' )->escaped()
+ $this->msg( 'mwoauthlistconsumers-view' )->text()
);
- $links[] = \Linker::linkKnown(
+ $links[] = $this->getLinkRenderer()->makeKnownLink(
$this->getPageTitle( 'update/' . $cmrKey ),
- $this->msg( 'mwoauthconsumerregistration-manage' )->escaped()
+ $this->msg( 'mwoauthconsumerregistration-manage' )->text()
);
$links = $this->getLanguage()->pipeList( $links );
@@ -565,7 +388,7 @@ class SpecialMWOAuthConsumerRegistration extends \SpecialPage {
wfTimestamp( TS_MW, $cmrAc->getRegistration() ), true ) );
$stageKey = Consumer::$stageNames[$cmrAc->getStage()];
- $encStageKey = htmlspecialchars( $stageKey ); // sanity
+ $encStageKey = htmlspecialchars( $stageKey );
// Show last log entry (@TODO: title namespace?)
// @TODO: inject DB
$logHtml = '';
@@ -580,8 +403,8 @@ class SpecialMWOAuthConsumerRegistration extends \SpecialPage {
$lang = $this->getLanguage();
$oauthVersionMessage = $cmrAc->getOAuthVersion() === Consumer::OAUTH_VERSION_2 ?
- wfMessage( 'mwoauth-oauth-version-2' )->text() :
- wfMessage( 'mwoauth-oauth-version-1' )->text();
+ $this->msg( 'mwoauth-oauth-version-2' )->text() :
+ $this->msg( 'mwoauth-oauth-version-1' )->text();
$data = [
'mwoauthconsumerregistration-name' => $cmrAc->escapeForHtml( $cmrAc->getNameAndVersion() ),
'mwoauth-oauth-version' => $cmrAc->escapeForHtml( $oauthVersionMessage ),
@@ -591,7 +414,7 @@ class SpecialMWOAuthConsumerRegistration extends \SpecialPage {
'mwoauthconsumerregistration-stage' =>
$this->msg( "mwoauth-consumer-stage-$stageKey" )->escaped(),
'mwoauthconsumerregistration-description' => $cmrAc->escapeForHtml(
- $cmrAc->get( 'description', function ( $s ) use ( $lang ) {
+ $cmrAc->get( 'description', static function ( $s ) use ( $lang ) {
return $lang->truncateForVisual( $s, 10024 );
} )
),
@@ -620,4 +443,402 @@ class SpecialMWOAuthConsumerRegistration extends \SpecialPage {
protected function getGroupName() {
return 'users';
}
+
+ private function proposeOAuth1( User $user, $allWikis, $lang, $showGrants, $grantLinks ) {
+ $dbw = Utils::getCentralDB( DB_PRIMARY );
+ $control = new ConsumerSubmitControl( $this->getContext(), [], $dbw );
+ $form = \HTMLForm::factory( 'ooui',
+ $control->registerValidators( [
+ 'oauthVersion' => [
+ 'class' => 'HTMLHiddenField',
+ 'default' => Consumer::OAUTH_VERSION_1,
+ ],
+ 'name' => [
+ 'type' => 'text',
+ 'label-message' => 'mwoauth-consumer-name',
+ 'size' => '45',
+ 'required' => true
+ ],
+ 'version' => [
+ 'type' => 'text',
+ 'label-message' => 'mwoauth-consumer-version',
+ 'required' => true,
+ 'default' => "1.0"
+ ],
+ 'description' => [
+ 'type' => 'textarea',
+ 'label-message' => 'mwoauth-consumer-description',
+ 'required' => true,
+ 'rows' => 5
+ ],
+ 'ownerOnly' => [
+ 'type' => 'check',
+ 'label-message' => [ 'mwoauth-consumer-owner-only', $user->getName() ],
+ 'help-message' => [ 'mwoauth-consumer-owner-only-help', $user->getName() ],
+ ],
+ 'callbackUrl' => [
+ 'type' => 'text',
+ 'label-message' => 'mwoauth-consumer-callbackurl',
+ 'required' => true,
+ 'hide-if' => [ '!==', 'ownerOnly', '' ],
+ ],
+ 'callbackIsPrefix' => [
+ 'type' => 'check',
+ 'label-message' => 'mwoauth-consumer-callbackisprefix',
+ 'hide-if' => [ '!==', 'ownerOnly', '' ],
+ ],
+ 'email' => [
+ 'type' => 'text',
+ 'label-message' => 'mwoauth-consumer-email',
+ 'required' => true,
+ 'readonly' => true,
+ 'default' => $user->getEmail(),
+ 'help-message' => 'mwoauth-consumer-email-help',
+ ],
+ 'wiki' => [
+ 'type' => $allWikis ? 'combobox' : 'select',
+ 'options' => [
+ $this->msg( 'mwoauth-consumer-allwikis' )->escaped() => '*',
+ $this->msg( 'mwoauth-consumer-wiki-thiswiki', WikiMap::getCurrentWikiId() )
+ ->escaped() => WikiMap::getCurrentWikiId()
+ ] + array_flip( $allWikis ),
+ 'label-message' => 'mwoauth-consumer-wiki',
+ 'required' => true,
+ 'default' => '*'
+ ],
+ 'granttype' => [
+ 'type' => 'radio',
+ 'options-messages' => [
+ 'grant-mwoauth-authonly' => 'authonly',
+ 'grant-mwoauth-authonlyprivate' => 'authonlyprivate',
+ 'mwoauth-granttype-normal' => 'normal',
+ ],
+ 'label-message' => 'mwoauth-consumer-granttypes',
+ 'default' => 'normal',
+ ],
+ 'grants' => [
+ 'type' => 'checkmatrix',
+ 'label-message' => 'mwoauth-consumer-grantsneeded',
+ 'help-message' => 'mwoauth-consumer-grantshelp',
+ 'hide-if' => [ '!==', 'granttype', 'normal' ],
+ 'columns' => [
+ $this->msg( 'mwoauth-consumer-required-grant' )->escaped() => 'grant'
+ ],
+ 'rows' => array_combine(
+ $grantLinks,
+ $showGrants
+ ),
+ 'tooltips' => array_combine(
+ $grantLinks,
+ array_map(
+ static function ( $rights ) use ( $lang ) {
+ return $lang->semicolonList( array_map(
+ '\User::getRightDescription', $rights ) );
+ },
+ array_intersect_key(
+ $this->grantsInfo->getRightsByGrant(), array_flip( $showGrants )
+ )
+ )
+ ),
+ 'force-options-on' => array_map(
+ static function ( $g ) {
+ return "grant-$g";
+ },
+ $this->grantsInfo->getHiddenGrants()
+ ),
+ // different format
+ 'validation-callback' => null,
+ ],
+ 'restrictions' => [
+ 'class' => 'HTMLRestrictionsField',
+ 'required' => true,
+ 'default' => \MWRestrictions::newDefault(),
+ ],
+ 'rsaKey' => [
+ 'type' => 'textarea',
+ 'label-message' => 'mwoauth-consumer-rsakey',
+ 'help-message' => 'mwoauth-consumer-rsakey-help',
+ 'required' => false,
+ 'default' => '',
+ 'rows' => 5
+ ],
+ 'agreement' => [
+ 'type' => 'check',
+ 'label-message' => 'mwoauth-consumer-developer-agreement',
+ 'required' => true,
+ ],
+ 'action' => [
+ 'type' => 'hidden',
+ 'default' => 'propose'
+ ]
+ ] ),
+ $this->getContext()
+ );
+ $form->setSubmitCallback(
+ function ( array $data, \IContextSource $context ) use ( $control ) {
+ // adapt form to controller
+ $data = $this->fillDefaultFields( $data );
+
+ $data['grants'] = \FormatJson::encode(
+ preg_replace( '/^grant-/', '', $data['grants'] )
+ );
+
+ // Force all ownerOnly clients to use client_credentials
+ if ( $data['ownerOnly'] ) {
+ $data['oauth2GrantTypes'] = [ 'client_credentials' ];
+ }
+
+ $control->setInputParameters( $data );
+ return $control->submit();
+ }
+ );
+ $form->setWrapperLegendMsg( 'mwoauthconsumerregistration-propose-legend' );
+ $form->setSubmitTextMsg( 'mwoauthconsumerregistration-propose-submit' );
+ $form->addPreText(
+ $this->msg( 'mwoauthconsumerregistration-propose-text-oauth1a' )->parseAsBlock() );
+
+ $status = $form->show();
+ if ( $status instanceof \Status && $status->isOK() ) {
+ /** @var Consumer $cmr */
+ // @phan-suppress-next-line PhanTypeArraySuspiciousNullable
+ $cmr = $status->value['result']['consumer'];
+ if ( $cmr->getOwnerOnly() ) {
+ // @phan-suppress-next-line PhanTypeArraySuspiciousNullable
+ $accessToken = $status->value['result']['accessToken'];
+ $this->getOutput()->addWikiMsg(
+ 'mwoauthconsumerregistration-created-owner-only',
+ $cmr->getConsumerKey(),
+ Utils::hmacDBSecret( $cmr->getSecretKey() ),
+ $accessToken->key,
+ Utils::hmacDBSecret( $accessToken->secret )
+ );
+ } else {
+ $this->getOutput()->addWikiMsg( 'mwoauthconsumerregistration-proposed',
+ $cmr->getConsumerKey(),
+ Utils::hmacDBSecret( $cmr->getSecretKey() ) );
+ }
+ $this->getOutput()->returnToMain();
+ }
+ }
+
+ private function proposeOAuth2( User $user, $allWikis, $lang, $showGrants, $grantLinks ) {
+ $config = MediaWikiServices::getInstance()->getConfigFactory()->makeConfig( 'mwoauth' );
+
+ $dbw = Utils::getCentralDB( DB_PRIMARY );
+ $control = new ConsumerSubmitControl( $this->getContext(), [], $dbw );
+ $form = \HTMLForm::factory( 'ooui',
+ $control->registerValidators( [
+ 'oauthVersion' => [
+ 'class' => 'HTMLHiddenField',
+ 'default' => Consumer::OAUTH_VERSION_2,
+ ],
+ 'name' => [
+ 'type' => 'text',
+ 'label-message' => 'mwoauth-consumer-name',
+ 'size' => '45',
+ 'required' => true
+ ],
+ 'version' => [
+ 'type' => 'text',
+ 'label-message' => 'mwoauth-consumer-version',
+ 'required' => true,
+ 'default' => "1.0"
+ ],
+ 'description' => [
+ 'type' => 'textarea',
+ 'label-message' => 'mwoauth-consumer-description',
+ 'required' => true,
+ 'rows' => 5
+ ],
+ 'ownerOnly' => [
+ 'type' => 'check',
+ 'label-message' => [ 'mwoauth-consumer-owner-only', $user->getName() ],
+ 'help-message' => [ 'mwoauth-consumer-owner-only-help', $user->getName() ],
+ ],
+ 'callbackUrl' => [
+ 'type' => 'text',
+ 'label-message' => 'mwoauth-consumer-callbackurl',
+ 'help-message' => 'mwoauth-consumer-callbackurl-help',
+ 'required' => true,
+ 'hide-if' => [ '!==', 'ownerOnly', '' ],
+ ],
+ 'email' => [
+ 'type' => 'text',
+ 'label-message' => 'mwoauth-consumer-email',
+ 'required' => true,
+ 'readonly' => true,
+ 'default' => $user->getEmail(),
+ 'help-message' => 'mwoauth-consumer-email-help',
+ ],
+ 'wiki' => [
+ 'type' => $allWikis ? 'combobox' : 'select',
+ 'options' => [
+ $this->msg( 'mwoauth-consumer-allwikis' )->escaped() => '*',
+ $this->msg( 'mwoauth-consumer-wiki-thiswiki', WikiMap::getCurrentWikiId() )
+ ->escaped() => WikiMap::getCurrentWikiId()
+ ] + array_flip( $allWikis ),
+ 'label-message' => 'mwoauth-consumer-wiki',
+ 'required' => true,
+ 'default' => '*'
+ ],
+ 'oauth2IsConfidential' => [
+ 'type' => 'check',
+ 'label-message' => 'mwoauth-oauth2-is-confidential',
+ 'help-message' => 'mwoauth-oauth2-is-confidential-help',
+ 'default' => 1
+ ],
+ 'oauth2GrantTypes' => [
+ 'type' => 'multiselect',
+ 'label-message' => 'mwoauth-oauth2-granttypes',
+ 'hide-if' => [ '!==', 'ownerOnly', '' ],
+ 'options' => array_filter( [
+ $this->msg( 'mwoauth-oauth2-granttype-auth-code' )->escaped() =>
+ 'authorization_code',
+ $this->msg( 'mwoauth-oauth2-granttype-refresh-token' )->escaped() =>
+ 'refresh_token',
+ $this->msg( 'mwoauth-oauth2-granttype-client-credentials' )->escaped() =>
+ 'client_credentials',
+ ], static function ( $grantType ) use ( $config ) {
+ return in_array( $grantType, $config->get( 'OAuth2EnabledGrantTypes' ) );
+ } ),
+ 'required' => true,
+ 'default' => [ 'authorization_code', 'refresh_token' ]
+ ],
+ 'granttype' => [
+ 'type' => 'radio',
+ 'options-messages' => [
+ 'grant-mwoauth-authonly' => 'authonly',
+ 'grant-mwoauth-authonlyprivate' => 'authonlyprivate',
+ 'mwoauth-granttype-normal' => 'normal',
+ ],
+ 'label-message' => 'mwoauth-consumer-granttypes',
+ 'default' => 'normal',
+ ],
+ 'grants' => [
+ 'type' => 'checkmatrix',
+ 'label-message' => 'mwoauth-consumer-grantsneeded',
+ 'help-message' => 'mwoauth-consumer-grantshelp',
+ 'hide-if' => [ '!==', 'granttype', 'normal' ],
+ 'columns' => [
+ $this->msg( 'mwoauth-consumer-required-grant' )->escaped() => 'grant'
+ ],
+ 'rows' => array_combine(
+ $grantLinks,
+ $showGrants
+ ),
+ 'tooltips' => array_combine(
+ $grantLinks,
+ array_map(
+ static function ( $rights ) use ( $lang ) {
+ return $lang->semicolonList( array_map(
+ '\User::getRightDescription', $rights ) );
+ },
+ array_intersect_key(
+ $this->grantsInfo->getRightsByGrant(), array_flip( $showGrants )
+ )
+ )
+ ),
+ 'force-options-on' => array_map(
+ static function ( $g ) {
+ return "grant-$g";
+ },
+ $this->grantsInfo->getHiddenGrants()
+ ),
+ // different format
+ 'validation-callback' => null,
+ ],
+ 'restrictions' => [
+ 'class' => 'HTMLRestrictionsField',
+ 'required' => true,
+ 'default' => \MWRestrictions::newDefault(),
+ ],
+ 'agreement' => [
+ 'type' => 'check',
+ 'label-message' => 'mwoauth-consumer-developer-agreement',
+ 'required' => true,
+ ],
+ 'action' => [
+ 'type' => 'hidden',
+ 'default' => 'propose'
+ ]
+ ] ),
+ $this->getContext()
+ );
+ $form->setSubmitCallback(
+ function ( array $data, \IContextSource $context ) use ( $control ) {
+ // adapt form to controller
+ $data = $this->fillDefaultFields( $data );
+
+ $data['grants'] = \FormatJson::encode(
+ preg_replace( '/^grant-/', '', $data['grants'] )
+ );
+
+ // Force all ownerOnly clients to use client_credentials
+ if ( $data['ownerOnly'] ) {
+ $data['oauth2GrantTypes'] = [ 'client_credentials' ];
+ }
+
+ $control->setInputParameters( $data );
+ return $control->submit();
+ }
+ );
+ $form->setWrapperLegendMsg( 'mwoauthconsumerregistration-propose-legend' );
+ $form->setSubmitTextMsg( 'mwoauthconsumerregistration-propose-submit' );
+ $form->addPreText(
+ $this->msg( 'mwoauthconsumerregistration-propose-text-oauth2' )->parseAsBlock() );
+
+ $status = $form->show();
+ if ( $status instanceof \Status && $status->isOK() ) {
+ /** @var Consumer $cmr */
+ // @phan-suppress-next-line PhanTypeArraySuspiciousNullable
+ $cmr = $status->value['result']['consumer'];
+ if ( $cmr->getOwnerOnly() ) {
+ // @phan-suppress-next-line PhanTypeArraySuspiciousNullable
+ $accessToken = $status->value['result']['accessToken'];
+ // If we just add raw AT to the page, it would go 3000px wide
+ $accessToken = \Html::element( 'span', [
+ 'style' => 'overflow-wrap: break-word'
+ ], (string)$accessToken );
+
+ $this->getOutput()->addWikiMsg(
+ 'mwoauthconsumerregistration-created-owner-only-oauth2',
+ $cmr->getConsumerKey(),
+ Utils::hmacDBSecret( $cmr->getSecretKey() ),
+ \Message::rawParam( $accessToken )
+ );
+ } else {
+ $this->getOutput()->addWikiMsg( 'mwoauthconsumerregistration-proposed',
+ $cmr->getConsumerKey(),
+ Utils::hmacDBSecret( $cmr->getSecretKey() ) );
+ }
+ $this->getOutput()->returnToMain();
+ }
+ }
+
+ /**
+ * Used to adapt both OAuth forms to the same structure so SubmitControl::validateFields() doesn't fail
+ *
+ * @param array $form
+ * @return array
+ */
+ private function fillDefaultFields( array $form ): array {
+ // These defaults are taken from the legacy form and are present regardless of OAuth version
+ $defaults = [
+ 'callbackIsPrefix' => false,
+ 'oauth2IsConfidential' => true,
+ 'oauth2GrantTypes' => [ 'authorization_code', 'refresh_token' ],
+ 'granttype' => 'normal',
+ 'rsaKey' => '',
+ ];
+
+ $form = array_merge( $defaults, $form );
+
+ // 'callbackUrl' must be present,
+ // otherwise SubmitControl::validateFields() fails.
+ if ( $form['ownerOnly'] && !isset( $form['callbackUrl'] ) ) {
+ $form['callbackUrl'] = '';
+ }
+
+ return $form;
+ }
}
diff --git a/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthListConsumers.php b/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthListConsumers.php
index 57a36176..93fa7ee7 100644
--- a/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthListConsumers.php
+++ b/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthListConsumers.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Frontend\SpecialPages;
+namespace MediaWiki\Extension\OAuth\Frontend\SpecialPages;
/**
* (c) Aaron Schulz 2013, GPL
@@ -21,16 +21,17 @@ namespace MediaWiki\Extensions\OAuth\Frontend\SpecialPages;
* http://www.gnu.org/copyleft/gpl.html
*/
-use Html;
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\ConsumerAcceptance;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Control\ConsumerAccessControl;
-use MediaWiki\Extensions\OAuth\Frontend\Pagers\ListConsumersPager;
-use MediaWiki\Extensions\OAuth\Frontend\UIUtils;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\ConsumerAcceptance;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Control\ConsumerAccessControl;
+use MediaWiki\Extension\OAuth\Frontend\Pagers\ListConsumersPager;
+use MediaWiki\Extension\OAuth\Frontend\UIUtils;
use MediaWiki\MediaWikiServices;
+use MediaWiki\Permissions\GrantsLocalization;
use OOUI\HtmlSnippet;
use SpecialPage;
+use WikiMap;
use Wikimedia\Rdbms\DBConnRef;
/**
@@ -38,8 +39,15 @@ use Wikimedia\Rdbms\DBConnRef;
* their approval/rejection and also for listing approved/disabled consumers
*/
class SpecialMWOAuthListConsumers extends \SpecialPage {
- public function __construct() {
+ /** @var GrantsLocalization */
+ private $grantsLocalization;
+
+ /**
+ * @param GrantsLocalization $grantsLocalization
+ */
+ public function __construct( GrantsLocalization $grantsLocalization ) {
parent::__construct( 'OAuthListConsumers' );
+ $this->grantsLocalization = $grantsLocalization;
}
public function execute( $par ) {
@@ -47,9 +55,9 @@ class SpecialMWOAuthListConsumers extends \SpecialPage {
$this->addHelpLink( 'Help:OAuth' );
// Format is Special:OAuthListConsumers[/list|/view/[<consumer key>]]
- $navigation = explode( '/', $par );
+ $navigation = $par !== null ? explode( '/', $par ) : [];
$type = $navigation[0] ?? null;
- $consumerKey = $navigation[1] ?? null;
+ $consumerKey = $navigation[1] ?? '';
$this->showConsumerListForm();
@@ -82,23 +90,23 @@ class SpecialMWOAuthListConsumers extends \SpecialPage {
$dbr = Utils::getCentralDB( DB_REPLICA );
$cmrAc = ConsumerAccessControl::wrap(
Consumer::newFromKey( $dbr, $consumerKey ), $this->getContext() );
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+
if ( !$cmrAc ) {
$out->addWikiMsg( 'mwoauth-invalid-consumer-key' );
return;
- } elseif ( $cmrAc->getDeleted() && !$user->isAllowed( 'mwoauthviewsuppressed' ) ) {
+ } elseif ( $cmrAc->getDeleted()
+ && !$permissionManager->userHasRight( $user, 'mwoauthviewsuppressed' ) ) {
throw new \PermissionsError( 'mwoauthviewsuppressed' );
}
$grants = $cmrAc->getGrants();
if ( $grants === [ 'mwoauth-authonly' ] || $grants === [ 'mwoauth-authonlyprivate' ] ) {
- $s = $this->msg( 'grant-' . $grants[0] )->plain() . "\n";
+ $s = $this->msg( 'grant-' . $grants[0] )->plain();
+ } elseif ( $grants === [ 'basic' ] ) {
+ $s = $this->msg( 'mwoauthlistconsumers-basicgrantsonly' )->plain();
} else {
- $s = \MWGrants::getGrantsWikiText( $grants, $this->getLanguage() );
- if ( $s == '' ) {
- $s = $this->msg( 'mwoauthlistconsumers-basicgrantsonly' )->plain();
- } else {
- $s .= "\n";
- }
+ $s = $this->grantsLocalization->getGrantsWikiText( $grants, $this->getLanguage() );
}
$stageKey = Consumer::$stageNames[$cmrAc->getDAO()->getStage()];
@@ -115,12 +123,9 @@ class SpecialMWOAuthListConsumers extends \SpecialPage {
'mwoauthlistconsumers-callbackurl' => $cmrAc->getCallbackUrl(),
'mwoauthlistconsumers-callbackisprefix' => $cmrAc->getCallbackIsPrefix() ?
$this->msg( 'htmlform-yes' ) : $this->msg( 'htmlform-no' ),
+ 'mwoauthlistconsumers-grants' => new HtmlSnippet( $out->parseInlineAsInterface( $s ) ),
];
- if ( $grants !== [ 'basic' ] ) {
- $data[ 'mwoauthlistconsumers-grants' ] = new HtmlSnippet( $out->parseInlineAsInterface( $s ) );
- }
-
$out->addHTML( UIUtils::generateInfoTable( $data, $this->getContext() ) );
$this->addNavigationSubtitle( $cmrAc );
@@ -180,8 +185,9 @@ class SpecialMWOAuthListConsumers extends \SpecialPage {
],
$this->getContext()
);
- $form->setAction( $this->getPageTitle()->getFullURL() ); // always go back to listings
- $form->setSubmitCallback( function () {
+ // always go back to listings
+ $form->setAction( $this->getPageTitle()->getFullURL() );
+ $form->setSubmitCallback( static function () {
return false;
} );
$form->setMethod( 'get' );
@@ -192,7 +198,6 @@ class SpecialMWOAuthListConsumers extends \SpecialPage {
/**
* Show a paged list of consumers with links to details
- * @suppress SecurityCheck-XSS For getNavigationBar, see T201811 for more information
*/
protected function showConsumerList() {
$request = $this->getRequest();
@@ -217,8 +222,8 @@ class SpecialMWOAuthListConsumers extends \SpecialPage {
$this->getOutput()->addWikiMsg( "mwoauthlistconsumers-none" );
}
# Every 30th view, prune old deleted items
- if ( 0 == mt_rand( 0, 29 ) ) {
- Utils::runAutoMaintenance( Utils::getCentralDB( DB_MASTER ) );
+ if ( mt_rand( 0, 29 ) == 0 ) {
+ Utils::runAutoMaintenance( Utils::getCentralDB( DB_PRIMARY ) );
}
}
@@ -230,26 +235,26 @@ class SpecialMWOAuthListConsumers extends \SpecialPage {
public function formatRow( DBConnRef $db, $row ) {
$cmrAc = ConsumerAccessControl::wrap(
Consumer::newFromRow( $db, $row ), $this->getContext() );
-
$cmrKey = $cmrAc->getConsumerKey();
$stageKey = Consumer::$stageNames[$cmrAc->getStage()];
+ $permMgr = MediaWikiServices::getInstance()->getPermissionManager();
$links = [];
- $links[] = \Linker::linkKnown(
+ $links[] = $this->getLinkRenderer()->makeKnownLink(
$this->getPageTitle( "view/{$cmrKey}" ),
- $this->msg( 'mwoauthlistconsumers-view' )->escaped(),
+ $this->msg( 'mwoauthlistconsumers-view' )->text(),
[],
- $this->getRequest()->getValues( 'name', 'publisher', 'stage' ) // stick
+ $this->getRequest()->getValues( 'name', 'publisher', 'stage' )
);
- if ( $this->getUser()->isAllowed( 'mwoauthmanageconsumer' ) ) {
- $links[] = \Linker::linkKnown(
- \SpecialPage::getTitleFor( 'OAuthManageConsumers', $cmrKey ),
- $this->msg( 'mwoauthmanageconsumers-review' )->escaped()
+ if ( $permMgr->userHasRight( $this->getUser(), 'mwoauthmanageconsumer' ) ) {
+ $links[] = $this->getLinkRenderer()->makeKnownLink(
+ SpecialPage::getTitleFor( 'OAuthManageConsumers', $cmrKey ),
+ $this->msg( 'mwoauthmanageconsumers-review' )->text()
);
}
$links = $this->getLanguage()->pipeList( $links );
- $encStageKey = htmlspecialchars( $stageKey ); // sanity
+ $encStageKey = htmlspecialchars( $stageKey );
$r = "<li class=\"mw-mwoauthlistconsumers-{$encStageKey}\">";
$name = $cmrAc->getNameAndVersion();
@@ -265,7 +270,7 @@ class SpecialMWOAuthListConsumers extends \SpecialPage {
),
'mwoauthlistconsumers-user' => $cmrAc->escapeForHtml( $cmrAc->getUserName() ),
'mwoauthlistconsumers-description' => $cmrAc->escapeForHtml(
- $cmrAc->get( 'description', function ( $s ) use ( $lang ) {
+ $cmrAc->get( 'description', static function ( $s ) use ( $lang ) {
return $lang->truncateForVisual( $s, 10024 );
} )
),
@@ -278,10 +283,12 @@ class SpecialMWOAuthListConsumers extends \SpecialPage {
$r .= '<p>' . $this->msg( $msg )->escaped() . ': ' . $encValue . '</p>';
}
- $rcUrl = SpecialPage::getTitleFor( 'Recentchanges' )
- ->getFullURL( [ 'tagfilter' => Utils::getTagName( $cmrAc->getId() ) ] );
- $rcLink = Html::element( 'a', [ 'href' => $rcUrl ],
- $this->msg( 'mwoauthlistconsumers-rclink' )->plain() );
+ $rcLink = $this->getLinkRenderer()->makeKnownLink(
+ SpecialPage::getTitleFor( 'Recentchanges' ),
+ $this->msg( 'mwoauthlistconsumers-rclink' )->plain(),
+ [],
+ [ 'tagfilter' => Utils::getTagName( $cmrAc->getId() ) ]
+ );
$r .= '<p>' . $rcLink . '</p>';
$r .= '</li>';
@@ -300,7 +307,7 @@ class SpecialMWOAuthListConsumers extends \SpecialPage {
private function addNavigationSubtitle( ConsumerAccessControl $cmrAc ): void {
$user = $this->getUser();
$centralUserId = Utils::getCentralIdFromLocalUser( $user );
- $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+ $linkRenderer = $this->getLinkRenderer();
$consumer = $cmrAc->getDAO();
$siteLinks = array_merge(
@@ -349,7 +356,9 @@ class SpecialMWOAuthListConsumers extends \SpecialPage {
private function manageConsumerLink(
Consumer $consumer, \User $user, \MediaWiki\Linker\LinkRenderer $linkRenderer
): array {
- if ( Utils::isCentralWiki() && $user->isAllowed( 'mwoauthmanageconsumer' ) ) {
+ $permMgr = MediaWikiServices::getInstance()->getPermissionManager();
+
+ if ( Utils::isCentralWiki() && $permMgr->userHasRight( $user, 'mwoauthmanageconsumer' ) ) {
return [
$linkRenderer->makeKnownLink( SpecialPage::getTitleFor( 'OAuthManageConsumers',
$consumer->getConsumerKey() ),
@@ -392,7 +401,7 @@ class SpecialMWOAuthListConsumers extends \SpecialPage {
$dbr = Utils::getCentralDB( DB_REPLICA );
$wikiSpecificGrant =
ConsumerAcceptance::newFromUserConsumerWiki(
- $dbr, $centralUserId, $consumer, wfWikiId() );
+ $dbr, $centralUserId, $consumer, WikiMap::getCurrentWikiId() );
$allWikiGrant = ConsumerAcceptance::newFromUserConsumerWiki(
$dbr, $centralUserId, $consumer, '*' );
diff --git a/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthManageConsumers.php b/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthManageConsumers.php
index 85083221..861473a2 100644
--- a/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthManageConsumers.php
+++ b/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthManageConsumers.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Frontend\SpecialPages;
+namespace MediaWiki\Extension\OAuth\Frontend\SpecialPages;
/**
* (c) Aaron Schulz 2013, GPL
@@ -21,13 +21,16 @@ namespace MediaWiki\Extensions\OAuth\Frontend\SpecialPages;
* http://www.gnu.org/copyleft/gpl.html
*/
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Control\ConsumerAccessControl;
-use MediaWiki\Extensions\OAuth\Control\ConsumerSubmitControl;
-use MediaWiki\Extensions\OAuth\Entity\ClientEntity;
-use MediaWiki\Extensions\OAuth\Frontend\Pagers\ManageConsumersPager;
-use MediaWiki\Extensions\OAuth\Frontend\UIUtils;
+use Html;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Control\ConsumerAccessControl;
+use MediaWiki\Extension\OAuth\Control\ConsumerSubmitControl;
+use MediaWiki\Extension\OAuth\Entity\ClientEntity;
+use MediaWiki\Extension\OAuth\Frontend\Pagers\ManageConsumersPager;
+use MediaWiki\Extension\OAuth\Frontend\UIUtils;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Permissions\GrantsLocalization;
use OOUI\HtmlSnippet;
use Wikimedia\Rdbms\DBConnRef;
@@ -55,8 +58,15 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
public static $listStages = [ Consumer::STAGE_APPROVED,
Consumer::STAGE_DISABLED ];
- public function __construct() {
+ /** @var GrantsLocalization */
+ private $grantsLocalization;
+
+ /**
+ * @param GrantsLocalization $grantsLocalization
+ */
+ public function __construct( GrantsLocalization $grantsLocalization ) {
parent::__construct( 'OAuthManageConsumers', 'mwoauthmanageconsumer' );
+ $this->grantsLocalization = $grantsLocalization;
}
public function doesWrites() {
@@ -64,36 +74,34 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
}
public function execute( $par ) {
- global $wgMWOAuthReadOnly;
-
$user = $this->getUser();
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
$this->setHeaders();
$this->getOutput()->disallowUserJs();
$this->addHelpLink( 'Help:OAuth' );
- if ( !$user->isLoggedIn() ) {
+ if ( !$user->isRegistered() ) {
$this->getOutput()->addWikiMsg( 'mwoauthmanageconsumers-notloggedin' );
return;
- } elseif ( !$user->isAllowed( 'mwoauthmanageconsumer' ) ) {
+ } elseif ( !$permissionManager->userHasRight( $user, 'mwoauthmanageconsumer' ) ) {
throw new \PermissionsError( 'mwoauthmanageconsumer' );
}
- if ( $wgMWOAuthReadOnly ) {
+ if ( $this->getConfig()->get( 'MWOAuthReadOnly' ) ) {
throw new \ErrorPageError( 'mwoauth-error', 'mwoauth-db-readonly' );
}
// Format is Special:OAuthManageConsumers[/<stage>|/<consumer key>]
// B/C format is Special:OAuthManageConsumers/<stage>/<consumer key>
$consumerKey = null;
- $navigation = explode( '/', $par );
+ $navigation = $par !== null ? explode( '/', $par ) : [];
if ( count( $navigation ) === 2 ) {
$this->stage = false;
$consumerKey = $navigation[1];
} elseif ( count( $navigation ) === 1 && $navigation[0] ) {
$this->stage = array_search( $navigation[0], Consumer::$stageNames, true );
if ( $this->stage !== false ) {
- $consumerKey = null;
$this->stageKey = $navigation[0];
} else {
$consumerKey = $navigation[0];
@@ -117,37 +125,39 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
* Show other sub-queue links. Grey out the current one.
* When viewing a request, show them all and a link to current consumer view.
*
- * @param string $consumerKey
+ * @param string|null $consumerKey
* @return void
*/
protected function addQueueSubtitleLinks( $consumerKey ) {
+ $linkRenderer = $this->getLinkRenderer();
$listLinks = [];
foreach ( self::$queueStages as $stage ) {
$stageKey = Consumer::$stageNames[$stage];
if ( $consumerKey || $this->stageKey !== $stageKey ) {
- $listLinks[] = \Linker::linkKnown(
+ $listLinks[] = $linkRenderer->makeKnownLink(
$this->getPageTitle( $stageKey ),
// Messages: mwoauthmanageconsumers-showproposed,
// mwoauthmanageconsumers-showrejected, mwoauthmanageconsumers-showexpired,
- $this->msg( 'mwoauthmanageconsumers-show' . $stageKey )->escaped() );
+ $this->msg( 'mwoauthmanageconsumers-show' . $stageKey )->text()
+ );
} else {
$listLinks[] = $this->msg( 'mwoauthmanageconsumers-show' . $stageKey )->escaped();
}
}
if ( $consumerKey ) {
- $consumerViewLink = "[" . \Linker::linkKnown(
+ $consumerViewLink = "[" . $linkRenderer->makeKnownLink(
\SpecialPage::getTitleFor( 'OAuthListConsumers', "view/$consumerKey" ),
- $this->msg( 'mwoauthconsumer-consumer-view' )->escaped() ) . "]";
+ $this->msg( 'mwoauthconsumer-consumer-view' )->text() ) . "]";
} else {
$consumerViewLink = '';
}
$linkHtml = $this->getLanguage()->pipeList( $listLinks );
- $viewall = $this->msg( 'parentheses' )->rawParams( \Linker::linkKnown(
+ $viewall = $this->msg( 'parentheses' )->rawParams( $linkRenderer->makeKnownLink(
$this->getPageTitle(),
- $this->msg( 'mwoauthmanageconsumers-main' )->escaped()
+ $this->msg( 'mwoauthmanageconsumers-main' )->text()
) )->escaped();
$this->getOutput()->setSubtitle(
@@ -167,6 +177,7 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
$keyStageMapL = array_intersect( array_flip( Consumer::$stageNames ),
self::$listStages );
+ $linkRenderer = $this->getLinkRenderer();
$out = $this->getOutput();
$out->addWikiMsg( 'mwoauthmanageconsumers-maintext' );
@@ -180,11 +191,11 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
$out->addHTML(
'<li>' .
"<$tag>" .
- \Linker::linkKnown(
+ $linkRenderer->makeKnownLink(
$this->getPageTitle( $stageKey ),
// Messages: mwoauthmanageconsumers-q-proposed, mwoauthmanageconsumers-q-rejected,
// mwoauthmanageconsumers-q-expired
- $this->msg( 'mwoauthmanageconsumers-q-' . $stageKey )->escaped()
+ $this->msg( 'mwoauthmanageconsumers-q-' . $stageKey )->text()
) .
"</$tag> [$counts[$stage]]" .
'</li>'
@@ -197,10 +208,10 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
foreach ( $keyStageMapL as $stageKey => $stage ) {
$out->addHTML(
'<li>' .
- \Linker::linkKnown(
+ $linkRenderer->makeKnownLink(
$this->getPageTitle( $stageKey ),
// Messages: mwoauthmanageconsumers-l-approved, mwoauthmanageconsumers-l-disabled
- $this->msg( 'mwoauthmanageconsumers-l-' . $stageKey )->escaped()
+ $this->msg( 'mwoauthmanageconsumers-l-' . $stageKey )->text()
) .
" [$counts[$stage]]" .
'</li>'
@@ -220,10 +231,13 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
$dbr = Utils::getCentralDB( DB_REPLICA );
$cmrAc = ConsumerAccessControl::wrap(
Consumer::newFromKey( $dbr, $consumerKey ), $this->getContext() );
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+
if ( !$cmrAc ) {
$this->getOutput()->addWikiMsg( 'mwoauth-invalid-consumer-key' );
return;
- } elseif ( $cmrAc->getDeleted() && !$user->isAllowed( 'mwoauthviewsuppressed' ) ) {
+ } elseif ( $cmrAc->getDeleted()
+ && !$permissionManager->userHasRight( $user, 'mwoauthviewsuppressed' ) ) {
throw new \PermissionsError( 'mwoauthviewsuppressed' );
}
$startingStage = $cmrAc->getStage();
@@ -235,7 +249,7 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
$this->msg( 'mwoauthmanageconsumers-approve' )->escaped() => 'approve',
$this->msg( 'mwoauthmanageconsumers-reject' )->escaped() => 'reject'
];
- if ( $this->getUser()->isAllowed( 'mwoauthsuppress' ) ) {
+ if ( $permissionManager->userHasRight( $this->getUser(), 'mwoauthsuppress' ) ) {
$msg = $this->msg( 'mwoauthmanageconsumers-rsuppress' )->escaped();
$opts["<strong>$msg</strong>"] = 'rsuppress';
}
@@ -244,13 +258,13 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
$this->msg( 'mwoauthmanageconsumers-disable' )->escaped() => 'disable',
$this->msg( 'mwoauthmanageconsumers-reenable' )->escaped() => 'reenable'
];
- if ( $this->getUser()->isAllowed( 'mwoauthsuppress' ) ) {
+ if ( $permissionManager->userHasRight( $this->getUser(), 'mwoauthsuppress' ) ) {
$msg = $this->msg( 'mwoauthmanageconsumers-dsuppress' )->escaped();
$opts["<strong>$msg</strong>"] = 'dsuppress';
}
}
- $dbw = Utils::getCentralDB( DB_MASTER ); // @TODO: lazy handle
+ $dbw = Utils::getCentralDB( DB_PRIMARY );
$control = new ConsumerSubmitControl( $this->getContext(), [], $dbw );
$form = \HTMLForm::factory( 'ooui',
$control->registerValidators( [
@@ -267,7 +281,8 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
'label-message' => 'mwoauthmanageconsumers-action',
'required' => true,
'options' => $opts,
- 'default' => '', // no validate on GET
+ // no validate on GET
+ 'default' => '',
],
'reason' => [
'type' => 'text',
@@ -286,7 +301,7 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
$this->getContext()
);
$form->setSubmitCallback(
- function ( array $data, \IContextSource $context ) use ( $control ) {
+ static function ( array $data, \IContextSource $context ) use ( $control ) {
$data['suppress'] = 0;
if ( $data['action'] === 'dsuppress' ) {
$data = [ 'action' => 'disable', 'suppress' => 1 ] + $data;
@@ -343,9 +358,9 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
$owner = $cmrAc->getUserName();
$lang = $this->getLanguage();
- $link = \Linker::linkKnown(
+ $link = $this->getLinkRenderer()->makeKnownLink(
$title = \SpecialPage::getTitleFor( 'OAuthListConsumers' ),
- $this->msg( 'mwoauthmanageconsumers-search-publisher' )->escaped(),
+ $this->msg( 'mwoauthmanageconsumers-search-publisher' )->text(),
[],
[ 'publisher' => $owner ]
);
@@ -364,9 +379,9 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
Consumer::$stageNames[$cmrAc->getStage()] ),
'mwoauth-consumer-key' => $cmrAc->getConsumerKey(),
'mwoauth-consumer-name' => new HtmlSnippet( $cmrAc->get( 'name', function ( $s ) {
- $link = \Linker::linkKnown(
+ $link = $this->getLinkRenderer()->makeKnownLink(
\SpecialPage::getTitleFor( 'OAuthListConsumers' ),
- $this->msg( 'mwoauthmanageconsumers-search-name' )->escaped(),
+ $this->msg( 'mwoauthmanageconsumers-search-name' )->text(),
[],
[ 'name' => $s ]
);
@@ -382,13 +397,13 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
'mwoauth-consumer-owner-only-label' => $ownerOnly ?
$this->msg( 'mwoauth-consumer-owner-only', $owner ) : null,
'mwoauth-consumer-callbackurl' => $ownerOnly ?
- null : $cmrAc->getCallbackUrl(),
+ null : $this->formatCallbackUrl( $cmrAc ),
'mwoauth-consumer-callbackisprefix' => $ownerOnly ?
null : ( $cmrAc->getCallbackIsPrefix() ?
$this->msg( 'htmlform-yes' ) : $this->msg( 'htmlform-no' ) ),
'mwoauth-consumer-grantsneeded' => $cmrAc->get( 'grants',
function ( $grants ) use ( $lang ) {
- return $lang->semicolonList( \MWGrants::grantNames( $grants, $lang ) );
+ return $lang->semicolonList( $this->grantsLocalization->getGrantDescriptions( $grants, $lang ) );
} ),
'mwoauth-consumer-email' => $cmrAc->getEmail(),
'mwoauth-consumer-wiki' => $cmrAc->getWiki()
@@ -423,6 +438,25 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
}
/**
+ * Format a callback URL. Usually this doesn't do anything nontrivial, but it adds a warning
+ * to callback URLs with a special meaning.
+ * @param ConsumerAccessControl $cmrAc
+ * @return HtmlSnippet|string Formatted callback URL, as a plaintext or HTML string
+ */
+ protected function formatCallbackUrl( ConsumerAccessControl $cmrAc ) {
+ $url = $cmrAc->getCallbackUrl();
+ if ( $cmrAc->getDAO()->getCallbackIsPrefix() ) {
+ $urlParts = wfParseUrl( $cmrAc->getDAO()->getCallbackUrl() );
+ if ( ( $urlParts['port'] ?? null ) === 1 ) {
+ $warning = Html::element( 'span', [ 'class' => 'warning' ],
+ $this->msg( 'mwoauth-consumer-callbackurl-warning' )->text() );
+ $url = new HtmlSnippet( $url . ' ' . $warning );
+ }
+ }
+ return $url;
+ }
+
+ /**
* Show a paged list of consumers with links to details
*/
protected function showConsumerList() {
@@ -438,8 +472,8 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
$this->getOutput()->addWikiMsg( "mwoauthmanageconsumers-none-{$this->stageKey}" );
}
# Every 30th view, prune old deleted items
- if ( 0 == mt_rand( 0, 29 ) ) {
- Utils::runAutoMaintenance( Utils::getCentralDB( DB_MASTER ) );
+ if ( mt_rand( 0, 29 ) == 0 ) {
+ Utils::runAutoMaintenance( Utils::getCentralDB( DB_PRIMARY ) );
}
}
@@ -455,15 +489,15 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
$cmrKey = $cmrAc->getConsumerKey();
$stageKey = Consumer::$stageNames[$cmrAc->getStage()];
- $link = \Linker::linkKnown(
+ $link = $this->getLinkRenderer()->makeKnownLink(
$this->getPageTitle( $cmrKey ),
- $this->msg( 'mwoauthmanageconsumers-review' )->escaped()
+ $this->msg( 'mwoauthmanageconsumers-review' )->text()
);
$time = $this->getLanguage()->timeanddate(
wfTimestamp( TS_MW, $cmrAc->getRegistration() ), true );
- $encStageKey = htmlspecialchars( $stageKey ); // sanity
+ $encStageKey = htmlspecialchars( $stageKey );
$r = "<li class='mw-mwoauthmanageconsumers-{$encStageKey}'>";
$r .= $time . " (<strong>{$link}</strong>)";
@@ -491,7 +525,7 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
$this->msg( 'mwoauth-oauth-version-1' )
),
'mwoauthmanageconsumers-description' => $cmrAc->escapeForHtml(
- $cmrAc->get( 'description', function ( $s ) use ( $lang ) {
+ $cmrAc->get( 'description', static function ( $s ) use ( $lang ) {
return $lang->truncateForVisual( $s, 10024 );
} )
),
@@ -518,4 +552,5 @@ class SpecialMWOAuthManageConsumers extends \SpecialPage {
protected function getGroupName() {
return 'users';
}
+
}
diff --git a/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthManageMyGrants.php b/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthManageMyGrants.php
index 62def2e3..5a41b9c7 100644
--- a/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthManageMyGrants.php
+++ b/OAuth/src/Frontend/SpecialPages/SpecialMWOAuthManageMyGrants.php
@@ -1,16 +1,18 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Frontend\SpecialPages;
-
-use Html;
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\ConsumerAcceptance;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Control\ConsumerAcceptanceAccessControl;
-use MediaWiki\Extensions\OAuth\Control\ConsumerAcceptanceSubmitControl;
-use MediaWiki\Extensions\OAuth\Control\ConsumerAccessControl;
-use MediaWiki\Extensions\OAuth\Frontend\Pagers\ManageMyGrantsPager;
-use MediaWiki\Extensions\OAuth\Frontend\UIUtils;
+namespace MediaWiki\Extension\OAuth\Frontend\SpecialPages;
+
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\ConsumerAcceptance;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Control\ConsumerAcceptanceAccessControl;
+use MediaWiki\Extension\OAuth\Control\ConsumerAcceptanceSubmitControl;
+use MediaWiki\Extension\OAuth\Control\ConsumerAccessControl;
+use MediaWiki\Extension\OAuth\Frontend\Pagers\ManageMyGrantsPager;
+use MediaWiki\Extension\OAuth\Frontend\UIUtils;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Permissions\GrantsInfo;
+use MediaWiki\Permissions\GrantsLocalization;
use SpecialPage;
use Wikimedia\Rdbms\DBConnRef;
@@ -38,10 +40,26 @@ use Wikimedia\Rdbms\DBConnRef;
* for manage the specific grants given or revoking access for the consumer
*/
class SpecialMWOAuthManageMyGrants extends SpecialPage {
+ /** @var string[]|null */
private static $irrevocableGrants = null;
- public function __construct() {
+ /** @var GrantsInfo */
+ private $grantsInfo;
+
+ /** @var GrantsLocalization */
+ private $grantsLocalization;
+
+ /**
+ * @param GrantsInfo $grantsInfo
+ * @param GrantsLocalization $grantsLocalization
+ */
+ public function __construct(
+ GrantsInfo $grantsInfo,
+ GrantsLocalization $grantsLocalization
+ ) {
parent::__construct( 'OAuthManageMyGrants', 'mwoauthmanagemygrants' );
+ $this->grantsInfo = $grantsInfo;
+ $this->grantsLocalization = $grantsLocalization;
}
public function doesWrites() {
@@ -49,34 +67,35 @@ class SpecialMWOAuthManageMyGrants extends SpecialPage {
}
public function execute( $par ) {
- global $wgMWOAuthReadOnly;
-
$user = $this->getUser();
$this->setHeaders();
$this->getOutput()->disallowUserJs();
$this->addHelpLink( 'Help:OAuth' );
- if ( !$this->getUser()->isLoggedIn() ) {
+ if ( !$this->getUser()->isRegistered() ) {
throw new \UserNotLoggedIn();
}
- if ( !$user->isAllowed( 'mwoauthmanagemygrants' ) ) {
+
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+ if ( !$permissionManager->userHasRight( $user, 'mwoauthmanagemygrants' ) ) {
throw new \PermissionsError( 'mwoauthmanagemygrants' );
}
// Format is Special:OAuthManageMyGrants[/list|/manage/<accesstoken>]
- $navigation = explode( '/', $par );
+ $navigation = $par !== null ? explode( '/', $par ) : [];
$typeKey = $navigation[0] ?? null;
$acceptanceId = $navigation[1] ?? null;
- if ( $wgMWOAuthReadOnly && in_array( $typeKey, [ 'update', 'revoke' ] ) ) {
+ if ( $this->getConfig()->get( 'MWOAuthReadOnly' )
+ && in_array( $typeKey, [ 'update', 'revoke' ] ) ) {
throw new \ErrorPageError( 'mwoauth-error', 'mwoauth-db-readonly' );
}
switch ( $typeKey ) {
case 'update':
case 'revoke':
- $this->handleConsumerForm( $acceptanceId, $typeKey );
+ $this->handleConsumerForm( $acceptanceId ?? 0, $typeKey );
break;
default:
$this->showConsumerList();
@@ -99,17 +118,19 @@ class SpecialMWOAuthManageMyGrants extends SpecialPage {
if ( $acceptanceId ) {
$dbr = Utils::getCentralDB( DB_REPLICA );
- $cmraAc = ConsumerAcceptance::newFromId( $dbr, $acceptanceId );
- $listLinks[] = \Linker::linkKnown(
+ $cmraAc = ConsumerAcceptance::newFromId( $dbr, (int)$acceptanceId );
+ $listLinks[] = $this->getLinkRenderer()->makeKnownLink(
$this->getPageTitle(),
- $this->msg( 'mwoauthmanagemygrants-showlist' )->escaped() );
+ $this->msg( 'mwoauthmanagemygrants-showlist' )->text()
+ );
if ( $cmraAc ) {
$cmrAc = Consumer::newFromId( $dbr, $cmraAc->getConsumerId() );
$consumerKey = $cmrAc->getConsumerKey();
- $listLinks[] = \Linker::linkKnown(
- \SpecialPage::getTitleFor( 'OAuthListConsumers', "view/$consumerKey" ),
- $this->msg( 'mwoauthconsumer-application-view' )->escaped() );
+ $listLinks[] = $this->getLinkRenderer()->makeKnownLink(
+ SpecialPage::getTitleFor( 'OAuthListConsumers', "view/$consumerKey" ),
+ $this->msg( 'mwoauthconsumer-application-view' )->text()
+ );
}
} else {
$listLinks[] = $this->msg( 'mwoauthmanagemygrants-showlist' )->escaped();
@@ -125,14 +146,14 @@ class SpecialMWOAuthManageMyGrants extends SpecialPage {
/**
* Show the form to approve/reject/disable/re-enable consumers
*
- * @param string $acceptanceId
+ * @param int $acceptanceId
* @param string $type One of (update,revoke)
* @throws \PermissionsError
*/
protected function handleConsumerForm( $acceptanceId, $type ) {
$user = $this->getUser();
- $lang = $this->getLanguage();
$dbr = Utils::getCentralDB( DB_REPLICA );
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
$centralUserId = Utils::getCentralIdFromLocalUser( $user );
if ( !$centralUserId ) {
@@ -149,7 +170,8 @@ class SpecialMWOAuthManageMyGrants extends SpecialPage {
$cmrAc = ConsumerAccessControl::wrap(
Consumer::newFromId( $dbr, $cmraAc->getConsumerId() ), $this->getContext() );
- if ( $cmrAc->getDeleted() && !$user->isAllowed( 'mwoauthviewsuppressed' ) ) {
+ if ( $cmrAc->getDeleted()
+ && !$permissionManager->userHasRight( $user, 'mwoauthviewsuppressed' ) ) {
throw new \PermissionsError( 'mwoauthviewsuppressed' );
}
@@ -185,32 +207,32 @@ class SpecialMWOAuthManageMyGrants extends SpecialPage {
$this->msg( 'mwoauthmanagemygrants-grantaccept' )->escaped() => 'grant'
],
'rows' => array_combine(
- array_map( 'MWGrants::getGrantsLink', $cmrAc->getGrants() ),
+ array_map( [ $this->grantsLocalization, 'getGrantsLink' ], $cmrAc->getGrants() ),
$cmrAc->getGrants()
),
'default' => array_map(
- function ( $g ) {
+ static function ( $g ) {
return "grant-$g";
},
$cmraAc->getGrants()
),
'tooltips' => [
- \MWGrants::getGrantsLink( 'basic' ) =>
+ $this->grantsLocalization->getGrantsLink( 'basic' ) =>
$this->msg( 'mwoauthmanagemygrants-basic-tooltip' )->text(),
- \MWGrants::getGrantsLink( 'mwoauth-authonly' ) =>
+ $this->grantsLocalization->getGrantsLink( 'mwoauth-authonly' ) =>
$this->msg( 'mwoauthmanagemygrants-authonly-tooltip' )->text(),
- \MWGrants::getGrantsLink( 'mwoauth-authonlyprivate' ) =>
+ $this->grantsLocalization->getGrantsLink( 'mwoauth-authonlyprivate' ) =>
$this->msg( 'mwoauthmanagemygrants-authonly-tooltip' )->text(),
],
'force-options-on' => array_map(
- function ( $g ) {
+ static function ( $g ) {
return "grant-$g";
},
( $type === 'revoke' )
- ? array_merge( \MWGrants::getValidGrants(), self::irrevocableGrants() )
+ ? array_merge( $this->grantsInfo->getValidGrants(), self::irrevocableGrants() )
: self::irrevocableGrants()
),
- 'validation-callback' => null // different format
+ 'validation-callback' => null
],
'acceptanceId' => [
'type' => 'hidden',
@@ -220,12 +242,14 @@ class SpecialMWOAuthManageMyGrants extends SpecialPage {
$this->getContext()
);
$form->setSubmitCallback(
- function ( array $data, \IContextSource $context ) use ( $action, $cmraAc ) {
+ static function ( array $data, \IContextSource $context ) use ( $action, $cmraAc ) {
$data['action'] = $action;
- $data['grants'] = \FormatJson::encode( // adapt form to controller
- preg_replace( '/^grant-/', '', $data['grants'] ) );
+ // adapt form to controller
+ $data['grants'] = \FormatJson::encode(
+ preg_replace( '/^grant-/', '', $data['grants'] )
+ );
- $dbw = Utils::getCentralDB( DB_MASTER );
+ $dbw = Utils::getCentralDB( DB_PRIMARY );
$control = new ConsumerAcceptanceSubmitControl(
$context, $data, $dbw, $cmraAc->getDAO()->getOAuthVersion()
);
@@ -288,16 +312,18 @@ class SpecialMWOAuthManageMyGrants extends SpecialPage {
$cmraAc = ConsumerAcceptanceAccessControl::wrap(
ConsumerAcceptance::newFromRow( $db, $row ), $this->getContext() );
+ $linkRenderer = $this->getLinkRenderer();
+
$links = [];
if ( array_diff( $cmrAc->getGrants(), self::irrevocableGrants() ) ) {
- $links[] = \Linker::linkKnown(
+ $links[] = $linkRenderer->makeKnownLink(
$this->getPageTitle( 'update/' . $cmraAc->getId() ),
- $this->msg( 'mwoauthmanagemygrants-review' )->escaped()
+ $this->msg( 'mwoauthmanagemygrants-review' )->text()
);
}
- $links[] = \Linker::linkKnown(
+ $links[] = $linkRenderer->makeKnownLink(
$this->getPageTitle( 'revoke/' . $cmraAc->getId() ),
- $this->msg( 'mwoauthmanagemygrants-revoke' )->escaped()
+ $this->msg( 'mwoauthmanagemygrants-revoke' )->text()
);
$reviewLinks = $this->getLanguage()->pipeList( $links );
@@ -314,17 +340,22 @@ class SpecialMWOAuthManageMyGrants extends SpecialPage {
$r .= '<p>' . $this->msg( $msg )->escaped() . ' ' . $cmrAc->escapeForHtml( $val ) . '</p>';
}
- $editsUrl = SpecialPage::getTitleFor( 'Contributions', $this->getUser()->getName() )
- ->getFullURL( [ 'tagfilter' => Utils::getTagName( $cmrAc->getId() ) ] );
- $editsLink = Html::element( 'a', [ 'href' => $editsUrl ],
- $this->msg( 'mwoauthmanagemygrants-editslink', $this->getUser() )->text() );
+ $editsLink = $linkRenderer->makeKnownLink(
+ SpecialPage::getTitleFor( 'Contributions', $this->getUser()->getName() ),
+ $this->msg( 'mwoauthmanagemygrants-editslink', $this->getUser()->getName() )->text(),
+ [],
+ [ 'tagfilter' => Utils::getTagName( $cmrAc->getId() ) ]
+ );
$r .= '<p>' . $editsLink . '</p>';
- $actionsUrl = SpecialPage::getTitleFor( 'Log' )->getFullURL( [
- 'user' => $this->getUser()->getName(),
- 'tagfilter' => Utils::getTagName( $cmrAc->getId() ),
- ] );
- $actionsLink = Html::element( 'a', [ 'href' => $actionsUrl ],
- $this->msg( 'mwoauthmanagemygrants-actionslink', $this->getUser() )->text() );
+ $actionsLink = $linkRenderer->makeKnownLink(
+ SpecialPage::getTitleFor( 'Log' ),
+ $this->msg( 'mwoauthmanagemygrants-actionslink', $this->getUser()->getName() )->text(),
+ [],
+ [
+ 'user' => $this->getUser()->getName(),
+ 'tagfilter' => Utils::getTagName( $cmrAc->getId() ),
+ ]
+ );
$r .= '<p>' . $actionsLink . '</p>';
$r .= '</li>';
@@ -335,7 +366,7 @@ class SpecialMWOAuthManageMyGrants extends SpecialPage {
private static function irrevocableGrants() {
if ( self::$irrevocableGrants === null ) {
self::$irrevocableGrants = array_merge(
- \MWGrants::getHiddenGrants(),
+ MediaWikiServices::getInstance()->getGrantsInfo()->getHiddenGrants(),
[ 'mwoauth-authonly', 'mwoauth-authonlyprivate' ]
);
}
diff --git a/OAuth/src/Frontend/UIHooks.php b/OAuth/src/Frontend/UIHooks.php
index 5d6b2602..abe98b89 100644
--- a/OAuth/src/Frontend/UIHooks.php
+++ b/OAuth/src/Frontend/UIHooks.php
@@ -1,14 +1,15 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Frontend;
+namespace MediaWiki\Extension\OAuth\Frontend;
use HTMLForm;
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Control\ConsumerAccessControl;
-use MediaWiki\Extensions\OAuth\Control\ConsumerSubmitControl;
-use MediaWiki\Extensions\OAuth\Frontend\SpecialPages\SpecialMWOAuthConsumerRegistration;
-use MediaWiki\Extensions\OAuth\Frontend\SpecialPages\SpecialMWOAuthManageConsumers;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Control\ConsumerAccessControl;
+use MediaWiki\Extension\OAuth\Control\ConsumerSubmitControl;
+use MediaWiki\Extension\OAuth\Frontend\SpecialPages\SpecialMWOAuthConsumerRegistration;
+use MediaWiki\Extension\OAuth\Frontend\SpecialPages\SpecialMWOAuthManageConsumers;
+use MediaWiki\MediaWikiServices;
use SpecialPage;
/**
@@ -28,7 +29,9 @@ class UIHooks {
'oaac_consumer_id = oarc_id',
'oaac_user_id' => Utils::getCentralIdFromLocalUser( $user ),
];
- if ( !$user->isAllowed( 'mwoauthviewsuppressed' ) ) {
+
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+ if ( !$permissionManager->userHasRight( $user, 'mwoauthviewsuppressed' ) ) {
$conds['oarc_deleted'] = 0;
}
$count = $dbr->selectField(
@@ -86,7 +89,7 @@ class UIHooks {
$dbr = Utils::getCentralDB( DB_REPLICA );
$cmrAc = ConsumerAccessControl::wrap(
- Consumer::newFromId( $dbr, $m[1] ), $context
+ Consumer::newFromId( $dbr, (int)$m[1] ), $context
);
if ( !$cmrAc ) {
// Invalid consumer, skip it
@@ -124,8 +127,8 @@ class UIHooks {
\Html::openElement( 'table',
[ 'class' => 'wikitable mw-listgrouprights-table' ] ) .
'<tr>' .
- \Html::element( 'th', null, $special->msg( 'listgrants-grant' )->text() ) .
- \Html::element( 'th', null, $special->msg( 'listgrants-rights' )->text() ) .
+ \Html::element( 'th', [], $special->msg( 'listgrants-grant' )->text() ) .
+ \Html::element( 'th', [], $special->msg( 'listgrants-rights' )->text() ) .
'</tr>'
);
@@ -136,7 +139,7 @@ class UIHooks {
foreach ( $grants as $grant => $rights ) {
$descs = [];
- $rights = array_filter( $rights ); // remove ones with 'false'
+ $rights = array_filter( $rights );
foreach ( $rights as $permission => $granted ) {
$descs[] = $special->msg(
'listgrouprights-right-display',
@@ -178,7 +181,8 @@ class UIHooks {
} else {
$url = \WikiMap::getForeignURL(
$wgMWOAuthCentralWiki,
- 'Special:OAuthConsumerRegistration' // Cross-wiki, so don't localize
+ // Cross-wiki, so don't localize
+ 'Special:OAuthConsumerRegistration'
);
}
$form->addPreText( $form->msg( 'mwoauth-botpasswords-note', $url )->parseAsBlock() );
@@ -224,8 +228,19 @@ class UIHooks {
*/
public static function onSpecialPage_initList( array &$specialPages ) {
if ( Utils::isCentralWiki() ) {
- $specialPages['OAuthConsumerRegistration'] = SpecialMWOAuthConsumerRegistration::class;
- $specialPages['OAuthManageConsumers'] = SpecialMWOAuthManageConsumers::class;
+ $specialPages['OAuthConsumerRegistration'] = [
+ 'class' => SpecialMWOAuthConsumerRegistration::class,
+ 'services' => [
+ 'GrantsInfo',
+ 'GrantsLocalization',
+ ],
+ ];
+ $specialPages['OAuthManageConsumers'] = [
+ 'class' => SpecialMWOAuthManageConsumers::class,
+ 'services' => [
+ 'GrantsLocalization',
+ ],
+ ];
}
}
diff --git a/OAuth/src/Frontend/UIUtils.php b/OAuth/src/Frontend/UIUtils.php
index 58387d14..29369a76 100644
--- a/OAuth/src/Frontend/UIUtils.php
+++ b/OAuth/src/Frontend/UIUtils.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Frontend;
+namespace MediaWiki\Extension\OAuth\Frontend;
use IContextSource;
use Message;
diff --git a/OAuth/src/HookRunner.php b/OAuth/src/HookRunner.php
new file mode 100644
index 00000000..3eea32de
--- /dev/null
+++ b/OAuth/src/HookRunner.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace MediaWiki\Extension\OAuth;
+
+use MediaWiki\Extension\OAuth\Entity\MWClientEntityInterface;
+use MediaWiki\Extension\OAuth\Repository\Hook\OAuthClaimStoreGetClaimsHook;
+use MediaWiki\HookContainer\HookContainer;
+
+class HookRunner implements OAuthClaimStoreGetClaimsHook {
+
+ /**
+ * @var HookContainer
+ */
+ private $hookContainer;
+
+ /**
+ * @param HookContainer $hookContainer
+ */
+ public function __construct( HookContainer $hookContainer ) {
+ $this->hookContainer = $hookContainer;
+ }
+
+ /**
+ * @param string $grantType
+ * @param MWClientEntityInterface $clientEntity
+ * @param array &$privateClaims
+ * @param string|null $userIdentifier
+ */
+ public function onOAuthClaimStoreGetClaims(
+ string $grantType, MWClientEntityInterface $clientEntity, array &$privateClaims, $userIdentifier = null
+ ) {
+ $this->hookContainer->run(
+ 'OAuthClaimStoreGetClaims',
+ [ $grantType, $clientEntity, &$privateClaims, $userIdentifier ]
+ );
+ }
+}
diff --git a/OAuth/src/Lib/OAuthConsumer.php b/OAuth/src/Lib/OAuthConsumer.php
index a0c348fa..37a79ad2 100644
--- a/OAuth/src/Lib/OAuthConsumer.php
+++ b/OAuth/src/Lib/OAuthConsumer.php
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-namespace MediaWiki\Extensions\OAuth\Lib;
+namespace MediaWiki\Extension\OAuth\Lib;
class OAuthConsumer {
public $key;
diff --git a/OAuth/src/Lib/OAuthDataStore.php b/OAuth/src/Lib/OAuthDataStore.php
index b34d1b3b..c43af462 100644
--- a/OAuth/src/Lib/OAuthDataStore.php
+++ b/OAuth/src/Lib/OAuthDataStore.php
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-namespace MediaWiki\Extensions\OAuth\Lib;
+namespace MediaWiki\Extension\OAuth\Lib;
class OAuthDataStore {
function lookup_consumer( $consumer_key ) {
diff --git a/OAuth/src/Lib/OAuthException.php b/OAuth/src/Lib/OAuthException.php
index bac7b119..91caa396 100644
--- a/OAuth/src/Lib/OAuthException.php
+++ b/OAuth/src/Lib/OAuthException.php
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-namespace MediaWiki\Extensions\OAuth\Lib;
+namespace MediaWiki\Extension\OAuth\Lib;
/**
* Generic exception class
diff --git a/OAuth/src/Lib/OAuthRequest.php b/OAuth/src/Lib/OAuthRequest.php
index 5b5050ae..82534bd6 100644
--- a/OAuth/src/Lib/OAuthRequest.php
+++ b/OAuth/src/Lib/OAuthRequest.php
@@ -24,10 +24,10 @@
* THE SOFTWARE.
*/
-namespace MediaWiki\Extensions\OAuth\Lib;
+namespace MediaWiki\Extension\OAuth\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthException;
-use MediaWiki\Extensions\OAuth\Lib\OAuthUtil;
+use MediaWiki\Extension\OAuth\Lib\OAuthException;
+use MediaWiki\Extension\OAuth\Lib\OAuthUtil;
use MediaWiki\Logger\LoggerFactory;
class OAuthRequest {
diff --git a/OAuth/src/Lib/OAuthServer.php b/OAuth/src/Lib/OAuthServer.php
index 49d2aac6..72f295aa 100644
--- a/OAuth/src/Lib/OAuthServer.php
+++ b/OAuth/src/Lib/OAuthServer.php
@@ -24,11 +24,11 @@
* THE SOFTWARE.
*/
-namespace MediaWiki\Extensions\OAuth\Lib;
+namespace MediaWiki\Extension\OAuth\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthDataStore;
-use MediaWiki\Extensions\OAuth\Lib\OAuthException;
-use MediaWiki\Extensions\OAuth\Lib\OAuthRequest;
+use MediaWiki\Extension\OAuth\Lib\OAuthDataStore;
+use MediaWiki\Extension\OAuth\Lib\OAuthException;
+use MediaWiki\Extension\OAuth\Lib\OAuthRequest;
use MediaWiki\Logger\LoggerFactory;
class OAuthServer {
diff --git a/OAuth/src/Lib/OAuthSignatureMethod.php b/OAuth/src/Lib/OAuthSignatureMethod.php
index e417eff3..5262f084 100644
--- a/OAuth/src/Lib/OAuthSignatureMethod.php
+++ b/OAuth/src/Lib/OAuthSignatureMethod.php
@@ -24,11 +24,11 @@
* THE SOFTWARE.
*/
-namespace MediaWiki\Extensions\OAuth\Lib;
+namespace MediaWiki\Extension\OAuth\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthConsumer;
-use MediaWiki\Extensions\OAuth\Lib\OAuthRequest;
-use MediaWiki\Extensions\OAuth\Lib\OAuthToken;
+use MediaWiki\Extension\OAuth\Lib\OAuthConsumer;
+use MediaWiki\Extension\OAuth\Lib\OAuthRequest;
+use MediaWiki\Extension\OAuth\Lib\OAuthToken;
use MediaWiki\Logger\LoggerFactory;
/**
diff --git a/OAuth/src/Lib/OAuthSignatureMethod_HMAC_SHA1.php b/OAuth/src/Lib/OAuthSignatureMethod_HMAC_SHA1.php
index b4d00dae..f406bf79 100644
--- a/OAuth/src/Lib/OAuthSignatureMethod_HMAC_SHA1.php
+++ b/OAuth/src/Lib/OAuthSignatureMethod_HMAC_SHA1.php
@@ -24,10 +24,10 @@
* THE SOFTWARE.
*/
-namespace MediaWiki\Extensions\OAuth\Lib;
+namespace MediaWiki\Extension\OAuth\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthSignatureMethod;
-use MediaWiki\Extensions\OAuth\Lib\OAuthUtil;
+use MediaWiki\Extension\OAuth\Lib\OAuthSignatureMethod;
+use MediaWiki\Extension\OAuth\Lib\OAuthUtil;
/**
* The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104]
diff --git a/OAuth/src/Lib/OAuthSignatureMethod_PLAINTEXT.php b/OAuth/src/Lib/OAuthSignatureMethod_PLAINTEXT.php
index 5e888439..bc3fbd9f 100644
--- a/OAuth/src/Lib/OAuthSignatureMethod_PLAINTEXT.php
+++ b/OAuth/src/Lib/OAuthSignatureMethod_PLAINTEXT.php
@@ -24,10 +24,10 @@
* THE SOFTWARE.
*/
-namespace MediaWiki\Extensions\OAuth\Lib;
+namespace MediaWiki\Extension\OAuth\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthSignatureMethod;
-use MediaWiki\Extensions\OAuth\Lib\OAuthUtil;
+use MediaWiki\Extension\OAuth\Lib\OAuthSignatureMethod;
+use MediaWiki\Extension\OAuth\Lib\OAuthUtil;
/**
* The PLAINTEXT method does not provide any security protection and SHOULD only be used
diff --git a/OAuth/src/Lib/OAuthSignatureMethod_RSA_SHA1.php b/OAuth/src/Lib/OAuthSignatureMethod_RSA_SHA1.php
index 3b442108..ed83ef70 100644
--- a/OAuth/src/Lib/OAuthSignatureMethod_RSA_SHA1.php
+++ b/OAuth/src/Lib/OAuthSignatureMethod_RSA_SHA1.php
@@ -24,9 +24,9 @@
* THE SOFTWARE.
*/
-namespace MediaWiki\Extensions\OAuth\Lib;
+namespace MediaWiki\Extension\OAuth\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthSignatureMethod;
+use MediaWiki\Extension\OAuth\Lib\OAuthSignatureMethod;
/**
* The RSA-SHA1 signature method uses the RSASSA-PKCS1-v1_5 signature algorithm as defined in
@@ -68,9 +68,6 @@ abstract class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod {
// Sign using the key
$ok = openssl_sign( $base_string, $signature, $privatekeyid );
- // Release the key resource
- openssl_free_key( $privatekeyid );
-
return base64_encode( $signature );
}
@@ -88,9 +85,6 @@ abstract class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod {
// Check the computed signature against the one passed in the query
$ok = openssl_verify( $base_string, $decoded_sig, $publickeyid );
- // Release the key resource
- openssl_free_key( $publickeyid );
-
return $ok == 1;
}
}
diff --git a/OAuth/src/Lib/OAuthToken.php b/OAuth/src/Lib/OAuthToken.php
index 669393aa..5cab9069 100644
--- a/OAuth/src/Lib/OAuthToken.php
+++ b/OAuth/src/Lib/OAuthToken.php
@@ -24,9 +24,9 @@
* THE SOFTWARE.
*/
-namespace MediaWiki\Extensions\OAuth\Lib;
+namespace MediaWiki\Extension\OAuth\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthUtil;
+use MediaWiki\Extension\OAuth\Lib\OAuthUtil;
class OAuthToken {
// access tokens and request tokens
diff --git a/OAuth/src/Lib/OAuthUtil.php b/OAuth/src/Lib/OAuthUtil.php
index 8dca8c06..cd75a840 100644
--- a/OAuth/src/Lib/OAuthUtil.php
+++ b/OAuth/src/Lib/OAuthUtil.php
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-namespace MediaWiki\Extensions\OAuth\Lib;
+namespace MediaWiki\Extension\OAuth\Lib;
use MediaWiki\Logger\LoggerFactory;
diff --git a/OAuth/src/Repository/AccessTokenRepository.php b/OAuth/src/Repository/AccessTokenRepository.php
index 28a7fcc6..0cfee595 100644
--- a/OAuth/src/Repository/AccessTokenRepository.php
+++ b/OAuth/src/Repository/AccessTokenRepository.php
@@ -1,20 +1,40 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Repository;
+namespace MediaWiki\Extension\OAuth\Repository;
use League\OAuth2\Server\Entities\AccessTokenEntityInterface;
use League\OAuth2\Server\Entities\ClientEntityInterface;
use League\OAuth2\Server\Entities\ScopeEntityInterface;
+use League\OAuth2\Server\Exception\OAuthServerException;
use League\OAuth2\Server\Exception\UniqueTokenIdentifierConstraintViolationException;
use League\OAuth2\Server\Repositories\AccessTokenRepositoryInterface;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthException;
-use MediaWiki\Extensions\OAuth\Entity\AccessTokenEntity;
-use MediaWiki\Extensions\OAuth\Entity\ClientEntity;
+use MediaWiki\Extension\OAuth\Entity\AccessTokenEntity;
+use MediaWiki\Extension\OAuth\Entity\ClientEntity;
+use MediaWiki\MediaWikiServices;
class AccessTokenRepository extends DatabaseRepository implements AccessTokenRepositoryInterface {
- const FIELD_EXPIRES = 'oaat_expires';
- const FIELD_ACCEPTANCE_ID = 'oaat_acceptance_id';
- const FIELD_REVOKED = 'oaat_revoked';
+ private const FIELD_EXPIRES = 'oaat_expires';
+ private const FIELD_ACCEPTANCE_ID = 'oaat_acceptance_id';
+ private const FIELD_REVOKED = 'oaat_revoked';
+
+ /** @var string */
+ private $issuer;
+
+ /**
+ * @param string|null $issuer
+ */
+ public function __construct(
+ string $issuer = null
+ ) {
+ if ( !$issuer ) {
+ // TODO: When the extension is converted to proper use of DI,
+ // this needs to be always injected.
+ $issuer = MediaWikiServices::getInstance()
+ ->getMainConfig()
+ ->get( 'CanonicalServer' );
+ }
+ $this->issuer = $issuer;
+ }
/**
* Create a new access token
@@ -22,12 +42,13 @@ class AccessTokenRepository extends DatabaseRepository implements AccessTokenRep
* @param ClientEntityInterface|ClientEntity $clientEntity
* @param ScopeEntityInterface[] $scopes
* @param mixed|null $userIdentifier
- * @throws MWOAuthException
* @return AccessTokenEntityInterface
+ * @throws OAuthServerException
*/
public function getNewToken( ClientEntityInterface $clientEntity,
array $scopes, $userIdentifier = null ) {
- return new AccessTokenEntity( $clientEntity, $scopes, $userIdentifier );
+ return new AccessTokenEntity( $clientEntity, $scopes,
+ $this->issuer, $userIdentifier );
}
/**
@@ -44,7 +65,7 @@ class AccessTokenRepository extends DatabaseRepository implements AccessTokenRep
$data = $this->getDbDataFromTokenEntity( $accessTokenEntity );
- $this->getDB( DB_MASTER )->insert(
+ $this->getDB( DB_PRIMARY )->insert(
$this->getTableName(),
$data,
__METHOD__
@@ -58,7 +79,7 @@ class AccessTokenRepository extends DatabaseRepository implements AccessTokenRep
*/
public function revokeAccessToken( $tokenId ) {
if ( $this->identifierExists( $tokenId ) ) {
- $this->getDB( DB_MASTER )->update(
+ $this->getDB( DB_PRIMARY )->update(
$this->getTableName(),
[ static::FIELD_REVOKED => 1 ],
[ $this->getIdentifierField() => $tokenId ],
@@ -93,7 +114,7 @@ class AccessTokenRepository extends DatabaseRepository implements AccessTokenRep
* @param int $approvalId
*/
public function deleteForApprovalId( $approvalId ) {
- $this->getDB( DB_MASTER )->delete(
+ $this->getDB( DB_PRIMARY )->delete(
$this->getTableName(),
[
static::FIELD_ACCEPTANCE_ID => $approvalId
diff --git a/OAuth/src/Repository/AuthCodeRepository.php b/OAuth/src/Repository/AuthCodeRepository.php
index beb620b5..3bb48772 100644
--- a/OAuth/src/Repository/AuthCodeRepository.php
+++ b/OAuth/src/Repository/AuthCodeRepository.php
@@ -1,12 +1,12 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Repository;
+namespace MediaWiki\Extension\OAuth\Repository;
use InvalidArgumentException;
use League\OAuth2\Server\Entities\AuthCodeEntityInterface;
use League\OAuth2\Server\Exception\UniqueTokenIdentifierConstraintViolationException;
use League\OAuth2\Server\Repositories\AuthCodeRepositoryInterface;
-use MediaWiki\Extensions\OAuth\Entity\AuthCodeEntity;
+use MediaWiki\Extension\OAuth\Entity\AuthCodeEntity;
class AuthCodeRepository extends CacheRepository implements AuthCodeRepositoryInterface {
diff --git a/OAuth/src/Repository/CacheRepository.php b/OAuth/src/Repository/CacheRepository.php
index 825b38f7..9a2bc292 100644
--- a/OAuth/src/Repository/CacheRepository.php
+++ b/OAuth/src/Repository/CacheRepository.php
@@ -1,9 +1,9 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Repository;
+namespace MediaWiki\Extension\OAuth\Repository;
use BagOStuff;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Backend\Utils;
abstract class CacheRepository {
@@ -34,7 +34,7 @@ abstract class CacheRepository {
*
* @return string
*/
- abstract protected function getCacheKeyType() : string;
+ abstract protected function getCacheKeyType(): string;
/**
* Get the cache key based on unique identifier
diff --git a/OAuth/src/Repository/ClaimStore.php b/OAuth/src/Repository/ClaimStore.php
new file mode 100644
index 00000000..e972d164
--- /dev/null
+++ b/OAuth/src/Repository/ClaimStore.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace MediaWiki\Extension\OAuth\Repository;
+
+use League\OAuth2\Server\Entities\ClientEntityInterface;
+use League\OAuth2\Server\Repositories\ClaimRepositoryInterface;
+use LogicException;
+use MediaWiki\Extension\OAuth\Entity\MWClientEntityInterface;
+use MediaWiki\Extension\OAuth\HookRunner;
+use MediaWiki\MediaWikiServices;
+
+class ClaimStore implements ClaimRepositoryInterface {
+
+ /**
+ * @var HookRunner
+ */
+ private $hookRunner;
+
+ public function __construct() {
+ $hookContainer = MediaWikiServices::getInstance()->getHookContainer();
+ $this->hookRunner = new HookRunner( $hookContainer );
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getClaims(
+ string $grantType, ClientEntityInterface $clientEntity, $userIdentifier = null
+ ) {
+ if ( !( $clientEntity instanceof MWClientEntityInterface ) ) {
+ throw new LogicException( '$clientEntity must be instance of ' .
+ MWClientEntityInterface::class . ', got ' . get_class( $clientEntity ) . ' instead' );
+ }
+
+ $privateClaims = [];
+ $this->hookRunner->onOAuthClaimStoreGetClaims( $grantType, $clientEntity, $privateClaims );
+
+ return $privateClaims;
+ }
+}
diff --git a/OAuth/src/Repository/ClientRepository.php b/OAuth/src/Repository/ClientRepository.php
index 97b3efef..f743c969 100644
--- a/OAuth/src/Repository/ClientRepository.php
+++ b/OAuth/src/Repository/ClientRepository.php
@@ -1,11 +1,11 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Repository;
+namespace MediaWiki\Extension\OAuth\Repository;
use InvalidArgumentException;
use League\OAuth2\Server\Repositories\ClientRepositoryInterface;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Entity\ClientEntity;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Entity\ClientEntity;
class ClientRepository implements ClientRepositoryInterface {
diff --git a/OAuth/src/Repository/DatabaseRepository.php b/OAuth/src/Repository/DatabaseRepository.php
index 328008a1..40af2769 100644
--- a/OAuth/src/Repository/DatabaseRepository.php
+++ b/OAuth/src/Repository/DatabaseRepository.php
@@ -1,8 +1,8 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Repository;
+namespace MediaWiki\Extension\OAuth\Repository;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Backend\Utils;
use Wikimedia\Rdbms\DBConnRef;
abstract class DatabaseRepository {
@@ -30,7 +30,7 @@ abstract class DatabaseRepository {
) !== false;
}
- abstract protected function getTableName() : string;
+ abstract protected function getTableName(): string;
- abstract protected function getIdentifierField() : string;
+ abstract protected function getIdentifierField(): string;
}
diff --git a/OAuth/src/Repository/Hook/OAuthClaimStoreGetClaimsHook.php b/OAuth/src/Repository/Hook/OAuthClaimStoreGetClaimsHook.php
new file mode 100644
index 00000000..ed82f05e
--- /dev/null
+++ b/OAuth/src/Repository/Hook/OAuthClaimStoreGetClaimsHook.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace MediaWiki\Extension\OAuth\Repository\Hook;
+
+use MediaWiki\Extension\OAuth\Entity\MWClientEntityInterface;
+
+interface OAuthClaimStoreGetClaimsHook {
+
+ /**
+ * Use this hook to add a list of private claims to a client's JWT
+ *
+ * @param string $grantType Type of OAuth grant
+ * @param MWClientEntityInterface $clientEntity Client that is making the request
+ * @param array &$privateClaims List of private claims to be added to the JWT
+ * @param string|null $userIdentifier Identifier for the user that is making the request, default is null
+ * @return void
+ */
+ public function onOAuthClaimStoreGetClaims(
+ string $grantType, MWClientEntityInterface $clientEntity, array &$privateClaims, $userIdentifier = null
+ );
+}
diff --git a/OAuth/src/Repository/RefreshTokenRepository.php b/OAuth/src/Repository/RefreshTokenRepository.php
index b6a9a350..6689c303 100644
--- a/OAuth/src/Repository/RefreshTokenRepository.php
+++ b/OAuth/src/Repository/RefreshTokenRepository.php
@@ -1,12 +1,12 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Repository;
+namespace MediaWiki\Extension\OAuth\Repository;
use InvalidArgumentException;
use League\OAuth2\Server\Entities\RefreshTokenEntityInterface;
use League\OAuth2\Server\Exception\UniqueTokenIdentifierConstraintViolationException;
use League\OAuth2\Server\Repositories\RefreshTokenRepositoryInterface;
-use MediaWiki\Extensions\OAuth\Entity\RefreshTokenEntity;
+use MediaWiki\Extension\OAuth\Entity\RefreshTokenEntity;
class RefreshTokenRepository extends CacheRepository implements RefreshTokenRepositoryInterface {
diff --git a/OAuth/src/Repository/ScopeRepository.php b/OAuth/src/Repository/ScopeRepository.php
index 5c6a5979..1c87ab87 100644
--- a/OAuth/src/Repository/ScopeRepository.php
+++ b/OAuth/src/Repository/ScopeRepository.php
@@ -1,16 +1,17 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Repository;
+namespace MediaWiki\Extension\OAuth\Repository;
use League\OAuth2\Server\Entities\ClientEntityInterface;
use League\OAuth2\Server\Entities\ScopeEntityInterface;
use League\OAuth2\Server\Repositories\ScopeRepositoryInterface;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthException;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Entity\ClientEntity;
-use MediaWiki\Extensions\OAuth\Entity\ScopeEntity;
-use MediaWiki\Extensions\OAuth\Entity\UserEntity;
-use MWGrants;
+use MediaWiki\Extension\OAuth\Backend\MWOAuthException;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Entity\ClientEntity;
+use MediaWiki\Extension\OAuth\Entity\ScopeEntity;
+use MediaWiki\Extension\OAuth\Entity\UserEntity;
+use MediaWiki\MediaWikiServices;
+use WikiMap;
class ScopeRepository implements ScopeRepositoryInterface {
/**
@@ -23,7 +24,12 @@ class ScopeRepository implements ScopeRepositoryInterface {
];
public function __construct() {
- $this->allowedScopes = array_merge( $this->allowedScopes, MWGrants::getValidGrants() );
+ $grantsInfo = MediaWikiServices::getInstance()->getGrantsInfo();
+ $this->allowedScopes = array_merge( $this->allowedScopes, $grantsInfo->getValidGrants() );
+ }
+
+ public function getAllowedScopes() {
+ return $this->allowedScopes;
}
/**
@@ -62,7 +68,7 @@ class ScopeRepository implements ScopeRepositoryInterface {
// just filter out the scopes that are not allowed for the client
return array_filter(
$scopes,
- function ( ScopeEntityInterface $scope ) use ( $clientEntity ) {
+ static function ( ScopeEntityInterface $scope ) use ( $clientEntity ) {
return in_array( $scope->getIdentifier(), $clientEntity->getGrants(), true );
}
);
@@ -71,7 +77,10 @@ class ScopeRepository implements ScopeRepositoryInterface {
return [];
}
- $mwUser = Utils::getLocalUserFromCentralId( $userIdentifier );
+ $mwUser = Utils::getLocalUserFromCentralId( (int)$userIdentifier );
+ if ( !$mwUser ) {
+ return [];
+ }
$userEntity = UserEntity::newFromMWUser( $mwUser );
if ( $userEntity === null ) {
return [];
@@ -79,7 +88,7 @@ class ScopeRepository implements ScopeRepositoryInterface {
// Filter out not approved scopes
try {
- $approval = $clientEntity->getCurrentAuthorization( $mwUser, wfWikiID() );
+ $approval = $clientEntity->getCurrentAuthorization( $mwUser, WikiMap::getCurrentWikiId() );
$approvedScopeIds = $approval->getGrants();
} catch ( MWOAuthException $ex ) {
$approvedScopeIds = [];
@@ -87,7 +96,7 @@ class ScopeRepository implements ScopeRepositoryInterface {
return array_filter(
$scopes,
- function ( ScopeEntityInterface $scope ) use ( $approvedScopeIds ) {
+ static function ( ScopeEntityInterface $scope ) use ( $approvedScopeIds ) {
return in_array( $scope->getIdentifier(), $approvedScopeIds, true );
}
);
@@ -103,7 +112,7 @@ class ScopeRepository implements ScopeRepositoryInterface {
private function replaceDefaultScope( array $scopes, ClientEntityInterface $client ) {
// Normally, #default scope would be an only scope set, but go through whole array in case
// someone explicitly made a request with that scope set
- $index = array_search( '#default', array_map( function ( ScopeEntityInterface $scope ) {
+ $index = array_search( '#default', array_map( static function ( ScopeEntityInterface $scope ) {
return $scope->getIdentifier();
}, $scopes ) );
diff --git a/OAuth/src/ResourceServer.php b/OAuth/src/ResourceServer.php
index c5f715e6..f48517ae 100644
--- a/OAuth/src/ResourceServer.php
+++ b/OAuth/src/ResourceServer.php
@@ -1,16 +1,16 @@
<?php
-namespace MediaWiki\Extensions\OAuth;
+namespace MediaWiki\Extension\OAuth;
use League\OAuth2\Server\Entities\ScopeEntityInterface;
use League\OAuth2\Server\Middleware\ResourceServerMiddleware;
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthException;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Entity\ClientEntity;
-use MediaWiki\Extensions\OAuth\Entity\ScopeEntity;
-use MediaWiki\Extensions\OAuth\Repository\AccessTokenRepository;
-use MediaWiki\Extensions\OAuth\Repository\ScopeRepository;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\MWOAuthException;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Entity\ClientEntity;
+use MediaWiki\Extension\OAuth\Entity\ScopeEntity;
+use MediaWiki\Extension\OAuth\Repository\AccessTokenRepository;
+use MediaWiki\Extension\OAuth\Repository\ScopeRepository;
use MediaWiki\MediaWikiServices;
use MediaWiki\Rest\HttpException;
use MWException;
@@ -35,14 +35,15 @@ class ResourceServer {
public static function factory() {
$config = MediaWikiServices::getInstance()->getConfigFactory()->makeConfig( 'mwoauth' );
- return new static( $config->get( 'OAuth2PublicKey' ) );
+ return new static( $config->get( 'OAuth2PublicKey' ), $config->get( 'CanonicalServer' ) );
}
/**
* @param string $publicKey
+ * @param string $canonicalServer
*/
- protected function __construct( $publicKey ) {
- $accessTokenRepository = new AccessTokenRepository();
+ protected function __construct( string $publicKey, string $canonicalServer ) {
+ $accessTokenRepository = new AccessTokenRepository( $canonicalServer );
$server = new \League\OAuth2\Server\ResourceServer(
$accessTokenRepository,
diff --git a/OAuth/src/Response.php b/OAuth/src/Response.php
index 890ccb37..e4d4a31e 100644
--- a/OAuth/src/Response.php
+++ b/OAuth/src/Response.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth;
+namespace MediaWiki\Extension\OAuth;
use MediaWiki\Rest\Response as RestResponse;
use Psr\Http\Message\ResponseInterface;
diff --git a/OAuth/src/Rest/Handler/AbstractClientHandler.php b/OAuth/src/Rest/Handler/AbstractClientHandler.php
new file mode 100644
index 00000000..85b7de7f
--- /dev/null
+++ b/OAuth/src/Rest/Handler/AbstractClientHandler.php
@@ -0,0 +1,126 @@
+<?php
+
+namespace MediaWiki\Extension\OAuth\Rest\Handler;
+
+use League\OAuth2\Server\Entities\AccessTokenEntityInterface;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Control\ConsumerSubmitControl;
+use MediaWiki\Extension\OAuth\Entity\ClientEntity;
+use MediaWiki\Rest\Handler;
+use MediaWiki\Rest\HttpException;
+use MediaWiki\Rest\LocalizedHttpException;
+use MediaWiki\Rest\ResponseInterface;
+use MWException;
+use RequestContext;
+use Wikimedia\Message\MessageValue;
+
+/**
+ * This class serves as the base class for all operations
+ * on OAuth 2.0 clients over the REST API.
+ * It provides client initialization and basic checks on it,
+ * as well as parameter name mapping between OAuth 2.0 and 1.0 terminology
+ */
+abstract class AbstractClientHandler extends Handler {
+
+ /**
+ * @return ResponseInterface
+ * @throws HttpException
+ * @throws MWException
+ */
+ public function execute(): ResponseInterface {
+ // At this point we assume user is authenticated and has valid session
+ // Authentication can be achieved over CentralAuth or Access token in authorization header
+ $responseFactory = $this->getResponseFactory();
+ $params = $this->getUnifiedParams();
+
+ $control = new ConsumerSubmitControl(
+ RequestContext::getMain(),
+ $params,
+ Utils::getCentralDB( DB_PRIMARY )
+ );
+
+ $status = $control->submit();
+ if ( $status->isGood() ) {
+ $value = $status->getValue();
+ if ( isset( $value['result']['consumer'] ) ) {
+ /** @var ClientEntity $client */
+ $client = $value['result']['consumer'];
+ $data = [
+ 'name' => $client->getName(),
+ 'client_key' => $client->getConsumerKey(),
+ 'secret' => Utils::hmacDBSecret( $client->getSecretKey() )
+ ];
+ if ( $client->getOwnerOnly() ) {
+ $accessToken = $value['result']['accessToken'];
+ if ( $accessToken instanceof AccessTokenEntityInterface ) {
+ $data['access_token'] = (string)$accessToken;
+ }
+ }
+
+ return $responseFactory->createJson( $data );
+ }
+
+ throw new LocalizedHttpException(
+ MessageValue::new( 'mwoauth-consumer-submit-error' ), 400
+ );
+ }
+ $value = $status->getValue();
+ if ( isset( $value['error'] ) ) {
+ throw new HttpException( $value['error'], 400 );
+ }
+
+ throw new HttpException( $status->getMessage() );
+ }
+
+ /**
+ * Get params that have fixed values and cannot be
+ * changed by the request params
+ *
+ * @return array
+ */
+ abstract protected function getFixedParams(): array;
+
+ /**
+ * Maps modern OAuth2 param names to the ones
+ * expected by the SubmitControl
+ *
+ * @return string[]
+ */
+ protected function getParamMapping(): array {
+ return [
+ 'oauth2IsConfidential' => 'is_confidential',
+ 'ownerOnly' => 'owner_only',
+ 'callbackUrl' => 'callback_url',
+ 'callbackIsPrefix' => 'callback_is_prefix',
+ 'oauth2GrantTypes' => 'grant_types',
+ 'grants' => 'scopes',
+ 'consumerKey' => 'client_key',
+ ];
+ }
+
+ /**
+ * Merge and adjust all params
+ *
+ * @return array
+ */
+ protected function getUnifiedParams(): array {
+ $finalParams = [];
+
+ $requestParams = $this->getValidatedParams();
+ $mapping = array_flip( $this->getParamMapping() );
+ foreach ( $requestParams as $name => $value ) {
+ if ( isset( $mapping[$name] ) ) {
+ $finalParams[$mapping[$name]] = $value;
+ } else {
+ $finalParams[$name] = $value;
+ }
+ }
+
+ $finalParams = array_merge(
+ $finalParams,
+ $this->getFixedParams()
+ );
+
+ return $finalParams;
+ }
+}
diff --git a/OAuth/src/Rest/Handler/AccessToken.php b/OAuth/src/Rest/Handler/AccessToken.php
index 2ddc90d4..6592ca87 100644
--- a/OAuth/src/Rest/Handler/AccessToken.php
+++ b/OAuth/src/Rest/Handler/AccessToken.php
@@ -1,13 +1,13 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Rest\Handler;
+namespace MediaWiki\Extension\OAuth\Rest\Handler;
use GuzzleHttp\Psr7\ServerRequest;
use League\OAuth2\Server\Exception\OAuthServerException;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant\AuthorizationCodeAccessTokens;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant\ClientCredentials;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant\RefreshToken;
-use MediaWiki\Extensions\OAuth\Response;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\Grant\AuthorizationCodeAccessTokens;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\Grant\ClientCredentials;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\Grant\RefreshToken;
+use MediaWiki\Extension\OAuth\Response;
use MWExceptionHandler;
use Throwable;
use Wikimedia\ParamValidator\ParamValidator;
@@ -18,9 +18,9 @@ use Wikimedia\ParamValidator\ParamValidator;
*/
class AccessToken extends AuthenticationHandler {
- const GRANT_TYPE_CLIENT_CREDENTIALS = 'client_credentials';
- const GRANT_TYPE_AUTHORIZATION_CODE = 'authorization_code';
- const GRANT_TYPE_REFRESH_TOKEN = 'refresh_token';
+ private const GRANT_TYPE_CLIENT_CREDENTIALS = 'client_credentials';
+ private const GRANT_TYPE_AUTHORIZATION_CODE = 'authorization_code';
+ private const GRANT_TYPE_REFRESH_TOKEN = 'refresh_token';
/**
* @inheritDoc
diff --git a/OAuth/src/Rest/Handler/AuthenticationHandler.php b/OAuth/src/Rest/Handler/AuthenticationHandler.php
index f44a0b63..6730e72a 100644
--- a/OAuth/src/Rest/Handler/AuthenticationHandler.php
+++ b/OAuth/src/Rest/Handler/AuthenticationHandler.php
@@ -1,13 +1,13 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Rest\Handler;
+namespace MediaWiki\Extension\OAuth\Rest\Handler;
use Config;
use League\OAuth2\Server\Exception\OAuthServerException;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\AccessToken as AccessTokenProvider;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant\AuthorizationCodeAuthorization;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Response;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\AccessToken as AccessTokenProvider;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\Grant\AuthorizationCodeAuthorization;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Response;
use MediaWiki\MediaWikiServices;
use MediaWiki\Rest\Handler;
use MediaWiki\Rest\HttpException;
diff --git a/OAuth/src/Rest/Handler/Authorize.php b/OAuth/src/Rest/Handler/Authorize.php
index a1dd71b6..304336fd 100644
--- a/OAuth/src/Rest/Handler/Authorize.php
+++ b/OAuth/src/Rest/Handler/Authorize.php
@@ -1,23 +1,24 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Rest\Handler;
+namespace MediaWiki\Extension\OAuth\Rest\Handler;
use Exception;
use GuzzleHttp\Psr7\ServerRequest;
use League\OAuth2\Server\Entities\ScopeEntityInterface;
use League\OAuth2\Server\Exception\OAuthServerException;
use League\OAuth2\Server\RequestTypes\AuthorizationRequest;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant\AuthorizationCodeAuthorization;
-use MediaWiki\Extensions\OAuth\Entity\ClientEntity;
-use MediaWiki\Extensions\OAuth\Entity\UserEntity;
-use MediaWiki\Extensions\OAuth\Exception\ClientApprovalDenyException;
-use MediaWiki\Extensions\OAuth\Response;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\Grant\AuthorizationCodeAuthorization;
+use MediaWiki\Extension\OAuth\Entity\ClientEntity;
+use MediaWiki\Extension\OAuth\Entity\UserEntity;
+use MediaWiki\Extension\OAuth\Exception\ClientApprovalDenyException;
+use MediaWiki\Extension\OAuth\Response;
use MediaWiki\Rest\Response as RestResponse;
use MWException;
use MWExceptionHandler;
use SpecialPage;
use Throwable;
use User;
+use WikiMap;
use Wikimedia\ParamValidator\ParamValidator;
/**
@@ -26,7 +27,7 @@ use Wikimedia\ParamValidator\ParamValidator;
* traded for the access token.
*/
class Authorize extends AuthenticationHandler {
- const RESPONSE_TYPE_CODE = 'code';
+ private const RESPONSE_TYPE_CODE = 'code';
/**
* @inheritDoc
@@ -99,7 +100,7 @@ class Authorize extends AuthenticationHandler {
$authRequest->setScopes( array_filter(
$authRequest->getScopes(),
- function ( ScopeEntityInterface $scope ) use ( $allowedScopes ) {
+ static function ( ScopeEntityInterface $scope ) use ( $allowedScopes ) {
return in_array( $scope->getIdentifier(), $allowedScopes );
}
) );
@@ -175,7 +176,7 @@ class Authorize extends AuthenticationHandler {
'returntoquery' => $this->getQueryParamsCgi(),
'client_id' => $authRequest->getClient()->getIdentifier(),
'oauth_version' => ClientEntity::OAUTH_VERSION_2,
- 'scope' => implode( ' ', array_map( function ( ScopeEntityInterface $scope ) {
+ 'scope' => implode( ' ', array_map( static function ( ScopeEntityInterface $scope ) {
return $scope->getIdentifier();
}, $authRequest->getScopes() ) )
] )
@@ -186,8 +187,8 @@ class Authorize extends AuthenticationHandler {
return $this->getResponseFactory()->createTemporaryRedirect(
SpecialPage::getTitleFor( 'Userlogin' )->getFullURL( [
'returnto' => SpecialPage::getTitleFor( 'OAuth', 'rest_redirect' ),
- 'returntoquery' => $this->getQueryParamsCgi( [
- 'rest_url' => $this->getRequest()->getUri()->getPath()
+ 'returntoquery' => wfArrayToCgi( [
+ 'rest_url' => $this->getRequest()->getUri()->__toString(),
] ),
] )
);
@@ -231,7 +232,7 @@ class Authorize extends AuthenticationHandler {
try {
$approval = $client->getCurrentAuthorization(
$userEntity->getMwUser(),
- wfWikiID()
+ WikiMap::getCurrentWikiId()
);
} catch ( Exception $ex ) {
return false;
@@ -257,7 +258,7 @@ class Authorize extends AuthenticationHandler {
* @return string[]
*/
private function getFlatScopes( $scopeEntities ) {
- return array_map( function ( ScopeEntityInterface $scope ) {
+ return array_map( static function ( ScopeEntityInterface $scope ) {
return $scope->getIdentifier();
}, $scopeEntities );
}
diff --git a/OAuth/src/Rest/Handler/ListClients.php b/OAuth/src/Rest/Handler/ListClients.php
new file mode 100644
index 00000000..851739be
--- /dev/null
+++ b/OAuth/src/Rest/Handler/ListClients.php
@@ -0,0 +1,218 @@
+<?php
+
+namespace MediaWiki\Extension\OAuth\Rest\Handler;
+
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Control\ConsumerAccessControl;
+use MediaWiki\Rest\LocalizedHttpException;
+use MediaWiki\Rest\ResponseInterface;
+use MediaWiki\Rest\SimpleHandler;
+use RequestContext;
+use Wikimedia\Message\MessageValue;
+use Wikimedia\ParamValidator\ParamValidator;
+use Wikimedia\Rdbms\ILoadBalancer;
+use Wikimedia\Rdbms\IResultWrapper;
+
+/**
+ * Handles the oauth2/consumers endpoint, which returns
+ * a list of registered consumers for the user
+ */
+class ListClients extends SimpleHandler {
+
+ /** @var string[] */
+ protected $propertyMapping = [
+ 'id' => 'oarc_id',
+ 'client_key' => 'oarc_consumer_key',
+ 'name' => 'oarc_name',
+ 'version' => 'oarc_version',
+ 'email' => 'oarc_email',
+ 'callback_url' => 'oarc_callback_url',
+ 'scopes' => 'oarc_grants',
+ 'registration' => 'oarc_registration',
+ 'stage' => 'oarc_stage',
+ 'oauth_version' => 'oarc_oauth_version',
+ 'description' => 'oarc_description',
+ 'allowed_grants' => 'oarc_oauth2_allowed_grants',
+ 'restrictions' => 'oarc_restrictions',
+ 'user_id' => 'oarc_user_id',
+ 'callback_is_prefix' => 'oarc_callback_is_prefix',
+ 'email_authenticated' => 'oarc_email_authenticated',
+ 'developer_agreement' => 'oarc_developer_agreement',
+ 'owner_only' => 'oarc_owner_only',
+ 'wiki' => 'oarc_wiki',
+ 'secret_key' => 'oarc_secret_key',
+ 'rsa_key' => 'oarc_rsa_key',
+ 'stage_timestamp' => 'oarc_stage_timestamp',
+ 'deleted' => 'oarc_deleted',
+ 'oauth2_is_confidential' => 'oarc_oauth2_is_confidential',
+ ];
+
+ /**
+ *
+ * @var ILoadBalancer
+ */
+ private $loadBalancer;
+
+ /**
+ * @param ILoadBalancer $loadBalancer
+ */
+ public function __construct( ILoadBalancer $loadBalancer ) {
+ $this->loadBalancer = $loadBalancer;
+ }
+
+ /**
+ * @return bool
+ */
+ public function needsWriteAccess() {
+ return false;
+ }
+
+ /**
+ * @return ResponseInterface
+ * @throws LocalizedHttpException
+ */
+ public function run(): ResponseInterface {
+ // @todo Inject this, when there is a good way to do that, see T239753
+ $user = RequestContext::getMain()->getUser();
+
+ $centralId = Utils::getCentralIdFromUserName( $user->getName() );
+ $responseFactory = $this->getResponseFactory();
+
+ if ( !$centralId ) {
+ throw new LocalizedHttpException(
+ new MessageValue( 'rest-nonexistent-user', [ $user->getName() ] ), 404
+ );
+ }
+ $response = $this->getDbResults( $centralId );
+
+ return $responseFactory->createJson( $response );
+ }
+
+ /**
+ *
+ * @return array
+ */
+ public function getParamSettings() {
+ return [
+ 'limit' => [
+ self::PARAM_SOURCE => 'query',
+ ParamValidator::PARAM_TYPE => 'integer',
+ ParamValidator::PARAM_REQUIRED => false,
+ ParamValidator::PARAM_DEFAULT => 25
+ ],
+ 'offset' => [
+ self::PARAM_SOURCE => 'query',
+ ParamValidator::PARAM_TYPE => 'integer',
+ ParamValidator::PARAM_REQUIRED => false,
+ ParamValidator::PARAM_DEFAULT => 0
+ ],
+ 'oauth_version' => [
+ self::PARAM_SOURCE => 'query',
+ ParamValidator::PARAM_TYPE => [ '1', '2' ],
+ ParamValidator::PARAM_REQUIRED => false,
+ ParamValidator::PARAM_DEFAULT => '2'
+ ]
+ ];
+ }
+
+ /**
+ * @param int $centralId the user id of calling user
+ * @return array the results
+ */
+ private function getDbResults( int $centralId ) {
+ $dbr = $this->loadBalancer->getConnectionRef( DB_REPLICA );
+
+ $params = $this->getValidatedParams();
+ $limit = $params['limit'];
+ $offset = $params['offset'];
+
+ $options = [
+ 'LIMIT' => $limit,
+ 'OFFSET' => $offset
+ ];
+
+ $oauthVersion = $params['oauth_version'];
+ $conds = [ 'oarc_user_id' => $centralId ];
+ if ( $oauthVersion !== null ) {
+ $conds['oarc_oauth_version'] = (int)$oauthVersion;
+ }
+
+ $options['ORDER BY'] = 'oarc_id DESC';
+
+ $res = $dbr->select(
+ 'oauth_registered_consumer',
+ array_values( $this->propertyMapping ),
+ $conds,
+ __METHOD__,
+ $options
+ );
+
+ $total = $dbr->selectRowCount(
+ 'oauth_registered_consumer',
+ 'oarc_consumer_key',
+ $conds
+ );
+
+ return [
+ 'clients' => $this->processDbResults( $res ),
+ 'total' => $total
+ ];
+ }
+
+ /**
+ * @param IResultWrapper $res database results, or an empty array if none
+ * @return array consumer data
+ */
+ private function processDbResults( $res ) {
+ $consumers = [];
+ $requestContext = RequestContext::getMain();
+ $user = $requestContext->getUser();
+
+ foreach ( $res as $row ) {
+
+ $consumer = [];
+
+ $cmrAc = ConsumerAccessControl::wrap(
+ Consumer::newFromRow( Utils::getCentralDB( DB_REPLICA ), $row ),
+ $requestContext
+ );
+
+ if ( !$cmrAc ) {
+ continue;
+ }
+
+ $consumer['email'] = $cmrAc->getEmail();
+ $consumer['name'] = $cmrAc->getName();
+ $consumer['version'] = $cmrAc->getVersion();
+ $consumer['callback_url'] = $cmrAc->getCallbackUrl();
+ $consumer['description'] = $cmrAc->getDescription();
+ $consumer['client_key'] = $cmrAc->getConsumerKey();
+ $consumer['owner_only'] = $cmrAc->getOwnerOnly();
+
+ $consumer['stage'] = (int)$cmrAc->getStage();
+ $consumer['oauth_version'] = $cmrAc->getOAuthVersion();
+ $consumer['registration_formatted'] = $requestContext->getLanguage()->userTimeAndDate(
+ $cmrAc->getRegistration(),
+ $user
+ );
+
+ if ( $consumer['oauth_version'] === Consumer::OAUTH_VERSION_2 ) {
+ $consumer['allowed_grants'] = $cmrAc->get( 'oauth2GrantTypes' );
+ }
+
+ $consumer['scopes'] = $cmrAc->getGrants();
+ $consumer['restrictions'] = $cmrAc->getRestrictions();
+
+ foreach ( $consumer as $key => $value ) {
+ if ( is_object( $consumer[$key] ) ) {
+ unset( $consumer[$key] );
+ }
+ }
+
+ $consumers[] = $consumer;
+ }
+
+ return $consumers;
+ }
+}
diff --git a/OAuth/src/Rest/Handler/RequestClient.php b/OAuth/src/Rest/Handler/RequestClient.php
new file mode 100644
index 00000000..c4946d34
--- /dev/null
+++ b/OAuth/src/Rest/Handler/RequestClient.php
@@ -0,0 +1,170 @@
+<?php
+
+namespace MediaWiki\Extension\OAuth\Rest\Handler;
+
+use MediaWiki\Extension\OAuth\Repository\ScopeRepository;
+use MediaWiki\Rest\LocalizedHttpException;
+use MediaWiki\Rest\Validator\Validator;
+use MWRestrictions;
+use Wikimedia\Message\MessageValue;
+use Wikimedia\ParamValidator\ParamValidator;
+
+/**
+ * Handles the oauth2/client endpoint, which creates
+ * a new consumer for the user
+ */
+class RequestClient extends AbstractClientHandler {
+
+ /**
+ * @inheritDoc
+ */
+ protected function getFixedParams(): array {
+ return [
+ 'oauthVersion' => '2.0',
+ 'agreement' => true,
+ 'action' => 'propose',
+ 'granttype' => 'normal',
+ 'rsaKey' => '',
+ 'restrictions' => MWRestrictions::newDefault(),
+ ];
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getParamSettings() {
+ $scopeRepo = new ScopeRepository();
+ return [
+ 'name' => [
+ self::PARAM_SOURCE => 'post',
+ ParamValidator::PARAM_TYPE => 'string',
+ ParamValidator::PARAM_REQUIRED => true,
+ ],
+ 'version' => [
+ self::PARAM_SOURCE => 'post',
+ ParamValidator::PARAM_TYPE => [ '1.0', '2.0' ],
+ ParamValidator::PARAM_REQUIRED => false,
+ ParamValidator::PARAM_DEFAULT => '1.0',
+ ],
+ 'description' => [
+ self::PARAM_SOURCE => 'post',
+ ParamValidator::PARAM_TYPE => 'string',
+ ParamValidator::PARAM_REQUIRED => true,
+ ],
+ 'wiki' => [
+ self::PARAM_SOURCE => 'post',
+ ParamValidator::PARAM_TYPE => 'string',
+ ParamValidator::PARAM_REQUIRED => false,
+ ParamValidator::PARAM_DEFAULT => '*',
+ ],
+ 'owner_only' => [
+ self::PARAM_SOURCE => 'post',
+ ParamValidator::PARAM_TYPE => 'boolean'
+ ],
+ 'callback_url' => [
+ self::PARAM_SOURCE => 'post',
+ ParamValidator::PARAM_TYPE => 'string',
+ ParamValidator::PARAM_REQUIRED => false,
+ ParamValidator::PARAM_DEFAULT => ''
+ ],
+ 'callback_is_prefix' => [
+ self::PARAM_SOURCE => 'post',
+ ParamValidator::PARAM_TYPE => 'boolean',
+ ParamValidator::PARAM_REQUIRED => false,
+ ParamValidator::PARAM_DEFAULT => false,
+ ],
+ 'email' => [
+ self::PARAM_SOURCE => 'post',
+ ParamValidator::PARAM_TYPE => 'string',
+ ParamValidator::PARAM_REQUIRED => true,
+ ],
+ 'is_confidential' => [
+ self::PARAM_SOURCE => 'post',
+ ParamValidator::PARAM_TYPE => 'boolean',
+ ParamValidator::PARAM_REQUIRED => true,
+ ],
+ 'grant_types' => [
+ self::PARAM_SOURCE => 'post',
+ ParamValidator::PARAM_TYPE => 'string',
+ ParamValidator::PARAM_REQUIRED => true,
+ ParamValidator::PARAM_ISMULTI => true
+ ],
+ 'scopes' => [
+ self::PARAM_SOURCE => 'post',
+ ParamValidator::PARAM_TYPE => $scopeRepo->getAllowedScopes(),
+ ParamValidator::PARAM_REQUIRED => true,
+ ParamValidator::PARAM_ISMULTI => true
+ ]
+ ];
+ }
+
+ /**
+ * @inheritDoc
+ */
+ protected function getUnifiedParams(): array {
+ $params = parent::getUnifiedParams();
+ return $this->adjustScopes( $params );
+ }
+
+ /**
+ * This is needed to adjust OAuth2 scope array to old grant/granttype params
+ *
+ * @param array $finalParams
+ * @return array
+ */
+ private function adjustScopes( array $finalParams ): array {
+ $scopeRepo = new ScopeRepository();
+ $allowedScopes = $scopeRepo->getAllowedScopes();
+
+ $scopes = array_filter( $finalParams['grants'], static function ( $scope ) use ( $allowedScopes ) {
+ return in_array( $scope, $allowedScopes );
+ } );
+
+ if ( $this->findAndRemoveScope( 'mwoauth-authonly', $scopes ) ) {
+ $finalParams['granttype'] = 'authonly';
+ }
+ if ( $this->findAndRemoveScope( 'mwoauth-authonlyprivate', $scopes ) ) {
+ $finalParams['granttype'] = 'authonlyprivate';
+ }
+
+ if ( !in_array( 'basic', $scopes ) ) {
+ $scopes[] = 'basic';
+ }
+ $finalParams['grants'] = \FormatJson::encode( $scopes );
+
+ return $finalParams;
+ }
+
+ /**
+ * @param string $searchKey
+ * @param array &$values
+ * @return bool
+ */
+ private function findAndRemoveScope( $searchKey, array &$values ): bool {
+ $index = array_search( $searchKey, $values );
+ if ( $index === false ) {
+ return false;
+ }
+ array_splice( $values, $index, 1 );
+
+ return true;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function validate( Validator $restValidator ) {
+ parent::validate( $restValidator );
+
+ $params = $this->getValidatedParams();
+
+ if (
+ ( isset( $params['owner_only'] ) && !$params['owner_only'] ) &&
+ ( isset( $params['callback_url'] ) && !$params['callback_url'] )
+ ) {
+ throw new LocalizedHttpException(
+ new MessageValue( 'mwoauth-error-missing-callback-url-non-owner', [] ), 400
+ );
+ }
+ }
+}
diff --git a/OAuth/src/Rest/Handler/ResetClientSecret.php b/OAuth/src/Rest/Handler/ResetClientSecret.php
new file mode 100644
index 00000000..7d95d302
--- /dev/null
+++ b/OAuth/src/Rest/Handler/ResetClientSecret.php
@@ -0,0 +1,82 @@
+<?php
+
+namespace MediaWiki\Extension\OAuth\Rest\Handler;
+
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Control\ConsumerAccessControl;
+use MediaWiki\Rest\LocalizedHttpException;
+use MWRestrictions;
+use RequestContext;
+use Wikimedia\Message\MessageValue;
+use Wikimedia\ParamValidator\ParamValidator;
+
+class ResetClientSecret extends AbstractClientHandler {
+
+ /**
+ * @inheritDoc
+ */
+ protected function getFixedParams(): array {
+ return [
+ 'action' => 'update',
+ 'rsaKey' => '',
+ 'resetSecret' => true,
+ 'restrictions' => MWRestrictions::newDefault(),
+ ];
+ }
+
+ /**
+ * @inheritDoc
+ */
+ protected function getUnifiedParams(): array {
+ $params = parent::getUnifiedParams();
+ $params['client_key'] = $this->getRequest()->getPathParam( 'client_key' );
+
+ $requestContext = RequestContext::getMain();
+ $dbr = Utils::getCentralDB( DB_REPLICA );
+ $clientAccess = ConsumerAccessControl::wrap(
+ Consumer::newFromKey( $dbr, $params['consumerKey'] ), $requestContext
+ );
+ if ( !$clientAccess ) {
+ throw new LocalizedHttpException(
+ MessageValue::new( 'mwoauth-invalid-consumer-key' ), 400
+ );
+ }
+
+ $dataAccessObj = $clientAccess->getDAO();
+
+ if ( $dataAccessObj->getDeleted() ) {
+ throw new LocalizedHttpException(
+ MessageValue::new( 'mwoauth-consumer-deleted-error' ), 401
+ );
+ } elseif ( $dataAccessObj->getUserId() !== Utils::getCentralIdFromLocalUser(
+ $requestContext->getUser()
+ ) ) {
+ throw new LocalizedHttpException(
+ MessageValue::new( 'mwoauth-consumer-user-mismatch' ), 400
+ );
+ }
+ $params['changeToken'] = $dataAccessObj->getChangeToken( $requestContext );
+
+ return $params;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getParamSettings(): array {
+ return [
+ 'client_key' => [
+ self::PARAM_SOURCE => 'path',
+ ParamValidator::PARAM_TYPE => 'string',
+ ParamValidator::PARAM_REQUIRED => true,
+ ],
+ 'reason' => [
+ self::PARAM_SOURCE => 'post',
+ ParamValidator::PARAM_TYPE => 'string',
+ ParamValidator::PARAM_REQUIRED => false,
+ ParamValidator::PARAM_DEFAULT => '',
+ ],
+ ];
+ }
+}
diff --git a/OAuth/src/Rest/Handler/Resource.php b/OAuth/src/Rest/Handler/Resource.php
index 2b283b4d..cf7154a2 100644
--- a/OAuth/src/Rest/Handler/Resource.php
+++ b/OAuth/src/Rest/Handler/Resource.php
@@ -1,13 +1,13 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Rest\Handler;
+namespace MediaWiki\Extension\OAuth\Rest\Handler;
use FormatJson;
use GuzzleHttp\Psr7\ServerRequest;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthException;
-use MediaWiki\Extensions\OAuth\ResourceServer;
-use MediaWiki\Extensions\OAuth\Response;
-use MediaWiki\Extensions\OAuth\UserStatementProvider;
+use MediaWiki\Extension\OAuth\Backend\MWOAuthException;
+use MediaWiki\Extension\OAuth\ResourceServer;
+use MediaWiki\Extension\OAuth\Response;
+use MediaWiki\Extension\OAuth\UserStatementProvider;
use MediaWiki\Rest\Handler;
use MediaWiki\Rest\HttpException;
use MWException;
@@ -20,7 +20,16 @@ use Wikimedia\ParamValidator\ParamValidator;
* information about the user and the grants of the application, respectively.
*/
class Resource extends Handler {
- const TYPE_PROFILE = 'profile';
+
+ /**
+ * (string) TYPE_PROFILE constant to specify the profile type of the resource.
+ */
+ private const TYPE_PROFILE = 'profile';
+
+ /**
+ * (string) TYPE_SCOPES constant to specify the scopes type of the resource.
+ */
+ private const TYPE_SCOPES = 'scopes';
/** @var ResourceServer */
protected $resourceServer;
@@ -82,9 +91,9 @@ class Resource extends Handler {
$type = $this->getRequest()->getPathParam( 'type' );
switch ( $type ) {
- case 'profile':
+ case self::TYPE_PROFILE:
return $this->getProfile( $response );
- case 'scopes':
+ case self::TYPE_SCOPES:
return $this->getScopes( $response );
}
@@ -127,7 +136,7 @@ class Resource extends Handler {
private function getScopes( $response ) {
$grants = $this->resourceServer->getClient()->getGrants();
return $this->respond( $response, [
- 'scopes' => $grants
+ self::TYPE_SCOPES => $grants
] );
}
@@ -145,7 +154,7 @@ class Resource extends Handler {
return [
'type' => [
self::PARAM_SOURCE => 'path',
- ParamValidator::PARAM_TYPE => [ 'profile', 'scopes' ],
+ ParamValidator::PARAM_TYPE => [ self::TYPE_PROFILE, self::TYPE_SCOPES ],
ParamValidator::PARAM_REQUIRED => true,
],
];
diff --git a/OAuth/src/SessionProvider.php b/OAuth/src/SessionProvider.php
index 8d7e5085..46fe6485 100644
--- a/OAuth/src/SessionProvider.php
+++ b/OAuth/src/SessionProvider.php
@@ -1,21 +1,24 @@
<?php
-namespace MediaWiki\Extensions\OAuth;
+namespace MediaWiki\Extension\OAuth;
use ApiMessage;
use GuzzleHttp\Psr7\ServerRequest;
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\ConsumerAcceptance;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthException;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthRequest;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
-use MediaWiki\Extensions\OAuth\Repository\AccessTokenRepository;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\ConsumerAcceptance;
+use MediaWiki\Extension\OAuth\Backend\MWOAuthException;
+use MediaWiki\Extension\OAuth\Backend\MWOAuthRequest;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Repository\AccessTokenRepository;
+use MediaWiki\MediaWikiServices;
use MediaWiki\Session\SessionBackend;
use MediaWiki\Session\SessionInfo;
use MediaWiki\Session\SessionManager;
use MediaWiki\Session\UserInfo;
+use MediaWiki\User\UserIdentity;
use User;
use WebRequest;
+use WikiMap;
use Wikimedia\Rdbms\DBError;
/**
@@ -58,7 +61,8 @@ class SessionProvider extends \MediaWiki\Session\ImmutableSessionProviderWithCoo
// is ready to catch it
$msg = wfMessage( $key, $params );
$exception = \ApiUsageException::newWithMessage( null, $msg );
- $wgHooks['ApiBeforeMain'][] = function () use ( $exception ) {
+ // @phan-suppress-next-line PhanPluginNeverReturnFunction Closures should not get doc
+ $wgHooks['ApiBeforeMain'][] = static function () use ( $exception ) {
throw $exception;
};
@@ -97,7 +101,7 @@ class SessionProvider extends \MediaWiki\Session\ImmutableSessionProviderWithCoo
if ( $oauthVersion === Consumer::OAUTH_VERSION_2 ) {
$resourceServer = ResourceServer::factory();
$accessTokenKey = $this->verifyOAuth2Request( $resourceServer, $request );
- $accessTokenRepo = new AccessTokenRepository();
+ $accessTokenRepo = new AccessTokenRepository( $this->config->get( 'CanonicalServer' ) );
$accessId = $accessTokenRepo->getApprovalId( $accessTokenKey );
if ( $accessId === 0 ) {
if (
@@ -144,7 +148,7 @@ class SessionProvider extends \MediaWiki\Session\ImmutableSessionProviderWithCoo
$logData['user'] = Utils::getCentralUserNameFromId( $access->getUserId(), 'raw' );
- $wiki = wfWikiID();
+ $wiki = WikiMap::getCurrentWikiId();
// Access token is for this wiki
if ( $access->getWiki() !== '*' && $access->getWiki() !== $wiki ) {
$this->logger->debug( 'OAuth request for wrong wiki from user {user}', $logData );
@@ -168,7 +172,7 @@ class SessionProvider extends \MediaWiki\Session\ImmutableSessionProviderWithCoo
);
}
if ( $localUser->isLocked() ||
- ( $this->config->get( 'BlockDisablesLogin' ) && $localUser->isBlocked() )
+ ( $this->config->get( 'BlockDisablesLogin' ) && $localUser->getBlock() )
) {
$this->logger->debug( 'OAuth request for blocked user {user}', $logData );
return $this->makeException( 'mwoauth-invalid-authorization-blocked-user' );
@@ -220,7 +224,9 @@ class SessionProvider extends \MediaWiki\Session\ImmutableSessionProviderWithCoo
'oauthVersion' => $oauthVersion,
'consumerId' => $consumer->getOwnerOnly() ? null : $consumer->getId(),
'key' => $accessTokenKey,
- 'rights' => \MWGrants::getGrantRights( $access->getGrants() ),
+ 'rights' => MediaWikiServices::getInstance()
+ ->getGrantsInfo()
+ ->getGrantRights( $access->getGrants() ),
],
] );
}
@@ -259,7 +265,7 @@ class SessionProvider extends \MediaWiki\Session\ImmutableSessionProviderWithCoo
$resourceServer->verify(
$request,
$response,
- function ( $request, $response ) use ( &$valid ) {
+ static function ( $request, $response ) use ( &$valid ) {
$valid = true;
}
);
@@ -273,7 +279,7 @@ class SessionProvider extends \MediaWiki\Session\ImmutableSessionProviderWithCoo
public function preventSessionsForUser( $username ) {
$id = Utils::getCentralIdFromUserName( $username );
- $dbw = Utils::getCentralDB( DB_MASTER );
+ $dbw = Utils::getCentralDB( DB_PRIMARY );
$dbw->startAtomic( __METHOD__ );
try {
@@ -313,11 +319,12 @@ class SessionProvider extends \MediaWiki\Session\ImmutableSessionProviderWithCoo
/**
* Fetch the access data, if any, for this user-session
- * @param \User|null $user
+ * @param UserIdentity|null $userIdentity
* @return array|null
*/
- private function getSessionData( \User $user = null ) {
- if ( $user ) {
+ private function getSessionData( UserIdentity $userIdentity = null ) {
+ if ( $userIdentity ) {
+ $user = User::newFromIdentity( $userIdentity );
$session = $user->getRequest()->getSession();
if ( $session->getProvider() === $this &&
$user->equals( $session->getUser() )
@@ -352,13 +359,13 @@ class SessionProvider extends \MediaWiki\Session\ImmutableSessionProviderWithCoo
* Disable certain API modules when used with OAuth
*
* @param \ApiBase $module
- * @param \User $user
+ * @param UserIdentity $userIdentity
* @param string|array &$message
* @return bool
*/
- public function onApiCheckCanExecute( \ApiBase $module, \User $user, &$message ) {
+ public function onApiCheckCanExecute( \ApiBase $module, UserIdentity $userIdentity, &$message ) {
global $wgMWOauthDisabledApiModules;
- if ( !$this->getSessionData( $user ) ) {
+ if ( !$this->getSessionData( $userIdentity ) ) {
return true;
}
@@ -382,7 +389,7 @@ class SessionProvider extends \MediaWiki\Session\ImmutableSessionProviderWithCoo
* @return bool true
*/
public function onRecentChange_save( $rc ) {
- $consumerId = $this->getPublicConsumerId( $rc->getPerformer() ?: null );
+ $consumerId = $this->getPublicConsumerId( $rc->getPerformerIdentity() );
if ( $consumerId !== null ) {
$rc->addTags( Utils::getTagName( $consumerId ) );
}
@@ -391,11 +398,11 @@ class SessionProvider extends \MediaWiki\Session\ImmutableSessionProviderWithCoo
/**
* Get the consumer ID of the non-owner-only OAuth consumer associated with this user, or null.
- * @param User|null $user
+ * @param UserIdentity|null $userIdentity
* @return int|null
*/
- protected function getPublicConsumerId( User $user = null ) {
- $data = $this->getSessionData( $user );
+ protected function getPublicConsumerId( UserIdentity $userIdentity = null ) {
+ $data = $this->getSessionData( $userIdentity );
if ( $data && isset( $data['consumerId'] ) ) {
return $data['consumerId'];
}
diff --git a/OAuth/src/Setup.php b/OAuth/src/Setup.php
index 8c69fd29..867ebc8b 100644
--- a/OAuth/src/Setup.php
+++ b/OAuth/src/Setup.php
@@ -1,15 +1,13 @@
<?php
-namespace MediaWiki\Extensions\OAuth;
+namespace MediaWiki\Extension\OAuth;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Backend\Utils;
/**
* Class containing hooked functions for an OAuth environment
*/
class Setup {
- const TTL_REFRESH_WINDOW = 600; // refresh if expiring in 10 minutes
-
/**
* Prevent CentralAuth from issuing centralauthtokens if we have
* OAuth headers in this request.
diff --git a/OAuth/src/UserStatementProvider.php b/OAuth/src/UserStatementProvider.php
index 6b518461..d50b582e 100644
--- a/OAuth/src/UserStatementProvider.php
+++ b/OAuth/src/UserStatementProvider.php
@@ -1,13 +1,14 @@
<?php
-namespace MediaWiki\Extensions\OAuth;
+namespace MediaWiki\Extension\OAuth;
use Config;
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\Utils;
use MediaWiki\MediaWikiServices;
+use MediaWiki\Permissions\GrantsInfo;
+use MediaWiki\User\UserGroupManager;
use MWException;
-use MWGrants;
use User;
class UserStatementProvider {
@@ -19,6 +20,10 @@ class UserStatementProvider {
protected $consumer;
/** @var array */
protected $grants;
+ /** @var UserGroupManager */
+ private $userGroupManager;
+ /** @var GrantsInfo */
+ private $grantsInfo;
/**
* @param User $user
@@ -27,8 +32,18 @@ class UserStatementProvider {
* @return static
*/
public static function factory( User $user, Consumer $consumer, $grants = [] ) {
- $mainConfig = MediaWikiServices::getInstance()->getMainConfig();
- return new static( $mainConfig, $user, $consumer, $grants );
+ $services = MediaWikiServices::getInstance();
+ $mainConfig = $services->getMainConfig();
+ $userGroupManager = $services->getUserGroupManager();
+ $grantsInfo = $services->getGrantsInfo();
+ return new static(
+ $mainConfig,
+ $user,
+ $consumer,
+ $grants,
+ $userGroupManager,
+ $grantsInfo
+ );
}
/**
@@ -37,12 +52,23 @@ class UserStatementProvider {
* @param User $user
* @param Consumer $consumer
* @param array $grants
+ * @param UserGroupManager $userGroupManager
+ * @param GrantsInfo $grantsInfo
*/
- protected function __construct( $config, $user, $consumer, $grants ) {
+ protected function __construct(
+ $config,
+ $user,
+ $consumer,
+ $grants,
+ $userGroupManager,
+ $grantsInfo
+ ) {
$this->config = $config;
$this->user = $user;
$this->consumer = $consumer;
$this->grants = $grants;
+ $this->userGroupManager = $userGroupManager;
+ $this->grantsInfo = $grantsInfo;
}
/**
@@ -63,7 +89,7 @@ class UserStatementProvider {
// Audience(s) that this ID Token is intended for.
$statement['aud'] = $this->consumer->getConsumerKey();
// Expiration time on or after which the ID Token MUST NOT be accepted for processing.
- $statement['exp'] = wfTimestamp() + 100;
+ $statement['exp'] = (int)wfTimestamp() + 100;
// Time at which the JWT was issued.
$statement['iat'] = (int)wfTimestamp();
// TODO: Add auth_time, if we start tracking last login timestamp
@@ -89,14 +115,14 @@ class UserStatementProvider {
$profile['confirmed_email'] = $this->user->isEmailConfirmed();
$profile['blocked'] = $this->user->getBlock() !== null;
$profile['registered'] = $this->user->getRegistration();
- $profile['groups'] = $this->user->getEffectiveGroups();
+ $profile['groups'] = $this->userGroupManager->getUserEffectiveGroups( $this->user );
$profile['rights'] = array_values( array_unique(
MediaWikiServices::getInstance()->getPermissionManager()->getUserPermissions( $this->user )
) );
$profile['grants'] = $this->grants;
if ( in_array( 'mwoauth-authonlyprivate', $this->grants ) ||
- in_array( 'viewmyprivateinfo', MWGrants::getGrantRights( $profile['grants'] ) )
+ in_array( 'viewmyprivateinfo', $this->grantsInfo->getGrantRights( $profile['grants'] ) )
) {
// Paranoia - avoid showing the real name if the wiki is not configured to use
// it but it somehow exists (from past configuration, or some identity management
diff --git a/OAuth/tests/phpunit/AuthorizationProviderTest.php b/OAuth/tests/phpunit/AuthorizationProviderTest.php
index be896aa3..cb81534e 100644
--- a/OAuth/tests/phpunit/AuthorizationProviderTest.php
+++ b/OAuth/tests/phpunit/AuthorizationProviderTest.php
@@ -1,31 +1,32 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests;
+namespace MediaWiki\Extension\OAuth\Tests;
use DateTime;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\AuthorizationProvider;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant\AuthorizationCodeAccessTokens;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant\AuthorizationCodeAuthorization;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant\ClientCredentials;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant\RefreshToken;
-use MediaWiki\Extensions\OAuth\AuthorizationProvider\IAuthorizationProvider;
-use MediaWiki\Extensions\OAuth\AuthorizationServerFactory;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\AuthorizationProvider;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\Grant\AuthorizationCodeAccessTokens;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\Grant\AuthorizationCodeAuthorization;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\Grant\ClientCredentials;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\Grant\RefreshToken;
+use MediaWiki\Extension\OAuth\AuthorizationProvider\IAuthorizationProvider;
+use MediaWiki\Extension\OAuth\AuthorizationServerFactory;
use MediaWiki\MediaWikiServices;
-use MediaWikiTestCase;
+use MediaWikiIntegrationTestCase;
use Psr\Log\NullLogger;
use ReflectionClass;
use User;
use Wikimedia\TestingAccessWrapper;
/**
- * @covers \MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant\AuthorizationCodeAuthorization
- * @covers \MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant\AuthorizationCodeAccessTokens
- * @covers \MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant\ClientCredentials
- * @covers \MediaWiki\Extensions\OAuth\AuthorizationProvider\Grant\RefreshToken
+ * @covers \MediaWiki\Extension\OAuth\AuthorizationProvider\Grant\AuthorizationCodeAuthorization
+ * @covers \MediaWiki\Extension\OAuth\AuthorizationProvider\Grant\AuthorizationCodeAccessTokens
+ * @covers \MediaWiki\Extension\OAuth\AuthorizationProvider\Grant\ClientCredentials
+ * @covers \MediaWiki\Extension\OAuth\AuthorizationProvider\Grant\RefreshToken
+ * @group OAuth
*/
-class AuthorizationProviderTest extends MediaWikiTestCase {
+class AuthorizationProviderTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
@@ -100,7 +101,7 @@ class AuthorizationProviderTest extends MediaWikiTestCase {
$enabledGrantsProp->setAccessible( true );
$enabledGrants = $enabledGrantsProp->getValue( $server );
// In our case, each class is handling a single grant, so only that grant must be enabled
- $this->assertSame( 1, count( $enabledGrants ),
+ $this->assertCount( 1, $enabledGrants,
'Authorization server must have exactly one grant enabled' );
$this->assertArrayHasKey(
$grantName, $enabledGrants, "Grant \"$grantName\" must be enabled for $class"
diff --git a/OAuth/tests/phpunit/Backend/MWOAuthHooksTest.php b/OAuth/tests/phpunit/Backend/MWOAuthHooksTest.php
index 116c4a46..ff661d86 100644
--- a/OAuth/tests/phpunit/Backend/MWOAuthHooksTest.php
+++ b/OAuth/tests/phpunit/Backend/MWOAuthHooksTest.php
@@ -1,14 +1,15 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Backend;
+namespace MediaWiki\Extension\OAuth\Tests\Backend;
-use MediaWiki\Extensions\OAuth\Backend\Hooks;
+use MediaWiki\Extension\OAuth\Backend\Hooks;
use PHPUnit\Framework\TestCase;
use Status;
use User;
/**
- * @covers \MediaWiki\Extensions\OAuth\Backend\MWOAuthServer
+ * @covers \MediaWiki\Extension\OAuth\Backend\MWOAuthServer
+ * @group OAuth
*/
class MWOAuthHooksTest extends TestCase {
diff --git a/OAuth/tests/phpunit/Backend/MWOAuthServerTest.php b/OAuth/tests/phpunit/Backend/MWOAuthServerTest.php
index 211d1800..58c77a70 100644
--- a/OAuth/tests/phpunit/Backend/MWOAuthServerTest.php
+++ b/OAuth/tests/phpunit/Backend/MWOAuthServerTest.php
@@ -21,13 +21,14 @@
* @file
*/
-namespace MediaWiki\Extensions\OAuth\Tests\Backend;
+namespace MediaWiki\Extension\OAuth\Tests\Backend;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthException;
-use MediaWiki\Extensions\OAuth\Backend\MWOAuthServer;
+use MediaWiki\Extension\OAuth\Backend\MWOAuthException;
+use MediaWiki\Extension\OAuth\Backend\MWOAuthServer;
/**
- * @covers \MediaWiki\Extensions\OAuth\Backend\MWOAuthServer
+ * @covers \MediaWiki\Extension\OAuth\Backend\MWOAuthServer
+ * @group OAuth
*/
class MWOAuthServerTest extends \PHPUnit\Framework\TestCase {
@@ -68,6 +69,8 @@ class MWOAuthServerTest extends \PHPUnit\Framework\TestCase {
[ true, 'http://host', 'https://host' ],
[ true, 'https://host:1234', 'https://host:1234' ],
[ true, 'http://host:1234', 'https://host:1234' ],
+ [ true, 'https://host:1', 'https://host:1234' ],
+ [ true, 'https://host:1', 'https://host' ],
[ true, 'https://host', 'https://host/path?query' ],
[ true, 'http://host', 'https://host/path?query' ],
[ true, 'https://host/path', 'https://host/path?query' ],
@@ -79,6 +82,7 @@ class MWOAuthServerTest extends \PHPUnit\Framework\TestCase {
[ false, 'https://host', 'https://host:1234' ],
[ false, 'https://host:4321', 'https://host:1234' ],
[ false, 'https://host:80', 'https://host:8099' ],
+ [ false, 'https://host', 'https://host:1' ],
[ false, 'https://host/path', 'https://host:1234/path' ],
[ false, 'https://host/path?query', 'https://host/path' ],
[ false, 'https://host:8000', 'https://host:8000@evil.com' ],
diff --git a/OAuth/tests/phpunit/Backend/StubConsumer.php b/OAuth/tests/phpunit/Backend/StubConsumer.php
index 3cc71c35..d911ddd3 100644
--- a/OAuth/tests/phpunit/Backend/StubConsumer.php
+++ b/OAuth/tests/phpunit/Backend/StubConsumer.php
@@ -21,9 +21,10 @@
* @file
*/
-namespace MediaWiki\Extensions\OAuth\Tests\Backend;
+namespace MediaWiki\Extension\OAuth\Tests\Backend;
class StubConsumer {
+ /** @var array */
public $data;
public function __construct( $data ) {
diff --git a/OAuth/tests/phpunit/Entity/AccessTokenEntityTest.php b/OAuth/tests/phpunit/Entity/AccessTokenEntityTest.php
index 7c3da324..6bb072ce 100644
--- a/OAuth/tests/phpunit/Entity/AccessTokenEntityTest.php
+++ b/OAuth/tests/phpunit/Entity/AccessTokenEntityTest.php
@@ -1,18 +1,30 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Entity;
+namespace MediaWiki\Extension\OAuth\Tests\Entity;
use League\OAuth2\Server\Entities\ScopeEntityInterface;
-use MediaWiki\Extensions\OAuth\Entity\AccessTokenEntity;
-use MediaWiki\Extensions\OAuth\Entity\ScopeEntity;
-use MediaWikiTestCase;
+use MediaWiki\Extension\OAuth\Entity\AccessTokenEntity;
+use MediaWiki\Extension\OAuth\Entity\ClaimEntity;
+use MediaWiki\Extension\OAuth\Entity\ScopeEntity;
+use MediaWikiIntegrationTestCase;
/**
- * @covers \MediaWiki\Extensions\OAuth\Entity\AccessTokenEntity
+ * @covers \MediaWiki\Extension\OAuth\Entity\AccessTokenEntity
+ * @group OAuth
*/
-class AccessTokenEntityTest extends MediaWikiTestCase {
+class AccessTokenEntityTest extends MediaWikiIntegrationTestCase {
public function testProperties() {
+ $claims = [
+ new ClaimEntity( 'name', 'dummyValue' ),
+ new ClaimEntity(
+ 'arr',
+ [
+ 'str' => 'string',
+ 'num' => 9
+ ]
+ )
+ ];
$accessToken = new AccessTokenEntity(
Mock_ClientEntity::newMock( $this->getTestUser()->getUser(), [
'consumerKey' => 'dummykey'
@@ -21,10 +33,14 @@ class AccessTokenEntityTest extends MediaWikiTestCase {
new ScopeEntity( 'editpage' ),
new ScopeEntity( 'highvolume' )
],
+ 'dummy',
$this->getTestUser()->getUser()->getId()
);
$identifier = bin2hex( random_bytes( 40 ) );
$accessToken->setIdentifier( $identifier );
+ foreach ( $claims as $claim ) {
+ $accessToken->addClaim( $claim );
+ }
$this->assertSame(
$identifier, $accessToken->getIdentifier(),
@@ -39,7 +55,7 @@ class AccessTokenEntityTest extends MediaWikiTestCase {
'dummykey', $accessToken->getClient()->getIdentifier(),
'Access token should have the same client identifier as the one that was passed'
);
- $atScopes = array_map( function ( ScopeEntityInterface $scope ) {
+ $atScopes = array_map( static function ( ScopeEntityInterface $scope ) {
return $scope->getIdentifier();
}, $accessToken->getScopes() );
$this->assertArrayEquals(
@@ -47,5 +63,15 @@ class AccessTokenEntityTest extends MediaWikiTestCase {
$atScopes,
'Access tokens should have the same scopes as the ones that were passed'
);
+ $tokenClaims = $accessToken->getClaims();
+ $this->assertCount( count( $claims ), $tokenClaims );
+ foreach ( $claims as $index => $claim ) {
+ $this->assertSame( $claim->getName(), $tokenClaims[$index]->getName() );
+ $this->assertSame( $claim->getValue(), $tokenClaims[$index]->getValue() );
+ }
+
+ $this->assertSame( 'dummy', $accessToken->getIssuer() );
+ $accessToken->setIssuer( 'new_dummy' );
+ $this->assertSame( 'new_dummy', $accessToken->getIssuer() );
}
}
diff --git a/OAuth/tests/phpunit/Entity/ClaimEntityTest.php b/OAuth/tests/phpunit/Entity/ClaimEntityTest.php
new file mode 100644
index 00000000..83d24d62
--- /dev/null
+++ b/OAuth/tests/phpunit/Entity/ClaimEntityTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace MediaWiki\Extension\OAuth\Tests\Entity;
+
+use MediaWiki\Extension\OAuth\Entity\ClaimEntity;
+use MediaWikiIntegrationTestCase;
+
+/**
+ * @group OAuth
+ */
+class ClaimEntityTest extends MediaWikiIntegrationTestCase {
+ public function provideClaims() {
+ yield 'string claim' => [
+ [ 'str' => 'string' ]
+ ];
+
+ yield 'number claim' => [
+ [ 'num' => 9 ]
+ ];
+
+ yield 'list of claims' => [
+ [
+ 'class' => 'dummy class',
+ 'another_item' => [
+ 'num' => 8,
+ 'str' => 'mock'
+ ]
+ ]
+ ];
+ }
+
+ /**
+ * @dataProvider provideClaims
+ * @covers \MediaWiki\Extension\OAuth\Entity\ClaimEntity::getName
+ * @covers \MediaWiki\Extension\OAuth\Entity\ClaimEntity::getValue
+ */
+ public function testProperties( $claims ) {
+ foreach ( $claims as $name => $value ) {
+ $claimEntity = new ClaimEntity( $name, $value );
+ $this->assertEquals( $name, $claimEntity->getName() );
+ $this->assertEquals( $value, $claimEntity->getValue() );
+ }
+ }
+}
diff --git a/OAuth/tests/phpunit/Entity/ClientEntityTest.php b/OAuth/tests/phpunit/Entity/ClientEntityTest.php
index 130aede5..eb35ddc5 100644
--- a/OAuth/tests/phpunit/Entity/ClientEntityTest.php
+++ b/OAuth/tests/phpunit/Entity/ClientEntityTest.php
@@ -1,20 +1,27 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Entity;
+namespace MediaWiki\Extension\OAuth\Tests\Entity;
-use MediaWikiTestCase;
+use MediaWiki\Extension\OAuth\Backend\ConsumerAcceptance;
+use MediaWiki\Extension\OAuth\Entity\AccessTokenEntity;
+use MediaWikiIntegrationTestCase;
/**
- * @covers \MediaWiki\Extensions\OAuth\Entity\ClientEntity
+ * @covers \MediaWiki\Extension\OAuth\Entity\ClientEntity
+ * @group OAuth
*/
-class ClientEntityTest extends MediaWikiTestCase {
+class ClientEntityTest extends MediaWikiIntegrationTestCase {
public function testProperties() {
$domain = 'http://domain.com/oauth2';
+ $now = wfTimestampNow();
$client = Mock_ClientEntity::newMock( $this->getTestUser()->getUser(), [
'consumerKey' => '123456789',
'callbackUrl' => $domain,
'name' => 'Test client',
+ 'emailAuthenticated' => $now,
+ 'registration' => $now,
+ 'stageTimestamp' => $now,
'oauth2IsConfidential' => false,
'oauth2GrantTypes' => [ 'client_credentials' ]
] );
@@ -41,9 +48,54 @@ class ClientEntityTest extends MediaWikiTestCase {
'Test client', $client->getName(),
'Client name should be same as the one given on registration'
);
+ $this->assertSame(
+ $now, $client->getEmailAuthenticated(),
+ 'EmailAuthenticated should match match the current timestamp'
+ );
+ $this->assertSame(
+ $now, $client->getRegistration(),
+ 'Registration should match match the current timestamp'
+ );
+ $this->assertSame(
+ $now, $client->getStageTimestamp(),
+ 'StageTimestamp should match match the current timestamp'
+ );
$this->assertArrayEquals(
[ 'client_credentials' ], $client->getAllowedGrants(),
'Allowed grants should be the same as ones given on registration'
);
+
+ $approval = ConsumerAcceptance::newFromArray(
+ [
+ 'id' => 2,
+ 'accessToken' => '98764erf',
+ 'accepted' => wfTimestampNow(),
+ 'wiki' => 'dummy',
+ 'userId' => 12345,
+ 'consumerId' => '67890987654',
+ 'accessSecret' => 'secret key',
+ 'grants' => [ 'editpage' ]
+ ]
+ );
+
+ $accessToken = $client->getOwnerOnlyAccessToken( $approval );
+ $this->assertInstanceOf( AccessTokenEntity::class, $accessToken );
+ $this->assertEquals( 12345, $accessToken->getUserIdentifier() );
+
+ $scopes = $client->getScopes();
+ $accessTokenScopes = $accessToken->getScopes();
+ foreach ( $scopes as $index => $scope ) {
+ $this->assertEquals( $scope->jsonSerialize(), $accessTokenScopes[$index]->jsonSerialize() );
+ }
+ }
+
+ public function testNullEmailAuthenticated() {
+ $client = Mock_ClientEntity::newMock( $this->getTestUser()->getUser(), [
+ 'emailAuthenticated' => null,
+ ] );
+
+ $this->assertNull( $client->getEmailAuthenticated(),
+ 'EmailAuthenticated should be null'
+ );
}
}
diff --git a/OAuth/tests/phpunit/Entity/Mock_ClientEntity.php b/OAuth/tests/phpunit/Entity/Mock_ClientEntity.php
index a99ffdb8..71444b1d 100644
--- a/OAuth/tests/phpunit/Entity/Mock_ClientEntity.php
+++ b/OAuth/tests/phpunit/Entity/Mock_ClientEntity.php
@@ -1,9 +1,9 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Entity;
+namespace MediaWiki\Extension\OAuth\Tests\Entity;
-use MediaWiki\Extensions\OAuth\Backend\Consumer;
-use MediaWiki\Extensions\OAuth\Entity\ClientEntity;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Entity\ClientEntity;
use MWRestrictions;
use User;
diff --git a/OAuth/tests/phpunit/Entity/UserEntityTest.php b/OAuth/tests/phpunit/Entity/UserEntityTest.php
index 39f4a14a..cb27eb63 100644
--- a/OAuth/tests/phpunit/Entity/UserEntityTest.php
+++ b/OAuth/tests/phpunit/Entity/UserEntityTest.php
@@ -1,14 +1,15 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Entity;
+namespace MediaWiki\Extension\OAuth\Tests\Entity;
-use MediaWiki\Extensions\OAuth\Entity\UserEntity;
-use MediaWikiTestCase;
+use MediaWiki\Extension\OAuth\Entity\UserEntity;
+use MediaWikiIntegrationTestCase;
/**
- * @covers \MediaWiki\Extensions\OAuth\Entity\UserEntity
+ * @covers \MediaWiki\Extension\OAuth\Entity\UserEntity
+ * @group OAuth
*/
-class UserEntityTest extends MediaWikiTestCase {
+class UserEntityTest extends MediaWikiIntegrationTestCase {
public function testProperties() {
$userEntity = UserEntity::newFromMWUser(
diff --git a/OAuth/tests/phpunit/Lib/Mock_OAuthBaseStringRequest.php b/OAuth/tests/phpunit/Lib/Mock_OAuthBaseStringRequest.php
index ebfadcd1..9e939c3d 100644
--- a/OAuth/tests/phpunit/Lib/Mock_OAuthBaseStringRequest.php
+++ b/OAuth/tests/phpunit/Lib/Mock_OAuthBaseStringRequest.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Lib;
+namespace MediaWiki\Extension\OAuth\Tests\Lib;
/**
* A very simple class that you can pass a base-string, and then have it returned again.
diff --git a/OAuth/tests/phpunit/Lib/Mock_OAuthDataStore.php b/OAuth/tests/phpunit/Lib/Mock_OAuthDataStore.php
index 0cd16b83..c1f43072 100644
--- a/OAuth/tests/phpunit/Lib/Mock_OAuthDataStore.php
+++ b/OAuth/tests/phpunit/Lib/Mock_OAuthDataStore.php
@@ -1,10 +1,10 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Lib;
+namespace MediaWiki\Extension\OAuth\Tests\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthConsumer;
-use MediaWiki\Extensions\OAuth\Lib\OAuthDataStore;
-use MediaWiki\Extensions\OAuth\Lib\OAuthToken;
+use MediaWiki\Extension\OAuth\Lib\OAuthConsumer;
+use MediaWiki\Extension\OAuth\Lib\OAuthDataStore;
+use MediaWiki\Extension\OAuth\Lib\OAuthToken;
/**
* A mock store for testing
diff --git a/OAuth/tests/phpunit/Lib/Mock_OAuthSignatureMethod_RSA_SHA1.php b/OAuth/tests/phpunit/Lib/Mock_OAuthSignatureMethod_RSA_SHA1.php
index 30d17aa8..657715f7 100644
--- a/OAuth/tests/phpunit/Lib/Mock_OAuthSignatureMethod_RSA_SHA1.php
+++ b/OAuth/tests/phpunit/Lib/Mock_OAuthSignatureMethod_RSA_SHA1.php
@@ -1,8 +1,8 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Lib;
+namespace MediaWiki\Extension\OAuth\Tests\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthSignatureMethod_RSA_SHA1;
+use MediaWiki\Extension\OAuth\Lib\OAuthSignatureMethod_RSA_SHA1;
/**
* A mock implementation of OAuthSignatureMethod_RSA_SHA1
diff --git a/OAuth/tests/phpunit/Lib/OAuthConsumerTest.php b/OAuth/tests/phpunit/Lib/OAuthConsumerTest.php
index 2f3ce1b8..66f97675 100644
--- a/OAuth/tests/phpunit/Lib/OAuthConsumerTest.php
+++ b/OAuth/tests/phpunit/Lib/OAuthConsumerTest.php
@@ -1,8 +1,8 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Lib;
+namespace MediaWiki\Extension\OAuth\Tests\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthConsumer;
+use MediaWiki\Extension\OAuth\Lib\OAuthConsumer;
/**
* The MIT License
@@ -30,6 +30,7 @@ use MediaWiki\Extensions\OAuth\Lib\OAuthConsumer;
/**
* @group OAuth
+ * @covers \MediaWiki\Extension\OAuth\Lib\OAuthConsumer
*/
class OAuthConsumerTest extends \PHPUnit\Framework\TestCase {
public function testConvertToString() {
diff --git a/OAuth/tests/phpunit/Lib/OAuthRequestTest.php b/OAuth/tests/phpunit/Lib/OAuthRequestTest.php
index ee5fcfbd..3e5a4b58 100644
--- a/OAuth/tests/phpunit/Lib/OAuthRequestTest.php
+++ b/OAuth/tests/phpunit/Lib/OAuthRequestTest.php
@@ -23,27 +23,27 @@
* THE SOFTWARE.
*/
-namespace MediaWiki\Extensions\OAuth\Tests\Lib;
+namespace MediaWiki\Extension\OAuth\Tests\Lib;
-
-use MediaWiki\Extensions\OAuth\Lib\OAuthConsumer;
-use MediaWiki\Extensions\OAuth\Lib\OAuthException;
-use MediaWiki\Extensions\OAuth\Lib\OAuthRequest;
-use MediaWiki\Extensions\OAuth\Lib\OAuthSignatureMethod_HMAC_SHA1;
-use MediaWiki\Extensions\OAuth\Lib\OAuthSignatureMethod_PLAINTEXT;
-use MediaWiki\Extensions\OAuth\Lib\OAuthToken;
+use MediaWiki\Extension\OAuth\Lib\OAuthConsumer;
+use MediaWiki\Extension\OAuth\Lib\OAuthException;
+use MediaWiki\Extension\OAuth\Lib\OAuthRequest;
+use MediaWiki\Extension\OAuth\Lib\OAuthSignatureMethod_HMAC_SHA1;
+use MediaWiki\Extension\OAuth\Lib\OAuthSignatureMethod_PLAINTEXT;
+use MediaWiki\Extension\OAuth\Lib\OAuthToken;
/**
* Tests of OAuthRequest
*
* The tests works by using OAuthTestUtils::build_request
- * to populare $_SERVER, $_GET & $_POST.
+ * to populate $_SERVER, $_GET & $_POST.
*
* Most of the base string and signature tests
* are either very simple or based upon
* http://wiki.oauth.net/TestCases
*
* @group OAuth
+ * @covers \MediaWiki\Extension\OAuth\Lib\OAuthRequest
*/
class OAuthRequestTest extends \PHPUnit\Framework\TestCase {
@@ -125,7 +125,7 @@ class OAuthRequestTest extends \PHPUnit\Framework\TestCase {
$this->assertEquals($cons->key, $request->get_parameter('oauth_consumer_key'));
$this->assertEquals($token->key, $request->get_parameter('oauth_token'));
$this->assertEquals(time(), $request->get_parameter('oauth_timestamp'));
- $this->assertRegExp('/[0-9a-f]{32}/', $request->get_parameter('oauth_nonce'));
+ $this->assertMatchesRegularExpression('/[0-9a-f]{32}/', $request->get_parameter('oauth_nonce'));
// We don't know what the nonce will be, except it'll be md5 and hence 32 hexa digits
$request = OAuthRequest::from_consumer_and_token($cons, $token, 'POST', 'http://example.com', array('oauth_nonce'=>'foo'));
diff --git a/OAuth/tests/phpunit/Lib/OAuthServerTest.php b/OAuth/tests/phpunit/Lib/OAuthServerTest.php
index db508934..277bbee1 100644
--- a/OAuth/tests/phpunit/Lib/OAuthServerTest.php
+++ b/OAuth/tests/phpunit/Lib/OAuthServerTest.php
@@ -23,19 +23,20 @@
* THE SOFTWARE.
*/
-namespace MediaWiki\Extensions\OAuth\Tests\Lib;
+namespace MediaWiki\Extension\OAuth\Tests\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthConsumer;
-use MediaWiki\Extensions\OAuth\Lib\OAuthException;
-use MediaWiki\Extensions\OAuth\Lib\OAuthRequest;
-use MediaWiki\Extensions\OAuth\Lib\OAuthServer;
-use MediaWiki\Extensions\OAuth\Lib\OAuthSignatureMethod_HMAC_SHA1;
-use MediaWiki\Extensions\OAuth\Lib\OAuthSignatureMethod_PLAINTEXT;
-use MediaWiki\Extensions\OAuth\Lib\OAuthToken;
+use MediaWiki\Extension\OAuth\Lib\OAuthConsumer;
+use MediaWiki\Extension\OAuth\Lib\OAuthException;
+use MediaWiki\Extension\OAuth\Lib\OAuthRequest;
+use MediaWiki\Extension\OAuth\Lib\OAuthServer;
+use MediaWiki\Extension\OAuth\Lib\OAuthSignatureMethod_HMAC_SHA1;
+use MediaWiki\Extension\OAuth\Lib\OAuthSignatureMethod_PLAINTEXT;
+use MediaWiki\Extension\OAuth\Lib\OAuthToken;
/**
* Tests of OAuthUtil
* @group OAuth
+ * @covers \MediaWiki\Extension\OAuth\Lib\OAuthServer
*/
class OAuthServerTest extends \PHPUnit\Framework\TestCase {
diff --git a/OAuth/tests/phpunit/Lib/OAuthSignatureMethodHmacSha1Test.php b/OAuth/tests/phpunit/Lib/OAuthSignatureMethodHmacSha1Test.php
index af01d1d4..b485f4ef 100644
--- a/OAuth/tests/phpunit/Lib/OAuthSignatureMethodHmacSha1Test.php
+++ b/OAuth/tests/phpunit/Lib/OAuthSignatureMethodHmacSha1Test.php
@@ -1,10 +1,10 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Lib;
+namespace MediaWiki\Extension\OAuth\Tests\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthConsumer;
-use MediaWiki\Extensions\OAuth\Lib\OAuthSignatureMethod_HMAC_SHA1;
-use MediaWiki\Extensions\OAuth\Lib\OAuthToken;
+use MediaWiki\Extension\OAuth\Lib\OAuthConsumer;
+use MediaWiki\Extension\OAuth\Lib\OAuthSignatureMethod_HMAC_SHA1;
+use MediaWiki\Extension\OAuth\Lib\OAuthToken;
/**
* The MIT License
@@ -32,6 +32,7 @@ use MediaWiki\Extensions\OAuth\Lib\OAuthToken;
/**
* @group OAuth
+ * @covers \MediaWiki\Extension\OAuth\Lib\OAuthSignatureMethod_HMAC_SHA1
*/
class OAuthSignatureMethodHmacSha1Test extends \PHPUnit\Framework\TestCase {
private $method;
diff --git a/OAuth/tests/phpunit/Lib/OAuthSignatureMethodRsaSha1Test.php b/OAuth/tests/phpunit/Lib/OAuthSignatureMethodRsaSha1Test.php
index 80beb699..f3f9f7fb 100644
--- a/OAuth/tests/phpunit/Lib/OAuthSignatureMethodRsaSha1Test.php
+++ b/OAuth/tests/phpunit/Lib/OAuthSignatureMethodRsaSha1Test.php
@@ -1,8 +1,8 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Lib;
+namespace MediaWiki\Extension\OAuth\Tests\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthConsumer;
+use MediaWiki\Extension\OAuth\Lib\OAuthConsumer;
/**
* The MIT License
@@ -30,6 +30,7 @@ use MediaWiki\Extensions\OAuth\Lib\OAuthConsumer;
/**
* @group OAuth
+ * @covers \MediaWiki\Extension\OAuth\Lib\OAuthSignatureMethod_RSA_SHA1
*/
class OAuthSignatureMethodRsaSha1Test extends \PHPUnit\Framework\TestCase {
private $method;
diff --git a/OAuth/tests/phpunit/Lib/OAuthTestUtils.php b/OAuth/tests/phpunit/Lib/OAuthTestUtils.php
index 5f362543..51891000 100644
--- a/OAuth/tests/phpunit/Lib/OAuthTestUtils.php
+++ b/OAuth/tests/phpunit/Lib/OAuthTestUtils.php
@@ -1,8 +1,8 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Lib;
+namespace MediaWiki\Extension\OAuth\Tests\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthRequest;
+use MediaWiki\Extension\OAuth\Lib\OAuthRequest;
/**
* A simple utils class for methods needed
diff --git a/OAuth/tests/phpunit/Lib/OAuthTokenTest.php b/OAuth/tests/phpunit/Lib/OAuthTokenTest.php
index 46000f09..8a26dab7 100644
--- a/OAuth/tests/phpunit/Lib/OAuthTokenTest.php
+++ b/OAuth/tests/phpunit/Lib/OAuthTokenTest.php
@@ -1,8 +1,8 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Lib;
+namespace MediaWiki\Extension\OAuth\Tests\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthToken;
+use MediaWiki\Extension\OAuth\Lib\OAuthToken;
/**
* The MIT License
@@ -30,6 +30,7 @@ use MediaWiki\Extensions\OAuth\Lib\OAuthToken;
/**
* @group OAuth
+ * @covers \MediaWiki\Extension\OAuth\Lib\OAuthToken
*/
class OAuthTokenTest extends \PHPUnit\Framework\TestCase {
public function testSerialize() {
diff --git a/OAuth/tests/phpunit/Lib/OAuthUtilTest.php b/OAuth/tests/phpunit/Lib/OAuthUtilTest.php
index 2a422269..68ca2ce5 100644
--- a/OAuth/tests/phpunit/Lib/OAuthUtilTest.php
+++ b/OAuth/tests/phpunit/Lib/OAuthUtilTest.php
@@ -1,8 +1,8 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Lib;
+namespace MediaWiki\Extension\OAuth\Tests\Lib;
-use MediaWiki\Extensions\OAuth\Lib\OAuthUtil;
+use MediaWiki\Extension\OAuth\Lib\OAuthUtil;
/**
* The MIT License
@@ -31,6 +31,7 @@ use MediaWiki\Extensions\OAuth\Lib\OAuthUtil;
/**
* Tests of OAuthUtil
* @group OAuth
+ * @covers \MediaWiki\Extension\OAuth\Lib\OAuthUtil
*/
class OAuthUtilTest extends \PHPUnit\Framework\TestCase {
public function testUrlencode() {
diff --git a/OAuth/tests/phpunit/Repository/AccessTokenRepositoryTest.php b/OAuth/tests/phpunit/Repository/AccessTokenRepositoryTest.php
index 084c30b3..7184d82b 100644
--- a/OAuth/tests/phpunit/Repository/AccessTokenRepositoryTest.php
+++ b/OAuth/tests/phpunit/Repository/AccessTokenRepositoryTest.php
@@ -1,27 +1,31 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Repository;
+namespace MediaWiki\Extension\OAuth\Tests\Repository;
-use MediaWiki\Extensions\OAuth\Entity\AccessTokenEntity;
-use MediaWiki\Extensions\OAuth\Repository\AccessTokenRepository;
-use MediaWiki\Extensions\OAuth\Tests\Entity\Mock_ClientEntity;
-use MediaWikiTestCase;
+use MediaWiki\Extension\OAuth\Entity\AccessTokenEntity;
+use MediaWiki\Extension\OAuth\Repository\AccessTokenRepository;
+use MediaWiki\Extension\OAuth\Tests\Entity\Mock_ClientEntity;
+use MediaWikiIntegrationTestCase;
/**
- * @covers \MediaWiki\Extensions\OAuth\Repository\AccessTokenRepository
+ * @covers \MediaWiki\Extension\OAuth\Repository\AccessTokenRepository
* @group Database
+ * @group OAuth
*/
-class AccessTokenRepositoryTest extends MediaWikiTestCase {
+class AccessTokenRepositoryTest extends MediaWikiIntegrationTestCase {
+ /** @var AccessTokenEntity */
protected $accessToken;
+ /** @var AccessTokenRepository */
protected $accessTokenRepo;
+ /** @inheritDoc */
protected $tablesUsed = [ 'oauth2_access_tokens' ];
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->accessToken = new AccessTokenEntity(
- Mock_ClientEntity::newMock( $this->getTestUser()->getUser() ), []
+ Mock_ClientEntity::newMock( $this->getTestUser()->getUser() ), [], 'dummy'
);
$identifier = bin2hex( random_bytes( 40 ) );
$this->accessToken->setIdentifier( $identifier );
@@ -29,7 +33,7 @@ class AccessTokenRepositoryTest extends MediaWikiTestCase {
( new \DateTimeImmutable() )->add( new \DateInterval( 'PT1H' ) )
);
- $this->accessTokenRepo = new AccessTokenRepository();
+ $this->accessTokenRepo = new AccessTokenRepository( 'dummy' );
}
public function testPersistingToken() {
@@ -49,4 +53,11 @@ class AccessTokenRepositoryTest extends MediaWikiTestCase {
'Access token should be revoked'
);
}
+
+ public function testGetNewToken() {
+ $client = Mock_ClientEntity::newMock( $this->getTestUser()->getUser() );
+ $token = $this->accessTokenRepo->getNewToken( $client, [] );
+ $this->assertSame( 'dummy', $token->getIssuer() );
+ $this->assertSame( $client, $token->getClient() );
+ }
}
diff --git a/OAuth/tests/phpunit/Repository/AuthCodeRepositoryTest.php b/OAuth/tests/phpunit/Repository/AuthCodeRepositoryTest.php
index 2d2dc431..aeb38ca4 100644
--- a/OAuth/tests/phpunit/Repository/AuthCodeRepositoryTest.php
+++ b/OAuth/tests/phpunit/Repository/AuthCodeRepositoryTest.php
@@ -1,19 +1,23 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Repository;
+namespace MediaWiki\Extension\OAuth\Tests\Repository;
-use MediaWiki\Extensions\OAuth\Repository\AuthCodeRepository;
-use MediaWiki\Extensions\OAuth\Tests\Entity\Mock_ClientEntity;
-use MediaWikiTestCase;
+use MediaWiki\Extension\OAuth\Entity\AuthCodeEntity;
+use MediaWiki\Extension\OAuth\Repository\AuthCodeRepository;
+use MediaWiki\Extension\OAuth\Tests\Entity\Mock_ClientEntity;
+use MediaWikiIntegrationTestCase;
/**
- * @covers \MediaWiki\Extensions\OAuth\Repository\AuthCodeRepository
+ * @covers \MediaWiki\Extension\OAuth\Repository\AuthCodeRepository
+ * @group OAuth
*/
-class AuthCodeRepositoryTest extends MediaWikiTestCase {
+class AuthCodeRepositoryTest extends MediaWikiIntegrationTestCase {
+ /** @var AuthCodeEntity */
protected $authCodeToken;
+ /** @var AuthCodeRepository */
protected $authCodeTokenRepo;
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->authCodeTokenRepo = AuthCodeRepository::factory();
diff --git a/OAuth/tests/phpunit/Repository/ClaimStoreTest.php b/OAuth/tests/phpunit/Repository/ClaimStoreTest.php
new file mode 100644
index 00000000..9ec040a6
--- /dev/null
+++ b/OAuth/tests/phpunit/Repository/ClaimStoreTest.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace MediaWiki\Extension\OAuth\Tests\Repository;
+
+use League\OAuth2\Server\Entities\ClientEntityInterface;
+use MediaWiki\Extension\OAuth\Entity\ClaimEntity;
+use MediaWiki\Extension\OAuth\Repository\ClaimStore;
+use MediaWiki\Extension\OAuth\Tests\Entity\Mock_ClientEntity;
+use MediaWikiIntegrationTestCase;
+
+/**
+ * @covers \MediaWiki\Extension\OAuth\Repository\ClaimStore
+ * @group Database
+ * @group OAuth
+ */
+class ClaimStoreTest extends MediaWikiIntegrationTestCase {
+
+ /**
+ * @var ClaimStore
+ */
+ private $oAuthClaimStore;
+
+ protected function setUp(): void {
+ $this->oAuthClaimStore = new ClaimStore();
+ }
+
+ public function provideClaims() {
+ yield 'empty claims' => [
+ [], []
+ ];
+
+ yield 'string claims' => [
+ [ 'str' => 'string' ], [ new ClaimEntity( 'str', 'string' ) ]
+ ];
+
+ yield 'number claims' => [
+ [ 'num' => 9 ], [ new ClaimEntity( 'num', 9 ) ]
+ ];
+
+ yield 'list of claims' => [
+ [
+ 'class' => 'dummy class',
+ 'another_str' => [
+ 'num' => 8,
+ 'str' => 'mock'
+ ]
+ ],
+ [
+ new ClaimEntity( 'class', 'dummy class' ),
+ new ClaimEntity( 'another_str',
+ [
+ 'num' => 8,
+ 'str' => 'mock'
+ ]
+ )
+ ]
+ ];
+ }
+
+ /**
+ * @dataProvider provideClaims
+ * @covers \MediaWiki\Extension\OAuth\Repository\ClaimStore::getClaims
+ */
+ public function testGetClaimsWithHook( $claims, $expectedClaims ) {
+ $client = Mock_ClientEntity::newMock( $this->getTestUser()->getUser() );
+ $hookCalled = false;
+
+ $this->setTemporaryHook(
+ 'OAuthClaimStoreGetClaims',
+ function ( string $grantType, ClientEntityInterface $clientEntity, array &$privateClaims )
+ use ( $claims, $client, &$hookCalled ) {
+ $this->assertEquals( $clientEntity->getName(), $client->getName() );
+ foreach ( $claims as $name => $value ) {
+ $privateClaims[] = new ClaimEntity( $name, $value );
+ }
+ $hookCalled = true;
+ }
+ );
+
+ $res = $this->oAuthClaimStore->getClaims(
+ 'fake_type',
+ $client
+ );
+
+ $this->assertTrue( $hookCalled );
+ foreach ( $expectedClaims as $index => $claimEntity ) {
+ $this->assertSame( $claimEntity->getName(), $res[$index]->getName() );
+ $this->assertSame( $claimEntity->getValue(), $res[$index]->getValue() );
+ }
+ }
+
+ public function testGetClaimsWithoutHook() {
+ $res = $this->oAuthClaimStore->getClaims(
+ 'fake_type',
+ Mock_ClientEntity::newMock( $this->getTestUser()->getUser() )
+ );
+
+ $this->assertEquals( [], $res );
+ }
+}
diff --git a/OAuth/tests/phpunit/Repository/ScopeRepositoryTest.php b/OAuth/tests/phpunit/Repository/ScopeRepositoryTest.php
index 41196aef..5bdd6ec6 100644
--- a/OAuth/tests/phpunit/Repository/ScopeRepositoryTest.php
+++ b/OAuth/tests/phpunit/Repository/ScopeRepositoryTest.php
@@ -1,15 +1,16 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Repository;
+namespace MediaWiki\Extension\OAuth\Tests\Repository;
-use MediaWiki\Extensions\OAuth\Entity\ScopeEntity;
-use MediaWiki\Extensions\OAuth\Repository\ScopeRepository;
-use MediaWikiTestCase;
+use MediaWiki\Extension\OAuth\Entity\ScopeEntity;
+use MediaWiki\Extension\OAuth\Repository\ScopeRepository;
+use MediaWikiIntegrationTestCase;
/**
- * @covers \MediaWiki\Extensions\OAuth\Repository\ScopeRepository
+ * @covers \MediaWiki\Extension\OAuth\Repository\ScopeRepository
+ * @group OAuth
*/
-class ScopeRepositoryTest extends MediaWikiTestCase {
+class ScopeRepositoryTest extends MediaWikiIntegrationTestCase {
public function testScopes() {
$repo = new ScopeRepository();
diff --git a/OAuth/tests/phpunit/Rest/AccessTokenEndpointTest.php b/OAuth/tests/phpunit/Rest/AccessTokenEndpointTest.php
index c3b7f8af..a3054354 100644
--- a/OAuth/tests/phpunit/Rest/AccessTokenEndpointTest.php
+++ b/OAuth/tests/phpunit/Rest/AccessTokenEndpointTest.php
@@ -1,12 +1,16 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Rest;
+namespace MediaWiki\Extension\OAuth\Tests\Rest;
+
+use MediaWiki\Extension\OAuth\Rest\Handler\AccessToken;
+use MediaWiki\Rest\Handler;
/**
- * @covers \MediaWiki\Extensions\OAuth\Rest\Handler\AccessToken
+ * @covers \MediaWiki\Extension\OAuth\Rest\Handler\AccessToken
+ * @group OAuth
*/
class AccessTokenEndpointTest extends EndpointTest {
- public static function provideTestViaRouter() {
+ public function provideTestHandlerExecute() {
return [
'normal' => [
[
@@ -26,18 +30,6 @@ class AccessTokenEndpointTest extends EndpointTest {
'protocolVersion' => '1.1'
]
],
- 'method not allowed' => [
- [
- 'method' => 'GET',
- 'uri' => self::makeUri( '/oauth2/access_token' ),
- ],
- [
- 'statusCode' => 405,
- 'reasonPhrase' => 'Method Not Allowed',
- 'protocolVersion' => '1.1',
- 'body' => '{"httpCode":405,"httpReason":"Method Not Allowed"}',
- ]
- ],
'invalid grant type' => [
[
'method' => 'POST',
@@ -69,4 +61,8 @@ class AccessTokenEndpointTest extends EndpointTest {
],
];
}
+
+ protected function newHandler(): Handler {
+ return AccessToken::factory();
+ }
}
diff --git a/OAuth/tests/phpunit/Rest/AuthorizationEndpointTest.php b/OAuth/tests/phpunit/Rest/AuthorizationEndpointTest.php
index 599c17c6..ca88086f 100644
--- a/OAuth/tests/phpunit/Rest/AuthorizationEndpointTest.php
+++ b/OAuth/tests/phpunit/Rest/AuthorizationEndpointTest.php
@@ -1,15 +1,19 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Rest;
+namespace MediaWiki\Extension\OAuth\Tests\Rest;
+
+use MediaWiki\Extension\OAuth\Rest\Handler\Authorize;
+use MediaWiki\Rest\Handler;
/**
- * @covers \MediaWiki\Extensions\OAuth\Rest\Handler\Authorize
+ * @covers \MediaWiki\Extension\OAuth\Rest\Handler\Authorize
+ * @group OAuth
*/
class AuthorizationEndpointTest extends EndpointTest {
/**
* @return array
*/
- public static function provideTestViaRouter() {
+ public function provideTestHandlerExecute() {
return [
'redirect to login' => [
[
@@ -25,19 +29,11 @@ class AuthorizationEndpointTest extends EndpointTest {
'reasonPhrase' => 'Temporary Redirect',
'protocolVersion' => '1.1'
]
- ],
- 'method not allowed' => [
- [
- 'method' => 'POST',
- 'uri' => self::makeUri( '/oauth2/authorize' ),
- ],
- [
- 'statusCode' => 405,
- 'reasonPhrase' => 'Method Not Allowed',
- 'protocolVersion' => '1.1',
- 'body' => '{"httpCode":405,"httpReason":"Method Not Allowed"}',
- ]
- ],
+ ]
];
}
+
+ protected function newHandler(): Handler {
+ return Authorize::factory();
+ }
}
diff --git a/OAuth/tests/phpunit/Rest/EndpointTest.php b/OAuth/tests/phpunit/Rest/EndpointTest.php
index 94638a58..35f58def 100644
--- a/OAuth/tests/phpunit/Rest/EndpointTest.php
+++ b/OAuth/tests/phpunit/Rest/EndpointTest.php
@@ -1,24 +1,30 @@
<?php
-namespace MediaWiki\Extensions\OAuth\Tests\Rest;
+namespace MediaWiki\Extension\OAuth\Tests\Rest;
-use EmptyBagOStuff;
+use FormatJson;
use GuzzleHttp\Psr7\Uri;
-use MediaWiki\Permissions\PermissionManager;
-use MediaWiki\Rest\BasicAccess\StaticBasicAuthorizer;
+use MediaWiki\Rest\Handler;
+use MediaWiki\Rest\HttpException;
use MediaWiki\Rest\RequestData;
-use MediaWiki\Rest\ResponseFactory;
-use MediaWiki\Rest\Router;
-use MediaWiki\Rest\Validator\Validator;
-use Psr\Container\ContainerInterface;
+use MediaWiki\Rest\RequestInterface;
+use MediaWiki\Tests\Rest\Handler\HandlerTestTrait;
use RequestContext;
use Title;
use User;
-use Wikimedia\ObjectFactory;
-abstract class EndpointTest extends \MediaWikiTestCase {
+/**
+ * Class EndpointTest
+ * @package MediaWiki\Extension\OAuth\Tests\Rest
+ */
+abstract class EndpointTest extends \MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ use HandlerTestTrait;
+
+ /**
+ * @throws \Exception
+ */
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
@@ -28,32 +34,46 @@ abstract class EndpointTest extends \MediaWikiTestCase {
RequestContext::getMain()->setTitle( Title::newMainPage() );
}
- abstract public static function provideTestViaRouter();
+ /**
+ * @return mixed
+ */
+ abstract public function provideTestHandlerExecute();
+ /**
+ * @param string $path
+ * @return Uri
+ */
protected static function makeUri( $path ) {
return new Uri( "http://www.example.com/rest$path" );
}
- /** @dataProvider provideTestViaRouter */
- public function testViaRouter( $requestInfo, $responseInfo ) {
- $objectFactory = new ObjectFactory(
- $this->getMockForAbstractClass( ContainerInterface::class )
- );
- $permissionManager = $this->createMock( PermissionManager::class );
+ abstract protected function newHandler(): Handler;
+
+ /**
+ * @param array $requestInfo
+ * @param array $responseInfo
+ * @param callable|null $userCreateCallback
+ * @param callable|null $extraValidationCallback
+ * @dataProvider provideTestHandlerExecute
+ */
+ public function testHandlerExecute(
+ array $requestInfo = [],
+ array $responseInfo = [],
+ callable $userCreateCallback = null,
+ callable $extraValidationCallback = null
+ ) {
$request = new RequestData( $requestInfo );
- $router = new Router(
- [ __DIR__ . '/testRoutes.json' ],
- [],
- 'http://wiki.example.com',
- '/rest',
- new EmptyBagOStuff(),
- new ResponseFactory( [] ),
- new StaticBasicAuthorizer(),
- $objectFactory,
- new Validator( $objectFactory, $permissionManager, $request, new User ),
- $this->createHookContainer()
- );
- $response = $router->execute( $request );
+
+ if ( $userCreateCallback ) {
+ $user = $userCreateCallback();
+ } else {
+ $user = new User();
+ }
+
+ // TODO: to remove this once REST is switched to Authority
+ RequestContext::getMain()->setUser( $user );
+
+ $response = $this->executeHandlerAndGetReponse( $this->newHandler(), $request, [], [], [], [], $user );
if ( isset( $responseInfo['statusCode'] ) ) {
$this->assertSame( $responseInfo['statusCode'], $response->getStatusCode() );
@@ -65,7 +85,15 @@ abstract class EndpointTest extends \MediaWikiTestCase {
$this->assertSame( $responseInfo['protocolVersion'], $response->getProtocolVersion() );
}
if ( isset( $responseInfo['body'] ) ) {
- $this->assertSame( $responseInfo['body'], $response->getBody()->getContents() );
+ $expectedBody = is_array( $responseInfo['body'] ) ?
+ $responseInfo['body'] :
+ FormatJson::decode( $responseInfo['body'], true );
+
+ $responseBody = FormatJson::decode( $response->getBody()->getContents(), true );
+
+ unset( $expectedBody['messageTranslations'] );
+ unset( $responseBody['messageTranslations'] );
+ $this->assertArrayEquals( $expectedBody, $responseBody );
}
$this->assertSame(
[],
@@ -76,5 +104,45 @@ abstract class EndpointTest extends \MediaWikiTestCase {
'body'
] ),
'$responseInfo may not contain unknown keys' );
+
+ if ( $extraValidationCallback ) {
+ $extraValidationCallback( $response );
+ }
+ }
+
+ /**
+ * Executes the given Handler on the given request.
+ *
+ * @param Handler $handler
+ * @param RequestInterface $request
+ * @param array $config
+ * @param array $hooks Hook overrides
+ * @param array $validatedParams Path/query params to return as already valid
+ * @param array $validatedBody Body params to return as already valid
+ * @param User|null $user User provided by request
+ * @return ResponseInterface
+ */
+ private function executeHandlerAndGetReponse(
+ Handler $handler,
+ RequestInterface $request,
+ $config = [],
+ $hooks = [],
+ $validatedParams = [],
+ $validatedBody = [],
+ ?User $user = null
+ ) {
+ try {
+ return $this->executeHandler(
+ $handler,
+ $request,
+ $config,
+ $hooks,
+ $validatedParams,
+ $validatedBody,
+ $user
+ );
+ } catch ( HttpException $e ) {
+ return $handler->getResponseFactory()->createFromException( $e );
+ }
}
}
diff --git a/OAuth/tests/phpunit/Rest/ListClientsEndpointTest.php b/OAuth/tests/phpunit/Rest/ListClientsEndpointTest.php
new file mode 100644
index 00000000..f4cc409a
--- /dev/null
+++ b/OAuth/tests/phpunit/Rest/ListClientsEndpointTest.php
@@ -0,0 +1,186 @@
+<?php
+
+namespace MediaWiki\Extension\OAuth\Tests\Rest;
+
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Tests\TestHandlerFactory;
+use MediaWiki\Rest\Handler;
+use MWRestrictions;
+use User;
+
+/**
+ * @covers \MediaWiki\Extension\OAuth\Rest\Handler\ListClients
+ * @group Database
+ * @group OAuth
+ */
+class ListClientsEndpointTest extends EndpointTest {
+
+ /**
+ * @throws \Exception
+ */
+ public function setUp(): void {
+ parent::setUp();
+ $this->tablesUsed[] = 'oauth_registered_consumer';
+ }
+
+ /**
+ * @var array
+ */
+ protected $consumerData = [
+ 'id' => null,
+ 'consumerKey' => null,
+ 'name' => 'lc_test_name',
+ 'userId' => null,
+ 'version' => '1',
+ 'callbackUrl' => 'https://test.com',
+ 'callbackIsPrefix' => null,
+ 'description' => 'test_description',
+ 'email' => 'test@test.com',
+ 'emailAuthenticated' => 1577836800,
+ 'oauthVersion' => 1,
+ 'developerAgreement' => 1,
+ 'ownerOnly' => false,
+ 'wiki' => '*',
+ 'grants' => '["test"]',
+ 'registration' => 1577836800,
+ 'secretKey' => 'sk111111111111111111111111111111',
+ 'rsaKey' => '',
+ 'restrictions' => '{"IPAddresses": ["127.0.0.1"]}',
+ 'stage' => 1,
+ 'stageTimestamp' => 1577836800,
+ 'deleted' => 0,
+ 'oauth2IsConfidential' => 1,
+ 'oauth2GrantTypes' => null,
+ ];
+
+ public function testNeedsWriteAccess() {
+ $this->assertFalse( $this->newHandler()->needsWriteAccess() );
+ }
+
+ /**
+ * @return array
+ */
+ public function provideTestHandlerExecute() {
+ return [
+ 'Non-empty result OAuth 1' => [
+ [
+ 'method' => 'GET',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'queryParams' => [
+ 'oauth_version' => '1'
+ ]
+ ],
+ [
+ 'statusCode' => 200,
+ 'reasonPhrase' => 'OK',
+ 'protocolVersion' => '1.1',
+ 'body' => '{"clients":[{"name":"lc_test_name","version":"1","callback_url":' .
+ '"https://test.com","description":"test_description","stage":1,"oauth_version":1,' .
+ '"registration_formatted":"00:00, 1 January 2020","scopes":["[\"test\"]"],' .
+ '"client_key":"lc111111111111111111111111111111", "owner_only":false}],"total":1}',
+ ],
+ function () {
+ $user = User::createNew( 'ListClientsTestUser1' );
+ $centralId = Utils::getCentralIdFromUserName( $user->getName() );
+ $db = Utils::getCentralDB( DB_PRIMARY );
+
+ $this->consumerData['userId'] = $centralId;
+ $this->consumerData['consumerKey'] = 'lc111111111111111111111111111111';
+
+ if ( isset( $this->consumerData['restrictions'] ) ) {
+ $this->consumerData['restrictions'] =
+ MWRestrictions::newFromJson( $this->consumerData['restrictions'] );
+ }
+
+ Consumer::newFromArray( $this->consumerData )->save( $db );
+
+ return $user;
+ }
+ ],
+ 'Non-empty result OAuth 2' => [
+ [
+ 'method' => 'GET',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'queryParams' => []
+ ],
+ [
+ 'statusCode' => 200,
+ 'reasonPhrase' => 'OK',
+ 'protocolVersion' => '1.1',
+ 'body' => '{"clients":[{"name":"lc_test_name","version":"1","callback_url":' .
+ '"https://test.com","description":"test_description","stage":1,"oauth_version":2,' .
+ '"registration_formatted":"00:00, 1 January 2020","allowed_grants":null,' .
+ '"scopes":["[\"test\"]"],' .
+ '"client_key":"lc222222222222222222222222222222", "owner_only":false}],"total":1}'
+ ],
+ function () {
+ $user = User::createNew( 'ListClientsTestUser2' );
+ $centralId = Utils::getCentralIdFromUserName( $user->getName() );
+ $db = Utils::getCentralDB( DB_PRIMARY );
+
+ $this->consumerData['userId'] = $centralId;
+ $this->consumerData['consumerKey'] = 'lc222222222222222222222222222222';
+ $this->consumerData['oauthVersion'] = '2';
+
+ if ( isset( $this->consumerData['restrictions'] ) ) {
+ $this->consumerData['restrictions'] =
+ MWRestrictions::newFromJson( $this->consumerData['restrictions'] );
+ }
+
+ Consumer::newFromArray( $this->consumerData )->save( $db );
+
+ return $user;
+ }
+ ],
+ 'Empty result' => [
+ [
+ 'method' => 'GET',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'queryParams' => []
+ ],
+ [
+ 'statusCode' => 200,
+ 'reasonPhrase' => 'OK',
+ 'protocolVersion' => '1.1',
+ 'body' => '{"clients":[],"total":0}'
+ ],
+ function () {
+ $user = User::createNew( 'ListClientsTestUser3' );
+ $db = Utils::getCentralDB( DB_PRIMARY );
+
+ /*
+ * Inserting client id for a different user than the one making the request.
+ * This proves filtering works.
+ */
+ $this->consumerData['userId'] = 99999;
+ $this->consumerData['consumerKey'] = 'lc333333333333333333333333333333';
+
+ Consumer::newFromArray( $this->consumerData )->save( $db );
+
+ return $user;
+ }
+ ],
+ 'Nonexistent user' => [
+ [
+ 'method' => 'GET',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'queryParams' => []
+ ],
+ [
+ 'statusCode' => 404,
+ 'reasonPhrase' => 'Not Found',
+ 'protocolVersion' => '1.1',
+ 'body' => [
+ 'httpCode' => 404,
+ 'httpReason' => 'Not Found',
+ ]
+ ]
+ ],
+ ];
+ }
+
+ protected function newHandler(): Handler {
+ return TestHandlerFactory::getListClients();
+ }
+}
diff --git a/OAuth/tests/phpunit/Rest/RequestClientEndpointTest.php b/OAuth/tests/phpunit/Rest/RequestClientEndpointTest.php
new file mode 100644
index 00000000..293bcdc8
--- /dev/null
+++ b/OAuth/tests/phpunit/Rest/RequestClientEndpointTest.php
@@ -0,0 +1,347 @@
+<?php
+
+namespace MediaWiki\Extension\OAuth\Tests\Rest;
+
+use FormatJson;
+use MediaWiki\Extension\OAuth\Rest\Handler\RequestClient;
+use MediaWiki\Rest\Handler;
+use MediaWiki\Rest\ResponseInterface;
+use User;
+use WikiMap;
+
+/**
+ * @covers \MediaWiki\Extension\OAuth\Rest\Handler\RequestClient
+ * @group Database
+ * @group OAuth
+ */
+class RequestClientEndpointTest extends EndpointTest {
+
+ /**
+ * @var array[]
+ */
+ private $postParams = [
+ 'name' => 'TestName',
+ 'version' => '1.0',
+ 'description' => 'TestDescription',
+ 'wiki' => '*',
+ 'owner_only' => false,
+ 'callback_url' => 'https://test.com',
+ 'callback_is_prefix' => false,
+ 'email' => 'test@test.com',
+ 'is_confidential' => false,
+ 'grant_types' => [ 'client_credentials' ],
+ 'scopes' => [],
+ ];
+
+ /**
+ * @var array[]
+ */
+ private $postParamsOwnerOnlyRestriction = [
+ 'callback_url' => false,
+ ];
+
+ /**
+ * @var array
+ */
+ private $postParamsEmailMismatch = [
+ 'email' => '_test@test.com',
+ ];
+
+ /**
+ * @var array
+ */
+ private $postParamsWrongGrantTypes = [
+ 'owner_only' => true,
+ 'grant_types' => [ 'authorization_code', 'refresh_token' ],
+ ];
+
+ /**
+ * @var array
+ */
+ private $postParamsOwnerOnly = [
+ 'owner_only' => true,
+ ];
+
+ /**
+ * @throws \Exception
+ */
+ protected function setUp(): void {
+ parent::setUp();
+
+ $this->setMwGlobals( [
+ 'wgMWOAuthCentralWiki' => WikiMap::getCurrentWikiId(),
+ 'wgGroupPermissions' => [
+ '*' => [ 'mwoauthproposeconsumer' => true ]
+ ],
+ 'wgEmailAuthentication' => false
+ ] );
+ $this->tablesUsed[] = 'oauth_registered_consumer';
+ }
+
+ /**
+ * @return array
+ */
+ public function provideTestHandlerExecute() {
+ return [
+ 'No POST params' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'postParams' => []
+ ],
+ [
+ 'statusCode' => 400,
+ 'reasonPhrase' => 'Bad Request',
+ 'protocolVersion' => '1.1'
+ ]
+ ],
+ 'Not logged in' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'postParams' => $this->postParams,
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 400,
+ 'reasonPhrase' => 'Bad Request',
+ 'protocolVersion' => '1.1'
+ ],
+ ],
+ 'Email not confirmed' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'postParams' => $this->postParams,
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 400,
+ 'reasonPhrase' => 'Bad Request',
+ 'protocolVersion' => '1.1'
+ ],
+ static function () {
+ return User::createNew( 'RequestClientTestUser1' );
+ }
+ ],
+ 'Missing Content-Type header' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'postParams' => $this->postParams,
+ 'headers' => [],
+ ],
+ [
+ 'statusCode' => 415,
+ 'reasonPhrase' => 'Unsupported Media Type',
+ 'protocolVersion' => '1.1'
+ ],
+ static function () {
+ $user = User::createNew( 'RequestClientTestUser3' );
+ $user->setEmail( 'test@test.com' );
+
+ return $user;
+ }
+ ],
+ 'Missing Callback URL for non-OwnerOnly client' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'postParams' => array_merge( $this->postParams, $this->postParamsOwnerOnlyRestriction ),
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 400,
+ 'reasonPhrase' => 'Bad Request',
+ 'protocolVersion' => '1.1'
+ ],
+ static function () {
+ $user = User::createNew( 'RequestClientTestUser4' );
+ $user->setEmail( 'test@test.com' );
+
+ return $user;
+ }
+ ],
+ 'Email Mismatch' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'postParams' => array_merge( $this->postParams, $this->postParamsEmailMismatch ),
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 400,
+ 'reasonPhrase' => 'Bad Request',
+ 'protocolVersion' => '1.1'
+ ],
+ static function () {
+ $user = User::createNew( 'RequestClientTestUser5' );
+ $user->setEmail( 'test@test.com' );
+
+ return $user;
+ }
+ ],
+ 'Invalid Grant Types for OwnerOnly client' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'postParams' => array_merge( $this->postParams, $this->postParamsWrongGrantTypes ),
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 400,
+ 'reasonPhrase' => 'Bad Request',
+ 'protocolVersion' => '1.1'
+ ],
+ static function () {
+ $user = User::createNew( 'RequestClientTestUser6' );
+ $user->setEmail( 'test@test.com' );
+
+ return $user;
+ }
+ ],
+ 'Successful request' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'postParams' => $this->postParams,
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 200,
+ 'reasonPhrase' => 'OK',
+ 'protocolVersion' => '1.1'
+ ],
+ static function () {
+ $user = User::createNew( 'RequestClientTestUser2' );
+ $user->setEmail( 'test@test.com' );
+
+ return $user;
+ }
+ ],
+ 'Successful request owner only' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'postParams' => array_merge( $this->postParams, $this->postParamsOwnerOnly ),
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 200,
+ 'reasonPhrase' => 'OK',
+ 'protocolVersion' => '1.1',
+ ],
+ static function () {
+ $user = User::createNew( 'RequestClientTestUser10' );
+ $user->setEmail( 'test@test.com' );
+
+ return $user;
+ },
+ function ( ResponseInterface $response ) {
+ $responseBody = FormatJson::decode(
+ $response->getBody()->getContents(),
+ true
+ );
+ $this->assertArrayHasKey( 'access_token', $responseBody );
+ $this->assertMatchesRegularExpression( '/((.*)\.(.*)\.(.*))/', $responseBody['access_token'] );
+ },
+ ],
+ 'Successful scopes values' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'postParams' => [ 'scopes' => 'basic' ] + $this->postParams,
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 200,
+ 'reasonPhrase' => 'OK',
+ 'protocolVersion' => '1.1'
+ ],
+ static function () {
+ $user = User::createNew( 'RequestClientTestUser7' );
+ $user->setEmail( 'test@test.com' );
+
+ return $user;
+ }
+ ],
+ 'Scope with mwoauth-authonly' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'postParams' => [ 'scopes' => 'mwoauth-authonly' ] + $this->postParams,
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 200,
+ 'reasonPhrase' => 'OK',
+ 'protocolVersion' => '1.1'
+ ],
+ static function () {
+ $user = User::createNew( 'RequestClientTestUser8' );
+ $user->setEmail( 'test@test.com' );
+
+ return $user;
+ }
+ ],
+ 'Scope with mwoauth-authonlyprivate' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'postParams' => [ 'scopes' => 'mwoauth-authonlyprivate' ] + $this->postParams,
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 200,
+ 'reasonPhrase' => 'OK',
+ 'protocolVersion' => '1.1'
+ ],
+ static function () {
+ $user = User::createNew( 'RequestClientTestUser9' );
+ $user->setEmail( 'test@test.com' );
+
+ return $user;
+ }
+ ],
+ 'Failed scopes values' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client' ),
+ 'postParams' => [ 'scopes' => 'wrong' ] + $this->postParams,
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 400,
+ 'reasonPhrase' => 'Bad Request',
+ 'protocolVersion' => '1.1'
+ ],
+ ],
+ ];
+ }
+
+ protected function newHandler(): Handler {
+ return new RequestClient();
+ }
+}
diff --git a/OAuth/tests/phpunit/Rest/ResetClientSecretEndpointTest.php b/OAuth/tests/phpunit/Rest/ResetClientSecretEndpointTest.php
new file mode 100644
index 00000000..6d7e3c52
--- /dev/null
+++ b/OAuth/tests/phpunit/Rest/ResetClientSecretEndpointTest.php
@@ -0,0 +1,302 @@
+<?php
+
+namespace MediaWiki\Extension\OAuth\Tests\Rest;
+
+use FormatJson;
+use MediaWiki\Extension\OAuth\Backend\Consumer;
+use MediaWiki\Extension\OAuth\Backend\Utils;
+use MediaWiki\Extension\OAuth\Rest\Handler\ResetClientSecret;
+use MediaWiki\Rest\Handler;
+use MediaWiki\Rest\ResponseInterface;
+use MWRestrictions;
+use User;
+use WikiMap;
+
+/**
+ * @covers \MediaWiki\Extension\OAuth\Rest\Handler\ResetClientSecret
+ * @group Database
+ * @group OAuth
+ */
+class ResetClientSecretEndpointTest extends EndpointTest {
+
+ /**
+ * @var array
+ */
+ protected $consumerData = [
+ 'id' => null,
+ 'consumerKey' => null,
+ 'name' => 'rc_test_name',
+ 'userId' => null,
+ 'version' => '1',
+ 'callbackUrl' => 'https://test.com',
+ 'callbackIsPrefix' => null,
+ 'description' => 'test_description',
+ 'email' => 'test@test.com',
+ 'emailAuthenticated' => 1577836800,
+ 'oauthVersion' => 1,
+ 'developerAgreement' => 1,
+ 'ownerOnly' => false,
+ 'wiki' => '*',
+ 'grants' => '["test"]',
+ 'registration' => 1577836800,
+ 'secretKey' => 'sk111111111111111111111111111111',
+ 'rsaKey' => '',
+ 'restrictions' => '{"IPAddresses": ["127.0.0.1"]}',
+ 'stage' => 1,
+ 'stageTimestamp' => 1577836800,
+ 'deleted' => 0,
+ 'oauth2IsConfidential' => 1,
+ 'oauth2GrantTypes' => null,
+ ];
+
+ /**
+ * @var array
+ */
+ private $consumerDataOwnerOnly = [
+ 'ownerOnly' => true,
+ 'oauth2GrantTypes' => [ 'client_credentials' ],
+ ];
+
+ /**
+ * @throws \Exception
+ */
+ protected function setUp(): void {
+ parent::setUp();
+
+ $this->setMwGlobals( [
+ 'wgMWOAuthCentralWiki' => WikiMap::getCurrentWikiId(),
+ 'wgGroupPermissions' => [
+ '*' => [ 'mwoauthupdateownconsumer' => true ]
+ ],
+ ] );
+ $this->tablesUsed[] = 'oauth_registered_consumer';
+ }
+
+ /**
+ * @return array
+ */
+ public function provideTestHandlerExecute() {
+ return [
+ 'Unsupported Media Type' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client/INVALID_CLIENT_KEY/reset_secret' ),
+ 'pathParams' => [ 'client_key' => 'INVALID_CLIENT_KEY' ]
+ ],
+ [
+ 'statusCode' => 415,
+ 'reasonPhrase' => 'Unsupported Media Type',
+ 'protocolVersion' => '1.1'
+ ]
+ ],
+ 'Missing Content-Type header' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client/11111111111111111111111111111111/reset_secret' ),
+ 'pathParams' => [ 'client_key' => '11111111111111111111111111111111' ],
+ 'headers' => [],
+ ],
+ [
+ 'statusCode' => 415,
+ 'reasonPhrase' => 'Unsupported Media Type',
+ 'protocolVersion' => '1.1'
+ ]
+ ],
+ 'Invalid client key' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client/22222222222222222222222222222222/reset_secret' ),
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ 'pathParams' => [ 'client_key' => '444444444' ],
+ ],
+ [
+ 'statusCode' => 400,
+ 'reasonPhrase' => 'Bad Request',
+ 'protocolVersion' => '1.1'
+ ],
+ ],
+ 'Deleted Consumer Request' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client/11111111111111111111111111111111/reset_secret' ),
+ 'pathParams' => [ 'client_key' => '11111111111111111111111111111111' ],
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 401,
+ 'reasonPhrase' => 'Unauthorized',
+ 'protocolVersion' => '1.1'
+ ],
+ function () {
+ $user = User::createNew( 'ResetClientSecretTestUser1' );
+ $centralId = Utils::getCentralIdFromUserName( $user->getName() );
+ $db = Utils::getCentralDB( DB_PRIMARY );
+
+ $this->consumerData['userId'] = $centralId;
+ $this->consumerData['consumerKey'] = '11111111111111111111111111111111';
+ $this->consumerData['deleted'] = true;
+
+ if ( isset( $this->consumerData['restrictions'] ) ) {
+ $this->consumerData['restrictions'] =
+ MWRestrictions::newFromJson( $this->consumerData['restrictions'] );
+ }
+
+ Consumer::newFromArray( $this->consumerData )->save( $db );
+
+ return $user;
+ }
+ ],
+ 'User Mismatch Request' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client/22222222222222222222222222222222/reset_secret' ),
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 400,
+ 'reasonPhrase' => 'Bad Request',
+ 'protocolVersion' => '1.1'
+ ],
+ function () {
+ $user = User::createNew( 'ResetClientSecretTestUser2' );
+ $db = Utils::getCentralDB( DB_PRIMARY );
+
+ $this->consumerData['userId'] = 999;
+ $this->consumerData['consumerKey'] = '22222222222222222222222222222222';
+ $this->consumerData['deleted'] = false;
+ $this->consumerData['name'] = 'test_name_user_mismatch';
+
+ if ( isset( $this->consumerData['restrictions'] ) ) {
+ $this->consumerData['restrictions'] =
+ MWRestrictions::newFromJson( $this->consumerData['restrictions'] );
+ }
+
+ Consumer::newFromArray( $this->consumerData )->save( $db );
+
+ return $user;
+ }
+ ],
+ 'Successful Request OAuth 1' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client/33333333333333333333333333333333/reset_secret' ),
+ 'pathParams' => [ 'client_key' => '33333333333333333333333333333333' ],
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 200,
+ 'reasonPhrase' => 'OK',
+ 'protocolVersion' => '1.1'
+ ],
+ function () {
+ $user = User::createNew( 'ResetClientSecretTestUser3' );
+ $centralId = Utils::getCentralIdFromUserName( $user->getName() );
+ $db = Utils::getCentralDB( DB_PRIMARY );
+
+ $this->consumerData['userId'] = $centralId;
+ $this->consumerData['consumerKey'] = '33333333333333333333333333333333';
+ $this->consumerData['name'] = 'test_name_user_successful';
+
+ if ( isset( $this->consumerData['restrictions'] ) ) {
+ $this->consumerData['restrictions'] =
+ MWRestrictions::newFromJson( $this->consumerData['restrictions'] );
+ }
+
+ Consumer::newFromArray( $this->consumerData )->save( $db );
+
+ return $user;
+ }
+ ],
+ 'Successful Request OAuth 2' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client/44444444444444444444444444444444/reset_secret' ),
+ 'pathParams' => [ 'client_key' => '44444444444444444444444444444444' ],
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 200,
+ 'reasonPhrase' => 'OK',
+ 'protocolVersion' => '1.1'
+ ],
+ function () {
+ $user = User::createNew( 'ResetClientSecretTestUser4' );
+ $centralId = Utils::getCentralIdFromUserName( $user->getName() );
+ $db = Utils::getCentralDB( DB_PRIMARY );
+
+ $this->consumerData['userId'] = $centralId;
+ $this->consumerData['consumerKey'] = '44444444444444444444444444444444';
+ $this->consumerData['name'] = 'test_name_user_successful';
+ $this->consumerData['oauthVersion'] = '2';
+
+ if ( isset( $this->consumerData['restrictions'] ) ) {
+ $this->consumerData['restrictions'] =
+ MWRestrictions::newFromJson( $this->consumerData['restrictions'] );
+ }
+
+ Consumer::newFromArray( $this->consumerData )->save( $db );
+
+ return $user;
+ }
+ ],
+ 'Successful Request OAuth 2 Owner Only' => [
+ [
+ 'method' => 'POST',
+ 'uri' => self::makeUri( '/oauth2/client/55555555555555555555555555555555/reset_secret' ),
+ 'pathParams' => [ 'client_key' => '55555555555555555555555555555555' ],
+ 'headers' => [
+ 'Content-Type' => 'application/json'
+ ],
+ ],
+ [
+ 'statusCode' => 200,
+ 'reasonPhrase' => 'OK',
+ 'protocolVersion' => '1.1'
+ ],
+ function () {
+ $user = User::createNew( 'ResetClientSecretTestUser5' );
+ $centralId = Utils::getCentralIdFromUserName( $user->getName() );
+ $db = Utils::getCentralDB( DB_PRIMARY );
+
+ $this->consumerData['userId'] = $centralId;
+ $this->consumerData['consumerKey'] = '55555555555555555555555555555555';
+ $this->consumerData['name'] = 'test_name_user_successful';
+ $this->consumerData['oauthVersion'] = '2';
+
+ if ( isset( $this->consumerData['restrictions'] ) ) {
+ $this->consumerData['restrictions'] =
+ MWRestrictions::newFromJson( $this->consumerData['restrictions'] );
+ }
+
+ Consumer::newFromArray(
+ array_merge( $this->consumerData, $this->consumerDataOwnerOnly )
+ )->save( $db );
+
+ return $user;
+ },
+ function ( ResponseInterface $response ) {
+ $responseBody = FormatJson::decode(
+ $response->getBody()->getContents(),
+ true
+ );
+ $this->assertArrayHasKey( 'access_token', $responseBody );
+ $this->assertMatchesRegularExpression( '/((.*)\.(.*)\.(.*))/', $responseBody['access_token'] );
+ }
+ ],
+ ];
+ }
+
+ protected function newHandler(): Handler {
+ return new ResetClientSecret();
+ }
+}
diff --git a/OAuth/tests/phpunit/Rest/testRoutes.json b/OAuth/tests/phpunit/Rest/testRoutes.json
index 031f0cc4..ae1d184e 100644
--- a/OAuth/tests/phpunit/Rest/testRoutes.json
+++ b/OAuth/tests/phpunit/Rest/testRoutes.json
@@ -1,15 +1,33 @@
[
- {
- "path": "/oauth2/authorize",
- "factory": "MediaWiki\\Extensions\\OAuth\\Rest\\Handler\\Authorize::factory"
- },
- {
- "path": "/oauth2/access_token",
- "factory": "MediaWiki\\Extensions\\OAuth\\Rest\\Handler\\AccessToken::factory",
- "method": "POST"
- },
- {
- "path": "/oauth2/resource/{{type}}",
- "factory": "MediaWiki\\Extensions\\OAuth\\Rest\\Handler\\Resource::factory"
- }
+ {
+ "path": "/oauth2/authorize",
+ "factory": "MediaWiki\\Extensions\\OAuth\\Rest\\Handler\\Authorize::factory"
+ },
+ {
+ "path": "/oauth2/access_token",
+ "factory": "MediaWiki\\Extensions\\OAuth\\Rest\\Handler\\AccessToken::factory",
+ "method": "POST"
+ },
+ {
+ "path": "/oauth2/resource/{{type}}",
+ "factory": "MediaWiki\\Extensions\\OAuth\\Rest\\Handler\\Resource::factory"
+ },
+ {
+ "path": "/oauth2/client",
+ "class": "MediaWiki\\Extensions\\OAuth\\Rest\\Handler\\RequestClient",
+ "method": "POST"
+ },
+ {
+ "path": "/oauth2/client/{client_key}/reset_secret",
+ "class": "MediaWiki\\Extensions\\OAuth\\Rest\\Handler\\ResetClientSecret",
+ "method": "POST"
+ },
+ {
+ "path": "/oauth2/client",
+ "factory": "MediaWiki\\Extensions\\OAuth\\Tests\\TestHandlerFactory::getListClients",
+ "services": [
+ "DBLoadBalancer"
+ ],
+ "method": "GET"
+ }
]
diff --git a/OAuth/tests/phpunit/SessionProviderTest.php b/OAuth/tests/phpunit/SessionProviderTest.php
index 60df85f3..84138e81 100644
--- a/OAuth/tests/phpunit/SessionProviderTest.php
+++ b/OAuth/tests/phpunit/SessionProviderTest.php
@@ -21,19 +21,20 @@
* @file
*/
-namespace MediaWiki\Extensions\OAuth\Tests;
+namespace MediaWiki\Extension\OAuth\Tests;
-use MediaWiki\Extensions\OAuth\SessionProvider;
-use MediaWikiTestCase;
+use MediaWiki\Extension\OAuth\SessionProvider;
+use MediaWikiIntegrationTestCase;
+use RecentChange;
/**
- * @covers \MediaWiki\Extensions\OAuth\SessionProvider
+ * @covers \MediaWiki\Extension\OAuth\SessionProvider
* @group OAuth
* @license GPL-2.0-or-later
*/
-class SessionProviderTest extends MediaWikiTestCase {
+class SessionProviderTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
// the SessionProvider constructor modifies $wgHooks, stash it
global $wgHooks;
@@ -52,7 +53,7 @@ class SessionProviderTest extends MediaWikiTestCase {
*/
public function testOnMarkPatrolled( $consumerId, $auto, $expectedExtraTag ) {
$provider = $this->getMockBuilder( SessionProvider::class )
- ->setMethods( [ 'getPublicConsumerId' ] )
+ ->onlyMethods( [ 'getPublicConsumerId' ] )
->getMock();
$provider->expects( $this->once() )
->method( 'getPublicConsumerId' )
@@ -98,4 +99,38 @@ class SessionProviderTest extends MediaWikiTestCase {
];
}
+ /**
+ * @dataProvider provideOnRecentChangeSave
+ */
+ public function testOnRecentChangeSave( $expectedConsumerId ) {
+ $provider = $this->getMockBuilder( SessionProvider::class )
+ ->setMethodsExcept( [ 'onRecentChange_save' ] )
+ ->onlyMethods( [ 'getPublicConsumerId' ] )
+ ->getMock();
+ $provider->expects( $this->once() )
+ ->method( 'getPublicConsumerId' )
+ ->willReturn( $expectedConsumerId );
+ $rc = $this->getMockBuilder( RecentChange::class )
+ ->onlyMethods( [ 'addTags', 'getPerformerIdentity' ] )
+ ->getMock();
+ $rc->expects( $this->once() )
+ ->method( 'getPerformerIdentity' )
+ ->willReturn( $this->getTestUser()->getUser() );
+
+ if ( $expectedConsumerId !== null ) {
+ $rc->expects( $this->once() )
+ ->method( 'addTags' );
+ }
+ $this->assertTrue( $provider->onRecentChange_save( $rc ) );
+ }
+
+ public function provideOnRecentChangeSave() {
+ yield 'no consumer' => [
+ null,
+ ];
+
+ yield 'consumer 123' => [
+ 123,
+ ];
+ }
}
diff --git a/OAuth/tests/phpunit/TestHandlerFactory.php b/OAuth/tests/phpunit/TestHandlerFactory.php
new file mode 100644
index 00000000..19457c37
--- /dev/null
+++ b/OAuth/tests/phpunit/TestHandlerFactory.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace MediaWiki\Extension\OAuth\Tests;
+
+use MediaWiki\Extension\OAuth\Rest\Handler\ListClients;
+use MediaWiki\MediaWikiServices;
+
+/**
+ * Class TestHandlerFactory
+ *
+ * Used to retrieve Handlers for unit tests.
+ *
+ * @package MediaWiki\Extension\OAuth\Rest\Handler
+ */
+class TestHandlerFactory {
+
+ /**
+ * @return ListClients
+ */
+ public static function getListClients() {
+ $loadBalancer = MediaWikiServices::getInstance()
+ ->getDBLoadBalancerFactory()
+ ->getMainLB();
+
+ return new ListClients(
+ $loadBalancer
+ );
+ }
+}