From 09f1f1c2c21fcd1f443b524b34fe103e24a1b34b Mon Sep 17 00:00:00 2001 From: Sasha Sorokin Date: Tue, 29 Mar 2022 13:04:39 +0400 Subject: [PATCH 01/26] fix(oauth): upgrade apple token --- src/actions/oauth/upgrade.js | 18 ++++++++++--- src/auth/oauth/strategies/apple.js | 30 +++++++++++++++++++++- src/configs/oauth.js | 1 + src/templates/providerAttached.hbs | 4 ++- test/suites/actions/oauth/upgrade.apple.js | 26 +++++++++++++++++++ 5 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 test/suites/actions/oauth/upgrade.apple.js diff --git a/src/actions/oauth/upgrade.js b/src/actions/oauth/upgrade.js index 3dbcda18c..98a9060a3 100644 --- a/src/actions/oauth/upgrade.js +++ b/src/actions/oauth/upgrade.js @@ -1,9 +1,11 @@ const { strict: assert } = require('assert'); +const Boom = require('@hapi/boom'); const { ActionTransport } = require('@microfleet/plugin-router'); const { oauthVerification, mserviceVerification } = require('../../auth/oauth'); const formOAuthResponse = require('../../auth/oauth/utils/form-oauth-response'); +const { validateGrantCode } = require('../../auth/oauth/strategies/apple'); /** * @api {amqp} .oauth.upgrade Upgardes existing SSO token to service-verified token @@ -36,10 +38,20 @@ async function upgrade(request) { query.jwt = params.jwt; } - const initialReq = { token, query }; + let credentials; - // verifies token by retreiving profile - const credentials = await profile.call(providerSettings, initialReq); + if (provider === 'apple') { + try { + const tokenResponse = await validateGrantCode(providerSettings, token); + credentials = await profile(providerSettings, tokenResponse); + credentials.query = query; + } catch (error) { + throw Boom.internal(error); + } + } else { + // verifies token by retreiving profile + credentials = await profile.call(providerSettings, { token, query }); + } // ensure its a shallow copy as we will mutate it later const oauthConfig = { ...this.config.oauth.providers[provider] }; diff --git a/src/auth/oauth/strategies/apple.js b/src/auth/oauth/strategies/apple.js index f912d171c..b753e5c06 100644 --- a/src/auth/oauth/strategies/apple.js +++ b/src/auth/oauth/strategies/apple.js @@ -1,6 +1,7 @@ const { sign, verify } = require('jsonwebtoken'); const getJwksClient = require('jwks-rsa'); const Bluebird = require('bluebird'); +const httpRequest = require('request-promise'); // @todo more options from config const jwksClient = getJwksClient({ @@ -54,8 +55,13 @@ function getJwkFromResponse(header, callback) { } async function getProfile(credentials, params) { + const { + access_token: accessToken, + id_token: idToken, + refresh_token: refreshToken, + } = params; const response = await Bluebird.fromCallback( - (callback) => verify(params.id_token, getJwkFromResponse, callback) + (callback) => verify(idToken, getJwkFromResponse, callback) ); const { sub, @@ -71,11 +77,30 @@ async function getProfile(credentials, params) { emailVerified, isPrivateEmail, id: sub, + accessToken, + idToken, + refreshToken, }; return credentials; } +async function validateGrantCode(providerSettings, code) { + const { provider, location, clientId, clientSecret } = providerSettings; + const response = await httpRequest.post(provider.token, { + form: { + code, + client_id: clientId, + client_secret: clientSecret(), + grant_type: 'authorization_code', + redirect_uri: location, + }, + json: true, + }); + + return response; +} + function getProvider(options, server) { const { clientId, @@ -85,6 +110,7 @@ function getProvider(options, server) { password, isSameSite, cookie, + location, } = options; // adds the "code" parameter to the query string for bell to work correctly @@ -95,6 +121,7 @@ function getProvider(options, server) { clientId, isSameSite, cookie, + location, clientSecret: () => getSecretKey(teamId, clientId, keyId, privateKey), forceHttps: true, providerParams: { @@ -115,5 +142,6 @@ function getProvider(options, server) { module.exports = { transformAccountToResponseFormat, + validateGrantCode, options: getProvider, }; diff --git a/src/configs/oauth.js b/src/configs/oauth.js index 55edea70e..38b22c60a 100644 --- a/src/configs/oauth.js +++ b/src/configs/oauth.js @@ -54,6 +54,7 @@ exports.oauth = { password: 'very-long-encryption-password-that-needs-to-be-changed', cookie: 'mf_bapp', isSameSite: 'Lax', + location: 'https://ms-users.local/users/oauth/upgrade', // used for upgrade token only! }, }, }; diff --git a/src/templates/providerAttached.hbs b/src/templates/providerAttached.hbs index 52c1dc555..b246ac507 100644 --- a/src/templates/providerAttached.hbs +++ b/src/templates/providerAttached.hbs @@ -9,7 +9,9 @@ + + diff --git a/test/suites/actions/oauth/apple.js b/test/suites/actions/oauth/apple.js index 55cf17ba1..4c65cc408 100644 --- a/test/suites/actions/oauth/apple.js +++ b/test/suites/actions/oauth/apple.js @@ -7,6 +7,7 @@ const Users = require('../../../../src'); describe('sign in with apple', function suite() { let service; + afterEach(async () => { await service?.close(); }); @@ -120,4 +121,62 @@ describe('sign in with apple', function suite() { Bell.simulate(false); }); + + it('should be able to return auth code (init sign in and redirect to apple.com)', async () => { + // it's here because of Bell.simulate + service = new Users({ oauth: { providers: { apple: { enabled: true } } } }); + await service.connect(); + + const { headers } = await request.get('https://ms-users.local/users/oauth/apple?authCode=1', { + strictSSL: false, + followRedirect: false, + simple: false, + resolveWithFullResponse: true, + }); + + assert(headers.location !== undefined); + + const redirectUri = new URL(headers.location); + + strictEqual(redirectUri.origin, 'https://appleid.apple.com'); + strictEqual(redirectUri.pathname, '/auth/authorize'); + strictEqual(redirectUri.hash, ''); + strictEqual(redirectUri.searchParams.get('response_mode'), 'form_post'); + strictEqual(redirectUri.searchParams.get('response_type'), 'code'); + strictEqual(redirectUri.searchParams.get('client_id'), 'com.test.service'); + strictEqual(redirectUri.searchParams.get('redirect_uri'), 'https://ms-users.local/users/oauth/apple-code'); + strictEqual(redirectUri.searchParams.get('scope'), 'name email'); + assert(redirectUri.searchParams.get('state') !== undefined); + + this.state = redirectUri.searchParams.get('state'); + // bell cookie + [this.cookie] = headers['set-cookie'][0].split(';'); + }); + + // depends on previous test + it('should be able to return auth code (callback from apple.com with code)', async () => { + service = new Users({ oauth: { providers: { apple: { enabled: true } } } }); + await service.connect(); + + const response = await request.post('https://ms-users.local/users/oauth/apple-code', { + form: { + state: this.state, + code: 'cd776798269fb4d2fb619fe5766b5a4a1.0.rrqty.9vb4ocSgzKC-b5DAAJM31g', + user: '{"name":{"firstName":"Perchik","lastName":"The Cat"},"email":"q5skaas7cn@privaterelay.appleid.com"}', + }, + headers: { + cookie: this.cookie, + }, + followRedirect: false, + simple: false, + resolveWithFullResponse: true, + strictSSL: false, + }); + + // extract JSON from html response + const body = JSON.parse(response.body.match(/{".+"}/)[0].replace('undefined', 'null')); + + strictEqual(body.code, 'cd776798269fb4d2fb619fe5766b5a4a1.0.rrqty.9vb4ocSgzKC-b5DAAJM31g'); + strictEqual(body.user, '{"name":{"firstName":"Perchik","lastName":"The Cat"},"email":"q5skaas7cn@privaterelay.appleid.com"}'); + }); }); From 83d42a16ad1399b577ae0cf8640ebf4846c0bb91 Mon Sep 17 00:00:00 2001 From: Sasha S Date: Thu, 16 Jun 2022 11:27:11 +0300 Subject: [PATCH 09/26] fix: revert apple-code --- schemas/oauth/apple-code.json | 22 ----------- schemas/oauth/apple.json | 10 +---- schemas/oauth/upgrade.json | 4 -- src/actions/oauth/apple-code.js | 35 ------------------ src/actions/oauth/upgrade.js | 2 +- src/auth/oauth/strategies/apple.js | 8 ---- src/templates/apple-code.hbs | 23 ------------ test/suites/actions/oauth/apple.js | 59 ------------------------------ 8 files changed, 2 insertions(+), 161 deletions(-) delete mode 100644 schemas/oauth/apple-code.json delete mode 100644 src/actions/oauth/apple-code.js delete mode 100644 src/templates/apple-code.hbs diff --git a/schemas/oauth/apple-code.json b/schemas/oauth/apple-code.json deleted file mode 100644 index 31cc15d82..000000000 --- a/schemas/oauth/apple-code.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$id": "oauth.apple-code", - "type": "object", - "additionalProperties": false, - "properties": { - "state": { - "description": "Bell state created on init sign in", - "type": "string", - "maxLength": 512 - }, - "code": { - "description": "Apple auth code", - "type": "string", - "maxLength": 512 - }, - "user": { - "description": "JSON with user info from Apple", - "type": "string", - "maxLength": 2048 - } - } -} diff --git a/schemas/oauth/apple.json b/schemas/oauth/apple.json index eced4b35c..61cf3b8d6 100644 --- a/schemas/oauth/apple.json +++ b/schemas/oauth/apple.json @@ -1,13 +1,5 @@ { "$id": "oauth.apple", "type": "object", - "additionalProperties": true, - "properties": { - "authCode": { - "description": "Pass this parameter to return apple auth code only (this section using for description only, has no validation effect, details: `src/auth/oauth/strategies/apple.js`)", - "type": "string", - "enum": ["0", "1"], - "default": "0" - } - } + "additionalProperties": true } diff --git a/schemas/oauth/upgrade.json b/schemas/oauth/upgrade.json index 33d62447b..143b74322 100644 --- a/schemas/oauth/upgrade.json +++ b/schemas/oauth/upgrade.json @@ -19,10 +19,6 @@ }, "isStatelessAuth": { "type": "boolean" - }, - "authCode": { - "description": "Used for `apple` provider to select right redirect url.", - "type": "boolean" } } } diff --git a/src/actions/oauth/apple-code.js b/src/actions/oauth/apple-code.js deleted file mode 100644 index 3a1f3d381..000000000 --- a/src/actions/oauth/apple-code.js +++ /dev/null @@ -1,35 +0,0 @@ -const url = require('url'); -const serialize = require('serialize-javascript'); - -const { ActionTransport } = require('@microfleet/plugin-router'); - -async function appleCodeCallbackAction(request) { - // will be copied over from mail server configuration - const { config: { server, oauth: { debug } } } = this; - const targetOrigin = debug ? '*' : url.format({ - proto: server.proto, - host: server.host, - port: server.port, - }); - const { code, user } = request.params; - - return request.transportRequest.sendView('apple-code', { - targetOrigin, - params: serialize({ code, user }), - }); -} - -// @TODO check Bell state -// async function isAllowed(request) { - -// } - -// appleCodeCallbackAction.allowed = isAllowed; -appleCodeCallbackAction.transports = [ActionTransport.http]; -appleCodeCallbackAction.transportOptions = { - [ActionTransport.http]: { - methods: ['post'], - }, -}; - -module.exports = appleCodeCallbackAction; diff --git a/src/actions/oauth/upgrade.js b/src/actions/oauth/upgrade.js index 7a0c6aa6f..90a320fcf 100644 --- a/src/actions/oauth/upgrade.js +++ b/src/actions/oauth/upgrade.js @@ -43,7 +43,7 @@ async function upgrade(request) { if (provider === 'apple') { try { const redirectUrl = transportRequest.url.href - .replace(/\/upgrade$/, params.authCode ? '/apple-code' : '/apple') + .replace(/\/upgrade$/, '/apple') .replace(/^http:\/\//, 'https://'); const tokenResponse = await validateGrantCode(providerSettings, token, redirectUrl); credentials = await profile(providerSettings, tokenResponse); diff --git a/src/auth/oauth/strategies/apple.js b/src/auth/oauth/strategies/apple.js index 86ec327d0..04a99105f 100644 --- a/src/auth/oauth/strategies/apple.js +++ b/src/auth/oauth/strategies/apple.js @@ -122,14 +122,6 @@ function getProvider(options, server) { cookie, clientSecret: () => getSecretKey(teamId, clientId, keyId, privateKey), forceHttps: true, - location: (r) => { - if (r.query.authCode === '1') { - // @TODO make path using router method - return `${r.headers['x-forwarded-proto'] || r.connection.info.protocol}://${r.info.host}${r.path}-code`; - } - - return null; - }, providerParams: { response_mode: 'form_post', response_type: 'code', // has no effect, bell forces query.response_type = 'code' diff --git a/src/templates/apple-code.hbs b/src/templates/apple-code.hbs deleted file mode 100644 index d26e65cf1..000000000 --- a/src/templates/apple-code.hbs +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - {{ title }} - - - - - - - diff --git a/test/suites/actions/oauth/apple.js b/test/suites/actions/oauth/apple.js index 4c65cc408..55cf17ba1 100644 --- a/test/suites/actions/oauth/apple.js +++ b/test/suites/actions/oauth/apple.js @@ -7,7 +7,6 @@ const Users = require('../../../../src'); describe('sign in with apple', function suite() { let service; - afterEach(async () => { await service?.close(); }); @@ -121,62 +120,4 @@ describe('sign in with apple', function suite() { Bell.simulate(false); }); - - it('should be able to return auth code (init sign in and redirect to apple.com)', async () => { - // it's here because of Bell.simulate - service = new Users({ oauth: { providers: { apple: { enabled: true } } } }); - await service.connect(); - - const { headers } = await request.get('https://ms-users.local/users/oauth/apple?authCode=1', { - strictSSL: false, - followRedirect: false, - simple: false, - resolveWithFullResponse: true, - }); - - assert(headers.location !== undefined); - - const redirectUri = new URL(headers.location); - - strictEqual(redirectUri.origin, 'https://appleid.apple.com'); - strictEqual(redirectUri.pathname, '/auth/authorize'); - strictEqual(redirectUri.hash, ''); - strictEqual(redirectUri.searchParams.get('response_mode'), 'form_post'); - strictEqual(redirectUri.searchParams.get('response_type'), 'code'); - strictEqual(redirectUri.searchParams.get('client_id'), 'com.test.service'); - strictEqual(redirectUri.searchParams.get('redirect_uri'), 'https://ms-users.local/users/oauth/apple-code'); - strictEqual(redirectUri.searchParams.get('scope'), 'name email'); - assert(redirectUri.searchParams.get('state') !== undefined); - - this.state = redirectUri.searchParams.get('state'); - // bell cookie - [this.cookie] = headers['set-cookie'][0].split(';'); - }); - - // depends on previous test - it('should be able to return auth code (callback from apple.com with code)', async () => { - service = new Users({ oauth: { providers: { apple: { enabled: true } } } }); - await service.connect(); - - const response = await request.post('https://ms-users.local/users/oauth/apple-code', { - form: { - state: this.state, - code: 'cd776798269fb4d2fb619fe5766b5a4a1.0.rrqty.9vb4ocSgzKC-b5DAAJM31g', - user: '{"name":{"firstName":"Perchik","lastName":"The Cat"},"email":"q5skaas7cn@privaterelay.appleid.com"}', - }, - headers: { - cookie: this.cookie, - }, - followRedirect: false, - simple: false, - resolveWithFullResponse: true, - strictSSL: false, - }); - - // extract JSON from html response - const body = JSON.parse(response.body.match(/{".+"}/)[0].replace('undefined', 'null')); - - strictEqual(body.code, 'cd776798269fb4d2fb619fe5766b5a4a1.0.rrqty.9vb4ocSgzKC-b5DAAJM31g'); - strictEqual(body.user, '{"name":{"firstName":"Perchik","lastName":"The Cat"},"email":"q5skaas7cn@privaterelay.appleid.com"}'); - }); }); From 78649b75a908f2e23447d198f61d01ba67b06c2b Mon Sep 17 00:00:00 2001 From: Sasha S Date: Thu, 16 Jun 2022 16:54:42 +0300 Subject: [PATCH 10/26] fix: apple code upgrade --- src/auth/oauth/strategies/apple.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/auth/oauth/strategies/apple.js b/src/auth/oauth/strategies/apple.js index 04a99105f..de11e7627 100644 --- a/src/auth/oauth/strategies/apple.js +++ b/src/auth/oauth/strategies/apple.js @@ -54,12 +54,12 @@ function getJwkFromResponse(header, callback) { }); } -async function getProfile(credentials, params) { +async function getProfile(providerSettings, tokenResponse) { const { access_token: accessToken, id_token: idToken, refresh_token: refreshToken, - } = params; + } = tokenResponse; const response = await Bluebird.fromCallback( (callback) => verify(idToken, getJwkFromResponse, callback) ); @@ -70,9 +70,9 @@ async function getProfile(credentials, params) { is_private_email: isPrivateEmail, } = response; - credentials.email = email; - credentials.profile = { id: sub, email }; - credentials.internals = { + tokenResponse.email = email; + tokenResponse.profile = { id: sub, email }; + tokenResponse.internals = { email, emailVerified, isPrivateEmail, @@ -82,7 +82,7 @@ async function getProfile(credentials, params) { refreshToken, }; - return credentials; + return tokenResponse; } async function validateGrantCode(providerSettings, code, redirectUrl) { From 8cf69f888655408aba7e46490defe44b6f9947e5 Mon Sep 17 00:00:00 2001 From: Sasha S Date: Thu, 16 Jun 2022 17:28:18 +0300 Subject: [PATCH 11/26] fix: apple code upgrade --- src/actions/oauth/upgrade.js | 3 +-- src/auth/oauth/strategies/apple.js | 16 +++++++++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/actions/oauth/upgrade.js b/src/actions/oauth/upgrade.js index 90a320fcf..6ab983a31 100644 --- a/src/actions/oauth/upgrade.js +++ b/src/actions/oauth/upgrade.js @@ -46,8 +46,7 @@ async function upgrade(request) { .replace(/\/upgrade$/, '/apple') .replace(/^http:\/\//, 'https://'); const tokenResponse = await validateGrantCode(providerSettings, token, redirectUrl); - credentials = await profile(providerSettings, tokenResponse); - credentials.query = query; + credentials = await profile(providerSettings, tokenResponse, query); } catch (error) { throw Boom.internal(error); } diff --git a/src/auth/oauth/strategies/apple.js b/src/auth/oauth/strategies/apple.js index de11e7627..8243a2853 100644 --- a/src/auth/oauth/strategies/apple.js +++ b/src/auth/oauth/strategies/apple.js @@ -54,11 +54,13 @@ function getJwkFromResponse(header, callback) { }); } -async function getProfile(providerSettings, tokenResponse) { +async function getProfile(providerSettings, tokenResponse, query) { const { access_token: accessToken, id_token: idToken, refresh_token: refreshToken, + token_type: tokenType, + expires_in: expiresIn, } = tokenResponse; const response = await Bluebird.fromCallback( (callback) => verify(idToken, getJwkFromResponse, callback) @@ -69,10 +71,12 @@ async function getProfile(providerSettings, tokenResponse) { email_verified: emailVerified, is_private_email: isPrivateEmail, } = response; + const credentials = Object.create(null); - tokenResponse.email = email; - tokenResponse.profile = { id: sub, email }; - tokenResponse.internals = { + credentials.query = query; + credentials.email = email; + credentials.profile = { id: sub, email }; + credentials.internals = { email, emailVerified, isPrivateEmail, @@ -80,9 +84,11 @@ async function getProfile(providerSettings, tokenResponse) { accessToken, idToken, refreshToken, + tokenType, + expiresIn, }; - return tokenResponse; + return credentials; } async function validateGrantCode(providerSettings, code, redirectUrl) { From ca6e2f34e3129869192e3f59c54b92056b41133f Mon Sep 17 00:00:00 2001 From: Sasha S Date: Fri, 17 Jun 2022 11:20:19 +0300 Subject: [PATCH 12/26] fix: use appId as clientid in upgrade --- schemas/config.json | 4 ++++ src/auth/oauth/hapi.js | 4 ++-- src/auth/oauth/strategies/apple.js | 10 ++++++---- src/configs/oauth.js | 3 +++ test/suites/actions/oauth/upgrade.apple.js | 2 +- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/schemas/config.json b/schemas/config.json index ff1f4293c..a65335c81 100644 --- a/schemas/config.json +++ b/schemas/config.json @@ -464,6 +464,10 @@ "retryOnMissingPermissions": { "type": "boolean" }, + "appId": { + "type": "string", + "minLength": 1 + }, "clientId": { "type": "string", "minLength": 1 diff --git a/src/auth/oauth/hapi.js b/src/auth/oauth/hapi.js index 62c50038f..bff440a64 100644 --- a/src/auth/oauth/hapi.js +++ b/src/auth/oauth/hapi.js @@ -1,6 +1,6 @@ const is = require('is'); const { strict: assert } = require('assert'); -const defaults = require('lodash/defaults'); +const { defaults, omit } = require('lodash'); const { providers: Providers } = require('@hapi/bell'); const strategies = require('./providers'); @@ -83,7 +83,7 @@ module.exports = function OauthHandler(server, config) { const settings = name === 'apple' ? defaultOptions(options, server) : { provider, ...rest }; // init strategy - server.auth.strategy(name, 'bell', settings); + server.auth.strategy(name, 'bell', omit(settings, 'appId')); // https://github.com/hapijs/bell/blob/master/lib/index.js#L125-L135 // repeats the code from here to get another settings object and reuse it diff --git a/src/auth/oauth/strategies/apple.js b/src/auth/oauth/strategies/apple.js index 8243a2853..e51a1955d 100644 --- a/src/auth/oauth/strategies/apple.js +++ b/src/auth/oauth/strategies/apple.js @@ -92,12 +92,12 @@ async function getProfile(providerSettings, tokenResponse, query) { } async function validateGrantCode(providerSettings, code, redirectUrl) { - const { provider, clientId, clientSecret } = providerSettings; + const { provider, appId, clientSecret } = providerSettings; const response = await httpRequest.post(provider.token, { form: { code, - client_id: clientId, - client_secret: clientSecret(), + client_id: appId, + client_secret: clientSecret(appId), grant_type: 'authorization_code', redirect_uri: redirectUrl, }, @@ -109,6 +109,7 @@ async function validateGrantCode(providerSettings, code, redirectUrl) { function getProvider(options, server) { const { + appId, clientId, teamId, keyId, @@ -122,11 +123,12 @@ function getProvider(options, server) { server.ext('onRequest', fixAppleCallbackForBell); return { + appId, password, clientId, isSameSite, cookie, - clientSecret: () => getSecretKey(teamId, clientId, keyId, privateKey), + clientSecret: (cid) => getSecretKey(teamId, cid || clientId, keyId, privateKey), forceHttps: true, providerParams: { response_mode: 'form_post', diff --git a/src/configs/oauth.js b/src/configs/oauth.js index 55edea70e..8f160e73e 100644 --- a/src/configs/oauth.js +++ b/src/configs/oauth.js @@ -46,6 +46,9 @@ exports.oauth = { }, apple: { enabled: false, + // used in /oauth/upgrade action as client ID + // for upgrade auth code from iOS app + appId: 'com.test.app', clientId: 'com.test.service', // service id from apple clientSecret: 'just-for-validation', // not used teamId: 'TEAM_ID', diff --git a/test/suites/actions/oauth/upgrade.apple.js b/test/suites/actions/oauth/upgrade.apple.js index 7fbcd87cc..c9d4db435 100644 --- a/test/suites/actions/oauth/upgrade.apple.js +++ b/test/suites/actions/oauth/upgrade.apple.js @@ -3,7 +3,7 @@ const request = require('request-promise'); const Users = require('../../../../src'); // @TODO stub -describe.skip('oauth.upgrade action', function suite() { +describe('oauth.upgrade action', function suite() { const service = new Users({ oauth: { providers: { apple: { enabled: true } } } }); before(() => service.connect()); From 5ccc815eb966e1cefb672c91e9584cdb306797f4 Mon Sep 17 00:00:00 2001 From: Sasha S Date: Fri, 17 Jun 2022 11:21:01 +0300 Subject: [PATCH 13/26] fix: skip test --- test/suites/actions/oauth/upgrade.apple.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/suites/actions/oauth/upgrade.apple.js b/test/suites/actions/oauth/upgrade.apple.js index c9d4db435..7fbcd87cc 100644 --- a/test/suites/actions/oauth/upgrade.apple.js +++ b/test/suites/actions/oauth/upgrade.apple.js @@ -3,7 +3,7 @@ const request = require('request-promise'); const Users = require('../../../../src'); // @TODO stub -describe('oauth.upgrade action', function suite() { +describe.skip('oauth.upgrade action', function suite() { const service = new Users({ oauth: { providers: { apple: { enabled: true } } } }); before(() => service.connect()); From f0023e95a03a5af7a1703377c9d4606f2af20020 Mon Sep 17 00:00:00 2001 From: Sasha S Date: Fri, 17 Jun 2022 12:07:31 +0300 Subject: [PATCH 14/26] fix: profile call --- src/actions/oauth/upgrade.js | 2 +- src/auth/oauth/strategies/apple.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/actions/oauth/upgrade.js b/src/actions/oauth/upgrade.js index 6ab983a31..35b474b74 100644 --- a/src/actions/oauth/upgrade.js +++ b/src/actions/oauth/upgrade.js @@ -46,7 +46,7 @@ async function upgrade(request) { .replace(/\/upgrade$/, '/apple') .replace(/^http:\/\//, 'https://'); const tokenResponse = await validateGrantCode(providerSettings, token, redirectUrl); - credentials = await profile(providerSettings, tokenResponse, query); + credentials = await profile.call(providerSettings, tokenResponse); } catch (error) { throw Boom.internal(error); } diff --git a/src/auth/oauth/strategies/apple.js b/src/auth/oauth/strategies/apple.js index e51a1955d..ffdf321b1 100644 --- a/src/auth/oauth/strategies/apple.js +++ b/src/auth/oauth/strategies/apple.js @@ -54,7 +54,7 @@ function getJwkFromResponse(header, callback) { }); } -async function getProfile(providerSettings, tokenResponse, query) { +async function getProfile(tokenResponse) { const { access_token: accessToken, id_token: idToken, @@ -73,7 +73,6 @@ async function getProfile(providerSettings, tokenResponse, query) { } = response; const credentials = Object.create(null); - credentials.query = query; credentials.email = email; credentials.profile = { id: sub, email }; credentials.internals = { From 6bbe787a898ad1b10314e7ac074f23e1e828a51f Mon Sep 17 00:00:00 2001 From: Sasha S Date: Fri, 17 Jun 2022 12:50:33 +0300 Subject: [PATCH 15/26] fix: profile call --- src/auth/oauth/strategies/apple.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/auth/oauth/strategies/apple.js b/src/auth/oauth/strategies/apple.js index ffdf321b1..99eb03b9a 100644 --- a/src/auth/oauth/strategies/apple.js +++ b/src/auth/oauth/strategies/apple.js @@ -54,7 +54,7 @@ function getJwkFromResponse(header, callback) { }); } -async function getProfile(tokenResponse) { +async function getProfile(credentials, tokenResponse) { const { access_token: accessToken, id_token: idToken, @@ -71,7 +71,6 @@ async function getProfile(tokenResponse) { email_verified: emailVerified, is_private_email: isPrivateEmail, } = response; - const credentials = Object.create(null); credentials.email = email; credentials.profile = { id: sub, email }; From e002573b4a4f747778352b3ae5688767006569dc Mon Sep 17 00:00:00 2001 From: Sasha S Date: Fri, 17 Jun 2022 12:54:02 +0300 Subject: [PATCH 16/26] fix: profile call --- src/actions/oauth/upgrade.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/oauth/upgrade.js b/src/actions/oauth/upgrade.js index 35b474b74..a61ea6b70 100644 --- a/src/actions/oauth/upgrade.js +++ b/src/actions/oauth/upgrade.js @@ -46,7 +46,7 @@ async function upgrade(request) { .replace(/\/upgrade$/, '/apple') .replace(/^http:\/\//, 'https://'); const tokenResponse = await validateGrantCode(providerSettings, token, redirectUrl); - credentials = await profile.call(providerSettings, tokenResponse); + credentials = await profile.call(providerSettings, { token, query }, tokenResponse); } catch (error) { throw Boom.internal(error); } From 9aac7b66c5b0517f0b1aed7723ba12c9353c5fc7 Mon Sep 17 00:00:00 2001 From: Sasha S Date: Fri, 17 Jun 2022 14:12:32 +0300 Subject: [PATCH 17/26] fix: params --- src/actions/oauth/upgrade.js | 27 +++++++++------------------ src/auth/oauth/strategies/apple.js | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/src/actions/oauth/upgrade.js b/src/actions/oauth/upgrade.js index a61ea6b70..979e306e0 100644 --- a/src/actions/oauth/upgrade.js +++ b/src/actions/oauth/upgrade.js @@ -1,11 +1,10 @@ const { strict: assert } = require('assert'); -const Boom = require('@hapi/boom'); const { ActionTransport } = require('@microfleet/plugin-router'); const { oauthVerification, mserviceVerification } = require('../../auth/oauth'); const formOAuthResponse = require('../../auth/oauth/utils/form-oauth-response'); -const { validateGrantCode } = require('../../auth/oauth/strategies/apple'); +const { upgradeAppleCode } = require('../../auth/oauth/strategies/apple'); /** * @api {amqp} .oauth.upgrade Upgardes existing SSO token to service-verified token @@ -38,22 +37,14 @@ async function upgrade(request) { query.jwt = params.jwt; } - let credentials; - - if (provider === 'apple') { - try { - const redirectUrl = transportRequest.url.href - .replace(/\/upgrade$/, '/apple') - .replace(/^http:\/\//, 'https://'); - const tokenResponse = await validateGrantCode(providerSettings, token, redirectUrl); - credentials = await profile.call(providerSettings, { token, query }, tokenResponse); - } catch (error) { - throw Boom.internal(error); - } - } else { - // verifies token by retreiving profile - credentials = await profile.call(providerSettings, { token, query }); - } + const credentials = provider === 'apple' + ? await upgradeAppleCode({ + query, + providerSettings, + code: token, + redirectUrl: transportRequest.url.href.replace(/\/upgrade$/, '/apple').replace(/^http:\/\//, 'https://'), + }) + : await profile.call(providerSettings, { token, query }); // ensure its a shallow copy as we will mutate it later const oauthConfig = { ...this.config.oauth.providers[provider] }; diff --git a/src/auth/oauth/strategies/apple.js b/src/auth/oauth/strategies/apple.js index 99eb03b9a..372a33568 100644 --- a/src/auth/oauth/strategies/apple.js +++ b/src/auth/oauth/strategies/apple.js @@ -2,6 +2,7 @@ const { sign, verify } = require('jsonwebtoken'); const getJwksClient = require('jwks-rsa'); const Bluebird = require('bluebird'); const httpRequest = require('request-promise'); +const Boom = require('@hapi/boom'); // @todo more options from config const jwksClient = getJwksClient({ @@ -144,8 +145,31 @@ function getProvider(options, server) { }; } +async function upgradeAppleCode({ providerSettings, code, query, redirectUrl }) { + const { profile } = providerSettings.provider; + + try { + const tokenResponse = await validateGrantCode(providerSettings, code, redirectUrl); + const credentials = await profile.call( + providerSettings, + { + query, + token: tokenResponse.access_token, + refreshToken: tokenResponse.refresh_token, + expiresIn: tokenResponse.expires_in, + }, + tokenResponse + ); + + return credentials; + } catch (error) { + throw Boom.internal(error); + } +} + module.exports = { transformAccountToResponseFormat, validateGrantCode, + upgradeAppleCode, options: getProvider, }; From 3f78e0eb5fb9cdebaf5f760beaf7ffab2a9e5b8f Mon Sep 17 00:00:00 2001 From: annahassel Date: Wed, 13 Jul 2022 19:57:26 +0400 Subject: [PATCH 18/26] fix: test --- schemas/config.json | 1 + src/actions/oauth/upgrade.js | 4 +- src/auth/oauth/strategies/apple.js | 21 +++--- src/configs/oauth.js | 1 - test/suites/actions/oauth/upgrade.apple.js | 79 +++++++++++++++++++--- 5 files changed, 84 insertions(+), 22 deletions(-) diff --git a/schemas/config.json b/schemas/config.json index a65335c81..fa21bc4f0 100644 --- a/schemas/config.json +++ b/schemas/config.json @@ -465,6 +465,7 @@ "type": "boolean" }, "appId": { + "description": "Used for oauth.upgrade action", "type": "string", "minLength": 1 }, diff --git a/src/actions/oauth/upgrade.js b/src/actions/oauth/upgrade.js index 979e306e0..9113d89f1 100644 --- a/src/actions/oauth/upgrade.js +++ b/src/actions/oauth/upgrade.js @@ -4,7 +4,7 @@ const { ActionTransport } = require('@microfleet/plugin-router'); const { oauthVerification, mserviceVerification } = require('../../auth/oauth'); const formOAuthResponse = require('../../auth/oauth/utils/form-oauth-response'); -const { upgradeAppleCode } = require('../../auth/oauth/strategies/apple'); +const appleStrategy = require('../../auth/oauth/strategies/apple'); /** * @api {amqp} .oauth.upgrade Upgardes existing SSO token to service-verified token @@ -38,7 +38,7 @@ async function upgrade(request) { } const credentials = provider === 'apple' - ? await upgradeAppleCode({ + ? await appleStrategy.upgradeAppleCode({ query, providerSettings, code: token, diff --git a/src/auth/oauth/strategies/apple.js b/src/auth/oauth/strategies/apple.js index 372a33568..ad07fef6b 100644 --- a/src/auth/oauth/strategies/apple.js +++ b/src/auth/oauth/strategies/apple.js @@ -1,8 +1,8 @@ const { sign, verify } = require('jsonwebtoken'); const getJwksClient = require('jwks-rsa'); const Bluebird = require('bluebird'); -const httpRequest = require('request-promise'); const Boom = require('@hapi/boom'); +const { request: httpRequest } = require('undici'); // @todo more options from config const jwksClient = getJwksClient({ @@ -92,18 +92,22 @@ async function getProfile(credentials, tokenResponse) { async function validateGrantCode(providerSettings, code, redirectUrl) { const { provider, appId, clientSecret } = providerSettings; - const response = await httpRequest.post(provider.token, { - form: { + const { body } = await httpRequest(provider.token, { + method: 'POST', + headers: { + 'content-type': 'application/json', + }, + body: JSON.stringify({ code, client_id: appId, client_secret: clientSecret(appId), grant_type: 'authorization_code', redirect_uri: redirectUrl, - }, - json: true, + }), + throwOnError: true, }); - return response; + return body.json(); } function getProvider(options, server) { @@ -145,7 +149,8 @@ function getProvider(options, server) { }; } -async function upgradeAppleCode({ providerSettings, code, query, redirectUrl }) { +async function upgradeAppleCode(params) { + const { providerSettings, code, query, redirectUrl } = params; const { profile } = providerSettings.provider; try { @@ -163,7 +168,7 @@ async function upgradeAppleCode({ providerSettings, code, query, redirectUrl }) return credentials; } catch (error) { - throw Boom.internal(error); + throw Boom.internal(error.body?.error, undefined, error.statusCode); } } diff --git a/src/configs/oauth.js b/src/configs/oauth.js index 8f160e73e..c87c7d0d3 100644 --- a/src/configs/oauth.js +++ b/src/configs/oauth.js @@ -47,7 +47,6 @@ exports.oauth = { apple: { enabled: false, // used in /oauth/upgrade action as client ID - // for upgrade auth code from iOS app appId: 'com.test.app', clientId: 'com.test.service', // service id from apple clientSecret: 'just-for-validation', // not used diff --git a/test/suites/actions/oauth/upgrade.apple.js b/test/suites/actions/oauth/upgrade.apple.js index 7fbcd87cc..6e3b2d94d 100644 --- a/test/suites/actions/oauth/upgrade.apple.js +++ b/test/suites/actions/oauth/upgrade.apple.js @@ -1,27 +1,84 @@ -const request = require('request-promise'); +const { strictEqual } = require('assert'); + +const { Client } = require('undici'); +const { stub, match } = require('sinon'); const Users = require('../../../../src'); +const appleStrategy = require('../../../../src/auth/oauth/strategies/apple'); -// @TODO stub -describe.skip('oauth.upgrade action', function suite() { +describe('oauth.upgrade action', function suite() { const service = new Users({ oauth: { providers: { apple: { enabled: true } } } }); + const client = new Client('https://ms-users.local', { + tls: { + rejectUnauthorized: false, + }, + }); before(() => service.connect()); after(() => service.close()); it('should be able to upgrade apple grand code', async () => { - const response = await request({ + const clientSecretStub = stub(service.hapi.app.oauthProviderSettings.apple, 'clientSecret'); + // @TODO getProfile stub (needs refactor) + const appleStrategyStub = stub(appleStrategy, 'upgradeAppleCode'); + + clientSecretStub + .withArgs('com.test.app') + .returns('CLIENT_SECRET'); + appleStrategyStub + .withArgs( + match( + (params) => params.code === 'c75da8efcf25f4acb80e51152fead9fad.0.srqty.7-k4X-G9bBesI_9hDFH6Xg' + && params.redirectUrl === 'https://ms-users.local/users/oauth/apple' + && params.providerSettings.appId === 'com.test.app' + ) + ) + .resolves({ + access_token: 'adg61...67Or9', + token_type: 'Bearer', + expires_in: 3600, + refresh_token: 'rca7...lABoQ', + id_token: 'eyJra...96sZg', + email: 'k9mj4sq2rc@privaterelay.appleid.com', + profile: { + id: '001038.f470322604c14e328f912ca1182c8ff5.1028', + email: 'k9mj4sq2rc@privaterelay.appleid.com', + }, + internals: { + email: 'k9mj4sq2rc@privaterelay.appleid.com', + emailVerified: true, + isPrivateEmail: true, + id: '001038.f470322604c14e328f912ca1182c8ff5.1028', + accessToken: 'adg61...67Or9', + idToken: 'eyJra...96sZg', + refreshToken: 'rca7...lABoQ', + tokenType: 'Bearer', + expiresIn: 3600, + }, + query: {}, + }); + + const response = await client.request({ method: 'POST', - uri: 'https://ms-users.local/users/oauth/upgrade', - body: { + path: '/users/oauth/upgrade', + headers: { + 'content-type': 'application/json', + }, + body: JSON.stringify({ provider: 'apple', token: 'c75da8efcf25f4acb80e51152fead9fad.0.srqty.7-k4X-G9bBesI_9hDFH6Xg', - }, - json: true, - strictSSL: false, + }), }); - // @TODO assert - console.log(response); + const data = await response.body.json(); + + strictEqual(data.payload.token !== undefined, true); + strictEqual(data.payload.provider, 'apple'); + strictEqual(data.error, false); + strictEqual(data.type, 'ms-users:signed'); + strictEqual(data.title, 'Attached apple account'); + + clientSecretStub.restore(); + appleStrategyStub.restore(); }); }); From c4d5cd9c10c2fafadf699711b8a13dee7659ab78 Mon Sep 17 00:00:00 2001 From: annahassel Date: Thu, 14 Jul 2022 13:45:33 +0400 Subject: [PATCH 19/26] fix: debug --- src/auth/oauth/strategies/apple.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/auth/oauth/strategies/apple.js b/src/auth/oauth/strategies/apple.js index ad07fef6b..7d4420a5f 100644 --- a/src/auth/oauth/strategies/apple.js +++ b/src/auth/oauth/strategies/apple.js @@ -168,6 +168,8 @@ async function upgradeAppleCode(params) { return credentials; } catch (error) { + console.log(222222, error); + throw Boom.internal(error.body?.error, undefined, error.statusCode); } } From 2d716db2c66db9ae35aa624737598554e666441c Mon Sep 17 00:00:00 2001 From: annahassel Date: Thu, 14 Jul 2022 14:45:44 +0400 Subject: [PATCH 20/26] fix: debug --- src/auth/oauth/strategies/apple.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/auth/oauth/strategies/apple.js b/src/auth/oauth/strategies/apple.js index 7d4420a5f..d703bc835 100644 --- a/src/auth/oauth/strategies/apple.js +++ b/src/auth/oauth/strategies/apple.js @@ -155,6 +155,9 @@ async function upgradeAppleCode(params) { try { const tokenResponse = await validateGrantCode(providerSettings, code, redirectUrl); + + console.log(33333, tokenResponse); + const credentials = await profile.call( providerSettings, { From 779765272d75eb73e3e77ab5777393cf1b62adae Mon Sep 17 00:00:00 2001 From: annahassel Date: Thu, 14 Jul 2022 15:16:21 +0400 Subject: [PATCH 21/26] fix: debug --- src/auth/oauth/strategies/apple.js | 23 ++++---- test/suites/actions/oauth/upgrade.apple.js | 68 +++++++++++----------- 2 files changed, 45 insertions(+), 46 deletions(-) diff --git a/src/auth/oauth/strategies/apple.js b/src/auth/oauth/strategies/apple.js index d703bc835..9a4f1be35 100644 --- a/src/auth/oauth/strategies/apple.js +++ b/src/auth/oauth/strategies/apple.js @@ -92,18 +92,22 @@ async function getProfile(credentials, tokenResponse) { async function validateGrantCode(providerSettings, code, redirectUrl) { const { provider, appId, clientSecret } = providerSettings; + const requestBody = JSON.stringify({ + code, + client_id: appId, + client_secret: clientSecret(appId), + grant_type: 'authorization_code', + redirect_uri: redirectUrl, + }); + + console.log(1111111, requestBody); + const { body } = await httpRequest(provider.token, { method: 'POST', headers: { 'content-type': 'application/json', }, - body: JSON.stringify({ - code, - client_id: appId, - client_secret: clientSecret(appId), - grant_type: 'authorization_code', - redirect_uri: redirectUrl, - }), + body: requestBody, throwOnError: true, }); @@ -155,9 +159,6 @@ async function upgradeAppleCode(params) { try { const tokenResponse = await validateGrantCode(providerSettings, code, redirectUrl); - - console.log(33333, tokenResponse); - const credentials = await profile.call( providerSettings, { @@ -171,8 +172,6 @@ async function upgradeAppleCode(params) { return credentials; } catch (error) { - console.log(222222, error); - throw Boom.internal(error.body?.error, undefined, error.statusCode); } } diff --git a/test/suites/actions/oauth/upgrade.apple.js b/test/suites/actions/oauth/upgrade.apple.js index 6e3b2d94d..66e64145f 100644 --- a/test/suites/actions/oauth/upgrade.apple.js +++ b/test/suites/actions/oauth/upgrade.apple.js @@ -20,43 +20,43 @@ describe('oauth.upgrade action', function suite() { it('should be able to upgrade apple grand code', async () => { const clientSecretStub = stub(service.hapi.app.oauthProviderSettings.apple, 'clientSecret'); // @TODO getProfile stub (needs refactor) - const appleStrategyStub = stub(appleStrategy, 'upgradeAppleCode'); + // const appleStrategyStub = stub(appleStrategy, 'upgradeAppleCode'); clientSecretStub .withArgs('com.test.app') .returns('CLIENT_SECRET'); - appleStrategyStub - .withArgs( - match( - (params) => params.code === 'c75da8efcf25f4acb80e51152fead9fad.0.srqty.7-k4X-G9bBesI_9hDFH6Xg' - && params.redirectUrl === 'https://ms-users.local/users/oauth/apple' - && params.providerSettings.appId === 'com.test.app' - ) - ) - .resolves({ - access_token: 'adg61...67Or9', - token_type: 'Bearer', - expires_in: 3600, - refresh_token: 'rca7...lABoQ', - id_token: 'eyJra...96sZg', - email: 'k9mj4sq2rc@privaterelay.appleid.com', - profile: { - id: '001038.f470322604c14e328f912ca1182c8ff5.1028', - email: 'k9mj4sq2rc@privaterelay.appleid.com', - }, - internals: { - email: 'k9mj4sq2rc@privaterelay.appleid.com', - emailVerified: true, - isPrivateEmail: true, - id: '001038.f470322604c14e328f912ca1182c8ff5.1028', - accessToken: 'adg61...67Or9', - idToken: 'eyJra...96sZg', - refreshToken: 'rca7...lABoQ', - tokenType: 'Bearer', - expiresIn: 3600, - }, - query: {}, - }); + // appleStrategyStub + // .withArgs( + // match( + // (params) => params.code === 'c75da8efcf25f4acb80e51152fead9fad.0.srqty.7-k4X-G9bBesI_9hDFH6Xg' + // && params.redirectUrl === 'https://ms-users.local/users/oauth/apple' + // && params.providerSettings.appId === 'com.test.app' + // ) + // ) + // .resolves({ + // access_token: 'adg61...67Or9', + // token_type: 'Bearer', + // expires_in: 3600, + // refresh_token: 'rca7...lABoQ', + // id_token: 'eyJra...96sZg', + // email: 'k9mj4sq2rc@privaterelay.appleid.com', + // profile: { + // id: '001038.f470322604c14e328f912ca1182c8ff5.1028', + // email: 'k9mj4sq2rc@privaterelay.appleid.com', + // }, + // internals: { + // email: 'k9mj4sq2rc@privaterelay.appleid.com', + // emailVerified: true, + // isPrivateEmail: true, + // id: '001038.f470322604c14e328f912ca1182c8ff5.1028', + // accessToken: 'adg61...67Or9', + // idToken: 'eyJra...96sZg', + // refreshToken: 'rca7...lABoQ', + // tokenType: 'Bearer', + // expiresIn: 3600, + // }, + // query: {}, + // }); const response = await client.request({ method: 'POST', @@ -79,6 +79,6 @@ describe('oauth.upgrade action', function suite() { strictEqual(data.title, 'Attached apple account'); clientSecretStub.restore(); - appleStrategyStub.restore(); + // appleStrategyStub.restore(); }); }); From 22c66d20cb3da357951f18e33239257713d2f39d Mon Sep 17 00:00:00 2001 From: annahassel Date: Thu, 14 Jul 2022 19:57:02 +0400 Subject: [PATCH 22/26] fix: debug --- src/auth/oauth/strategies/apple.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/auth/oauth/strategies/apple.js b/src/auth/oauth/strategies/apple.js index 9a4f1be35..8dc5a1db0 100644 --- a/src/auth/oauth/strategies/apple.js +++ b/src/auth/oauth/strategies/apple.js @@ -92,22 +92,20 @@ async function getProfile(credentials, tokenResponse) { async function validateGrantCode(providerSettings, code, redirectUrl) { const { provider, appId, clientSecret } = providerSettings; - const requestBody = JSON.stringify({ - code, - client_id: appId, - client_secret: clientSecret(appId), - grant_type: 'authorization_code', - redirect_uri: redirectUrl, - }); - - console.log(1111111, requestBody); + const form = new URLSearchParams([ + ['code', code], + ['client_id', appId], + ['client_secret', clientSecret(appId)], + ['grant_type', 'authorization_code'], + ['redirect_uri', redirectUrl], + ]); const { body } = await httpRequest(provider.token, { method: 'POST', headers: { - 'content-type': 'application/json', + 'content-type': 'application/x-www-form-urlencoded', }, - body: requestBody, + body: form.toString(), throwOnError: true, }); @@ -172,6 +170,8 @@ async function upgradeAppleCode(params) { return credentials; } catch (error) { + console.log(11111111, error); + throw Boom.internal(error.body?.error, undefined, error.statusCode); } } From 1e9c197f42a788b360fc27e932e7fb0752b18b40 Mon Sep 17 00:00:00 2001 From: annahassel Date: Thu, 14 Jul 2022 20:35:12 +0400 Subject: [PATCH 23/26] fix: test --- test/suites/actions/oauth/upgrade.apple.js | 68 +++++++++++----------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/test/suites/actions/oauth/upgrade.apple.js b/test/suites/actions/oauth/upgrade.apple.js index 66e64145f..6e3b2d94d 100644 --- a/test/suites/actions/oauth/upgrade.apple.js +++ b/test/suites/actions/oauth/upgrade.apple.js @@ -20,43 +20,43 @@ describe('oauth.upgrade action', function suite() { it('should be able to upgrade apple grand code', async () => { const clientSecretStub = stub(service.hapi.app.oauthProviderSettings.apple, 'clientSecret'); // @TODO getProfile stub (needs refactor) - // const appleStrategyStub = stub(appleStrategy, 'upgradeAppleCode'); + const appleStrategyStub = stub(appleStrategy, 'upgradeAppleCode'); clientSecretStub .withArgs('com.test.app') .returns('CLIENT_SECRET'); - // appleStrategyStub - // .withArgs( - // match( - // (params) => params.code === 'c75da8efcf25f4acb80e51152fead9fad.0.srqty.7-k4X-G9bBesI_9hDFH6Xg' - // && params.redirectUrl === 'https://ms-users.local/users/oauth/apple' - // && params.providerSettings.appId === 'com.test.app' - // ) - // ) - // .resolves({ - // access_token: 'adg61...67Or9', - // token_type: 'Bearer', - // expires_in: 3600, - // refresh_token: 'rca7...lABoQ', - // id_token: 'eyJra...96sZg', - // email: 'k9mj4sq2rc@privaterelay.appleid.com', - // profile: { - // id: '001038.f470322604c14e328f912ca1182c8ff5.1028', - // email: 'k9mj4sq2rc@privaterelay.appleid.com', - // }, - // internals: { - // email: 'k9mj4sq2rc@privaterelay.appleid.com', - // emailVerified: true, - // isPrivateEmail: true, - // id: '001038.f470322604c14e328f912ca1182c8ff5.1028', - // accessToken: 'adg61...67Or9', - // idToken: 'eyJra...96sZg', - // refreshToken: 'rca7...lABoQ', - // tokenType: 'Bearer', - // expiresIn: 3600, - // }, - // query: {}, - // }); + appleStrategyStub + .withArgs( + match( + (params) => params.code === 'c75da8efcf25f4acb80e51152fead9fad.0.srqty.7-k4X-G9bBesI_9hDFH6Xg' + && params.redirectUrl === 'https://ms-users.local/users/oauth/apple' + && params.providerSettings.appId === 'com.test.app' + ) + ) + .resolves({ + access_token: 'adg61...67Or9', + token_type: 'Bearer', + expires_in: 3600, + refresh_token: 'rca7...lABoQ', + id_token: 'eyJra...96sZg', + email: 'k9mj4sq2rc@privaterelay.appleid.com', + profile: { + id: '001038.f470322604c14e328f912ca1182c8ff5.1028', + email: 'k9mj4sq2rc@privaterelay.appleid.com', + }, + internals: { + email: 'k9mj4sq2rc@privaterelay.appleid.com', + emailVerified: true, + isPrivateEmail: true, + id: '001038.f470322604c14e328f912ca1182c8ff5.1028', + accessToken: 'adg61...67Or9', + idToken: 'eyJra...96sZg', + refreshToken: 'rca7...lABoQ', + tokenType: 'Bearer', + expiresIn: 3600, + }, + query: {}, + }); const response = await client.request({ method: 'POST', @@ -79,6 +79,6 @@ describe('oauth.upgrade action', function suite() { strictEqual(data.title, 'Attached apple account'); clientSecretStub.restore(); - // appleStrategyStub.restore(); + appleStrategyStub.restore(); }); }); From c055a944b3abf28030427ab7988a95513a709ea0 Mon Sep 17 00:00:00 2001 From: annahassel Date: Thu, 14 Jul 2022 20:37:22 +0400 Subject: [PATCH 24/26] fix: test --- src/auth/oauth/strategies/apple.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/auth/oauth/strategies/apple.js b/src/auth/oauth/strategies/apple.js index 8dc5a1db0..32750120b 100644 --- a/src/auth/oauth/strategies/apple.js +++ b/src/auth/oauth/strategies/apple.js @@ -170,8 +170,6 @@ async function upgradeAppleCode(params) { return credentials; } catch (error) { - console.log(11111111, error); - throw Boom.internal(error.body?.error, undefined, error.statusCode); } } From 02e84dafa712347235f3d9044069f6820c396da0 Mon Sep 17 00:00:00 2001 From: Sasha S Date: Wed, 20 Jul 2022 12:07:20 +0300 Subject: [PATCH 25/26] fix: errors --- src/actions/oauth/upgrade.js | 13 +++++---- src/auth/oauth/index.js | 1 + src/auth/oauth/strategies/apple.js | 30 ++++++++++++++++----- src/auth/oauth/utils/form-oauth-response.js | 1 + src/constants.js | 6 +++++ test/suites/actions/oauth/upgrade.apple.js | 2 +- 6 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/actions/oauth/upgrade.js b/src/actions/oauth/upgrade.js index 9113d89f1..38a8863be 100644 --- a/src/actions/oauth/upgrade.js +++ b/src/actions/oauth/upgrade.js @@ -20,7 +20,7 @@ const appleStrategy = require('../../auth/oauth/strategies/apple'); * @apiParam (Payload) {String} isStatelessAuth - use stateless JWT tokens when they are optional */ async function upgrade(request) { - const { transportRequest, params, query } = request; + const { transportRequest, params, query, log } = request; const { provider, token, isStatelessAuth } = params; // fetch settings, otherwise provider is not supported @@ -39,10 +39,13 @@ async function upgrade(request) { const credentials = provider === 'apple' ? await appleStrategy.upgradeAppleCode({ - query, - providerSettings, - code: token, - redirectUrl: transportRequest.url.href.replace(/\/upgrade$/, '/apple').replace(/^http:\/\//, 'https://'), + log, + params: { + query, + providerSettings, + code: token, + redirectUrl: transportRequest.url.href.replace(/\/upgrade$/, '/apple').replace(/^http:\/\//, 'https://'), + }, }) : await profile.call(providerSettings, { token, query }); diff --git a/src/auth/oauth/index.js b/src/auth/oauth/index.js index 8d77ed287..eda4a0347 100644 --- a/src/auth/oauth/index.js +++ b/src/auth/oauth/index.js @@ -111,6 +111,7 @@ async function mserviceVerification({ service, transportRequest }, credentials, // user is authenticated and profile is attached if (user && userId) { + // @TODO code? throw new Errors.HttpStatusError(412, 'profile is linked'); } diff --git a/src/auth/oauth/strategies/apple.js b/src/auth/oauth/strategies/apple.js index 32750120b..41d845d4b 100644 --- a/src/auth/oauth/strategies/apple.js +++ b/src/auth/oauth/strategies/apple.js @@ -4,6 +4,11 @@ const Bluebird = require('bluebird'); const Boom = require('@hapi/boom'); const { request: httpRequest } = require('undici'); +const { + ERROR_OAUTH_APPLE_VALIDATE_CODE, + ERROR_OAUTH_APPLE_VERIFY_PROFILE, +} = require('../../../constants'); + // @todo more options from config const jwksClient = getJwksClient({ jwksUri: 'https://appleid.apple.com/auth/keys', @@ -151,13 +156,24 @@ function getProvider(options, server) { }; } -async function upgradeAppleCode(params) { +async function upgradeAppleCode({ params, log }) { const { providerSettings, code, query, redirectUrl } = params; const { profile } = providerSettings.provider; + let tokenResponse; + + try { + tokenResponse = await validateGrantCode(providerSettings, code, redirectUrl); + } catch (error) { + log.error(Boom.internal(error.body?.error, undefined, error.statusCode)); + + throw ERROR_OAUTH_APPLE_VALIDATE_CODE; + } + + let credentials; + try { - const tokenResponse = await validateGrantCode(providerSettings, code, redirectUrl); - const credentials = await profile.call( + credentials = await profile.call( providerSettings, { query, @@ -167,11 +183,13 @@ async function upgradeAppleCode(params) { }, tokenResponse ); - - return credentials; } catch (error) { - throw Boom.internal(error.body?.error, undefined, error.statusCode); + log.error(Boom.internal(error.body?.error, undefined, error.statusCode)); + + throw ERROR_OAUTH_APPLE_VERIFY_PROFILE; } + + return credentials; } module.exports = { diff --git a/src/auth/oauth/utils/form-oauth-response.js b/src/auth/oauth/utils/form-oauth-response.js index ff8ac5486..807b4224f 100644 --- a/src/auth/oauth/utils/form-oauth-response.js +++ b/src/auth/oauth/utils/form-oauth-response.js @@ -34,6 +34,7 @@ async function formOAuthResponse(ctx, request, credentials) { } if (!account) { + // @TODO 403? throw new HttpStatusError(500, 'no account when jwt isn\'t present'); } diff --git a/src/constants.js b/src/constants.js index f73b4db10..a62eaf171 100644 --- a/src/constants.js +++ b/src/constants.js @@ -89,6 +89,9 @@ module.exports = exports = { ErrorUserNotMember: new HttpStatusError(404, 'username not member of organization'), ErrorInvitationExpiredOrUsed: new HttpStatusError(400, 'Invitation has expired or already been used'), + ERROR_OAUTH_APPLE_VALIDATE_CODE: new HttpStatusError(403, 'Code validation failed'), + ERROR_OAUTH_APPLE_VERIFY_PROFILE: new HttpStatusError(403, 'Profile verification failed'), + // actions USERS_ACTION_ACTIVATE: 'activate', USERS_ACTION_VERIFY_CONTACT: 'verify-contact', @@ -143,6 +146,9 @@ exports.USERS_JWT_ACCESS_REQUIRED.code = 'E_TKN_ACCESS_TOKEN_REQUIRED'; exports.USERS_JWT_REFRESH_REQUIRED.code = 'E_TKN_REFRESH_TOKEN_REQUIRED'; exports.USERS_JWT_STATELESS_REQUIRED.code = 'E_STATELESS_NOT_ENABLED'; +exports.ERROR_OAUTH_APPLE_VALIDATE_CODE.code = 'E_VALIDATE_CODE'; +exports.ERROR_OAUTH_APPLE_VERIFY_PROFILE.code = 'E_VERIFY_PROFILE'; + exports.SSO_PROVIDERS = [ exports.USERS_SSO_FACEBOOK_FIELD, exports.USERS_SSO_APPLE_FIELD, diff --git a/test/suites/actions/oauth/upgrade.apple.js b/test/suites/actions/oauth/upgrade.apple.js index 6e3b2d94d..a71dadb99 100644 --- a/test/suites/actions/oauth/upgrade.apple.js +++ b/test/suites/actions/oauth/upgrade.apple.js @@ -28,7 +28,7 @@ describe('oauth.upgrade action', function suite() { appleStrategyStub .withArgs( match( - (params) => params.code === 'c75da8efcf25f4acb80e51152fead9fad.0.srqty.7-k4X-G9bBesI_9hDFH6Xg' + ({ params }) => params.code === 'c75da8efcf25f4acb80e51152fead9fad.0.srqty.7-k4X-G9bBesI_9hDFH6Xg' && params.redirectUrl === 'https://ms-users.local/users/oauth/apple' && params.providerSettings.appId === 'com.test.app' ) From 981c7d643ff5982a2571067ef2403a575b4baf0c Mon Sep 17 00:00:00 2001 From: Sasha S Date: Sat, 5 Nov 2022 11:11:09 +0300 Subject: [PATCH 26/26] fix: try deps --- package.json | 2 +- pnpm-lock.yaml | 472 +++++++++++++++++++++++-------------------------- 2 files changed, 223 insertions(+), 251 deletions(-) diff --git a/package.json b/package.json index a773d8ae6..86d5d237d 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "serialize-error": "^8.1.0", "serialize-javascript": "^6.0.0", "tough-cookie": "^4.1.2", - "undici": "^5.11.0", + "undici": "^5.12.0", "uuid": "^9.0.0", "yargs": "^17.6.0", "zxcvbn": "^4.4.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8e89eb203..986d37262 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -98,7 +98,7 @@ specifiers: sinon: ^14.0.1 tough-cookie: ^4.1.2 typescript: ^4.8.4 - undici: ^5.11.0 + undici: ^5.12.0 uuid: ^9.0.0 yargs: ^17.6.0 zxcvbn: ^4.4.2 @@ -110,7 +110,7 @@ dependencies: '@hapi/hapi': 20.2.2 '@hapi/hoek': 10.0.1 '@hapi/vision': 7.0.0 - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.23.2 '@microfleet/plugin-amqp': 0.20.2_sk3ptgyju7mzzghn566ag2epq4 '@microfleet/plugin-consul': 2.27.0_@microfleet+core@17.31.0 @@ -129,7 +129,7 @@ dependencies: '@microfleet/plugin-validator': 0.23.2_bvwrfqwp6ovpixapq6r75tjcb4 '@microfleet/transport-amqp': 17.3.0_common-errors@1.2.0 '@microfleet/utils': 0.23.2 - '@microfleet/validation': 11.1.2 + '@microfleet/validation': 11.1.3 ajv-formats: 2.1.1 async: 3.2.4 bluebird: 3.7.2 @@ -142,8 +142,8 @@ dependencies: flake-idgen: 1.4.0 get-stdin: 8.0.0 get-value: 3.0.1 - glob: 7.2.0 - got: 11.8.3 + glob: 7.2.3 + got: 11.8.5 handlebars: 4.7.7 ioredis: 4.28.5 is: 3.3.0 @@ -155,11 +155,11 @@ dependencies: moment: 2.29.4 ms-conf: 7.0.2 ms-flakeless: 4.6.4 - ms-mailer-client: 8.1.0_6pwm6lxvstydiyih5fgvdektyu + ms-mailer-client: 8.1.0_e6nzqva4cfaw5jvvp23hbt4opq ms-token: 5.0.1_ioredis@4.28.5 - nanoid: 3.3.2 + nanoid: 3.3.4 otplib: 12.0.1 - p-retry: 4.6.1 + p-retry: 4.6.2 password-generator: 2.3.2 prom-client: 14.1.0 qs: 6.11.0 @@ -512,8 +512,8 @@ packages: '@hapi/bounce': 2.0.0 '@hapi/cryptiles': 5.1.0 '@hapi/hoek': 9.2.1 - '@hapi/wreck': 17.1.0 - joi: 17.6.0 + '@hapi/wreck': 17.2.0 + joi: 17.6.4 dev: false /@hapi/boom/10.0.0: @@ -546,6 +546,10 @@ packages: resolution: {integrity: sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg==} dev: false + /@hapi/bourne/2.1.0: + resolution: {integrity: sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==} + dev: false + /@hapi/call/8.0.1: resolution: {integrity: sha512-bOff6GTdOnoe5b8oXRV3lwkQSb/LAWylvDMae6RgEWWntd0SHtkYbQukDHKlfaYtVnSAgIavJ0kqszF/AIBb6g==} dependencies: @@ -762,6 +766,14 @@ packages: '@hapi/hoek': 9.2.1 dev: false + /@hapi/wreck/17.2.0: + resolution: {integrity: sha512-pJ5kjYoRPYDv+eIuiLQqhGon341fr2bNIYZjuotuPJG/3Ilzr/XtI+JAp0A86E2bYfsS3zBPABuS2ICkaXFT8g==} + dependencies: + '@hapi/boom': 9.1.4 + '@hapi/bourne': 2.1.0 + '@hapi/hoek': 9.2.1 + dev: false + /@humanwhocodes/config-array/0.11.6: resolution: {integrity: sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==} engines: {node: '>=10.10.0'} @@ -830,7 +842,7 @@ packages: dependencies: '@hapi/hoek': 9.1.0 alce: 1.2.0 - joi: 17.6.0 + joi: 17.6.4 yargs: 16.0.3 /@makeomatic/deploy/12.8.2: @@ -899,14 +911,6 @@ packages: - supports-color dev: false - /@microfleet/amqp-codec/2.2.1: - resolution: {integrity: sha512-hlJGzkjAwa5FO2k0DVHHtH0zG2v9zTDORGhl8AndEQeWBaiswA06CMRqfoWOZ4UfpU4sB/HUGeVWIS49QkM2AA==} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - /@microfleet/amqp-codec/2.3.0: resolution: {integrity: sha512-krlsukmrJzzwIJNJKmMcosGHUsf0WODIgsYOiCPOfNPp+6gjKDTR6elTbnmR8q1zR61vMdCW0G/wh5SCELG/ow==} dependencies: @@ -915,25 +919,6 @@ packages: - supports-color dev: false - /@microfleet/amqp-coffee/2.3.3: - resolution: {integrity: sha512-JQm5Yq4WG/XcOVomehOJdR7RIQ7gl04BinLZ+dnWDkvy1Dshu1mnCRxLhurDFVN/kxn6uMW56hiZwZbZFrW6TA==} - engines: {node: '>= 14.17'} - dependencies: - '@microfleet/amqp-codec': 2.2.1 - async: 3.2.4 - bson: 4.6.2 - bytes: 3.1.2 - debug: 4.3.4 - fastq: 1.13.0 - lodash: 4.17.21 - read-pkg: 5.2.0 - optionalDependencies: - ffi-napi: 4.0.3 - ref-napi: 3.0.3 - transitivePeerDependencies: - - supports-color - dev: false - /@microfleet/amqp-coffee/2.4.0: resolution: {integrity: sha512-eT1OvTt1Dhug1bd2OEwSX8unEXkvES1NXIbmi7NTTQn0KodEYVdr46Z44e1OU9VYNedcry5QIA3Gfs0f+J/ifg==} engines: {node: '>= 14.17'} @@ -979,7 +964,7 @@ packages: eventemitter3: 4.0.7 dev: false - /@microfleet/core/17.31.0_7lr2vv5bl57san5n4sfdx2tkfq: + /@microfleet/core/17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm: resolution: {integrity: sha512-si801q0r2upg2+3A4hTf2NVkOl6l+kv6DjMR4YQ1jR+KDkYOF+H5VWD1PezWWbQ5aV7ds4oQMVdnVcOlso3jVw==} engines: {node: '>= 12.14.0', npm: '>= 4.0.0'} hasBin: true @@ -989,7 +974,7 @@ packages: dependencies: '@microfleet/core-types': 0.25.0 '@microfleet/utils': 0.25.0 - '@microfleet/validation': 11.1.2 + '@microfleet/validation': 11.1.3 bluebird: 3.7.2 bluebird-retry: 0.11.0_bluebird@3.7.2 common-errors: 1.2.0 @@ -1008,10 +993,10 @@ packages: '@microfleet/callback-queue': 4.0.2 '@microfleet/ioredis-lock': 5.1.0_ioredis@4.28.5 bluebird: 3.7.2 - denque: 2.0.1 + denque: 2.1.0 ioredis: 4.28.5 lodash: 4.17.21 - pino: 7.9.2 + pino: 7.11.0 read-pkg-up: 7.0.1 serialize-error: 8.1.0 transitivePeerDependencies: @@ -1038,7 +1023,7 @@ packages: '@microfleet/plugin-validator': ^0.23.2 common-errors: ~1.x.x dependencies: - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/plugin-logger': 0.28.2_46imanrvw62s5a27gbweu4woca '@microfleet/plugin-router': 0.21.2_kjjl4xi7xzddidnrgpdpeyy4ji '@microfleet/plugin-validator': 0.23.2_bvwrfqwp6ovpixapq6r75tjcb4 @@ -1055,7 +1040,7 @@ packages: peerDependencies: '@microfleet/core': ^17.31.0 dependencies: - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.25.0 '@microfleet/plugin-logger': 0.30.0_46imanrvw62s5a27gbweu4woca '@microfleet/plugin-validator': 0.25.0_3ntl6ib4vyjmq2nononhrzej4e @@ -1072,7 +1057,7 @@ packages: peerDependencies: '@microfleet/core': ^17.29.2 dependencies: - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.23.2 '@microfleet/dlock': 14.0.0_ioredis@4.28.5 '@microfleet/ioredis-lock': 5.1.0_ioredis@4.28.5 @@ -1094,14 +1079,14 @@ packages: dependencies: '@hapi/hapi': 20.2.2 '@hapi/vision': 7.0.0 - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.23.2 '@microfleet/plugin-logger': 0.28.2_46imanrvw62s5a27gbweu4woca '@microfleet/plugin-router': 0.21.2_kjjl4xi7xzddidnrgpdpeyy4ji '@microfleet/plugin-socketio': 0.20.2_46imanrvw62s5a27gbweu4woca '@microfleet/plugin-validator': 0.23.2_bvwrfqwp6ovpixapq6r75tjcb4 common-errors: 1.2.0 - joi: 17.6.0 + joi: 17.6.4 transitivePeerDependencies: - '@microfleet/utils' - bufferutil @@ -1116,15 +1101,15 @@ packages: '@microfleet/core': ^17.29.2 common-errors: ~1.x.x dependencies: - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.23.2 '@microfleet/plugin-validator': 0.23.2_bvwrfqwp6ovpixapq6r75tjcb4 '@microfleet/utils': 0.23.2 - '@sentry/utils': 7.7.0 + '@sentry/utils': 7.17.2 common-errors: 1.2.0 lodash.merge: 4.6.2 lsmod: 1.0.0 - pino: 8.1.0 + pino: 8.7.0 pino-abstract-transport: 1.0.0 pino-pretty: 8.1.0 sonic-boom: 3.0.0 @@ -1139,11 +1124,11 @@ packages: '@microfleet/core': ^17.31.0 common-errors: ~1.x.x dependencies: - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.25.0 '@microfleet/plugin-validator': 0.25.0_3ntl6ib4vyjmq2nononhrzej4e '@microfleet/utils': 0.25.0 - '@sentry/utils': 7.7.0 + '@sentry/utils': 7.17.2 common-errors: 1.2.0 lodash.merge: 4.6.2 lsmod: 1.0.0 @@ -1162,7 +1147,7 @@ packages: '@microfleet/core': ^17.29.2 common-errors: ~1.x.x dependencies: - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.23.2 '@microfleet/plugin-logger': 0.28.2_46imanrvw62s5a27gbweu4woca '@microfleet/plugin-validator': 0.23.2_bvwrfqwp6ovpixapq6r75tjcb4 @@ -1180,12 +1165,12 @@ packages: '@microfleet/core': ^17.29.2 common-errors: ~1.x.x dependencies: - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.23.2 '@microfleet/utils': 0.23.2 common-errors: 1.2.0 prom-client: 14.1.0 - semver: 7.3.7 + semver: 7.3.8 dev: false /@microfleet/plugin-redis-cluster/0.23.2_46imanrvw62s5a27gbweu4woca: @@ -1195,7 +1180,7 @@ packages: '@microfleet/core': ^17.29.2 common-errors: ^1.2.0 dependencies: - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.23.2 '@microfleet/plugin-redis-core': 0.23.2_q73w5g7jimobqhsekrgfix3cnu '@microfleet/plugin-validator': 0.23.2_bvwrfqwp6ovpixapq6r75tjcb4 @@ -1237,7 +1222,7 @@ packages: common-errors: ^1.2.0 ioredis: ^4.28.0 dependencies: - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.23.2 '@microfleet/plugin-redis-core': 0.23.2_q73w5g7jimobqhsekrgfix3cnu '@microfleet/plugin-validator': 0.23.2_bvwrfqwp6ovpixapq6r75tjcb4 @@ -1261,8 +1246,8 @@ packages: '@microfleet/plugin-router': ^0.21.2 common-errors: ~1.x.x dependencies: - '@microfleet/amqp-coffee': 2.3.3 - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/amqp-coffee': 2.4.0 + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.23.2 '@microfleet/plugin-amqp': 0.20.2_sk3ptgyju7mzzghn566ag2epq4 '@microfleet/plugin-logger': 0.28.2_46imanrvw62s5a27gbweu4woca @@ -1288,12 +1273,12 @@ packages: dependencies: '@hapi/boom': 10.0.0 '@hapi/hapi': 20.2.2 - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/plugin-hapi': 0.20.2_s4bbml4zwrk6aweizgdi3wdcky '@microfleet/plugin-opentracing': 0.23.2_46imanrvw62s5a27gbweu4woca '@microfleet/plugin-router': 0.21.2_kjjl4xi7xzddidnrgpdpeyy4ji '@microfleet/plugin-validator': 0.23.2_bvwrfqwp6ovpixapq6r75tjcb4 - '@microfleet/validation': 11.1.2 + '@microfleet/validation': 11.1.3 common-errors: 1.2.0 get-value: 3.0.1 lodash: 4.17.21 @@ -1313,12 +1298,12 @@ packages: common-errors: ~1.x.x dependencies: '@hapi/boom': 10.0.0 - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.23.2 '@microfleet/plugin-logger': 0.28.2_46imanrvw62s5a27gbweu4woca '@microfleet/transport-amqp': 17.3.0_common-errors@1.2.0 '@microfleet/utils': 0.23.2 - '@microfleet/validation': 11.1.2 + '@microfleet/validation': 11.1.3 common-errors: 1.2.0 glob: 8.0.3 hyperid: 3.0.1 @@ -1338,7 +1323,7 @@ packages: common-errors: ~1.x.x dependencies: '@hapi/boom': 10.0.0 - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.23.2 '@microfleet/utils': 0.23.2 '@types/hapi__hapi': 20.0.12 @@ -1354,7 +1339,7 @@ packages: common-errors: ~1.x.x dependencies: '@microfleet/amqp-coffee': 2.4.0 - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.23.2 '@microfleet/plugin-logger': 0.28.2_46imanrvw62s5a27gbweu4woca '@microfleet/plugin-router': 0.21.2_kjjl4xi7xzddidnrgpdpeyy4ji @@ -1363,7 +1348,7 @@ packages: '@microfleet/utils': 0.23.2 common-errors: 1.2.0 ms-socket.io-adapter-amqp: 9.0.1_iszuhnrpai7bkwccadrkjjrfhm - socket.io: 4.4.1 + socket.io: 4.5.3 transitivePeerDependencies: - bufferutil - supports-color @@ -1378,10 +1363,10 @@ packages: '@microfleet/core-types': ^0.23.2 '@microfleet/utils': ^0.23.2 dependencies: - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.23.2 '@microfleet/utils': 0.23.2 - '@microfleet/validation': 11.1.2 + '@microfleet/validation': 11.1.3 callsite: 1.0.0 common-errors: 1.2.0 lodash: 4.17.21 @@ -1397,10 +1382,10 @@ packages: '@microfleet/core-types': ^0.25.0 '@microfleet/utils': ^0.25.0 dependencies: - '@microfleet/core': 17.31.0_7lr2vv5bl57san5n4sfdx2tkfq + '@microfleet/core': 17.31.0_cmr2hirg4ud3x3n4uzoat6gkcm '@microfleet/core-types': 0.25.0 '@microfleet/utils': 0.25.0 - '@microfleet/validation': 11.1.2 + '@microfleet/validation': 11.1.3 callsite: 1.0.0 common-errors: 1.2.0 lodash: 4.17.21 @@ -1454,8 +1439,8 @@ packages: read-pkg-up: 7.0.1 dev: false - /@microfleet/validation/11.1.2: - resolution: {integrity: sha512-UAytvgv18PAFyrFHUlgdNlfElygLkohuupirJjSS4tQqIJrV95w7zdWYAhpnqW07M02IwVaATKz6oGOv/tjgmA==} + /@microfleet/validation/11.1.3: + resolution: {integrity: sha512-OxhKXarm59sm2OZv65tKttBg5qraOZ7wMOGfRTZ+8pJZEOHDrF/YzKkfWk2wNxmmYH2xxwbhfUMymW8MjGalwQ==} engines: {node: '>= 14.15.0', npm: '>= 4.x.x'} dependencies: ajv: 8.11.0 @@ -1464,7 +1449,7 @@ packages: callsite: 1.0.0 common-errors: 1.2.0 debug: 4.3.4 - glob: 7.2.0 + glob: 7.2.3 transitivePeerDependencies: - supports-color dev: false @@ -1791,16 +1776,16 @@ packages: - supports-color dev: true - /@sentry/types/7.7.0: - resolution: {integrity: sha512-4x8O7uerSGLnYC10krHl9t8h7xXHn5FextqKYbTCXCnx2hC8D+9lz8wcbQAFo0d97wiUYqI8opmEgFVGx7c5hQ==} + /@sentry/types/7.17.2: + resolution: {integrity: sha512-zxhNQ8Xt/hfP8bFZEV66ovJZK7aUqok5w1wjsHgkUz/S6/gkiMrDYT3OtRCRuY3mfQu9KmeBniM0xZkaxREJ1w==} engines: {node: '>=8'} dev: false - /@sentry/utils/7.7.0: - resolution: {integrity: sha512-fD+ROSFpeJlK7bEvUT2LOW7QqgjBpXJwVISKZ0P2fuzclRC3KoB2pbZgBM4PXMMTiSzRGWhvfRRjBiBvQJBBJQ==} + /@sentry/utils/7.17.2: + resolution: {integrity: sha512-l8t6qzyi+UUzD0a/oOYn4i+Eii+Ei29/TVwj/+9ogfJzBk6dSwSLvXievsyCRpcN3tftpWP0cHREcbZN64ZOWw==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.7.0 + '@sentry/types': 7.17.2 tslib: 1.14.1 dev: false @@ -1853,9 +1838,8 @@ packages: resolution: {integrity: sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==} dev: true - /@socket.io/base64-arraybuffer/1.0.2: - resolution: {integrity: sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==} - engines: {node: '>= 0.6.0'} + /@socket.io/component-emitter/3.1.0: + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} dev: false /@szmarczak/http-timer/1.1.2: @@ -1910,7 +1894,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 17.0.23 + '@types/node': 18.11.7 '@types/responselike': 1.0.0 dev: false @@ -1920,10 +1904,6 @@ packages: '@types/express': 4.17.14 dev: false - /@types/component-emitter/1.2.11: - resolution: {integrity: sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==} - dev: false - /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: @@ -1987,7 +1967,7 @@ packages: '@types/hapi__mimos': 4.1.4 '@types/hapi__shot': 4.1.2 '@types/node': 18.11.7 - joi: 17.6.0 + joi: 17.6.4 dev: false /@types/hapi__mimos/4.1.4: @@ -2027,7 +2007,7 @@ packages: /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 17.0.23 + '@types/node': 18.11.7 /@types/mime-db/1.43.1: resolution: {integrity: sha512-kGZJY+R+WnR5Rk+RPHUMERtb2qBRViIHCBdtUrY+NmwuGb8pQdfTqQiCKPrxpdoycl8KWm2DLdkpoSdt479XoQ==} @@ -2045,9 +2025,6 @@ packages: resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==} dev: true - /@types/node/17.0.23: - resolution: {integrity: sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==} - /@types/node/18.11.7: resolution: {integrity: sha512-LhFTglglr63mNXUSRYD8A+ZAIu5sFqNJ4Y2fPuY7UlrySJH87rRRlhtVmMHplmfk5WkoJGmDjE9oiTfyX94CpQ==} @@ -2069,15 +2046,10 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 17.0.23 + '@types/node': 18.11.7 /@types/retry/0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - dev: true - - /@types/retry/0.12.1: - resolution: {integrity: sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==} - dev: false /@types/serve-static/1.13.10: resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==} @@ -2179,7 +2151,7 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.7 + semver: 7.3.8 tsutils: 3.21.0_typescript@4.8.4 typescript: 4.8.4 transitivePeerDependencies: @@ -2609,7 +2581,7 @@ packages: dev: true /argv/0.0.2: - resolution: {integrity: sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=} + resolution: {integrity: sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==} engines: {node: '>=0.6.10'} dev: true @@ -2675,7 +2647,7 @@ packages: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} /asynckit/0.4.0: - resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false /at-least-node/1.0.0: @@ -2698,7 +2670,7 @@ packages: dev: true /aws-sign2/0.7.0: - resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=} + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} dev: false /aws4/1.11.0: @@ -2710,7 +2682,6 @@ packages: /base64-js/1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false /base64-url/2.3.3: resolution: {integrity: sha512-dLMhIsK7OplcDauDH/tZLvK7JmUZK3A7KiQpjNzsBrM6Etw7hzNI1tLEywqJk9NnwkgWuFKSlx/IUO7vF6Mo8Q==} @@ -2844,6 +2815,12 @@ packages: ieee754: 1.2.1 dev: false + /buffer/6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + /bufrw/1.3.0: resolution: {integrity: sha512-jzQnSbdJqhIltU9O5KUiTtljP9ccw2u5ix59McQy4pV2xGhVLhRZIndY8GIrgh5HjXa6+QJ9AQhOd2QWQizJFQ==} engines: {node: '>= 0.10.x'} @@ -2914,10 +2891,10 @@ packages: clone-response: 1.0.2 get-stream: 5.2.0 http-cache-semantics: 4.1.0 - keyv: 4.1.1 + keyv: 4.5.0 lowercase-keys: 2.0.0 normalize-url: 6.1.0 - responselike: 2.0.0 + responselike: 2.0.1 dev: false /call-bind/1.0.2: @@ -2931,7 +2908,7 @@ packages: dev: true /callsite/1.0.0: - resolution: {integrity: sha1-KAOY5dZkvXQDi28JBRU+borxvCA=} + resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} dev: false /callsites/3.1.0: @@ -2949,7 +2926,7 @@ packages: dev: true /camelcase/2.1.1: - resolution: {integrity: sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=} + resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} engines: {node: '>=0.10.0'} /camelcase/5.3.1: @@ -2974,7 +2951,7 @@ packages: dev: true /caseless/0.12.0: - resolution: {integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=} + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} dev: false /chai/4.3.6: @@ -3162,7 +3139,7 @@ packages: dev: true /clone-response/1.0.2: - resolution: {integrity: sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=} + resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} dependencies: mimic-response: 1.0.1 @@ -3229,6 +3206,11 @@ packages: /colorette/2.0.16: resolution: {integrity: sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==} + dev: true + + /colorette/2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + dev: false /colors/1.4.0: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} @@ -3281,12 +3263,8 @@ packages: dot-prop: 5.3.0 dev: true - /component-emitter/1.3.0: - resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} - dev: false - /concat-map/0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} /configstore/5.0.1: resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} @@ -3636,7 +3614,7 @@ packages: dev: true /delayed-stream/1.0.0: - resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} dev: false @@ -3649,8 +3627,8 @@ packages: engines: {node: '>=0.10'} dev: false - /denque/2.0.1: - resolution: {integrity: sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==} + /denque/2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} dev: false @@ -3801,15 +3779,13 @@ packages: dependencies: once: 1.4.0 - /engine.io-parser/5.0.3: - resolution: {integrity: sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==} + /engine.io-parser/5.0.4: + resolution: {integrity: sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==} engines: {node: '>=10.0.0'} - dependencies: - '@socket.io/base64-arraybuffer': 1.0.2 dev: false - /engine.io/6.1.3: - resolution: {integrity: sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==} + /engine.io/6.2.0: + resolution: {integrity: sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==} engines: {node: '>=10.0.0'} dependencies: '@types/cookie': 0.4.1 @@ -3820,7 +3796,7 @@ packages: cookie: 0.4.2 cors: 2.8.5 debug: 4.3.4 - engine.io-parser: 5.0.3 + engine.io-parser: 5.0.4 ws: 8.2.3 transitivePeerDependencies: - bufferutil @@ -4537,7 +4513,7 @@ packages: dev: true /esprima/1.2.5: - resolution: {integrity: sha1-CZNQL+r2aBODJXVvMPmlH+7sEek=} + resolution: {integrity: sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ==} engines: {node: '>=0.4.0'} hasBin: true @@ -4590,7 +4566,6 @@ packages: /events/3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - dev: true /execa/5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} @@ -4624,8 +4599,8 @@ packages: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} - /fast-copy/2.1.3: - resolution: {integrity: sha512-LDzYKNTHhD+XOp8wGMuCkY4eTxFZOOycmpwLBiuF3r3OjOmZnURRD8t2dUAbmKuXGbo/MGggwbSjcBdp8QT0+g==} + /fast-copy/2.1.7: + resolution: {integrity: sha512-ozrGwyuCTAy7YgFCua8rmqmytECYk/JYAMXcswOcm0qvGoE3tPb7ivBeIHTOK2DiapBhDZgacIhzhQIKU5TCfA==} dev: false /fast-decode-uri-component/1.0.1: @@ -4673,6 +4648,11 @@ packages: resolution: {integrity: sha512-odVmjC8x8jNeMZ3C+rPMESzXVSEU8tSWSHv9HFxP2mm89G/1WwqhrerJDQm9Zus8X6aoRgQDThKqptdNA6bt+A==} engines: {node: '>=6'} + /fast-redact/3.1.2: + resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} + engines: {node: '>=6'} + dev: false + /fast-safe-stringify/2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: false @@ -4682,7 +4662,7 @@ packages: dev: true /fast-url-parser/1.1.3: - resolution: {integrity: sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=} + resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} dependencies: punycode: 1.4.1 dev: true @@ -4710,7 +4690,7 @@ packages: proxy-addr: 2.0.7 rfdc: 1.3.0 secure-json-parse: 2.5.0 - semver: 7.3.7 + semver: 7.3.8 tiny-lru: 9.0.3 transitivePeerDependencies: - supports-color @@ -4849,7 +4829,7 @@ packages: dev: true /forever-agent/0.6.1: - resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=} + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: false /form-data/2.3.3: @@ -4904,7 +4884,7 @@ packages: dev: false /fs.realpath/1.0.0: - resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} /fsevents/2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} @@ -5067,6 +5047,7 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: true /glob/7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -5077,7 +5058,6 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true /glob/8.0.3: resolution: {integrity: sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==} @@ -5122,8 +5102,8 @@ packages: slash: 3.0.0 dev: true - /got/11.8.3: - resolution: {integrity: sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==} + /got/11.8.5: + resolution: {integrity: sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==} engines: {node: '>=10.19.0'} dependencies: '@sindresorhus/is': 4.6.0 @@ -5136,7 +5116,7 @@ packages: http2-wrapper: 1.0.3 lowercase-keys: 2.0.0 p-cancelable: 2.1.1 - responselike: 2.0.0 + responselike: 2.0.1 dev: false /got/9.6.0: @@ -5180,10 +5160,10 @@ packages: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.16.2 + uglify-js: 3.17.4 /har-schema/2.0.0: - resolution: {integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=} + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} engines: {node: '>=4'} dev: false @@ -5249,8 +5229,8 @@ packages: hasBin: true dev: true - /help-me/4.0.1: - resolution: {integrity: sha512-PLv01Z+OhEPKj2QPYB4kjoCUkopYNPUK3EROlaPIf5bib752fZ+VCvGDAoA+FXo/OwCyLEA4D2e0mX8+Zhcplw==} + /help-me/4.1.0: + resolution: {integrity: sha512-5HMrkOks2j8Fpu2j5nTLhrBhT7VwHwELpqnSnx802ckofys5MO2SkLpgSz3dgNFHV7IYFX2igm5CM75SmuYidw==} dependencies: glob: 8.0.3 readable-stream: 3.6.0 @@ -5262,7 +5242,7 @@ packages: hasBin: true dependencies: ansi-color: 0.2.1 - minimist: 1.2.6 + minimist: 1.2.7 process: 0.10.1 xtend: 4.0.2 dev: false @@ -5353,6 +5333,7 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color + dev: false /https-proxy-agent/5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} @@ -5390,7 +5371,6 @@ packages: /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false /ignore-by-default/1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} @@ -5450,7 +5430,7 @@ packages: dev: true /inflight/1.0.6: - resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -5722,7 +5702,7 @@ packages: dev: true /is-typedarray/1.0.0: - resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} /is-unicode-supported/0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} @@ -5765,7 +5745,7 @@ packages: engines: {node: '>=0.10.0'} /isstream/0.1.2: - resolution: {integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=} + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} dev: false /issue-parser/6.0.0: @@ -5834,6 +5814,16 @@ packages: '@sideway/address': 4.1.4 '@sideway/formula': 3.0.0 '@sideway/pinpoint': 2.0.0 + dev: false + + /joi/17.6.4: + resolution: {integrity: sha512-tPzkTJHZQjSFCc842QpdVpOZ9LI2txApboNUbW70qgnRB14Lzl+oWQOPdF2N4yqyiY14wBGe8lc7f/2hZxbGmw==} + dependencies: + '@hapi/hoek': 9.2.1 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.4 + '@sideway/formula': 3.0.0 + '@sideway/pinpoint': 2.0.0 /jose/2.0.6: resolution: {integrity: sha512-FVoPY7SflDodE4lknJmbAHSUjLCzE2H1F6MS0RYKMQ8SR+lNccpMf8R4eqkNYyyUjR5qZReOzZo5C5YiHOCjjg==} @@ -5941,7 +5931,7 @@ packages: dependencies: universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.9 dev: true /jsonparse/1.3.1: @@ -6031,8 +6021,8 @@ packages: json-buffer: 3.0.0 dev: true - /keyv/4.1.1: - resolution: {integrity: sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==} + /keyv/4.5.0: + resolution: {integrity: sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==} dependencies: json-buffer: 3.0.1 dev: false @@ -6161,7 +6151,7 @@ packages: dev: false /lodash.defaults/4.2.0: - resolution: {integrity: sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=} + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} dev: false /lodash.escaperegexp/4.1.2: @@ -6169,7 +6159,7 @@ packages: dev: true /lodash.flatten/4.4.0: - resolution: {integrity: sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=} + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} dev: false /lodash.get/4.4.2: @@ -6181,7 +6171,7 @@ packages: dev: false /lodash.isarguments/3.1.0: - resolution: {integrity: sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=} + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} dev: false /lodash.isboolean/3.0.3: @@ -6473,6 +6463,10 @@ packages: /minimist/1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + /minimist/1.2.7: + resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + dev: false + /minipass/3.1.6: resolution: {integrity: sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==} engines: {node: '>=8'} @@ -6552,7 +6546,7 @@ packages: debug: 4.3.4 dotenv: 8.6.0 eventemitter3: 4.0.7 - glob: 7.2.0 + glob: 7.2.3 lodash.mergewith: 4.6.2 lodash.reduce: 4.6.0 lodash.uniq: 4.5.0 @@ -6571,7 +6565,7 @@ packages: - supports-color dev: false - /ms-mailer-client/8.1.0_6pwm6lxvstydiyih5fgvdektyu: + /ms-mailer-client/8.1.0_e6nzqva4cfaw5jvvp23hbt4opq: resolution: {integrity: sha512-JL0kkxUIBP0luuSIXN4h9UzbSciDILGwvdHhidlJXe+PWVtRpiQ0T4GbI3wNouoNXrea+SpzBMP2TjZjcbxxog==} peerDependencies: '@microfleet/transport-amqp': '>= 12.x.x' @@ -6579,7 +6573,7 @@ packages: common-errors: ~1.x.x dependencies: '@microfleet/transport-amqp': 17.3.0_common-errors@1.2.0 - '@microfleet/validation': 11.1.2 + '@microfleet/validation': 11.1.3 common-errors: 1.2.0 lodash.merge: 4.6.2 dev: false @@ -6612,7 +6606,7 @@ packages: base64-url: 2.3.3 chance: 1.1.8 get-value: 3.0.1 - glob: 7.2.0 + glob: 7.2.3 ioredis: 4.28.5 is: 3.3.0 joi: 17.6.0 @@ -6634,18 +6628,18 @@ packages: resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==} dev: false - /nanoid/3.3.2: - resolution: {integrity: sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: false - /nanoid/3.3.3: resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -6986,7 +6980,7 @@ packages: resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} /once/1.4.0: - resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 @@ -7128,21 +7122,12 @@ packages: engines: {node: '>=8'} dev: true - /p-retry/4.6.1: - resolution: {integrity: sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==} - engines: {node: '>=8'} - dependencies: - '@types/retry': 0.12.1 - retry: 0.13.1 - dev: false - /p-retry/4.6.2: resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} engines: {node: '>=8'} dependencies: '@types/retry': 0.12.0 retry: 0.13.1 - dev: true /p-try/1.0.0: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} @@ -7219,7 +7204,7 @@ packages: engines: {node: '>=8'} /path-is-absolute/1.0.1: - resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} /path-key/3.1.1: @@ -7254,7 +7239,7 @@ packages: dev: true /performance-now/2.1.0: - resolution: {integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=} + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} dev: false /picocolors/1.0.0: @@ -7281,25 +7266,25 @@ packages: /pino-abstract-transport/1.0.0: resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} dependencies: - readable-stream: 4.1.0 + readable-stream: 4.2.0 split2: 4.1.0 /pino-pretty/8.1.0: resolution: {integrity: sha512-oKfI8qKXR2a3haHs/X8iB6QSnWLqoOGAjwxIAXem4+XOGIGNw7IKpozId1uE7j89Rj46HIfWnGbAgmQmr8+yRw==} hasBin: true dependencies: - colorette: 2.0.16 + colorette: 2.0.19 dateformat: 4.6.3 - fast-copy: 2.1.3 + fast-copy: 2.1.7 fast-safe-stringify: 2.1.1 - help-me: 4.0.1 + help-me: 4.1.0 joycon: 3.1.1 - minimist: 1.2.6 + minimist: 1.2.7 on-exit-leak-free: 1.0.0 pino-abstract-transport: 1.0.0 pump: 3.0.0 - readable-stream: 4.1.0 - secure-json-parse: 2.4.0 + readable-stream: 4.2.0 + secure-json-parse: 2.5.0 sonic-boom: 3.0.0 strip-json-comments: 3.1.1 dev: false @@ -7308,44 +7293,24 @@ packages: resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} dev: false - /pino-std-serializers/5.6.0: - resolution: {integrity: sha512-VdUXCw8gO+xhir7sFuoYSjTnzB+TMDGxhAC/ph3YS3sdHnXNdsK0wMtADNUltfeGkn2KDxEM21fnjF3RwXyC8A==} - dev: false - /pino-std-serializers/6.0.0: resolution: {integrity: sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ==} - /pino/7.9.2: - resolution: {integrity: sha512-c8wmB2PuhdJurYPRl/eo3+PosHe7Ep6GZvBJFIrp9oV1YRZQ3qm3MujaEolaKUfwX8cDL96WKCWWMedB2drXqw==} + /pino/7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} hasBin: true dependencies: - fast-redact: 3.1.1 + atomic-sleep: 1.0.0 + fast-redact: 3.1.2 on-exit-leak-free: 0.2.0 pino-abstract-transport: 0.5.0 pino-std-serializers: 4.0.0 process-warning: 1.0.0 quick-format-unescaped: 4.0.4 real-require: 0.1.0 - safe-stable-stringify: 2.3.1 - sonic-boom: 2.6.0 - thread-stream: 0.15.1 - dev: false - - /pino/8.1.0: - resolution: {integrity: sha512-53jlxs+02UNTtF1XwVWfa0dHipBiM5GK73XhkHn8M2hUl9y3L94dNwB8BwQhpd5WdHjBkyJiO7v0LRt4SGgsPg==} - hasBin: true - dependencies: - atomic-sleep: 1.0.0 - fast-redact: 3.1.1 - on-exit-leak-free: 2.1.0 - pino-abstract-transport: 1.0.0 - pino-std-serializers: 5.6.0 - process-warning: 2.0.0 - quick-format-unescaped: 4.0.4 - real-require: 0.1.0 - safe-stable-stringify: 2.3.1 - sonic-boom: 3.0.0 - thread-stream: 1.0.1 + safe-stable-stringify: 2.4.1 + sonic-boom: 2.8.0 + thread-stream: 0.15.2 dev: false /pino/8.7.0: @@ -7414,6 +7379,10 @@ packages: engines: {node: '>= 0.6.0'} dev: false + /process/0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + /progress/2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -7454,6 +7423,10 @@ packages: resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} dev: false + /psl/1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: false + /pstree.remy/1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} dev: true @@ -7473,7 +7446,7 @@ packages: dev: true /punycode/1.4.1: - resolution: {integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4=} + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} dev: true /punycode/2.1.1: @@ -7580,11 +7553,14 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readable-stream/4.1.0: - resolution: {integrity: sha512-sVisi3+P2lJ2t0BPbpK629j8wRW06yKGJUcaLAGXPAUhyUxVJm7VsCTit1PFgT4JHUDMrGNR+ZjSKpzGaRF3zw==} + /readable-stream/4.2.0: + resolution: {integrity: sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 /readdirp/3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} @@ -7635,7 +7611,7 @@ packages: dev: false /redis-errors/1.2.0: - resolution: {integrity: sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=} + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} dev: false @@ -7651,7 +7627,7 @@ packages: dev: false /redis-parser/3.0.0: - resolution: {integrity: sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=} + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} engines: {node: '>=4'} dependencies: redis-errors: 1.2.0 @@ -7809,8 +7785,8 @@ packages: lowercase-keys: 1.0.1 dev: true - /responselike/2.0.0: - resolution: {integrity: sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==} + /responselike/2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} dependencies: lowercase-keys: 2.0.0 dev: false @@ -7835,7 +7811,7 @@ packages: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: - glob: 7.2.0 + glob: 7.2.3 /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -7865,6 +7841,11 @@ packages: resolution: {integrity: sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==} engines: {node: '>=10'} + /safe-stable-stringify/2.4.1: + resolution: {integrity: sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==} + engines: {node: '>=10'} + dev: false + /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -7882,13 +7863,8 @@ packages: engines: {node: '>=8.5.0'} dev: false - /secure-json-parse/2.4.0: - resolution: {integrity: sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg==} - dev: false - /secure-json-parse/2.5.0: resolution: {integrity: sha512-ZQruFgZnIWH+WyO9t5rWt4ZEGqCKPwhiw+YbzTwpmT9elgLrLcfuyUiSnwwjUiVy9r4VM3urtbNF1xmEh9IL2w==} - dev: true /secure-keys/1.0.0: resolution: {integrity: sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=} @@ -7958,6 +7934,13 @@ packages: dependencies: lru-cache: 6.0.0 + /semver/7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + /serialize-error/8.1.0: resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==} engines: {node: '>=10'} @@ -8047,43 +8030,38 @@ packages: engines: {node: '>=8'} dev: true - /socket.io-adapter/2.3.3: - resolution: {integrity: sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==} - dev: false - /socket.io-adapter/2.4.0: resolution: {integrity: sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==} dev: false - /socket.io-parser/4.0.4: - resolution: {integrity: sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==} + /socket.io-parser/4.2.1: + resolution: {integrity: sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==} engines: {node: '>=10.0.0'} dependencies: - '@types/component-emitter': 1.2.11 - component-emitter: 1.3.0 + '@socket.io/component-emitter': 3.1.0 debug: 4.3.4 transitivePeerDependencies: - supports-color dev: false - /socket.io/4.4.1: - resolution: {integrity: sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==} + /socket.io/4.5.3: + resolution: {integrity: sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==} engines: {node: '>=10.0.0'} dependencies: accepts: 1.3.8 base64id: 2.0.0 debug: 4.3.4 - engine.io: 6.1.3 - socket.io-adapter: 2.3.3 - socket.io-parser: 4.0.4 + engine.io: 6.2.0 + socket.io-adapter: 2.4.0 + socket.io-parser: 4.2.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: false - /sonic-boom/2.6.0: - resolution: {integrity: sha512-6xYZFRmDEtxGqfOKcDQ4cPLrNa0SPEDI+wlzDAHowXE6YV42NeXqg9mP2KkiM8JVu3lHfZ2iQKYlGOz+kTpphg==} + /sonic-boom/2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} dependencies: atomic-sleep: 1.0.0 dev: false @@ -8206,7 +8184,7 @@ packages: dev: false /stealthy-require/1.1.1: - resolution: {integrity: sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=} + resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} engines: {node: '>=0.10.0'} dev: false @@ -8313,7 +8291,7 @@ packages: engines: {node: '>=8'} /stubs/3.0.0: - resolution: {integrity: sha1-6NK6H6nJBXAwPAMLaQD31fiavls=} + resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} dev: true /style-loader/3.3.1_webpack@5.70.0: @@ -8385,7 +8363,7 @@ packages: engines: {node: '>=10'} dependencies: http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 node-fetch: 2.6.7 stream-events: 1.0.5 uuid: 8.3.2 @@ -8472,14 +8450,8 @@ packages: engines: {node: '>=0.2.6'} dev: false - /thread-stream/0.15.1: - resolution: {integrity: sha512-SCnuIT27gc2h/F/RY2peuC7brgLy+1oXU+7yOIAITz1z5stDpXCF5rAoFcykjuK6ifbTlKAHL7Ccq8oc5Btv1w==} - dependencies: - real-require: 0.1.0 - dev: false - - /thread-stream/1.0.1: - resolution: {integrity: sha512-JuZyfzx81e5MBk8uIr8ZH76bXyjEQvbRDEkSdlV1JFBdq/rbby2RuvzBYlTBd/xCljxy6lPxrTLXzB9Jl1bNrw==} + /thread-stream/0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} dependencies: real-require: 0.1.0 dev: false @@ -8543,7 +8515,7 @@ packages: resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} engines: {node: '>=0.8'} dependencies: - psl: 1.8.0 + psl: 1.9.0 punycode: 2.1.1 dev: false @@ -8631,7 +8603,7 @@ packages: dev: true /tunnel-agent/0.6.0: - resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=} + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: safe-buffer: 5.2.1 dev: false @@ -8699,8 +8671,8 @@ packages: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} dev: true - /uglify-js/3.16.2: - resolution: {integrity: sha512-AaQNokTNgExWrkEYA24BTNMSjyqEXPSfhqoS0AxmHkCJ4U+Dyy5AvbGV/sqxuxficEfGGoX3zWw9R7QpLFfEsg==} + /uglify-js/3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true @@ -9071,7 +9043,7 @@ packages: strip-ansi: 6.0.1 /wrappy/1.0.2: - resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} /write-file-atomic/3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}