From 4092a8cccae51ccab9fe1b33c0f827d19e6e0d8e Mon Sep 17 00:00:00 2001 From: Prakash Selvam Date: Thu, 31 Oct 2024 17:22:10 -0500 Subject: [PATCH] 5.3.1 release --- .nvmrc | 2 +- package.json | 10 +- packages/example/src/ui/Footer.js | 18 +- packages/layer7-apihub/src/apis/ApiSpecs.js | 14 +- .../layer7-apihub/src/apis/ApiSpecs.test.js | 63 +-- .../src/apis/Application/ApiApplications.js | 144 ++++-- .../apis/Application/ApiApplications.test.js | 150 +++--- packages/layer7-apihub/src/apis/Swagger.js | 14 +- .../ApplicationDetailsKeyClient.js | 79 +++- .../src/applications/ApplicationEditView.js | 60 ++- .../src/applications/ApplicationKeysPanel.js | 193 ++++++-- .../src/applications/ApplicationToolbar.js | 1 + .../src/applications/constants.js | 4 +- .../authentication/credentialsAuthProvider.js | 2 +- .../src/authentication/useAuthSchemes.js | 2 +- .../layer7-apihub/src/dataProvider/apiKeys.js | 1 + .../src/dataProvider/applications.js | 1 + .../src/dataProvider/authProviders.js | 22 + .../layer7-apihub/src/dataProvider/index.js | 2 + packages/layer7-apihub/src/i18n/en.js | 10 + packages/layer7-apihub/src/i18n/es.js | 11 +- packages/layer7-apihub/src/i18n/fr.js | 9 + packages/layer7-apihub/src/permissionUtils.js | 19 + packages/layer7-apihub/src/theme/branding.js | 40 +- pom.xml | 2 +- remote-hosting/package-lock.json | 428 ++++++++++++------ remote-hosting/package.json | 4 +- yarn.lock | 386 +++++++++------- 28 files changed, 1173 insertions(+), 518 deletions(-) create mode 100644 packages/layer7-apihub/src/dataProvider/authProviders.js create mode 100644 packages/layer7-apihub/src/permissionUtils.js diff --git a/.nvmrc b/.nvmrc index 970d890c0..c20cd7ad0 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v12.16.3 \ No newline at end of file +v12.20.2 \ No newline at end of file diff --git a/package.json b/package.json index 9cff997bc..a8482799e 100644 --- a/package.json +++ b/package.json @@ -20,14 +20,14 @@ "cypress" ], "devDependencies": { + "babel-eslint": "^10.1.0", "concurrently": "~5.1.0", "eslint": "~7.11.0", "eslint-config-prettier": "~6.15.0", + "eslint-config-react-app": "^6.0.0", "eslint-plugin-prettier": "~3.1.4", "lint-staged": "~10.0.7", - "prettier": "~1.19.1", - "babel-eslint": "^10.1.0", - "eslint-config-react-app": "^6.0.0" + "prettier": "~1.19.1" }, "resolutions": { "@babel/plugin-transform-for-of": "7.12.13", @@ -42,7 +42,9 @@ "bl": "~4.0.3", "cypress": "~5.6.0", "date-fns": "~2.9.0", + "dompurify": "^2.5.6", "es-abstract": "~1.19.0", + "elliptic": "~6.5.7", "get-intrinsic": "~1.1.3", "serialize-javascript": "~3.1.0", "qs": "6.9.7", @@ -52,4 +54,4 @@ "fast-json-patch": "3.1.1", "yaml": "2.0.0-1" } -} +} \ No newline at end of file diff --git a/packages/example/src/ui/Footer.js b/packages/example/src/ui/Footer.js index 84bb5e8fb..5102bfca0 100644 --- a/packages/example/src/ui/Footer.js +++ b/packages/example/src/ui/Footer.js @@ -4,16 +4,18 @@ import { makeStyles } from '@material-ui/core'; export const Footer = () => { const classes = useStyles(); - + const showCopyright = localStorage.getItem('SHOW_COPYRIGHT'); return (
- - Copyright © 2024 Broadcom. All Rights Reserved - + {showCopyright === 'true' && ( + + Copyright © 2024 Broadcom. All Rights Reserved + + )}
); }; diff --git a/packages/layer7-apihub/src/apis/ApiSpecs.js b/packages/layer7-apihub/src/apis/ApiSpecs.js index 4add3a423..0d8be81bb 100755 --- a/packages/layer7-apihub/src/apis/ApiSpecs.js +++ b/packages/layer7-apihub/src/apis/ApiSpecs.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useCallback, useState } from 'react'; import { makeStyles } from '@material-ui/core/styles'; import { ApiApplications } from './Application'; @@ -7,10 +7,18 @@ import { Swagger } from './Swagger'; export const ApiSpecs = ({ record }) => { const classes = useStyles(); + const [selectedAPIkey, setSelectedAPIKey] = useState({}); + const handleKeyUpdate = useCallback(keyDetails => { + if (keyDetails) { + setSelectedAPIKey(keyDetails); + } else { + setSelectedAPIKey({}); + } + }, []); return (
- - + +
); }; diff --git a/packages/layer7-apihub/src/apis/ApiSpecs.test.js b/packages/layer7-apihub/src/apis/ApiSpecs.test.js index c6d1f793f..bd5239b3e 100755 --- a/packages/layer7-apihub/src/apis/ApiSpecs.test.js +++ b/packages/layer7-apihub/src/apis/ApiSpecs.test.js @@ -7,38 +7,44 @@ import specs from './specs.json'; const defaultData = [ { - id: "17694075-6d09-4df0-8307-90f41de2f35a", - uuid: "17694075-6d09-4df0-8307-90f41de2f35a", - name: "SQL National Functionality", - status: "REJECTED", + id: '17694075-6d09-4df0-8307-90f41de2f35a', + uuid: '17694075-6d09-4df0-8307-90f41de2f35a', + name: 'SQL National Functionality', + status: 'REJECTED', disabledByType: null, - description: "Networked non-volatile challenge", - OauthCallbackUrl: "https://example.com/oauthCallback", - OauthScope: "OOB", - OauthType: "public", - apiKey: "f2055ef4-dd20-4a71-bd91-18042cc348c9", - keySecret: "3ae27eaf-c882-429f-8339-94a675088486", + description: 'Networked non-volatile challenge', + OauthCallbackUrl: 'https://example.com/oauthCallback', + OauthScope: 'OOB', + OauthType: 'public', + apiKey: 'f2055ef4-dd20-4a71-bd91-18042cc348c9', + keySecret: '3ae27eaf-c882-429f-8339-94a675088486', apiIds: { - results: ["beb8833e-1876-4b31-ace3-5d50aa0d9007", "8a334a2f-de19-472a-bb11-5a6e38e1c2ee"] + results: [ + 'beb8833e-1876-4b31-ace3-5d50aa0d9007', + '8a334a2f-de19-472a-bb11-5a6e38e1c2ee', + ], }, - _accessibleApis: ["beb8833e-1876-4b31-ace3-5d50aa0d9007"] + _accessibleApis: ['beb8833e-1876-4b31-ace3-5d50aa0d9007'], }, { - id: "80dc52f6-1d63-4c10-bf94-cae666c03dc8", - uuid: "80dc52f6-1d63-4c10-bf94-cae666c03dc8", - name: "GB Future Response", - status: "APPLICATION_PENDING_APPROVAL", + id: '80dc52f6-1d63-4c10-bf94-cae666c03dc8', + uuid: '80dc52f6-1d63-4c10-bf94-cae666c03dc8', + name: 'GB Future Response', + status: 'APPLICATION_PENDING_APPROVAL', disabledByType: null, - description: "Distributed bifurcated customer loyalty", - OauthCallbackUrl: "https://example.com/oauthCallback", - OauthScope: "OOB", - OauthType: "public", - apiKey: "b2dcdf94-d7cf-47e1-9b03-9efb862f0a9b", - keySecret: "b2e97991-9a8c-4160-a9e2-ea10be778f48", + description: 'Distributed bifurcated customer loyalty', + OauthCallbackUrl: 'https://example.com/oauthCallback', + OauthScope: 'OOB', + OauthType: 'public', + apiKey: 'b2dcdf94-d7cf-47e1-9b03-9efb862f0a9b', + keySecret: 'b2e97991-9a8c-4160-a9e2-ea10be778f48', apiIds: { - results: ["32b97328-5800-4811-b53d-1ad107d36541", "8a334a2f-de19-472a-bb11-5a6e38e1c2ee"] + results: [ + '32b97328-5800-4811-b53d-1ad107d36541', + '8a334a2f-de19-472a-bb11-5a6e38e1c2ee', + ], }, - _accessibleApis: ["32b97328-5800-4811-b53d-1ad107d36541"] + _accessibleApis: ['32b97328-5800-4811-b53d-1ad107d36541'], }, ]; @@ -46,6 +52,7 @@ const dataProvider = { getList: jest.fn().mockResolvedValue({ data: defaultData, total: defaultData.length, + totalPages: 1, }), getOne: jest.fn().mockResolvedValue({ data: specs, @@ -60,8 +67,8 @@ const initialState = { specs: { data: { api_1: specs, - } - } + }, + }, }, }, }; @@ -78,7 +85,9 @@ describe('ApiSpecs', () => { await wait(() => { expect( - getByLabelText('resources.apis.specification.actions.search_or_select_application') + getByLabelText( + 'resources.apis.specification.actions.search_or_select_application' + ) ).not.toBeNull(); }); }); diff --git a/packages/layer7-apihub/src/apis/Application/ApiApplications.js b/packages/layer7-apihub/src/apis/Application/ApiApplications.js index 9dc2e9106..bd3779d48 100755 --- a/packages/layer7-apihub/src/apis/Application/ApiApplications.js +++ b/packages/layer7-apihub/src/apis/Application/ApiApplications.js @@ -5,14 +5,20 @@ import FormControl from '@material-ui/core/FormControl'; import Grid from '@material-ui/core/Grid'; import Typography from '@material-ui/core/Typography'; import TextField from '@material-ui/core/TextField'; +import Select from '@material-ui/core/Select'; +import InputLabel from '@material-ui/core/InputLabel'; +import Input from '@material-ui/core/Input'; +import MenuItem from '@material-ui/core/MenuItem'; import Autocomplete from '@material-ui/lab/Autocomplete'; import CircularProgress from '@material-ui/core/CircularProgress'; import uniqBy from 'lodash/uniqBy'; +import find from 'lodash/find'; -import { ApiApplicationCredentials } from './ApiApplicationCredentials'; import { useLayer7Notify } from '../../useLayer7Notify'; -export const ApiApplications = ({ id }) => { +const emptyFunction = () => {}; + +export const ApiApplications = ({ handleKeyUpdate = emptyFunction, id }) => { const translate = useTranslate(); const classes = useStyles(); const dataProvider = useDataProvider(); @@ -20,57 +26,108 @@ export const ApiApplications = ({ id }) => { const [selectedApp, setSelectedApp] = useState(); const [open, setOpen] = React.useState(false); const [applications, setApplications] = useState([]); + const [apiKeys, setApiKeys] = useState([]); + const [selectedAPIKey, setSelectedAPIKey] = useState(); const [search, setSearch] = React.useState(undefined); - const [loading, setLoading] = React.useState(false); - const [currentPage, setCurrentPage] = React.useState(1); + const [loadingApplications, setLoadingApplications] = React.useState(false); + const [loadingAPIKeys, setLoadingAPIKeys] = React.useState(false); + const [currentAppPage, setCurrentAppPage] = React.useState(1); + const [currentAPIkeyPage, setCurrentAPIkeyPage] = React.useState(0); const fetchApplications = async searchValue => { - const { data, total } = await dataProvider.getList( + const { data, totalPages } = await dataProvider.getList( 'applications', { filter: { apiUuid: id, name: search, }, - pagination: { page: currentPage, perPage: 10 }, + pagination: { page: currentAppPage, perPage: 10 }, sort: { field: 'name', order: 'ASC' }, }, { onFailure: error => notify(error), } ); + return [data, totalPages]; + }; + + const fetchAPIKeys = async () => { + const { data, totalPages } = await dataProvider.getList( + 'apiKeys', + { + applicationUuid: selectedApp.id, + pagination: { page: currentAPIkeyPage, perPage: 10 }, + sort: { field: 'createTs', order: 'DESC' }, + }, + { + onFailure: error => notify(error), + } + ); - return [data, total]; + return [data, totalPages]; }; + const handleAPIKeyChange = evt => { + setSelectedAPIKey(evt.target.value); + }; + + React.useEffect(() => { + let active = true; + + (async () => { + if (!selectedApp) { + return; + } + const [data, totalPages] = await fetchAPIKeys(); + + if (active) { + setApiKeys(uniqBy([...apiKeys, ...data], 'apiKey')); + if (currentAPIkeyPage < totalPages) { + setCurrentAPIkeyPage(currentAPIkeyPage + 1); + } else { + setLoadingAPIKeys(false); + } + } + })(); + + return () => { + active = false; + }; + // eslint-disable-next-line + }, [selectedApp, currentAPIkeyPage]); + const onSearch = event => { - setCurrentPage(1); - setLoading(true); + setCurrentAppPage(1); + setLoadingApplications(true); setSearch(event.target.value); }; React.useEffect(() => { if (!open) { - setLoading(false); + setLoadingApplications(false); setSearch(undefined); } }, [open]); + React.useEffect(() => { + if (handleKeyUpdate) { + const apiKey = find(apiKeys, item => item.id === selectedAPIKey); + handleKeyUpdate(apiKey); + } + }, [apiKeys, handleKeyUpdate, selectedAPIKey]); + React.useEffect(() => { let active = true; (async () => { - const [data, total] = await fetchApplications(search); - + const [data, totalPages] = await fetchApplications(search); if (active) { - if (data.length == total) { - setApplications(data); - setLoading(false); - } else if (applications.length < total) { - setApplications(uniqBy([...applications, ...data], 'uuid')); - setCurrentPage(currentPage + 1); + setApplications(uniqBy([...applications, ...data], 'id')); + if (currentAppPage < totalPages) { + setCurrentAppPage(currentAppPage + 1); } else { - setLoading(false); + setLoadingApplications(false); } } })(); @@ -78,7 +135,8 @@ export const ApiApplications = ({ id }) => { return () => { active = false; }; - }, [search, currentPage]); + // eslint-disable-next-line + }, [search, currentAppPage]); return (
@@ -97,17 +155,17 @@ export const ApiApplications = ({ id }) => { onOpen={() => setOpen(true)} onClose={(event, reason) => setOpen(false)} onChange={(event, app, reason) => { + setCurrentAPIkeyPage(1); + setApiKeys([]); setSelectedApp(app); - if (reason == 'clear') { - setApplications([]); - } + setSelectedAPIKey(); }} getOptionSelected={(option, value) => option.name === value.name } getOptionLabel={option => option.name} options={applications} - loading={loading} + loading={loadingApplications} loadingText={translate('ra.action.loading')} renderInput={params => ( { ...params.InputProps, endAdornment: ( - {loading ? ( + {loadingApplications ? ( { )} /> - - {translate( - 'resources.apis.specification.actions.select_application' - )} - - {selectedApp && ( - - )} + + {translate('resources.applications.fields.apiKeyName')} + + + + {translate( + 'resources.apis.specification.actions.select_api_key' + )} + + +
diff --git a/packages/layer7-apihub/src/apis/Application/ApiApplications.test.js b/packages/layer7-apihub/src/apis/Application/ApiApplications.test.js index 92d65d75f..c83666137 100755 --- a/packages/layer7-apihub/src/apis/Application/ApiApplications.test.js +++ b/packages/layer7-apihub/src/apis/Application/ApiApplications.test.js @@ -29,6 +29,7 @@ describe('Applications', () => { }, ], total: 3, + totalPages: 1, }, }, }, @@ -38,31 +39,53 @@ describe('Applications', () => { }; const dataProvider = { - getList: jest.fn().mockResolvedValue({ - data: [ - { - id: 1, - name: 'application 1', - }, - { - id: 2, - name: 'application 2', - }, - { - id: 3, - name: 'application 3', - }, - { - id: 4, - name: 'app 4', - }, - { - id: 5, - name: 'app 5', - }, - ], - total: 5, - }), + getList: type => { + if (type === 'applications') { + return Promise.resolve({ + data: [ + { + id: 1, + name: 'application 1', + }, + { + id: 2, + name: 'application 2', + }, + { + id: 3, + name: 'application 3', + }, + { + id: 4, + name: 'app 4', + }, + { + id: 5, + name: 'app 5', + }, + ], + total: 5, + totalPages: 1, + }); + } else if (type === 'apiKeys') { + return Promise.resolve({ + data: [ + { + apiKey: 1, + id: 1, + name: 'key 1', + }, + { + apiKey: 2, + id: 2, + name: 'key 2', + }, + ], + total: 2, + totalPages: 1, + }); + } + }, }; const { getByLabelText, queryByText } = renderWithRedux( @@ -72,12 +95,12 @@ describe('Applications', () => { initialState ); - const select = getByLabelText( + const appSelect = getByLabelText( 'resources.apis.specification.actions.search_or_select_application' ); - // Show all applications when select when no search criteria - await wait(() => fireEvent.mouseDown(select)); + // Show all applications when appSelect when no search criteria + await wait(() => fireEvent.mouseDown(appSelect)); expect(queryByText('application 1')).not.toBeNull(); expect(queryByText('application 2')).not.toBeNull(); expect(queryByText('application 3')).not.toBeNull(); @@ -86,7 +109,7 @@ describe('Applications', () => { // Enter search criteria await wait(() => - fireEvent.change(select, { target: { value: 'application' } }) + fireEvent.change(appSelect, { target: { value: 'application' } }) ); expect(queryByText('application 1')).not.toBeNull(); expect(queryByText('application 2')).not.toBeNull(); @@ -112,19 +135,40 @@ describe('Applications', () => { }, }, }; - const dataProvider = { - getList: jest.fn().mockResolvedValue({ - data: [ - { - id: 1, - name: 'application 1', - apiKey: 'the_api_key', - keySecret: 'the_api_secret', - }, - ], - total: 1, - }), + getList: type => { + if (type === 'applications') { + return Promise.resolve({ + data: [ + { + id: 1, + name: 'application 1', + apiKey: 'the_api_key', + keySecret: 'the_api_secret', + }, + ], + total: 1, + totalPages: 1, + }); + } else if (type === 'apiKeys') { + return Promise.resolve({ + data: [ + { + apiKey: 1, + id: 1, + name: 'key 1', + }, + { + apiKey: 2, + id: 2, + name: 'key 2', + }, + ], + total: 2, + totalPages: 1, + }); + } + }, getOne: jest.fn().mockResolvedValue({ data: { id: 1, @@ -142,13 +186,17 @@ describe('Applications', () => { initialState ); + const appSelect = getByLabelText( + 'resources.apis.specification.actions.search_or_select_application' + ); + const keySelect = getByLabelText( + 'resources.apis.specification.actions.select_api_key' + ); + await wait(() => { - const select = getByLabelText( - 'resources.apis.specification.actions.search_or_select_application' - ); - fireEvent.mouseDown(select); + fireEvent.mouseDown(appSelect); // Enter search criteria - fireEvent.change(select, { target: { value: 'application' } }); + fireEvent.change(appSelect, { target: { value: 'application' } }); }); await wait(() => { @@ -157,11 +205,11 @@ describe('Applications', () => { fireEvent.click(getByText('application 1')); - await wait(() => { - expect(queryByText('the_api_key')).not.toBeNull(); - expect(queryByText('the_api_secret')).not.toBeNull(); - }); + await wait(() => fireEvent.mouseDown(keySelect)); + + expect(queryByText('key 1')).not.toBeNull(); + expect(queryByText('key 2')).not.toBeNull(); - expect.assertions(3); + fireEvent.click(getByText('key 1')); }); }); diff --git a/packages/layer7-apihub/src/apis/Swagger.js b/packages/layer7-apihub/src/apis/Swagger.js index 73ff09ce2..0a7bf53c7 100755 --- a/packages/layer7-apihub/src/apis/Swagger.js +++ b/packages/layer7-apihub/src/apis/Swagger.js @@ -7,9 +7,10 @@ import SwaggerUI from 'swagger-ui-react'; import 'swagger-ui-react/swagger-ui.css'; import { makeStyles } from '@material-ui/core'; -export const Swagger = ({ id }) => { +export const Swagger = ({ apiKeyDetails, id }) => { const translate = useTranslate(); const classes = useStyles(); + const { apiKey, keySecret } = apiKeyDetails || {}; const { data, loaded, error } = useGetOne('specs', id); @@ -27,7 +28,16 @@ export const Swagger = ({ id }) => { return (
- + { + system.initOAuth({ + clientId: apiKey, + clientSecret: keySecret, + }); + }} + spec={data} + />
); }; diff --git a/packages/layer7-apihub/src/applications/ApplicationDetailsKeyClient.js b/packages/layer7-apihub/src/applications/ApplicationDetailsKeyClient.js index dcbd9c9a4..c44b74932 100644 --- a/packages/layer7-apihub/src/applications/ApplicationDetailsKeyClient.js +++ b/packages/layer7-apihub/src/applications/ApplicationDetailsKeyClient.js @@ -1,5 +1,5 @@ import React, { Fragment } from 'react'; -import { Labeled, TextField } from 'react-admin'; +import { Labeled, TextField, useDataProvider } from 'react-admin'; import { useTranslate } from 'ra-core'; import Grid from '@material-ui/core/Grid'; import Typography from '@material-ui/core/Typography'; @@ -22,6 +22,7 @@ import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails'; import classnames from 'classnames'; import moment from 'moment'; import momentTimeZone from 'moment-timezone'; +import forEach from 'lodash/forEach'; import { CERTIFICATE_DISPLAY_FORMAT } from './constants'; import { useCopyToClipboard } from '../ui'; @@ -64,6 +65,26 @@ export const ApplicationDetailsKeyClient = props => { successMessage: 'resources.applications.notifications.copy_success', errorMessage: 'resources.applications.notifications.copy_error', }); + const [authProviders, setAuthProviders] = React.useState([]); + const [authProvidersMap, setAuthProvidersMap] = React.useState({}); + const dataProvider = useDataProvider(); + + React.useEffect(() => { + (async () => { + const { data } = + (await dataProvider.getList('authProviders')) || {}; + setAuthProviders(data); + })(); + }, [dataProvider]); + + React.useEffect(() => { + const providersMap = {}; + forEach(authProviders, item => { + providersMap[item.id] = item.name; + }); + setAuthProvidersMap(providersMap); + }, [authProviders]); + if (!data || !data.apiKey) { return null; } @@ -216,6 +237,62 @@ export const ApplicationDetailsKeyClient = props => { )} + + {data.authMethod === 'NONE' && ( + , this will translate in a correct `for` attribute on the label + id="apiKeyAuthProvider" + label={ + 'resources.applications.fields.authprovider' + } + classes={classes} + className={classes.fieldLabel} + > + + + { + authProvidersMap[ + data.authProviderUuid + ] + } + + + + )} + + + {data.authMethod === 'NONE' && ( + , this will translate in a correct `for` attribute on the label + id="apiKeyAuthMethod" + label={ + 'resources.applications.fields.authMethod' + } + classes={classes} + className={classes.fieldLabel} + > + + + {translate( + 'resources.applications.fields.notAvailableAuthMethod' + )} + + + + )} + , this will translate in a correct `for` attribute on the label diff --git a/packages/layer7-apihub/src/applications/ApplicationEditView.js b/packages/layer7-apihub/src/applications/ApplicationEditView.js index 5029d01d8..aafc99168 100644 --- a/packages/layer7-apihub/src/applications/ApplicationEditView.js +++ b/packages/layer7-apihub/src/applications/ApplicationEditView.js @@ -1,3 +1,4 @@ +// Copyright © 2024 Broadcom Inc. and its subsidiaries. All Rights Reserved. import React, { useState, useEffect } from 'react'; import { Labeled, @@ -122,6 +123,7 @@ export const ApplicationEditView = ({ const [assignedCertName, setAssignedCertName] = useState(''); const isAppIncomplete = record.status === APPLICATION_STATUS_INCOMPLETE; const isAppRejected = record.status === APPLICATION_STATUS_REJECTED; + const [authProviders, setAuthProviders] = useState([]); const { data: apiPlanFeatureFlag, @@ -132,6 +134,14 @@ export const ApplicationEditView = ({ payload: {}, }); + React.useEffect(() => { + (async () => { + const { data } = + (await dataProvider.getList('authProviders')) || {}; + setAuthProviders(data); + })(); + }, [dataProvider]); + // get application certificates data const [fetchApplicationCerts, { data: applicationCertsData }] = useMutation( { @@ -145,7 +155,7 @@ export const ApplicationEditView = ({ useEffect(() => { fetchApplicationCerts(); - }, []); + }, [fetchApplicationCerts]); useEffect(() => { if (applicationCertsData) { @@ -424,13 +434,22 @@ export const ApplicationEditView = ({ }; } if (apiKey === NEW_KEY) { - addApiKey(record.id, { - ...keyData, - ...(isAuthMethodSecret && { - keySecretHashed: secretHashing === 'HASHED', - }), - defaultKey: form.apiKeys.length === 1, - }); + if (keyData.authMethod === 'NONE') { + addApiKey(record.id, { + ...keyData, + authProviderUuid: apiKeyObject.authProviderUuid, + apiKey: apiKeyObject.userProvidedApiKey, + defaultKey: form.apiKeys.length === 1, + }); + } else { + addApiKey(record.id, { + ...keyData, + ...(isAuthMethodSecret && { + keySecretHashed: secretHashing === 'HASHED', + }), + defaultKey: form.apiKeys.length === 1, + }); + } } else { if (!isEditApiKeysLocked) { update( @@ -481,11 +500,25 @@ export const ApplicationEditView = ({ setAddedKey(data); setOpenSecretDialog(true); } else { - notify( - translate( - 'resources.applications.notifications.key_create_success' - ) - ); + if ( + isOrgBoundUser(userContext) && + !isAppIncomplete && + workFlowConfigurations.editApplicationRequestWorkflowStatus === + 'ENABLED' + ) { + notify( + translate( + 'resources.applications.notifications.key_create_request_success' + ) + ); + } else { + notify( + translate( + 'resources.applications.notifications.key_create_success' + ) + ); + } + if (isAppIncomplete) { reloadForm(); } else { @@ -1288,6 +1321,7 @@ export const ApplicationEditView = ({ apiKeysLoading={apiKeysLoading} appCertificates={appCertificates} application={record} + authProviders={authProviders} initialValues={initialValues} isEditApiKeysLocked={isEditApiKeysLocked} isSectionModified={isSectionModified} diff --git a/packages/layer7-apihub/src/applications/ApplicationKeysPanel.js b/packages/layer7-apihub/src/applications/ApplicationKeysPanel.js index fe72febab..11b375e6e 100644 --- a/packages/layer7-apihub/src/applications/ApplicationKeysPanel.js +++ b/packages/layer7-apihub/src/applications/ApplicationKeysPanel.js @@ -1,3 +1,4 @@ +// Copyright © 2024 Broadcom Inc. and its subsidiaries. All Rights Reserved. import React, { Fragment, useState } from 'react'; import { ArrayInput, @@ -6,6 +7,7 @@ import { maxLength, RadioButtonGroupInput, required, + SelectInput, SimpleFormIterator, TextInput, TopToolbar, @@ -22,7 +24,7 @@ import { TableRow, Typography, } from '@material-ui/core'; -import { isPortalAdmin, isOrgBoundUser } from '../userContexts'; +import { isPortalAdmin } from '../userContexts'; import DeleteIcon from '@material-ui/icons/Delete'; import AddCircleOutlineIcon from '@material-ui/icons/AddCircleOutline'; import { ConfirmDialog } from '../ui/ConfirmDialog'; @@ -32,14 +34,33 @@ import { ApplicationKeySecret } from './ApplicationKeySecret'; import CollapsiblePanel from './CollapsiblePanel'; import { useTranslate } from 'ra-core'; import moment from 'moment'; +import filter from 'lodash/filter'; import get from 'lodash/get'; import momentTimeZone from 'moment-timezone'; -import { CERTIFICATE_DISPLAY_FORMAT } from './constants'; +import { + CERTIFICATE_DISPLAY_FORMAT, + DEFAULT_PORTAL_AUTH_PROVIDER_UUID, +} from './constants'; +import { + API_KEYS_APPLICATION, + hasCRUDPermissions, + PERMISSIONS_CREATE, + PERMISSIONS_DELETE, + PERMISSIONS_UPDATE, +} from '../permissionUtils'; +import { useForm } from 'react-final-form'; import { useLayer7Notify } from '../useLayer7Notify'; const NEW_KEY = 'NEW_KEY'; const PANEL_ID_KEY_PREFIX = 'PANEL_ID_KEY_PREFIX_'; + +const APPLICATION_STATUS_DISABLED = 'DISABLED'; const APPLICATION_STATUS_INCOMPLETE = 'INCOMPLETE'; +const APPLICATION_STATUS_PENDING_APPROVAL = 'APPLICATION_PENDING_APPROVAL'; +const APPLICATION_STATUS_REJECTED = 'REJECTED'; +const APPLICATION_STATUS_DELETE_PENDING_APPROVAL = + 'DELETE_APPLICATION_PENDING_APPROVAL'; +const APPLICATION_STATUS_DELETE_FAILED = 'DELETE_FAILED'; export const ApplicationKeysPanel = ({ activePanelID, @@ -49,6 +70,7 @@ export const ApplicationKeysPanel = ({ apiKeys, appCertificates, application, + authProviders, initialValues, isEditApiKeysLocked, isSectionModified, @@ -71,8 +93,18 @@ export const ApplicationKeysPanel = ({ const [proxyCheckFailed, setProxyCheckFailed] = React.useState(false); const [deletingKeyId, setDeletingKeyId] = useState(); const notify = useLayer7Notify(); + const form = useForm(); - const canDeleteAPIKey = !isOrgBoundUser(userContext); + const canDeleteKey = hasCRUDPermissions( + userContext.userDetails, + [PERMISSIONS_DELETE], + API_KEYS_APPLICATION + ); + const canEditKey = hasCRUDPermissions( + userContext.userDetails, + [PERMISSIONS_UPDATE], + API_KEYS_APPLICATION + ); const contentLabelClasses = useContentStyles(); const confirmDelete = keyId => { @@ -80,6 +112,11 @@ export const ApplicationKeysPanel = ({ setDeleteKeyConfirm(true); }; + React.useEffect(() => { + form.change('apiKeys', apiKeys); + //eslint-disable-next-line + }, [apiKeys]); + const deleteApiKey = (ignoreProxyCheck, forceDelete) => { dataProvider.delete( 'apiKeys', @@ -133,7 +170,7 @@ export const ApplicationKeysPanel = ({ const hasAppCertificates = appCertificates && appCertificates.length > 0; - const getKeyLabel = status => { + const getKeyDeleteLabel = status => { if (isPortalAdmin(userContext) && status === 'DELETE_FAILED') { return translate('resources.apikeys.actions.force_delete'); } @@ -141,7 +178,7 @@ export const ApplicationKeysPanel = ({ }; const isAppIncomplete = - application.status === APPLICATION_STATUS_INCOMPLETE; + get(application, 'status') === APPLICATION_STATUS_INCOMPLETE; const keysSummaryLabelContent = isAppIncomplete && @@ -162,7 +199,7 @@ export const ApplicationKeysPanel = ({ }); const isKeyEditDisabled = status => - isEditApiKeysLocked || status === 'DELETE_FAILED'; + isEditApiKeysLocked || status === 'DELETE_FAILED' || !canEditKey; const secretTypeChoices = [ { @@ -188,21 +225,25 @@ export const ApplicationKeysPanel = ({ const authMethodChoices = [ { - description: 'Created on save', - id: 'SECRET', - name: translate('resources.applications.fields.authMethodSecret'), + id: 'NONE', + name: translate('resources.applications.fields.authMethodNone'), }, { - description: - 'At least one valid client certificate added to the application is required.', id: 'CERTIFICATE', name: translate( 'resources.applications.fields.authMethodCertificate' ), }, + { + id: 'SECRET', + name: translate('resources.applications.fields.authMethodSecret'), + }, ]; - const renderKey = ({ getSource, scopedFormData }) => { + const renderKey = ({ getSource, scopedFormData, source }) => { + const regex = /apiKeys\[(\d+)\]\./; + const match = getSource('').match(regex); + const index = parseInt(match[1]); if (!getSource('apiKey') && !addingKeyEntry) { return ; } @@ -243,11 +284,17 @@ export const ApplicationKeysPanel = ({ } } + const deleteKeyDisabledStates = [ + APPLICATION_STATUS_DELETE_FAILED, + APPLICATION_STATUS_DELETE_PENDING_APPROVAL, + APPLICATION_STATUS_DISABLED, + APPLICATION_STATUS_PENDING_APPROVAL, + APPLICATION_STATUS_REJECTED, + ]; const disableDeleteKey = get(scopedFormData, 'defaultKey') || - !canDeleteAPIKey || - addingKeyEntry || - (apiKeys && apiKeys.length === 1); + deleteKeyDisabledStates.includes(get(application, 'status')) || + addingKeyEntry; const handleKeyPanelClick = (evt, expanded) => onPanelClick( @@ -263,7 +310,7 @@ export const ApplicationKeysPanel = ({ ); const isForceDelete = isPortalAdmin(userContext) && - apiKeyObj.status === 'DELETE_FAILED'; + get(apiKeyObj, 'status') === 'DELETE_FAILED'; deleteApiKey(proxyCheckFailed || isForceDelete, isForceDelete); }; @@ -331,6 +378,34 @@ export const ApplicationKeysPanel = ({ ); }; + const isDefaultAuthProviderSelected = + get(scopedFormData, 'authProviderUuid') === + DEFAULT_PORTAL_AUTH_PROVIDER_UUID; + + let defaultAuthProviderOptions = filter( + authMethodChoices, + item => item.id !== 'NONE' + ); + defaultAuthProviderOptions = hasAppCertificates + ? defaultAuthProviderOptions + : filter( + defaultAuthProviderOptions, + item => item.id !== 'CERTIFICATE' + ); + + const handleAuthProviderChange = event => { + const value = get(event, 'target.value'); + if (value !== DEFAULT_PORTAL_AUTH_PROVIDER_UUID) { + form.change(`apiKeys[${index}].authMethod`, 'NONE'); + } else { + form.change(`apiKeys[${index}].authMethod`, 'SECRET'); + } + }; + + const filteredAuthMethodChoices = isDefaultAuthProviderSelected + ? defaultAuthProviderOptions + : filter(authMethodChoices, item => item.id === 'NONE'); + return (
- + {canDeleteKey && ( + + )}
{renderDeleteConfirmDialog()} - + } record={scopedFormData} required source={getSource('authMethod')} @@ -489,24 +577,51 @@ export const ApplicationKeysPanel = ({ )} {get(scopedFormData, 'authMethod') === 'CERTIFICATE' && renderCertificates()} + {get(scopedFormData, 'authMethod') === 'NONE' && + !currentItemAPIKey && ( + + )}
); }; - const disableAddKeyEntry = - addingKeyEntry || - isSectionModified || - (isAppIncomplete && apiKeys && apiKeys.length === 1); - const handleAddKeyBtnClick = () => { setAddingKeyEntry(true); setActivePanelID(`${PANEL_ID_KEY_PREFIX}${NEW_KEY}`); }; + const canAddKey = hasCRUDPermissions( + userContext.userDetails, + [PERMISSIONS_CREATE], + API_KEYS_APPLICATION + ); + + const addKeyDisabledStates = [ + APPLICATION_STATUS_DELETE_FAILED, + APPLICATION_STATUS_DELETE_PENDING_APPROVAL, + APPLICATION_STATUS_DISABLED, + APPLICATION_STATUS_PENDING_APPROVAL, + APPLICATION_STATUS_REJECTED, + ]; + + const disableAddKeyEntry = + addingKeyEntry || + isSectionModified || + addKeyDisabledStates.includes(get(application, 'status')); + const addButton = () => - isOrgBoundUser(userContext) && apiKeys && apiKeys.length > 0 ? ( - - ) : ( + canAddKey ? ( + ) : ( + ); const renderKeys = () => ( diff --git a/packages/layer7-apihub/src/applications/ApplicationToolbar.js b/packages/layer7-apihub/src/applications/ApplicationToolbar.js index 934f30d48..bae57b9a2 100755 --- a/packages/layer7-apihub/src/applications/ApplicationToolbar.js +++ b/packages/layer7-apihub/src/applications/ApplicationToolbar.js @@ -79,6 +79,7 @@ export const ApplicationToolbar = props => { icon={} label={buttonLabel} color={color} + type="button" variant={variant} size={size} /> diff --git a/packages/layer7-apihub/src/applications/constants.js b/packages/layer7-apihub/src/applications/constants.js index e73dff22e..694b78459 100644 --- a/packages/layer7-apihub/src/applications/constants.js +++ b/packages/layer7-apihub/src/applications/constants.js @@ -1 +1,3 @@ -export const CERTIFICATE_DISPLAY_FORMAT = 'MMM Do YYYY, HH:mm'; \ No newline at end of file +export const CERTIFICATE_DISPLAY_FORMAT = 'MMM Do YYYY, HH:mm'; +export const DEFAULT_PORTAL_AUTH_PROVIDER_UUID = + '77a39e3c-4ea6-11ef-9a16-0242ac1e0003'; diff --git a/packages/layer7-apihub/src/authentication/credentialsAuthProvider.js b/packages/layer7-apihub/src/authentication/credentialsAuthProvider.js index aac25b5c6..aa5793533 100755 --- a/packages/layer7-apihub/src/authentication/credentialsAuthProvider.js +++ b/packages/layer7-apihub/src/authentication/credentialsAuthProvider.js @@ -1,5 +1,5 @@ export const credentialsAuthProvider = (apiUrl, fetchJson) => ({ - login: async ({ username, password, publicKey, ...params }) => { + login: async ({ username, password, publicKey, ...params } = {}) => { try { const headers = new Headers({ 'Content-Type': 'application/json; charset=UTF-8', diff --git a/packages/layer7-apihub/src/authentication/useAuthSchemes.js b/packages/layer7-apihub/src/authentication/useAuthSchemes.js index bb70e5d6f..1fdfbcd75 100755 --- a/packages/layer7-apihub/src/authentication/useAuthSchemes.js +++ b/packages/layer7-apihub/src/authentication/useAuthSchemes.js @@ -42,7 +42,7 @@ export const getAuthSchemes = async ( } }); - if (json.isOktaProxied) { + if (json.isOktaProxied || json.isSamlProxied) { schemesList = schemesList.filter( scheme => scheme.authMethod !== 'SAML' ); diff --git a/packages/layer7-apihub/src/dataProvider/apiKeys.js b/packages/layer7-apihub/src/dataProvider/apiKeys.js index 1fd4e111c..ec000386f 100755 --- a/packages/layer7-apihub/src/dataProvider/apiKeys.js +++ b/packages/layer7-apihub/src/dataProvider/apiKeys.js @@ -29,6 +29,7 @@ export const apiKeysDataProvider = context => { ...item, })) || [], total: json.totalElements || 0, + totalPages: json.totalPages, }; }, getOne: async ({ appUuid, apiKey }) => { diff --git a/packages/layer7-apihub/src/dataProvider/applications.js b/packages/layer7-apihub/src/dataProvider/applications.js index a61ac22d1..06481f4e9 100755 --- a/packages/layer7-apihub/src/dataProvider/applications.js +++ b/packages/layer7-apihub/src/dataProvider/applications.js @@ -55,6 +55,7 @@ export const applicationsDataProvider = context => { ...item, })) || [], total: json.totalElements || 0, + totalPages: json.totalPages, }; }, diff --git a/packages/layer7-apihub/src/dataProvider/authProviders.js b/packages/layer7-apihub/src/dataProvider/authProviders.js new file mode 100644 index 000000000..773da5a9e --- /dev/null +++ b/packages/layer7-apihub/src/dataProvider/authProviders.js @@ -0,0 +1,22 @@ +import map from 'lodash/map'; + +export const authProvidersDataProvider = context => { + const basePath = `${context.apiUrl}/api-management/0.1/auth-providers`; + + return { + getList: async () => { + const { json = [] } = await context.fetchJson(basePath, { + credentials: 'include', + }); + + return { + data: + json.map(({ uuid, ...item }) => ({ + ...item, + id: uuid, + })) || [], + total: json.length, + }; + }, + }; +}; diff --git a/packages/layer7-apihub/src/dataProvider/index.js b/packages/layer7-apihub/src/dataProvider/index.js index d90974135..d2200210d 100644 --- a/packages/layer7-apihub/src/dataProvider/index.js +++ b/packages/layer7-apihub/src/dataProvider/index.js @@ -9,6 +9,7 @@ import { applicationCertificatesDataProvider } from './applicationCertificates'; import { apiKeysDataProvider } from './apiKeys'; import { applicationsDataProvider } from './applications'; import { assetsDataProvider } from './assets'; +import { authProvidersDataProvider } from './authProviders'; import { customFieldsDataProvider } from './customFields'; import { documentsDataProvider } from './documents'; import { organizationsDataProvider } from './organizations'; @@ -42,6 +43,7 @@ export const dataProvider = ( applicationCertificates: applicationCertificatesDataProvider(context), applications: applicationsDataProvider(context), assets: assetsDataProvider(context), + authProviders: authProvidersDataProvider(context), customFields: customFieldsDataProvider(context), documents: documentsDataProvider(context), organizations: organizationsDataProvider(context), diff --git a/packages/layer7-apihub/src/i18n/en.js b/packages/layer7-apihub/src/i18n/en.js index fae6439ea..88eccb4ba 100644 --- a/packages/layer7-apihub/src/i18n/en.js +++ b/packages/layer7-apihub/src/i18n/en.js @@ -1,3 +1,4 @@ +// Copyright © 2024 Broadcom Inc. and its subsidiaries. All Rights Reserved. import { mergeTranslations } from 'react-admin'; import raMessages from 'ra-language-english'; @@ -288,6 +289,7 @@ const apiHubMessages = { 'Select application to use its default key.', search_or_select_application: 'Search or Select Application', + select_api_key: 'Select API Key', }, }, documentation: { @@ -319,11 +321,14 @@ const apiHubMessages = { fields: { name: 'Name', apiKey: 'API Key:', + apiKeyName: 'API Key', keySecret: 'Shared Secret:', apiKeyClientID: 'API Key / Client ID', apisIncluded: 'APIs Included', apis: 'APIs', authentication: 'Authentication', + authMethod: 'Auth Method', + authprovider: 'Auth Provider', description: 'Description', day: 'day', days: 'days', @@ -372,7 +377,9 @@ const apiHubMessages = { notValidAfter: 'Not valid after (%{zone})', certificates: 'Certificates', authMethodCertificate: 'Client Certificate', + authMethodNone: 'None', authMethodSecret: 'Client ID & Secret', + notAvailableAuthMethod: 'Not Available', }, actions: { generateSecret: 'Generate New Secret', @@ -409,6 +416,8 @@ const apiHubMessages = { callback_url_caption: 'Use comma separated values', scope_caption: 'Use space separated values', application_name_caption: 'Use unique name 50 characters (max)', + apikey_caption: + 'The key must be unique. Maximum length is 255 characters.', apikey_name_caption: 'The key name must be unique to this application. Maximum length is 255 characters.', apikey_name_empty_error: 'Name cannot be empty', @@ -473,6 +482,7 @@ const apiHubMessages = { edit_overview: 'Edit overview', empty_overview: 'No value', create_success: 'Application successfully created.', + key_create_request_success: 'API Key create request submitted.', key_create_success: 'API Key created successfully.', create_error: 'An error occurred while creating the application.', diff --git a/packages/layer7-apihub/src/i18n/es.js b/packages/layer7-apihub/src/i18n/es.js index 0e533f101..161b26e6c 100644 --- a/packages/layer7-apihub/src/i18n/es.js +++ b/packages/layer7-apihub/src/i18n/es.js @@ -41,7 +41,7 @@ const apiHubMessages = { password: 'Contraseña', }, actions: { - multi_session_sign_in: 'PROCEDER', + multi_session_sign_in: 'PROCEDER', multi_session_sign_in_additional_text: ' OTRAS SESIONES TERMINARÁN', sign_in: 'Iniciar sesión', @@ -299,6 +299,7 @@ const apiHubMessages = { 'Seleccione la aplicación para usar su clave predeterminada', search_or_select_application: 'Buscar o seleccionar aplicación', + select_api_key: 'Seleccionar API Key', }, }, documentation: { @@ -336,6 +337,8 @@ const apiHubMessages = { apis: 'APIs', apisCount: '%{count}', authentication: 'Autenticación', + authMethod: 'Método de autenticación', + authprovider: 'Proveedor de autenticación', description: 'Descripción', day: 'día', days: 'días', @@ -386,7 +389,9 @@ const apiHubMessages = { notValidAfter: 'No es válido después de #date (%{zone})', certificates: 'Certificados', authMethodCertificate: 'Certificado de cliente', + authMethodNone: 'None', authMethodSecret: 'ID de cliente y password', + notAvailableAuthMethod: 'No disponible', }, actions: { generateSecret: 'Generar nuevo secreto', @@ -427,6 +432,8 @@ const apiHubMessages = { scope_caption: 'Utilizar valores separados por espacios', application_name_caption: 'El nombre de la clave debe ser único para esta aplicación. El largo máximo es de 255 caracteres.', + apikey_caption: + 'La clave debe ser única y su longitud máxima es de 255 caracteres.', apikey_name_empty_error: 'El nombre no puede estar vacío', certificate_name_caption: 'Debe ser único por aplicación.', certificate_file_input_caption: @@ -490,6 +497,8 @@ const apiHubMessages = { edit_overview: 'Editar descripción general', empty_overview: 'Sin valor', create_success: 'La aplicación se ha creado correctamente.', + key_create_request_success: + 'Solicitud de creación de API Key enviada.', key_create_success: 'la Clave de API creada con éxito.', create_error: 'Se ha producido un error al crear la aplicación.', diff --git a/packages/layer7-apihub/src/i18n/fr.js b/packages/layer7-apihub/src/i18n/fr.js index e5e1a860c..1b01c03a0 100644 --- a/packages/layer7-apihub/src/i18n/fr.js +++ b/packages/layer7-apihub/src/i18n/fr.js @@ -295,6 +295,7 @@ const apiHubMessages = { "Sélectionnez l'application pour utiliser sa clé par défaut.", search_or_select_application: 'Rechercher ou sélectionner une application', + select_api_key: "Sélectionner la clé d'API", }, }, documentation: { @@ -332,6 +333,8 @@ const apiHubMessages = { apis: 'APIs', apisCount: '%{count}', authentication: 'Authentification', + authMethod: "Méthode d'authentification", + authprovider: "Fournisseur d'authentification", day: 'jour', days: 'jours', description: 'Description ', @@ -379,7 +382,9 @@ const apiHubMessages = { notValidAfter: 'Non valable après (%{zone})', certificates: 'Certificats', authMethodCertificate: 'Certificats', + authMethodNone: 'Aucun', authMethodSecret: 'Identifiant client et secret', + notAvailableAuthMethod: 'Non disponible', }, actions: { generateSecret: 'Générer un nouveau secret', @@ -412,6 +417,8 @@ const apiHubMessages = { submitDelete: 'Soumettre Supprimer', }, validation: { + apikey_caption: + 'La clé doit être unique. La longueur maximale de la clé est de 255 caractères.', apikey_name_caption: 'Le nom de la clé doit être unique pour l’application. La longueur maximale est de 255 caractères.', error_application_name_not_unique: @@ -483,6 +490,8 @@ const apiHubMessages = { edit_overview: 'Modifier la présentation', empty_overview: 'Aucune valeur', create_success: "L'application a été créée.", + key_create_request_success: + "Demande de création de clé d'API soumise.", key_create_success: 'Clé d’API créée avec succès.', create_error: "Une erreur s'est produite lors de la création de l'application.", diff --git a/packages/layer7-apihub/src/permissionUtils.js b/packages/layer7-apihub/src/permissionUtils.js new file mode 100644 index 000000000..3141af960 --- /dev/null +++ b/packages/layer7-apihub/src/permissionUtils.js @@ -0,0 +1,19 @@ +// Copyright © 2024 Broadcom Inc. and its subsidiaries. All Rights Reserved. +import { get } from 'lodash'; + +export const hasCRUDPermissions = (user, types, param) => { + const permissions = get(user, `permissions[${param}]`); + if (permissions && permissions.length > 0) { + if (types.every(type => permissions.includes(type))) { + return true; + } + } + return false; +}; + +export const PERMISSIONS_CREATE = 'CREATE'; +export const PERMISSIONS_DELETE = 'DELETE'; +export const PERMISSIONS_READ = 'READ'; +export const PERMISSIONS_UPDATE = 'UPDATE'; + +export const API_KEYS_APPLICATION = 'API_KEYS_APPLICATION'; diff --git a/packages/layer7-apihub/src/theme/branding.js b/packages/layer7-apihub/src/theme/branding.js index cf75ca8cf..e8fe4df0a 100644 --- a/packages/layer7-apihub/src/theme/branding.js +++ b/packages/layer7-apihub/src/theme/branding.js @@ -136,8 +136,8 @@ export const fetchUserContext = async (url, originHubName) => { export const useBranding = (url, originHubName, defaultTheme = theme) => { const [brandingTheme, setBrandingTheme] = useState(defaultTheme); - const [brandingLogo, setBrandingLogo] = useState(''); - const [brandingFavicon, setBrandingFavicon] = useState(''); + const [brandingLogo, setBrandingLogo] = useState(null); + const [brandingFavicon, setBrandingFavicon] = useState(null); const [userContext, setUserContext] = useState(''); useEffect(() => { @@ -149,25 +149,29 @@ export const useBranding = (url, originHubName, defaultTheme = theme) => { }, [originHubName, url]); useEffect(() => { - if (global.APIHUB_CONFIG.USE_BRANDING_THEME) { - fetchBranding(url, originHubName, userContext) - .then(theme => { - return { - logo: theme.logo, - favicon: theme.favicon, - ...createMuiTheme(convertBrandingToMuiTheme(theme)), - }; - }) - .then(({ logo, favicon, ...theme }) => { + fetchBranding(url, originHubName, userContext) + .then(theme => { + localStorage.setItem( + 'SHOW_COPYRIGHT', + get(theme, 'display.apihubCopyright') + ); + return { + logo: theme.logo, + favicon: theme.favicon, + ...createMuiTheme(convertBrandingToMuiTheme(theme)), + }; + }) + .then(({ logo, favicon, ...theme }) => { + if (global.APIHUB_CONFIG.USE_BRANDING_THEME) { setBrandingLogo(logo); setBrandingFavicon(favicon); setBrandingTheme(merge(defaultTheme, theme)); - }); - } else { - setBrandingLogo(null); - setBrandingFavicon(null); - setBrandingTheme(defaultTheme); - } + } else { + setBrandingLogo(null); + setBrandingFavicon(null); + setBrandingTheme(defaultTheme); + } + }); }, [defaultTheme, originHubName, url, userContext]); return { diff --git a/pom.xml b/pom.xml index c4d717ec8..8f946d2ad 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ install-node-and-yarn - v12.20.0 + v12.20.2 v1.19.2 diff --git a/remote-hosting/package-lock.json b/remote-hosting/package-lock.json index 7b23cf423..41041cf00 100755 --- a/remote-hosting/package-lock.json +++ b/remote-hosting/package-lock.json @@ -5,63 +5,77 @@ "requires": true, "dependencies": { "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", + "bytes": "3.1.2", + "content-type": "~1.0.5", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" } }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" } }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "debug": { "version": "2.6.9", @@ -71,107 +85,182 @@ "ms": "2.0.0" } }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", + "depd": "2.0.0", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.3.1", "fresh": "0.5.2", - "merge-descriptors": "1.0.1", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" } }, "iconv-lite": { @@ -183,9 +272,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ipaddr.js": { "version": "1.9.1", @@ -195,17 +284,17 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "mime": { "version": "1.6.0", @@ -213,32 +302,37 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.45.0" + "mime-db": "1.52.0" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { "ee-first": "1.1.1" } @@ -249,23 +343,26 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "requires": { + "side-channel": "^1.0.6" + } }, "range-parser": { "version": "1.2.1", @@ -273,20 +370,20 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safer-buffer": { "version": "2.1.2", @@ -294,57 +391,86 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "requires": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.19.0" + } + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" } }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + } }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "type-is": { "version": "1.6.18", @@ -358,17 +484,17 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" } } -} +} \ No newline at end of file diff --git a/remote-hosting/package.json b/remote-hosting/package.json index ad869c948..86eed1081 100755 --- a/remote-hosting/package.json +++ b/remote-hosting/package.json @@ -8,6 +8,6 @@ "start": "HOST=local.portal.ca.com node index.js" }, "dependencies": { - "express": "^4.17.1" + "express": "^4.20.0" } -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 92e804381..59ca2000d 100755 --- a/yarn.lock +++ b/yarn.lock @@ -3922,7 +3922,7 @@ abstract-leveldown@~0.12.0, abstract-leveldown@~0.12.1: dependencies: xtend "~3.0.0" -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: +accepts@~1.3.4, accepts@~1.3.5: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== @@ -3930,6 +3930,14 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + acorn-globals@^4.1.0, acorn-globals@^4.3.0: version "4.3.4" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" @@ -4865,21 +4873,23 @@ bn.js@^5.0.0, bn.js@^5.1.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== -body-parser@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== +body-parser@1.20.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: - bytes "3.1.0" - content-type "~1.0.4" + bytes "3.1.2" + content-type "~1.0.5" debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" + on-finished "2.4.1" + qs "6.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" bonjour@^3.5.0: version "3.5.0" @@ -5166,7 +5176,12 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -bytes@3.1.0, bytes@^3.1.0: +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +bytes@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== @@ -6039,18 +6054,23 @@ content-disposition@0.5.2: resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: - safe-buffer "5.1.2" + safe-buffer "5.2.1" content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + convert-source-map@1.7.0, convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" @@ -6068,10 +6088,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== cookie@~0.4.1: version "0.4.1" @@ -6951,6 +6971,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -6969,10 +6994,10 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-indent@^6.0.0: version "6.1.0" @@ -7180,10 +7205,10 @@ domhandler@^2.3.0: dependencies: domelementtype "1" -dompurify@^2.0.7: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.2.tgz#cb8c2b1a2f3c8a0b565127504ae4eedec176a972" - integrity sha512-BsGR4nDLaC5CNBnyT5I+d5pOeaoWvgVeg6Gq/aqmKYWMPR07131u60I80BvExLAJ0FQEIBQ1BTicw+C5+jOyrg== +dompurify@^2.0.7, dompurify@^2.5.3: + version "2.5.6" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.5.6.tgz#8402b501611eaa7fb3786072297fcbe2787f8592" + integrity sha512-zUTaUBO8pY4+iJMPE1B9XlO2tXVYIcEA4SNGtvDELzTSCQO7RzH+j7S180BmhmJId78lqGU2z19vgVx2Sxs/PQ== domutils@1.5.1: version "1.5.1" @@ -7306,10 +7331,10 @@ elegant-spinner@^1.0.1: resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== +elliptic@^6.5.3, elliptic@~6.5.7: + version "6.5.7" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b" + integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q== dependencies: bn.js "^4.11.9" brorand "^1.1.0" @@ -7364,6 +7389,11 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + encoding@^0.1.11: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -8102,11 +8132,9 @@ events@^3.0.0: integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== eventsource@^1.0.7: - version "1.1.1" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.1.tgz#4544a35a57d7120fba4fa4c86cb4023b2c09df2f" - integrity sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA== - dependencies: - original "^1.0.0" + version "1.1.2" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.2.tgz#bc75ae1c60209e7cb1541231980460343eaea7c2" + integrity sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -8246,37 +8274,38 @@ expect@^26.6.0, expect@^26.6.2: jest-regex-util "^26.0.0" express@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + version "4.20.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.20.0.tgz#f1d08e591fcec770c07be4767af8eb9bcfd67c48" + integrity sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw== dependencies: - accepts "~1.3.7" + accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" + body-parser "1.20.3" + content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.0" + cookie "0.6.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" + depd "2.0.0" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" - merge-descriptors "1.0.1" + http-errors "2.0.0" + merge-descriptors "1.0.3" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" + path-to-regexp "0.1.10" + proxy-addr "~2.0.7" + qs "6.11.0" range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" + safe-buffer "5.2.1" + send "0.19.0" + serve-static "1.16.0" + setprototypeof "1.2.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -8449,14 +8478,14 @@ fault@^1.0.1: faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + integrity sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ== dependencies: websocket-driver ">=0.5.1" faye-websocket@~0.11.1: - version "0.11.3" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" - integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: websocket-driver ">=0.5.1" @@ -8608,17 +8637,17 @@ final-form@^4.18.5: dependencies: "@babel/runtime" "^7.10.0" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" find-babel-config@^1.2.0: @@ -8829,10 +8858,10 @@ format@^0.2.0: resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fragment-cache@^0.2.1: version "0.2.1" @@ -9770,16 +9799,16 @@ http-deceiver@^1.2.7: resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" http-errors@~1.6.2: version "1.6.3" @@ -9791,17 +9820,6 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - http-parser-js@>=0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" @@ -13207,10 +13225,10 @@ merge-deep@^3.0.2: clone-deep "^0.2.4" kind-of "^3.0.2" -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== merge-stream@^2.0.0: version "2.0.0" @@ -13552,6 +13570,11 @@ mime-db@1.44.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + "mime-db@>= 1.43.0 < 2": version "1.45.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" @@ -13576,6 +13599,13 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, dependencies: mime-db "1.44.0" +mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -13784,6 +13814,18 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +moment-timezone@0.5.31: + version "0.5.31" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.31.tgz#9c40d8c5026f0c7ab46eda3d63e49c155148de05" + integrity sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA== + dependencies: + moment ">= 2.9.0" + +"moment@>= 2.9.0": + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== + moment@^2.27.0: version "2.29.4" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" @@ -13860,16 +13902,16 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - ms@2.1.2, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" @@ -13932,6 +13974,11 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + neo-async@^2.5.0, neo-async@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -14364,10 +14411,10 @@ octal@^1.0.0: resolved "https://registry.yarnpkg.com/octal/-/octal-1.0.0.tgz#63e7162a68efbeb9e213588d58e989d1e5c4530b" integrity sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws= -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" @@ -14462,13 +14509,6 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -original@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== - dependencies: - url-parse "^1.4.3" - os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" @@ -14826,10 +14866,10 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-to-regexp@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" + integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== path-to-regexp@2.2.1: version "2.2.1" @@ -15867,12 +15907,12 @@ property-information@^6.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== -proxy-addr@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" - integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: - forwarded "~0.1.2" + forwarded "0.2.0" ipaddr.js "1.9.1" prr@~0.0.0: @@ -15959,7 +15999,7 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.7.0, qs@6.9.7, qs@^6.9.4, qs@~6.5.2: +qs@6.11.0, qs@6.13.0, qs@6.9.7, qs@^6.9.4, qs@~6.5.2: version "6.9.7" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== @@ -16118,13 +16158,13 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: - bytes "3.1.0" - http-errors "1.7.2" + bytes "3.1.2" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" @@ -17649,7 +17689,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -17783,9 +17823,9 @@ select-hose@^2.0.0: integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= selfsigned@^1.10.7: - version "1.10.8" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" - integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== + version "1.10.14" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.14.tgz#ee51d84d9dcecc61e07e4aba34f229ab525c1574" + integrity sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA== dependencies: node-forge "^0.10.0" @@ -17853,24 +17893,43 @@ semver@~5.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + depd "2.0.0" + destroy "1.2.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "~1.7.2" + http-errors "2.0.0" mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" + ms "2.1.3" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + statuses "2.0.1" + +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" serialize-error@^2.1.0: version "2.1.0" @@ -17911,15 +17970,15 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== +serve-static@1.16.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.0.tgz#2bf4ed49f8af311b519c46f272bf6ac3baf38a92" + integrity sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.1" + send "0.18.0" serve@~11.3.2: version "11.3.2" @@ -17961,10 +18020,10 @@ setprototypeof@1.1.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: version "2.4.11" @@ -18410,7 +18469,12 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= @@ -19200,10 +19264,10 @@ toggle-selection@^1.0.6: resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0, tough-cookie@~2.5.0: version "2.5.0" @@ -19386,7 +19450,7 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@~1.6.17, type-is@~1.6.18: +type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -20305,7 +20369,7 @@ webpack@4.44.2, webpack@^4.43.0, webpack@^4.44.1: websocket-driver@0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" - integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= + integrity sha512-oBx6ZM1Gs5q2jwZuSN/Qxyy/fbgomV8+vqsmipaPKB/74hjHlKuM07jNmRhn4qa2AdUwsgxrltq+gaPsHgcl0Q== dependencies: websocket-extensions ">=0.1.1" @@ -21025,4 +21089,4 @@ zenscroll@^4.0.2: zwitch@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" - integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== \ No newline at end of file