From 04bddbac638ba2d71782a6b2fb7b4a126bb5724e Mon Sep 17 00:00:00 2001 From: Jordy CABANNES Date: Thu, 6 Jun 2024 13:12:55 +0200 Subject: [PATCH 1/6] fix: rename "federation" to "federated identity" in source code --- .github/workflows/build-and-test.yml | 2 +- .../publish-tom-federation-server.yml | 8 +- .github/workflows/publish-tom-server.yml | 2 +- .github/workflows/push.yml | 6 +- .gitlab-ci.yml | 2 +- Dockerfile | 4 +- README.md | 2 +- docker.md | 2 +- packages/federation-server/Dockerfile | 4 +- packages/federation-server/README.md | 30 +- .../example/federation-server.ts | 8 +- packages/federation-server/package.json | 11 +- packages/federation-server/server.mjs | 10 +- .../src/__testData__/config.json | 2 +- .../src/__testData__/db/init-id-db.sh | 2 +- .../src/__testData__/db/init-synapse-db.sh | 2 +- .../src/__testData__/docker-compose.yml | 24 +- .../federation-server/federation-server.conf | 8 +- .../__testData__/identity-server/Dockerfile | 2 +- .../conf/identity-server-1.conf | 6 +- .../conf/identity-server-2.conf | 6 +- .../conf/identity-server-3.conf | 6 +- .../ssl/federated-identity.example.com.crt | 30 ++ .../ssl/federated-identity.example.com.key | 52 ++++ .../nginx/ssl/federation.example.com.crt | 30 -- .../nginx/ssl/federation.example.com.key | 52 ---- .../synapse-data/homeserver-federation.yaml | 6 +- packages/federation-server/src/config.json | 2 +- .../src/controllers/controllers.ts | 8 +- packages/federation-server/src/index.test.ts | 274 +++++++++--------- packages/federation-server/src/index.ts | 11 +- .../src/middlewares/errors.ts | 29 +- .../src/middlewares/utils.ts | 6 +- .../federation-server/src/routes/routes.ts | 10 +- packages/federation-server/src/types.ts | 4 +- .../src/__testData__/registerConf.json | 2 +- .../src/__testData__/termsConf.json | 2 +- .../matrix-identity-server/src/config.json | 6 +- .../src/cron/changePepper.ts | 11 +- .../src/cron/index.test.ts | 2 +- .../matrix-identity-server/src/cron/index.ts | 24 +- .../src/cron/update-federation-hashes.test.ts | 75 +++-- .../src/cron/update-federation-hashes.ts | 89 +++--- .../src/cron/updateUsers.ts | 13 +- packages/matrix-identity-server/src/index.ts | 10 +- packages/matrix-identity-server/src/types.ts | 6 +- packages/tom-server/src/config.json | 6 +- .../__testData__/registerConf.json | 2 +- .../__testData__/termsConf.json | 2 +- .../src/identity-server/index.test.ts | 8 +- .../src/identity-server/with-cache.test.ts | 8 +- packages/tom-server/src/wellKnown/index.ts | 30 +- server.mjs | 10 +- 53 files changed, 503 insertions(+), 466 deletions(-) create mode 100644 packages/federation-server/src/__testData__/nginx/ssl/federated-identity.example.com.crt create mode 100644 packages/federation-server/src/__testData__/nginx/ssl/federated-identity.example.com.key delete mode 100644 packages/federation-server/src/__testData__/nginx/ssl/federation.example.com.crt delete mode 100644 packages/federation-server/src/__testData__/nginx/ssl/federation.example.com.key diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 02067e1c..fe82db1d 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -25,7 +25,7 @@ jobs: needs: build steps: - name: Add hosts for integration tests - run: sudo echo "127.0.0.1 localhost auth.example.com matrix.example.com matrix1.example.com matrix2.example.com matrix3.example.com federation.example.com opensearch.example.com" | sudo tee -a /etc/hosts + run: sudo echo "127.0.0.1 localhost auth.example.com matrix.example.com matrix1.example.com matrix2.example.com matrix3.example.com federated-identity.example.com opensearch.example.com" | sudo tee -a /etc/hosts - uses: actions/checkout@v3 - name: Set up Node LTS uses: actions/setup-node@v3 diff --git a/.github/workflows/publish-tom-federation-server.yml b/.github/workflows/publish-tom-federation-server.yml index 2ff5af4a..b18c282a 100644 --- a/.github/workflows/publish-tom-federation-server.yml +++ b/.github/workflows/publish-tom-federation-server.yml @@ -1,7 +1,7 @@ # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs -name: publish-tom-federation-server +name: publish-tom-federated-identity-service on: workflow_call: @@ -19,15 +19,15 @@ jobs: uses: tj-actions/changed-files@v41 with: files: | - packages/federation-server/**/* + packages/federated-identity-service/**/* .github/workflows/** - name: Publish to dockerhub uses: elgohr/Publish-Docker-Github-Action@v5 with: - name: linagora/tom-federation-server + name: linagora/tom-federated-identity-service username: ${{ secrets.DOCKERHUB_USER }} password: ${{ secrets.DOCKERHUB_PASSWORD }} workdir: "${{ github.workspace }}" context: . - buildoptions: "-t linagora/tom-federation-server -f packages/federation-server/Dockerfile" + buildoptions: "-t linagora/tom-federated-identity-service -f packages/federated-identity-service/Dockerfile" tags: "latest,${{ steps.date.outputs.date }}" diff --git a/.github/workflows/publish-tom-server.yml b/.github/workflows/publish-tom-server.yml index 770081db..875f483f 100644 --- a/.github/workflows/publish-tom-server.yml +++ b/.github/workflows/publish-tom-server.yml @@ -19,7 +19,7 @@ jobs: uses: tj-actions/changed-files@v41 with: files: | - packages/federation-server/**/* + packages/federated-identity-service/**/* .github/workflows/** - name: Publish to dockerhub uses: elgohr/Publish-Docker-Github-Action@v5 diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 8244112f..aef9aee3 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -9,9 +9,9 @@ jobs: name: Build And Test uses: ./.github/workflows/build-and-test.yml secrets: inherit - publish-federation-server: - name: Publish Federation Server - uses: ./.github/workflows/publish-tom-federation-server.yml + publish-federated-identity-service: + name: Publish Federated Identity Service + uses: ./.github/workflows/publish-tom-federated-identity-service.yml needs: [test] secrets: inherit publish-tom-server: diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c9de9c47..c4bd2ea8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -43,7 +43,7 @@ test: - npm script: - cp /etc/hosts ~/hosts.new - - sed -i "s#\tdocker#\tdocker auth.example.com matrix.example.com matrix1.example.com matrix2.example.com matrix3.example.com federation.example.com#g" ~/hosts.new + - sed -i "s#\tdocker#\tdocker auth.example.com matrix.example.com matrix1.example.com matrix2.example.com matrix3.example.com federated-identity.example.com#g" ~/hosts.new - cp -f ~/hosts.new /etc/hosts - apt-get update && apt-get --assume-yes install ca-certificates curl gnupg coreutils - install -m 0755 -d /etc/apt/keyrings diff --git a/Dockerfile b/Dockerfile index 92b24daf..2efe25db 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ env BASE_URL= \ DATABASE_USER= \ DATABASE_PASSWORD= \ DATABASE_SSL= \ - FEDERATION_SERVERS= \ + FEDERATED_IDENTITY_SERVICES= \ JITSI_BASE_URL= \ JITSI_JWT_ALGORITHM= \ JITSI_JWT_ISSUER= \ @@ -45,7 +45,7 @@ env BASE_URL= \ OPENSEARCH_WAIT_FOR_ACTIVE_SHARDS= \ SERVER_NAME= \ TEMPLATE_DIR=/usr/src/app/packages/tom-server/templates \ - UDPATE_FEDERATION_HASHES_CRON="3 3 * * *" \ + UPDATE_FEDERATED_IDENTITY_HASHES_CRON="3 3 * * *" \ UPDATE_USERS_CRON="*/15 * * * *" \ SMS_API_LOGIN= \ SMS_API_URL= \ diff --git a/README.md b/README.md index 3a8c1e01..4f99ec3d 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ REST API Endpoints documentation is available on https://linagora.github.io/ToM- [Matrix Identity Service](https://spec.matrix.org/v1.6/identity-service-api/) implementation for Node.js * [@twake/matrix-invite](./packages/matrix-invite): matrix invitation web application * [@twake/server](./packages/tom-server): the main Twake Chat Server, extends [@twake/matrix-identity-server](./packages/matrix-identity-server) -* [@twakeg/federation-server](./packages/federation-server): Twake Federation Server +* [@twake/federated-identity-service](./packages/federated-identity-service): Twake Federated Identity Service * [@twake/config-parser](./packages/config-parser): simple file parser that uses also environment variables * [@twake/crypto](./packages/crypto): cryptographic methods for Twake Chat * [@twake/logger](./packages/logger): logger for Twake diff --git a/docker.md b/docker.md index 455ee516..24fd9084 100644 --- a/docker.md +++ b/docker.md @@ -2,7 +2,7 @@ Image are published in docker hub: * [The ToM Server itself](https://hub.docker.com/r/linagora/tom-server) - * [The Federation Identity Server](https://hub.docker.com/r/linagora/tom-federation-server) + * [The Federated Identity Service](https://hub.docker.com/r/linagora/tom-federated-identity-service) ## The ToM server image diff --git a/packages/federation-server/Dockerfile b/packages/federation-server/Dockerfile index faf79808..f0f871e0 100644 --- a/packages/federation-server/Dockerfile +++ b/packages/federation-server/Dockerfile @@ -28,14 +28,14 @@ RUN apt update && apt -y dist-upgrade WORKDIR /usr/src/app -COPY ./packages/federation-server/server.mjs . +COPY ./packages/federated-identity-service/server.mjs . COPY ./packages/crypto ./packages/crypto COPY ./packages/logger ./packages/logger COPY ./packages/matrix-resolve ./packages/matrix-resolve COPY ./packages/matrix-identity-server ./packages/matrix-identity-server COPY ./packages/config-parser ./packages/config-parser -COPY ./packages/federation-server ./packages/federation-server +COPY ./packages/federated-identity-service ./packages/federated-identity-service COPY .husky .husky COPY lerna.json ./ COPY tsconfig-build.json ./ diff --git a/packages/federation-server/README.md b/packages/federation-server/README.md index c9291d15..1301eabb 100644 --- a/packages/federation-server/README.md +++ b/packages/federation-server/README.md @@ -1,4 +1,4 @@ -# @twake/federation-server +# @twake/federated-identity-service Node.js library that implements [Matrix Identity Service API](https://spec.matrix.org/v1.6/identity-service-api/) and [this proposal](https://github.com/guimard/matrix-spec-proposals/blob/unified-identity-service/proposals/4004-unified-identity-service-view.md) @@ -9,22 +9,22 @@ Example using [express](https://www.npmjs.com/package/express): ```js import express from 'express' -import FederationServer from '@twake/federation-server' +import FederatedIdentityService from '@twake/federated-identity-service' -// if configuration is in default file (/etc/twake/federation-server.conf) -const federationServer = new FederationServer() +// if configuration is in default file (/etc/twake/federated-identity-service.conf) +const federatedIdentityService = new FederatedIdentityService() -// else if configuration is in a different file, set TWAKE_FEDERATION_SERVER_CONF -process.env.TWAKE_FEDERATION_SERVER_CONF = '/path/to/config/file' -const federationServer = new FederationServer() +// else if configuration is in a different file, set TWAKE_FEDERATED_IDENTITY_SERVICE_CONF +process.env.TWAKE_FEDERATED_IDENTITY_SERVICE_CONF = '/path/to/config/file' +const federatedIdentityService = new FederatedIdentityService() // You can also give configuration directly -const federationServer = new FederationServer(config) +const federatedIdentityService = new FederatedIdentityService(config) const app = express() -federationServer.ready.then( () => { - app.use(federationServer.routes) +federatedIdentityService.ready.then( () => { + app.use(federatedIdentityService.routes) app.listen(3000) }) ``` @@ -36,15 +36,15 @@ in [src/config.json](./src/config.json). ## How to use it with a client -Sending requests to the federation server requires to be logged on this server. The token allowing to send requests to Tom-server does not work with the federation server. +Sending requests to the federated identity service requires to be logged on this server. The token allowing to send requests to Tom-server does not work with the federated identity service. -After the user signed in, the client has to send a GET request to `/.well-known/matrix/client` endpoint or `/.well-known/twake/client` endpoint. If the response body contains the `m.federation_servers` key then at least one federation server is available. Keep the value of the `base_urls` field that you will find inside the `m.federation_servers` object. +After the user signed in, the client has to send a GET request to `/.well-known/matrix/client` endpoint or `/.well-known/twake/client` endpoint. If the response body contains the `m.federated_identity_services` key then at least one federated identity service is available. Keep the value of the `base_urls` field that you will find inside the `m.federated_identity_services` object. -These are the steps to obtain a token that works on the federation server: +These are the steps to obtain a token that works on the federated identity service: 1. Send a POST request to the URL `https:///_matrix/client/v3/user//openid/request_token`, you have to replace `matrix_server_address` by the address of the Matrix server selected by the user, and `userId` by the Matrix id of the user. The request body has to be empty and you have to set the `Authorization` header with the value `Bearer ` where `user_matrix_token` is the token retrieved on sign in. For more details see [Matrix specification](https://spec.matrix.org/v1.8/client-server-api/#post_matrixclientv3useruseridopenidrequest_token). **NB**: The `access_token` given in response can be used to register into any Matrix identity service or to ask for a Token exchange into a [yadd/lemonldap-ng-portal](https://github.com/guimard/llng-docker) server -2. The response body of the previous request now should be sent to the URL `https:///_matrix/identity/v2/account/register`. `federation_server` has to be replaced by each federation server address retrieved in the response body of the request sent on the first step. One request by federation server. The `Authorization` header does not need to be set. If the request does not work, maybe the value of `matrix_server_name` in the body is not the good one. +2. The response body of the previous request now should be sent to the URL `https:///_matrix/identity/v2/account/register`. `federated_identity_service` has to be replaced by each federated identity service address retrieved in the response body of the request sent on the first step. One request by federated identity service. The `Authorization` header does not need to be set. If the request does not work, maybe the value of `matrix_server_name` in the body is not the good one. For more details see [Matrix specification](https://spec.matrix.org/v1.8/identity-service-api/#post_matrixidentityv2accountregister) - * The response body JSON of each request will contain a `token` field whose the value will allow to be authenticated on the matching federation server. + * The response body JSON of each request will contain a `token` field whose the value will allow to be authenticated on the matching federated identity service. ## Copyright and license diff --git a/packages/federation-server/example/federation-server.ts b/packages/federation-server/example/federation-server.ts index 81ac7502..aeb4dee3 100644 --- a/packages/federation-server/example/federation-server.ts +++ b/packages/federation-server/example/federation-server.ts @@ -1,16 +1,16 @@ import express from 'express' -import FederationServer from '@twake/federation-server' +import FederatedIdentityService from '@twake/federated-identity-service' -const federationServer = new FederationServer({ +const federatedIdentityService = new FederatedIdentityService({ database_host: ':memory:' }) const app = express() -federationServer.ready +federatedIdentityService.ready .then(() => { - app.use(federationServer.routes) + app.use(federatedIdentityService.routes) const port = process.argv[2] != null ? parseInt(process.argv[2]) : 3000 console.log(`Listening on port ${port}`) app.listen(port) diff --git a/packages/federation-server/package.json b/packages/federation-server/package.json index 8aaeb317..1a02120e 100644 --- a/packages/federation-server/package.json +++ b/packages/federation-server/package.json @@ -1,11 +1,12 @@ { - "name": "@twake/federation-server", + "name": "@twake/federated-identity-service", "version": "0.0.1", - "description": "This is the Twake Federation server", + "description": "This is the Twake Federated Identity Service", "keywords": [ "federation", + "identity", "twake", - "server" + "service" ], "homepage": "https://ci.linagora.com/publicgroup/oss/twake/tom-server", "bugs": { @@ -33,9 +34,9 @@ ], "scripts": { "build": "npm run build:lib && npm run build:example", - "build:example": "rollup -p @rollup/plugin-typescript -e express,@twake/federation-server -m -o example/federation-server.js example/federation-server.ts", + "build:example": "rollup -p @rollup/plugin-typescript -e express,@twake/federated-identity-service -m -o example/federated-identity-service.js example/federated-identity-service.ts", "build:lib": "rollup -c", - "start": "node example/federation-server.js", + "start": "node example/federated-identity-service.js", "test": "jest" }, "dependencies": { diff --git a/packages/federation-server/server.mjs b/packages/federation-server/server.mjs index 403a4dcb..e0e046c7 100644 --- a/packages/federation-server/server.mjs +++ b/packages/federation-server/server.mjs @@ -1,4 +1,4 @@ -import FederationServer from '@twake/federation-server' +import FederatedIdentityService from '@twake/federated-identity-service' import express from 'express' import path from 'node:path' import { fileURLToPath } from 'url' @@ -16,7 +16,7 @@ const conf = { database_user: process.env.DATABASE_USER, database_password: process.env.DATABASE_PASSWORD, hashes_rate_limit: process.env.HASHES_RATE_LIMIT, - is_federation_server: true, + is_federated_identity_service: true, ldap_base: process.env.LDAP_BASE, ldap_filter: process.env.LDAP_FILTER, ldap_user: process.env.LDAP_USER, @@ -48,9 +48,9 @@ const conf = { trusted_servers_addresses: process.env.TRUSTED_SERVERS_ADDRESSES } -const federationServer = new FederationServer(conf) +const federatedIdentityService = new FederatedIdentityService(conf) const app = express() -const promises = [federationServer.ready] +const promises = [federatedIdentityService.ready] if (process.env.CROWDSEC_URI) { if (!process.env.CROWDSEC_KEY) { @@ -76,7 +76,7 @@ if (process.env.CROWDSEC_URI) { Promise.all(promises) .then(() => { - app.use(federationServer.routes) + app.use(federatedIdentityService.routes) const port = process.argv[2] != null ? parseInt(process.argv[2]) : 3000 console.log(`Listening on port ${port}`) app.listen(port) diff --git a/packages/federation-server/src/__testData__/config.json b/packages/federation-server/src/__testData__/config.json index e96c28ae..ffd0ca40 100644 --- a/packages/federation-server/src/__testData__/config.json +++ b/packages/federation-server/src/__testData__/config.json @@ -5,7 +5,7 @@ "database_engine": "sqlite", "database_host": "./src/__testData__/database.db", "database_vacuum_delay": 3600, - "is_federation_server": true, + "is_federated_identity_service": true, "key_delay": 3600, "keys_depth": 5, "ldap_base": "", diff --git a/packages/federation-server/src/__testData__/db/init-id-db.sh b/packages/federation-server/src/__testData__/db/init-id-db.sh index 6a2c2406..b89fbd1e 100644 --- a/packages/federation-server/src/__testData__/db/init-id-db.sh +++ b/packages/federation-server/src/__testData__/db/init-id-db.sh @@ -2,7 +2,7 @@ psql -U postgres <<-EOSQL CREATE USER twake PASSWORD 'twake!1'; - CREATE DATABASE federation TEMPLATE='template0' LOCALE='C' ENCODING='UTF8' OWNER='twake'; + CREATE DATABASE federatedidentity TEMPLATE='template0' LOCALE='C' ENCODING='UTF8' OWNER='twake'; CREATE DATABASE identity1 TEMPLATE='template0' LOCALE='C' ENCODING='UTF8' OWNER='twake'; CREATE DATABASE identity2 TEMPLATE='template0' LOCALE='C' ENCODING='UTF8' OWNER='twake'; CREATE DATABASE identity3 TEMPLATE='template0' LOCALE='C' ENCODING='UTF8' OWNER='twake'; diff --git a/packages/federation-server/src/__testData__/db/init-synapse-db.sh b/packages/federation-server/src/__testData__/db/init-synapse-db.sh index b015d1e3..453261cd 100644 --- a/packages/federation-server/src/__testData__/db/init-synapse-db.sh +++ b/packages/federation-server/src/__testData__/db/init-synapse-db.sh @@ -2,7 +2,7 @@ psql -U postgres <<-EOSQL CREATE USER synapse PASSWORD 'synapse!1'; - CREATE DATABASE synapsefederation TEMPLATE='template0' LOCALE='C' ENCODING='UTF8' OWNER='synapse'; + CREATE DATABASE synapsefederatedidentity TEMPLATE='template0' LOCALE='C' ENCODING='UTF8' OWNER='synapse'; CREATE DATABASE synapse1 TEMPLATE='template0' LOCALE='C' ENCODING='UTF8' OWNER='synapse'; CREATE DATABASE synapse2 TEMPLATE='template0' LOCALE='C' ENCODING='UTF8' OWNER='synapse'; CREATE DATABASE synapse3 TEMPLATE='template0' LOCALE='C' ENCODING='UTF8' OWNER='synapse'; diff --git a/packages/federation-server/src/__testData__/docker-compose.yml b/packages/federation-server/src/__testData__/docker-compose.yml index df75879e..db9dd28e 100644 --- a/packages/federation-server/src/__testData__/docker-compose.yml +++ b/packages/federation-server/src/__testData__/docker-compose.yml @@ -22,9 +22,9 @@ services: networks: - test - synapse-federation: &synapse_template + synapse-federated-identity-service: &synapse_template image: matrixdotorg/synapse:v1.89.0 - container_name: synapse-federation + container_name: synapse-federated-identity-service volumes: - ./synapse-data:/data - ./nginx/ssl/ca.pem:/etc/ssl/certs/ca.pem @@ -35,7 +35,7 @@ services: - UID=${MYUID} - VIRTUAL_PORT=8008 - VIRTUAL_HOST=matrix.example.com - - SYNAPSE_CONFIG_PATH=/data/homeserver-federation.yaml + - SYNAPSE_CONFIG_PATH=/data/homeserver-federated-identity.yaml healthcheck: test: ["CMD", "curl", "-fSs", "http://localhost:8008/health"] interval: 10s @@ -96,17 +96,17 @@ services: networks: - test - federation-server: - image: federation-server - container_name: federation-server + federated-identity-service: + image: federated-identity-service + container_name: federated-identity-service build: context: ../../../.. - dockerfile: ./packages/federation-server/Dockerfile + dockerfile: ./packages/federated-identity-service/Dockerfile volumes: - ./nginx/ssl/ca.pem:/etc/ssl/certs/ca.pem - - ./federation-server/federation-server.conf:/etc/twake/federation-server.conf + - ./federated-identity-service/federated-identity-service.conf:/etc/twake/federated-identity-service.conf depends_on: - synapse-federation: + synapse-federated-identity-service: condition: service_started identity-server-1: condition: service_started @@ -117,7 +117,7 @@ services: environment: - NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca.pem - VIRTUAL_PORT=3000 - - VIRTUAL_HOST=federation.example.com + - VIRTUAL_HOST=federated-identity.example.com networks: - test @@ -126,7 +126,7 @@ services: container_name: identity-server-1 build: context: ../../../.. - dockerfile: ./packages/federation-server/src/__testData__/identity-server/Dockerfile + dockerfile: ./packages/federated-identity-service/src/__testData__/identity-server/Dockerfile volumes: - ./nginx/ssl/ca.pem:/etc/ssl/certs/ca.pem - ./identity-server/conf/identity-server-1.conf:/etc/twake/identity-server.conf @@ -196,7 +196,7 @@ services: - matrix2.example.com - matrix3.example.com - auth.example.com - - federation.example.com + - federated-identity.example.com networks: test: diff --git a/packages/federation-server/src/__testData__/federation-server/federation-server.conf b/packages/federation-server/src/__testData__/federation-server/federation-server.conf index 3229cd26..26907e32 100644 --- a/packages/federation-server/src/__testData__/federation-server/federation-server.conf +++ b/packages/federation-server/src/__testData__/federation-server/federation-server.conf @@ -1,18 +1,18 @@ { "additional_features": true, "cron_service": true, - "base_url": "https://federation.example.com/", + "base_url": "https://federated-identity.example.com/", "database_engine": "pg", "database_host": "postgresql", - "database_name": "federation", + "database_name": "federatedidentity", "database_user": "twake", "database_password": "twake!1", - "is_federation_server": true, + "is_federated_identity_service": true, "ldap_base": "dc=example,dc=com", "ldap_uri": "ldap://annuaire", "matrix_database_engine": "pg", "matrix_database_host": "postgresql", - "matrix_database_name": "synapsefederation", + "matrix_database_name": "synapsefederatedidentity", "matrix_database_password": "synapse!1", "matrix_database_user": "synapse", "pepperCron": "*/60 * * * * *", diff --git a/packages/federation-server/src/__testData__/identity-server/Dockerfile b/packages/federation-server/src/__testData__/identity-server/Dockerfile index a60524ac..4d3ad418 100644 --- a/packages/federation-server/src/__testData__/identity-server/Dockerfile +++ b/packages/federation-server/src/__testData__/identity-server/Dockerfile @@ -4,7 +4,7 @@ RUN apt update && apt -y dist-upgrade WORKDIR /usr/src/app -COPY ./packages/federation-server/src/__testData__/identity-server/server.mjs . +COPY ./packages/federated-identity-service/src/__testData__/identity-server/server.mjs . COPY ./packages/matrix-identity-server ./packages/matrix-identity-server COPY ./packages/logger ./packages/logger diff --git a/packages/federation-server/src/__testData__/identity-server/conf/identity-server-1.conf b/packages/federation-server/src/__testData__/identity-server/conf/identity-server-1.conf index e685f3c8..bfbcccb9 100644 --- a/packages/federation-server/src/__testData__/identity-server/conf/identity-server-1.conf +++ b/packages/federation-server/src/__testData__/identity-server/conf/identity-server-1.conf @@ -7,8 +7,8 @@ "database_name": "identity1", "database_user": "twake", "database_password": "twake!1", - "federation_servers": ["federation.example.com"], - "is_federation_server": false, + "federated_identity_services": ["federated-identity.example.com"], + "is_federated_identity_service": false, "ldap_base": "dc=example,dc=com", "ldap_uri": "ldap://annuaire", "matrix_database_engine": "pg", @@ -20,6 +20,6 @@ "server_name": "example.com", "template_dir": "/usr/src/app/node_modules/@twake/matrix-identity-server/templates", "update_users_cron": "*/5 * * * * *", - "update_federation_hashes_cron": "*/5 * * * * *", + "update_federated_identity_hashes_cron": "*/5 * * * * *", "userdb_engine": "ldap" } \ No newline at end of file diff --git a/packages/federation-server/src/__testData__/identity-server/conf/identity-server-2.conf b/packages/federation-server/src/__testData__/identity-server/conf/identity-server-2.conf index 32c0c097..247ce146 100644 --- a/packages/federation-server/src/__testData__/identity-server/conf/identity-server-2.conf +++ b/packages/federation-server/src/__testData__/identity-server/conf/identity-server-2.conf @@ -7,8 +7,8 @@ "database_name": "identity2", "database_user": "twake", "database_password": "twake!1", - "federation_servers": ["federation.example.com"], - "is_federation_server": false, + "federated_identity_services": ["federated-identity.example.com"], + "is_federated_identity_service": false, "ldap_base": "dc=example,dc=com", "ldap_uri": "ldap://annuaire", "matrix_database_engine": "pg", @@ -20,6 +20,6 @@ "server_name": "example.com", "template_dir": "/usr/src/app/node_modules/@twake/matrix-identity-server/templates", "update_users_cron": "*/5 * * * * *", - "update_federation_hashes_cron": "*/5 * * * * *", + "update_federated_identity_hashes_cron": "*/5 * * * * *", "userdb_engine": "ldap" } \ No newline at end of file diff --git a/packages/federation-server/src/__testData__/identity-server/conf/identity-server-3.conf b/packages/federation-server/src/__testData__/identity-server/conf/identity-server-3.conf index a5413438..346dea11 100644 --- a/packages/federation-server/src/__testData__/identity-server/conf/identity-server-3.conf +++ b/packages/federation-server/src/__testData__/identity-server/conf/identity-server-3.conf @@ -7,8 +7,8 @@ "database_name": "identity3", "database_user": "twake", "database_password": "twake!1", - "federation_servers": ["federation.example.com"], - "is_federation_server": false, + "federated_identity_services": ["federated-identity.example.com"], + "is_federated_identity_service": false, "ldap_base": "dc=example,dc=com", "ldap_uri": "ldap://annuaire", "matrix_database_engine": "pg", @@ -20,6 +20,6 @@ "server_name": "example.com", "template_dir": "/usr/src/app/node_modules/@twake/matrix-identity-server/templates", "update_users_cron": "*/5 * * * * *", - "update_federation_hashes_cron": "*/5 * * * * *", + "update_federated_identity_hashes_cron": "*/5 * * * * *", "userdb_engine": "ldap" } \ No newline at end of file diff --git a/packages/federation-server/src/__testData__/nginx/ssl/federated-identity.example.com.crt b/packages/federation-server/src/__testData__/nginx/ssl/federated-identity.example.com.crt new file mode 100644 index 00000000..3c8508a6 --- /dev/null +++ b/packages/federation-server/src/__testData__/nginx/ssl/federated-identity.example.com.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFMjCCAxoCAf8wDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNV +BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 +ZDAgFw0yNDA2MDYxMzI0MzJaGA8yMTI0MDUxMzEzMjQzMlowdzELMAkGA1UEBhMC +RlIxDzANBgNVBAgMBkNlbnRyZTEOMAwGA1UEBwwFUGFyaXMxETAPBgNVBAoMCExp +bmFnb3JhMQswCQYDVQQLDAJJVDEnMCUGA1UEAwweZmVkZXJhdGVkLWlkZW50aXR5 +LmV4YW1wbGUuY29tMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAu/dZ +uZxSVWk+s6i3ic9zfAVMV+8MvvRE0WZhp1334761Z8TbHbvqOIegPWe/nqwawYKX +Nzp+5N8YzCe4xveYXulJS/3hJKD19seH5liOTE4MIG2DsjAZY1VGmkwGvkfUi2jI +Qm51WC4pSP98r59sjy4HGR74EM3KzvtQPBbxFxYy5NyBgNVKA9rRViKnxnqBetoj +uUBe0763MF3ETuRdwKML44dFH0unl4XO2u8XzeQBOVsyHZmjtbbK7wgZamrvoct7 +n432zigCgmTu1zhlkgEXPdCwFy/PPlGlwnaIdICCw+qyJPDOIg6zXEpshaRrsHBu +p4b7rK/VWcd68LuvNtCpnm9Kxl1lB6qlITWxkTuM7/qk3ehf0fECLv+Bn7dpO84q +UssRRN6bYdaUQW9ocI7B/J340t7qKIaMCBXYkZvy+fPkuyUmCZq1GyLKPjdgBv68 +8tVDMXx3AJFVRKd7I6qAKbrbXxU5P8X9bLiMPiXCBw/7jynATfaBTSmqVb6hR9xu +IVXfHuRP9ETJ3sQ+MvhF6cf+UMCq3c39AFt17VB4AOZe7Ae1OG19gYL40ry2W4+j +qFCvu3f7LtZeKZlXqKxeq5AiERDph98uC5sZ+de2CGKR2wNfWj+pUS55GncZemuf +KLuayn6bCnFQTEvshGrpiUW/uDWZFdF3aeipIHcCAwEAATANBgkqhkiG9w0BAQsF +AAOCAgEAjY4VNmuFBZRWO2p4RCI1+rpApi6t2TNUojwVsmqLrAcj1hr+05uc9d+E +EkTfvK7C8QX5r8LnJW4aiyD3phm8YN83xVRUFN/BOgiaUHtTY5Xt4YaAuqzJQSgW +CiyQ5vXcR3g/WVbxDO4M1MFIKl1HpLNjmgGzNP8VHRzATLo4ZizD2XqG6BOlTyzo +rXELZnIhNp4rmPTeGy3NwwN77ewUaiOStCh9QrTQU2jtuba4aBe3iMduxA6ix1aB +8LYs8WNu6XBPIIQjPxg063h1Ud/TfU0so0Q+MsGwH+tR7o0jjiguLGDHfX0z4WjE +eyIR6BIUuWwSzV0AwRGLAV+0tFs+MqndG0Gv8Al0MjfLX1085gIZhElN0xSriNTM +gDgcNsSMIaKF/x+Enl/WlTHukbp7o1E/WwxjMbEW1J711In7OlKtoTt8VWc8rpl8 +VWa5xtSRi5jVfkuYBFpiw0EHy+tbQwa11fiL3AgaYK8g2afGMAreaT+hxCR3APVu +QdyV6DMO9jiQF/MsxFV3zbhdhEIreIje9dRSVUSCQM/ZspAM4L8gh1nSYj8ENTlf +rnci936SvhThSsh2J+dr+uS0/sdJuXTxNHu2mfBnbR3Ylgsmi5iuWbXcAfeKT0uc +6Z9UlEj+Lr7Rb2Ka1Z91ycW00Kn6Z8ClFjvJRzxuVGDvFrQ7iiQ= +-----END CERTIFICATE----- diff --git a/packages/federation-server/src/__testData__/nginx/ssl/federated-identity.example.com.key b/packages/federation-server/src/__testData__/nginx/ssl/federated-identity.example.com.key new file mode 100644 index 00000000..27f7f2e8 --- /dev/null +++ b/packages/federation-server/src/__testData__/nginx/ssl/federated-identity.example.com.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQC791m5nFJVaT6z +qLeJz3N8BUxX7wy+9ETRZmGnXffjvrVnxNsdu+o4h6A9Z7+erBrBgpc3On7k3xjM +J7jG95he6UlL/eEkoPX2x4fmWI5MTgwgbYOyMBljVUaaTAa+R9SLaMhCbnVYLilI +/3yvn2yPLgcZHvgQzcrO+1A8FvEXFjLk3IGA1UoD2tFWIqfGeoF62iO5QF7Tvrcw +XcRO5F3Aowvjh0UfS6eXhc7a7xfN5AE5WzIdmaO1tsrvCBlqau+hy3ufjfbOKAKC +ZO7XOGWSARc90LAXL88+UaXCdoh0gILD6rIk8M4iDrNcSmyFpGuwcG6nhvusr9VZ +x3rwu6820Kmeb0rGXWUHqqUhNbGRO4zv+qTd6F/R8QIu/4Gft2k7zipSyxFE3pth +1pRBb2hwjsH8nfjS3uoohowIFdiRm/L58+S7JSYJmrUbIso+N2AG/rzy1UMxfHcA +kVVEp3sjqoAputtfFTk/xf1suIw+JcIHD/uPKcBN9oFNKapVvqFH3G4hVd8e5E/0 +RMnexD4y+EXpx/5QwKrdzf0AW3XtUHgA5l7sB7U4bX2BgvjSvLZbj6OoUK+7d/su +1l4pmVeorF6rkCIREOmH3y4Lmxn517YIYpHbA19aP6lRLnkadxl6a58ou5rKfpsK +cVBMS+yEaumJRb+4NZkV0Xdp6KkgdwIDAQABAoICAE7qY25NFjgrzpppPF2MjmTE +aLAGeih1r6rmvBsjlZ61g74EZSZPrd97+aeuNkIs6bLS3B/g3EPE8slL6AUJEJzQ +fuh7t5nERmAMl577EQsyPV8j+4XFMfOFavX+81nSGIdLP8C8VWHnR4gRU8z8NvzK +C0rduLJ9ZCeQVbhUvXW+6TEy7uAjLEcACKGMPTpUVqY4jYUKZIWr7YdN5sxkjoQB +ME2fjkK8Zal1EUrT1P+pOWZWRm0tAxGYpAzFLr6CFQetwcJUPQmCvML4E1qin+oz +sQlP445okS8N4nUJhPK8van5kD94JmMgHuehi3x0co4KNjr5rhJrZDykRpZphf7a +S8W5OHCxyi7RRUVxkbkc1XlLA2kmbbFpVxq+CFNqijiQTM4pLs/IHC4EzT5L/y0L +7XJEvW4hsNuZBPPCHmkcRb9cLhQUmqPCti90uT7J4V8qjCCZ2S1QUyMXVdGH2J9V +ld5hILiOt49XISvGVQwabu/8BtMRB871Hlagr6F8PuBGlQgv/vyRlsIhc20gie96 +l4zSy523Uek0kEUduqydLlOPpku6XMXMB5AWw91b+KLrKhinFDN2uSU2Q9bKEpv8 +jlaigV3LO/JHNqiRy/t0tJkbyb7NN51Onc5nFCW0OsPGMIu7bGdwE6ChNmeZsw/x +zfYQqdGLrYSvYI2nE1epAoIBAQDVpX0mAisFyTPXVgk8YIou/67RjlQ5RAPvCkqs +TR6qOD2qQhFDnbpoPPW8ttvJdl0rMPmGuMmfKlKrN1+J9JJTrEvbdasPd3bwiqyw +em5QTNi68WBJmSf8/puk7UpLfy8Hy/6y2f5tbfnUhfY6j6o6FhSPT6dOpNhbEYzU +fZ5F8vboZ4qu9wEYo+frmUjwlbrtGZiG9WIS/cb2g8XQ+sSkCmCVLAi6bBr22YLQ +jTYIMenR3qR5rFukyEWRPeoZHQV2W1L+n+Lr2PnWNNtMUr6xf+vn3XABKu/YN/oy +EZ5W6IIt9+wZok/OAcHMbQZ65Vu1TksK5w4Zm5xYDYLorBxDAoIBAQDhOph2IwKT +00+aEeA5yFE5imDflGttyV0Clj7XrzEmXxV4So7TtRHDGXNNcaCy1inNJNK6EF0R +Wa8UKe+4tNxlLPn6y+VYUeRoEg2oXvHqvT01NCq0I4SkJt5a5sidJepAFrBK8AKI +LYqsxTVGjhHpPjF2lnWFKs+m8V4vNj4OHmDUtwELC1FJuEa9C2ttwCgixvI/XYnO +DFuCndMIpT8/FoZBwWTdDk/uJbg+b9qFxiZ5QTKI/bZhhqqkEEzrCRMSVqSe8YmI +VOW5UoJfzKmI9rTDjBkklqlChfnV0Lvh9i/XkQ6Kd6g6gJWW/L1TXJxEOoKsd9OL +eGLw4AHa1AG9AoIBAAzEErJOtttlpl9bmLmu2xLr3DpRUt8JHWMPLl8VTJvHOIgP +4pAzwIux+M0J8CAdnnuSNZbDO+jy0nXAnUjVAFlXlkDKyynlbYn5/0+cQTMzJFAn +VCWRrT4EyLAWLbZNJzZEDjgJppZLV/5G8uuU4gsOfrQBgnHEj9kBN3UK/IYZen9w +kGzb/YjHYnhFdIJLsBuyx9Zomy+fUmAwh4VxNobGx/ah5vOcug+9938WsP/UW7Ba +qWFL1z4FaYLAPFi7zzO/STpFu310PZl7Fw98ckCQ8Duuk56+Pg6haaXMP7XZts2g +Xs85T6Nzn2zjptt5EP3Ia9t+6uzEy5bHV+cnQZkCggEBAJWv/8vkEL52Xh0jbEZ6 +36DCWwe8+HkKrwodGL737E54OyirRKlnWdq0e3Eo54hz1WxF4NdQMMprNHTOOkgj +y6ZicfFAubgtFQQlm3YfQ+CizJ8jgI4gXPNL8dOwNfxbSog1jA0B3mzq95NDrdiq +azT85JrP/GL4xPFK0THHdw6jGe/FgKf6aZf5JOpXQJq8bvBOEIoUfJW4mMkCY1MH +oDUpnyjsg0B3VqAL6Zt1c2IdA0zrC88H78J5YceQHc7HRSmW8+m+1Y0J/3NfZs6M +ktA4RoMABWXPy8YujJCSHYxbtggqm+NjCyd2dfTXHGzey+x8hoRhTvMOm5NDDXiG +FnECggEAJBQYgGus5kzbzlYsc8rv/P8uWMpNVHr4jcYwu5IIq0CXQ7PkHAydkRMa +liajJNXJ1344Us7tEtjAbD2Er/o7CpwVD+RG0kU06jFpTAAmsVhTDlTLrpp/aCHQ +/JLcdlaJXox4oTHE4t6rSf4151ENwPTOcvsiYcPox43snHbtHpPyRbUIWi/sUsBJ +pKC49skHXggBcK2jPCW/K3rflfuAoZrcrPvk7ePQeju6ERcGoGqul+zfpdhjSdjg +suJEsffE0TOQgqpOjt5T6F1Pjf43MNjvnX4OzWusALvy8pCZRcoK2hka5ViMksft +8AhnB4RD2e9I6nmB4fjuwbXpXbXWEg== +-----END PRIVATE KEY----- diff --git a/packages/federation-server/src/__testData__/nginx/ssl/federation.example.com.crt b/packages/federation-server/src/__testData__/nginx/ssl/federation.example.com.crt deleted file mode 100644 index 635ab268..00000000 --- a/packages/federation-server/src/__testData__/nginx/ssl/federation.example.com.crt +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFKjCCAxICAf8wDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNV -BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 -ZDAgFw0yMzA5MjcxNDI3NDlaGA8yMTIzMDkwMzE0Mjc0OVowbzELMAkGA1UEBhMC -RlIxDzANBgNVBAgMBkNlbnRyZTEOMAwGA1UEBwwFUGFyaXMxETAPBgNVBAoMCExp -bmFnb3JhMQswCQYDVQQLDAJJVDEfMB0GA1UEAwwWZmVkZXJhdGlvbi5leGFtcGxl -LmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJ9cz4ItKUQJTvJt -mt9aVAkomW5mQeA3IiA+uAt8xeeA8hvEjIKqFBRbBy1zLKZ1/5gWgHPk+VnXZdKy -P9nZRbN9zzlUW7LcTZ2NcUnlr0yuZSbvwL0EIAyPcdk1Z5PNqA0M4GfYFHXIm+BU -MOLiJ/61jiGvMn9U06QhCtlrjTqXVZaDr46ryzO4rkp7xh7SUODR231d2qJyZQEk -2Aq6dBr8ZZMHyDbVfO8kN1ObL4j4e8wmwDVz25TKWdL76HLVkcCZhFEV5cWySFzi -9cDDuY/fKyqY3sLAetPwatijNKP29nHcFe9l40alQuPf4ABhCuSg4rD1DHapCdol -ozb/MvwYuMPz4WghIJSiOhC8k0bJNXASHd9qNSxx6QPkTU2ukgwMVw/fAoelx/RH -zevxy9I+bD4ROzeurDt8OIByrX/u7Zx2q+SO9YK1dR9cW4Q3IgdTobfqEIPggKya -yDmd/bkxcY3Sa4+rp5pubkC4UWUwWYjQZqbPaE1vR+QBNNXa0s02Bc/9IwvZtNu4 -3hmtc78GAnBETiIwisOwGKHBhLsXwI5L1lk1i9dzqhRDmgpCfbTdCVIJID0AirSO -u9+JftGYu5YxVsC2U3ZJB1K/y/UTGFHVr17Fpr8LWc5rrWtm6BXes/HjdOWPeRtH -SSP9UhJOUPxMIAsu1VpXbBhdSderAgMBAAEwDQYJKoZIhvcNAQELBQADggIBAI+B -dO17+dGTjuKNWm7yzrebQJ7jSoPb+iZD4bKseXJRyRWlyzccWMGTYNMmjHsGUcoJ -C1rL4PEcZYOo9efgq+zOkijsmSJrNeQxG2XgjWoMD1VoIH/B+AWHP4xFPqoyDzjn -461/vnC2PrbCQj5QKjdGO7cL6eYCMIFlUVrhglVv4/lyy3IIHihoFiE4JbxwRNJq -yCF9iXK7764iS5uJGZLUDmcJ7DifzQRyORaUmQvXpcnI7BMvGa7BjoUkW3UWboFu -bxPCeIXqvlIbfc/RPyr0HpT0QtRhupeBVA49QNmN+2LO9GsTEkRx3QFdIEbJg0Iv -vz2WcDfij9D20hzM0vRucgMfIYB4h9hBjsVrlD+HcZEWD1wznoZbp9eK+PUdP7jE -05/QKKxawdILICAgjpM9herTFAsPut4CZgpEGq5YcHOnOEep10yOAxSaitHBTK23 -tKOsv3ujhDJDOrbx9se/eUCGAf2db9RYUuFbC87IH08O410OWiCxSkOeYBd0r9PI -ykeqA36SRSR2mxkySadY/wpLJA5kWHCi7OQ5DCW+6GcG+bToyOwBrFwtX+kvvkmR -GkDOvbErvxPWHr0AZXaBM1v45dpmmAYEym3oAaY4jgKHLHeXrShB0steaKwf6a+e -zKtdLj0mS2iZtNQIe5ZlkKFMVru3mSdGSzR6HVXy ------END CERTIFICATE----- \ No newline at end of file diff --git a/packages/federation-server/src/__testData__/nginx/ssl/federation.example.com.key b/packages/federation-server/src/__testData__/nginx/ssl/federation.example.com.key deleted file mode 100644 index 5e1d600b..00000000 --- a/packages/federation-server/src/__testData__/nginx/ssl/federation.example.com.key +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCfXM+CLSlECU7y -bZrfWlQJKJluZkHgNyIgPrgLfMXngPIbxIyCqhQUWwctcyymdf+YFoBz5PlZ12XS -sj/Z2UWzfc85VFuy3E2djXFJ5a9MrmUm78C9BCAMj3HZNWeTzagNDOBn2BR1yJvg -VDDi4if+tY4hrzJ/VNOkIQrZa406l1WWg6+Oq8szuK5Ke8Ye0lDg0dt9XdqicmUB -JNgKunQa/GWTB8g21XzvJDdTmy+I+HvMJsA1c9uUylnS++hy1ZHAmYRRFeXFskhc -4vXAw7mP3ysqmN7CwHrT8GrYozSj9vZx3BXvZeNGpULj3+AAYQrkoOKw9Qx2qQna -JaM2/zL8GLjD8+FoISCUojoQvJNGyTVwEh3fajUscekD5E1NrpIMDFcP3wKHpcf0 -R83r8cvSPmw+ETs3rqw7fDiAcq1/7u2cdqvkjvWCtXUfXFuENyIHU6G36hCD4ICs -msg5nf25MXGN0muPq6eabm5AuFFlMFmI0Gamz2hNb0fkATTV2tLNNgXP/SML2bTb -uN4ZrXO/BgJwRE4iMIrDsBihwYS7F8COS9ZZNYvXc6oUQ5oKQn203QlSCSA9AIq0 -jrvfiX7RmLuWMVbAtlN2SQdSv8v1ExhR1a9exaa/C1nOa61rZugV3rPx43Tlj3kb -R0kj/VISTlD8TCALLtVaV2wYXUnXqwIDAQABAoICADcXrlM6CqCPOUA9HQPnJdMu -unA8oLyDQuRz2kt6XK6OWOS5m7vWUW/CEmangQGhHHX3HXwzZfKlsPlYjxNgdiS5 -syiGHddlKt3zVn1uDp7LUYPW8cJGiU/eTUUCneaue9DbKT8tJ9GaQy0X3fipp5r6 -KANEHoh/ilUc6TPF50Kgq8GHj+saP/sG9xYf2RuxqK04T5F1H072ji2Jj7iRwe7M -X88nKxOt1W2VDx1zski/YojuwpcYEQrMs6XpWXBNngA/8krX76HbYwHdooj8AQwY -YkNtKuGYCj53yHBRZ7Lhf0xYgirLhflXy5qcvENVSR9F8WisppzlDldgmJ68NeL9 -syV6Jh4OXM1Z63k9Qo/AyLtR3rM/Eo41axIgmYV02rfkUMl0EyrJa1+RXzGF+A93 -KVJLQj4c0Tcptqu+Oyut1TSoawAZSxUhKWc+YuftMBPupbP+21DYCLUIf0nXdGrd -V11oUpzO0nYrNKycu53cDlpxt9jKT5Uh05PiQw/R15dDrGEtF65pRSfPYOG9Uizr -blqigBP6vDNXKAfMEsvwJvtGiDMWB9K/ztEzA/Log0zBySxXAKOnfBFtkMSOHc/2 -c4tZZow9FZmlySO6OnZ/h34fVvQGU2UXKJRx6ajDBxZXup84CK/BG7sMhOsUQOsG -/a6rwbTo9MGS8+McLck9AoIBAQC1hRP+uvmWBMI58OybA8YObRBcOai8EbCVqi0D -eb1K5OYGzkvZj9st9WnTquEQW3tqQW4hNWJOd0GxbD+d5eacbBLlsOH/OBWBCQjr -w+m9W/w0F/oiUWaZzRiPet5zPpPzPOAdEGyKBk5XOWOs9YNK5t4rz1UlGgvk20nc -PdJjRFiVc6FJpSrkE8357tVwE8aEiV090AqFwajdjoqEIPT3PktOmZm4eJ6qq3Ra -6t9oyLumtCcRRHa9SJMIUFeU58XyL9V1VnoLDeDw2SWUYd4b13mlRDlOGgRmoZEN -uCfAuoaINQhsoQb4ST8bJGXBzTOTi+Nbk4NN2MoFyJ1HFNllAoIBAQDgwFIWF4JI -hjClTaReWjitLEqYyklK5PqtUottDaQlu3TGzJST2xoy+YR8I7APw7jlxhYPNrn9 -1pI/S1pFu6PGJKcLZOOKugmmibiI31mG4uIdrBKBq860De51OniqmYP9SKFOMbf1 -lqRnN8ITAvN8tp6wBcednMwb+849uNa+9QAImds0xG5KTfEOi+lXVfIUuftTtABH -qVMwpWmpGSGiTyOq7y7z0yzEWCGNUT5ncnxsTdVQD2eBoJfXzk0yAKnrwk1L/8Kn -S9uCDrx+36qeNz/wrdGYe2tvf6QTovErKlo3ghT8o6iD1lcpR5DqSJdjNcygKYrZ -RHFz67c+LGPPAoIBAQCn66MyrB+F44MV/MW1JYmMAOL4njJ1QNwdqB8aLv2pEhWl -yCQs8MKvQm+S62pnKmoCQuMxf2Qg+HviOSSk2nA61lOo/rgi1Ow3wXbqPAO4NCcc -ve2c37bNowkMenrdG8/cXb1pxa7TBMBmOmX2M+0wVmDDIHtA5laIcUBjqSE+yZQ1 -NZHIQi5qbdPHWWVD2Fd2dmi2bQW+9QdVZq7HSoGzU4JxBPFK0PLfKdtq3Aqusbu+ -nLvjYnWB52h1cXWD/+GDiTKr6MLgBQfJZug3202QbgZPl8x3buQRWXeJvImx5hvc -V0siythayc/COSqVXVJQNUGvjsgSNPG25f5xKl1tAoIBAQCJlxNptOCsd4ImYJ7k -qEUUNw4/9W7jK8UPAH6ct4IrG1SFM88tqS+jzz89JDfvnrl96UOt8qnwbUDBAOd1 -00aS0fN1tUDbt8KasqtHF7zeJ92XnrUBr2VusyytlaszfaHhGGqvzR46eguRqP/l -1aOsULxbNF6c7dXCt+ftv0+wPZrUqSQabLq8QHT3m82xCsuVxrnG52ZYeJ+WI13J -CLqfe+VxCtZqrHg2h2Ga+wbCG8NyJkAVsCiEogTzN7foiaF81Emv4haPhpAOUekx -nsn77AT32eF7gOsnqjOPVexgqZ/rZXZlp+dNNpXLjqV32BLdyJzJ3ETFd/IgrkhT -BqffAoIBADnWZI6tffIfXOG2LZYEHqazxYI6UI8gPEqYotE2pothBv8/dbCpLvu8 -McO50KvueSXHqqcRonvP3wdZ47A7lmBVygVEFPopCN36zgaWhKiidzoJguc5N15E -9kXmHvNZQP+rsd5IHfgimE91wJFYvrK+dn/D7eOQROlTK2fmIeftVMgdYnmBaiGt -lb6eHlepD56lGk7rObwtYmKzddzRmfBANxbyXIlCfvfeG8LjFD3G97MaGtxxxuI8 -4YQZ2RNme6kiRCVCbXYXNshWw9mToNFWwcdq/4xScMMyuZ9+AjKhal9BQYntfwKs -XqO41Fmel51cnuMJqVdi5TWwKiYm4Vo= ------END PRIVATE KEY----- diff --git a/packages/federation-server/src/__testData__/synapse-data/homeserver-federation.yaml b/packages/federation-server/src/__testData__/synapse-data/homeserver-federation.yaml index f5d123a1..9ad173c8 100644 --- a/packages/federation-server/src/__testData__/synapse-data/homeserver-federation.yaml +++ b/packages/federation-server/src/__testData__/synapse-data/homeserver-federation.yaml @@ -11,7 +11,7 @@ # https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html server_name: "example.com" public_baseurl: "https://matrix.example.com/" -pid_file: /data/homeserver-federation.pid +pid_file: /data/homeserver-federated-identity.pid listeners: - port: 8008 tls: false @@ -25,7 +25,7 @@ database: args: user: synapse password: 'synapse!1' - database: synapsefederation + database: synapsefederatedidentity host: postgresql cp_min: 2 cp_max: 4 @@ -33,7 +33,7 @@ database: keepalives_interval: 10 keepalives_count: 3 log_config: "/data/matrix.example.com.log.config" -media_store_path: /data/media_store_federation +media_store_path: /data/media_store_federated_identity registration_shared_secret: "u+Q^i6&*Y9azZ*~pID^.a=qrvd+mUIBX9SAreEPGJ=xzP&c+Sk" report_stats: false macaroon_secret_key: "=0ws-1~ztzXm&xh+As;7YL5.-U~r-T,F4zR3mW#E;6Y::Rb7&G" diff --git a/packages/federation-server/src/config.json b/packages/federation-server/src/config.json index 46c9812f..08f9549d 100644 --- a/packages/federation-server/src/config.json +++ b/packages/federation-server/src/config.json @@ -11,7 +11,7 @@ "database_user": "", "database_vacuum_delay": 3600, "hashes_rate_limit": 100, - "is_federation_server": true, + "is_federated_identity_service": true, "key_delay": 3600, "keys_depth": 5, "ldap_base": "", diff --git a/packages/federation-server/src/controllers/controllers.ts b/packages/federation-server/src/controllers/controllers.ts index 5eb85e9b..100ab79a 100644 --- a/packages/federation-server/src/controllers/controllers.ts +++ b/packages/federation-server/src/controllers/controllers.ts @@ -4,7 +4,7 @@ import { MatrixErrors, type DbGetResult } from '@twake/matrix-identity-server' import lodash from 'lodash' import { hashByServer } from '../db' import { - FederationServerError, + FederatedIdentityServiceError, validationErrorHandler } from '../middlewares/errors' import { @@ -69,7 +69,7 @@ export const lookup = ( }) .catch((e) => { next( - new FederationServerError({ + new FederatedIdentityServiceError({ message: e, code: MatrixErrors.errCodes.unknown }) @@ -116,7 +116,7 @@ export const lookups = (db: IdentityServerDb): expressAppHandler => { }) .catch((e) => { next( - new FederationServerError({ + new FederatedIdentityServiceError({ message: e, code: MatrixErrors.errCodes.unknown }) @@ -155,7 +155,7 @@ export const hashDetails = ( }) .catch((e) => { next( - new FederationServerError({ + new FederatedIdentityServiceError({ message: e, code: MatrixErrors.errCodes.unknown }) diff --git a/packages/federation-server/src/index.test.ts b/packages/federation-server/src/index.test.ts index 1e3bd8fd..f7bf3c27 100644 --- a/packages/federation-server/src/index.test.ts +++ b/packages/federation-server/src/index.test.ts @@ -14,7 +14,7 @@ import { type StartedDockerComposeEnvironment, type StartedTestContainer } from 'testcontainers' -import FederationServer from '.' +import FederatedIdentityService from '.' import JEST_PROCESS_ROOT_PATH from '../jest.globals' import { buildMatrixDb, buildUserDB } from './__testData__/build-userdb' import defaultConfig from './__testData__/config.json' @@ -42,7 +42,7 @@ interface IHashDetails { alt_lookup_peppers?: string[] } -describe('Federation server', () => { +describe('Federated identity service', () => { const hash = new Hash() beforeAll((done) => { @@ -59,7 +59,7 @@ describe('Federation server', () => { let startedCompose: StartedDockerComposeEnvironment let identity1IPAddress: string let identity2IPAddress: string - let tokens: { matrixToken: string; federationToken: string } + let tokens: { matrixToken: string; federatedIdentityToken: string } let hashDetails: IHashDetails let allPeppers: string[] @@ -67,9 +67,9 @@ describe('Federation server', () => { username: string, password: string, matrixServer: string, - federationServer?: string + federatedIdentityService?: string ): Promise< - { matrixToken: string; federationToken?: string } | undefined + { matrixToken: string; federatedIdentityToken?: string } | undefined > => { let response = await fetch.default( encodeURI( @@ -126,7 +126,7 @@ describe('Federation server', () => { ) body = (await response.json()) as any const matrixToken = body.access_token as string - if (federationServer != null) { + if (federatedIdentityService != null) { const userId = body.user_id as string response = await fetch.default( encodeURI( @@ -143,7 +143,7 @@ describe('Federation server', () => { body = await response.json() response = await fetch.default( encodeURI( - `https://${federationServer}/_matrix/identity/v2/account/register` + `https://${federatedIdentityService}/_matrix/identity/v2/account/register` ), { method: 'POST', @@ -157,7 +157,8 @@ describe('Federation server', () => { } return { matrixToken, - federationToken: federationServer != null ? body.token : null + federatedIdentityToken: + federatedIdentityService != null ? body.token : null } } @@ -177,7 +178,10 @@ describe('Federation server', () => { ) .withEnvironment({ MYUID: os.userInfo().uid.toString() }) .withWaitStrategy('postgresql', Wait.forHealthCheck()) - .withWaitStrategy('synapse-federation', Wait.forHealthCheck()) + .withWaitStrategy( + 'synapse-federated-identity-service', + Wait.forHealthCheck() + ) .withWaitStrategy('synapse-1', Wait.forHealthCheck()) .withWaitStrategy('synapse-2', Wait.forHealthCheck()) .withWaitStrategy('synapse-3', Wait.forHealthCheck()) @@ -202,7 +206,7 @@ describe('Federation server', () => { path.join(pathToSynapseDataFolder, 'media_store1'), path.join(pathToSynapseDataFolder, 'media_store2'), path.join(pathToSynapseDataFolder, 'media_store3'), - path.join(pathToSynapseDataFolder, 'media_store_federation') + path.join(pathToSynapseDataFolder, 'media_store_federated_identity') ] filesToDelete.forEach((path: string) => { if (fs.existsSync(path)) { @@ -224,23 +228,25 @@ describe('Federation server', () => { } }) - describe('Federation server in docker container', () => { - let federationServerContainer: StartedTestContainer - const federationServerHostname = 'federation.example.com' - const pathToFederationServerConf = path.join( + describe('Federated identity service in docker container', () => { + let federatedIdentityServiceContainer: StartedTestContainer + const federatedIdentityServiceHostname = 'federated-identity.example.com' + const pathToFederatedIdentityServiceConf = path.join( pathToTestDataFolder, - 'federation-server', - 'federation-server.conf' + 'federated-identity-service', + 'federated-identity-service.conf' ) let confOriginalContent: string const getHashDetails = async (): Promise => { const response = await fetch.default( encodeURI( - `https://${federationServerHostname}/_matrix/identity/v2/hash_details` + `https://${federatedIdentityServiceHostname}/_matrix/identity/v2/hash_details` ), { - headers: { Authorization: `Bearer ${tokens.federationToken}` } + headers: { + Authorization: `Bearer ${tokens.federatedIdentityToken}` + } } ) return (await response.json()) as IHashDetails @@ -255,12 +261,12 @@ describe('Federation server', () => { .getIpAddress('test') confOriginalContent = fs.readFileSync( - pathToFederationServerConf, + pathToFederatedIdentityServiceConf, 'utf-8' ) fs.writeFileSync( - pathToFederationServerConf, + pathToFederatedIdentityServiceConf, confOriginalContent.replace( /"trusted_servers_addresses": \[\]/g, `"trusted_servers_addresses": ["${identity1IPAddress}", "${identity2IPAddress}"]` @@ -268,10 +274,11 @@ describe('Federation server', () => { 'utf-8' ) - federationServerContainer = - startedCompose.getContainer('federation-server') + federatedIdentityServiceContainer = startedCompose.getContainer( + 'federated-identity-service' + ) - federationServerContainer + federatedIdentityServiceContainer .restart() // eslint-disable-next-line @typescript-eslint/promise-function-async .then(() => { @@ -279,14 +286,14 @@ describe('Federation server', () => { 'askywalker', 'askywalker', 'matrix1.example.com', - federationServerHostname + federatedIdentityServiceHostname ) }) // eslint-disable-next-line @typescript-eslint/promise-function-async .then((askywalkerTokens) => { tokens = askywalkerTokens as { matrixToken: string - federationToken: string + federatedIdentityToken: string } return Promise.all([ simulationConnection( @@ -299,7 +306,7 @@ describe('Federation server', () => { }) // eslint-disable-next-line @typescript-eslint/promise-function-async .then(() => { - // wait for identity servers to push hashes to federation server + // wait for identity servers to push hashes to federated identity service return new Promise((resolve) => setTimeout(resolve, 8000)) }) .then(() => { @@ -312,12 +319,12 @@ describe('Federation server', () => { afterAll((done) => { fs.writeFileSync( - pathToFederationServerConf, + pathToFederatedIdentityServiceConf, confOriginalContent, 'utf-8' ) - if (federationServerContainer != null) { - federationServerContainer + if (federatedIdentityServiceContainer != null) { + federatedIdentityServiceContainer .stop() .then(() => { done() @@ -340,13 +347,13 @@ describe('Federation server', () => { for (let i = 0; i < allPeppers.length; i++) { const response = await fetch.default( encodeURI( - `https://${federationServerHostname}/_matrix/identity/v2/lookup` + `https://${federatedIdentityServiceHostname}/_matrix/identity/v2/lookup` ), { method: 'post', headers: { 'Content-Type': 'application/json', - Authorization: `Bearer ${tokens.federationToken}` + Authorization: `Bearer ${tokens.federatedIdentityToken}` }, body: JSON.stringify({ algorithm: hashDetails.algorithms[0], @@ -381,7 +388,7 @@ describe('Federation server', () => { expect(hosts.has('identity2.example.com:443')).toEqual(true) }) - it('should get user of federation server environment on lookup', async () => { + it('should get user of federated identity service environment on lookup', async () => { await simulationConnection( 'chewbacca', 'chewbacca', @@ -398,13 +405,13 @@ describe('Federation server', () => { for (let i = 0; i < allPeppers.length; i++) { const response = await fetch.default( encodeURI( - `https://${federationServerHostname}/_matrix/identity/v2/lookup` + `https://${federatedIdentityServiceHostname}/_matrix/identity/v2/lookup` ), { method: 'post', headers: { 'Content-Type': 'application/json', - Authorization: `Bearer ${tokens.federationToken}` + Authorization: `Bearer ${tokens.federatedIdentityToken}` }, body: JSON.stringify({ algorithm: hashDetails.algorithms[0], @@ -444,13 +451,13 @@ describe('Federation server', () => { for (let i = 0; i < allPeppers.length; i++) { const response = await fetch.default( encodeURI( - `https://${federationServerHostname}/_matrix/identity/v2/lookup` + `https://${federatedIdentityServiceHostname}/_matrix/identity/v2/lookup` ), { method: 'post', headers: { 'Content-Type': 'application/json', - Authorization: `Bearer ${tokens.federationToken}` + Authorization: `Bearer ${tokens.federatedIdentityToken}` }, body: JSON.stringify({ algorithm: hashDetails.algorithms[0], @@ -475,7 +482,7 @@ describe('Federation server', () => { expect(hosts.has('identity2.example.com:443')).toEqual(true) }) - it('should find all federation users and servers address of third party users on lookup', async () => { + it('should find all federated identity service users and servers address of third party users on lookup', async () => { hashDetails = await getHashDetails() allPeppers = getAllPeppers(hashDetails) const lskywalkerHashes = allPeppers.map((pepper) => @@ -500,13 +507,13 @@ describe('Federation server', () => { for (let i = 0; i < allPeppers.length; i++) { const response = await fetch.default( encodeURI( - `https://${federationServerHostname}/_matrix/identity/v2/lookup` + `https://${federatedIdentityServiceHostname}/_matrix/identity/v2/lookup` ), { method: 'post', headers: { 'Content-Type': 'application/json', - Authorization: `Bearer ${tokens.federationToken}` + Authorization: `Bearer ${tokens.federatedIdentityToken}` }, body: JSON.stringify({ algorithm: hashDetails.algorithms[0], @@ -564,13 +571,13 @@ describe('Federation server', () => { for (let i = 0; i < allPeppers.length; i++) { const response = await fetch.default( encodeURI( - `https://${federationServerHostname}/_matrix/identity/v2/lookup` + `https://${federatedIdentityServiceHostname}/_matrix/identity/v2/lookup` ), { method: 'post', headers: { 'Content-Type': 'application/json', - Authorization: `Bearer ${tokens.federationToken}` + Authorization: `Bearer ${tokens.federatedIdentityToken}` }, body: JSON.stringify({ algorithm: hashDetails.algorithms[0], @@ -598,13 +605,13 @@ describe('Federation server', () => { for (let i = 0; i < allPeppers.length; i++) { const response = await fetch.default( encodeURI( - `https://${federationServerHostname}/_matrix/identity/v2/lookup` + `https://${federatedIdentityServiceHostname}/_matrix/identity/v2/lookup` ), { method: 'post', headers: { 'Content-Type': 'application/json', - Authorization: `Bearer ${tokens.federationToken}` + Authorization: `Bearer ${tokens.federatedIdentityToken}` }, body: JSON.stringify({ algorithm: hashDetails.algorithms[0], @@ -624,19 +631,18 @@ describe('Federation server', () => { }) }) - // Does not work on CI when pepper is udpated due to ip addresses in identity servers requests - describe('Federation Server as express app', () => { - let federationServer: FederationServer + describe('Federated Identity Service as express app', () => { + let federatedIdentityService: FederatedIdentityService let app: express.Application - let expressFederationServer: http.Server + let expressFederatedIdentityService: http.Server const pathToIdentityServerConf = path.join( pathToTestDataFolder, 'identity-server', 'conf' ) const pathToNginxSsl = path.join(pathToTestDataFolder, 'nginx', 'ssl') - let federationServerCrtFilePath: string - let federationServerKeyFilePath: string + let federatedIdentityServiceCrtFilePath: string + let federatedIdentityServiceKeyFilePath: string const originalContents: string[] = [] const interfaces = os.networkInterfaces() @@ -655,7 +661,7 @@ describe('Federation server', () => { const response = await request(app) .get('/_matrix/identity/v2/hash_details') .set('Accept', 'application/json') - .set('Authorization', `Bearer ${tokens.federationToken}`) + .set('Authorization', `Bearer ${tokens.federatedIdentityToken}`) return response.body as IHashDetails } @@ -677,17 +683,17 @@ describe('Federation server', () => { const content = fs.readFileSync(confFilePath, 'utf-8') originalContents.push(content) const newContent = content.replace( - /federation\.example\.com/g, + /federated-identity\.example\.com/g, `${hostNetworkInterface.address}:3000` ) fs.writeFileSync(confFilePath, newContent, 'utf-8') } - federationServerCrtFilePath = path.join( + federatedIdentityServiceCrtFilePath = path.join( pathToNginxSsl, `${hostNetworkInterface.address}.crt` ) - federationServerKeyFilePath = path.join( + federatedIdentityServiceKeyFilePath = path.join( pathToNginxSsl, `${hostNetworkInterface.address}.key` ) @@ -708,14 +714,14 @@ describe('Federation server', () => { } waitForFilesExist([ - federationServerCrtFilePath, - federationServerKeyFilePath + federatedIdentityServiceCrtFilePath, + federatedIdentityServiceKeyFilePath ]) // eslint-disable-next-line @typescript-eslint/promise-function-async .then((areFilesCreated) => { if (!areFilesCreated) throw new Error( - 'Certificates files for federation server has not been created' + 'Certificates files for federated identity service has not been created' ) return Promise.all([ startedCompose.getContainer('identity-server-1').restart(), @@ -744,7 +750,7 @@ describe('Federation server', () => { database_host: `${startedCompose .getContainer(`postgresql`) .getHost()}:5432`, - database_name: 'federation', + database_name: 'federatedidentity', ldap_base: 'dc=example,dc=com', ldap_uri: `ldap://${startedCompose .getContainer(`postgresql`) @@ -753,7 +759,7 @@ describe('Federation server', () => { matrix_database_host: `${startedCompose .getContainer(`postgresql`) .getHost()}:5432`, - matrix_database_name: 'synapsefederation', + matrix_database_name: 'synapsefederatedidentity', matrix_database_user: 'synapse', matrix_database_password: 'synapse!1', pepperCron: '*/2 * * * *', @@ -772,25 +778,25 @@ describe('Federation server', () => { update_users_cron: '*/5 * * * * *', userdb_engine: 'ldap' } - federationServer = new FederationServer(testConfig) + federatedIdentityService = new FederatedIdentityService(testConfig) app = express() - return federationServer.ready + return federatedIdentityService.ready }) // eslint-disable-next-line @typescript-eslint/promise-function-async .then(() => { - app.use(federationServer.routes) - const key = fs.readFileSync(federationServerKeyFilePath) - const cert = fs.readFileSync(federationServerCrtFilePath) - expressFederationServer = createServer({ key, cert }, app) + app.use(federatedIdentityService.routes) + const key = fs.readFileSync(federatedIdentityServiceKeyFilePath) + const cert = fs.readFileSync(federatedIdentityServiceCrtFilePath) + expressFederatedIdentityService = createServer({ key, cert }, app) return new Promise((resolve, _reject) => { - expressFederationServer.listen(3000, () => { + expressFederatedIdentityService.listen(3000, () => { resolve() }) }) }) // eslint-disable-next-line @typescript-eslint/promise-function-async .then(() => { - // wait for identity servers to push hashes to federation server + // wait for identity servers to push hashes to federated identity service return new Promise((resolve) => setTimeout(resolve, 8000)) }) .then(() => { @@ -810,15 +816,16 @@ describe('Federation server', () => { ) } const filesToDelete = [ - federationServerCrtFilePath, - federationServerKeyFilePath + federatedIdentityServiceCrtFilePath, + federatedIdentityServiceKeyFilePath ] filesToDelete.forEach((path: string) => { if (fs.existsSync(path)) fs.unlinkSync(path) }) - if (federationServer != null) federationServer.cleanJobs() - if (expressFederationServer != null) { - expressFederationServer.close((e) => { + if (federatedIdentityService != null) + federatedIdentityService.cleanJobs() + if (expressFederatedIdentityService != null) { + expressFederatedIdentityService.close((e) => { if (e != null) { done(e) } @@ -840,7 +847,7 @@ describe('Federation server', () => { const response = await request(app) .post('/_matrix/identity/v2/lookup') .set('Accept', 'application/json') - .set('Authorization', `Bearer ${tokens.federationToken}`) + .set('Authorization', `Bearer ${tokens.federatedIdentityToken}`) .send({ algorithm: hashDetails.algorithms[0], pepper: allPeppers[i], @@ -858,7 +865,7 @@ describe('Federation server', () => { expect(hosts.has('identity2.example.com:443')).toEqual(true) }) - it('should get user of federation server environment on lookup', async () => { + it('should get user of federated identity service environment on lookup', async () => { hashDetails = await getHashDetails() allPeppers = getAllPeppers(hashDetails) const chewbaccaHashes = allPeppers.map((pepper) => @@ -870,7 +877,7 @@ describe('Federation server', () => { const response = await request(app) .post('/_matrix/identity/v2/lookup') .set('Accept', 'application/json') - .set('Authorization', `Bearer ${tokens.federationToken}`) + .set('Authorization', `Bearer ${tokens.federatedIdentityToken}`) .send({ algorithm: hashDetails.algorithms[0], pepper: allPeppers[i], @@ -897,7 +904,7 @@ describe('Federation server', () => { const response = await request(app) .post('/_matrix/identity/v2/lookup') .set('Accept', 'application/json') - .set('Authorization', `Bearer ${tokens.federationToken}`) + .set('Authorization', `Bearer ${tokens.federatedIdentityToken}`) .send({ algorithm: hashDetails.algorithms[0], pepper: allPeppers[i], @@ -919,7 +926,7 @@ describe('Federation server', () => { const response = await request(app) .post('/_matrix/identity/v2/lookup') .set('Accept', 'application/json') - .set('Authorization', `Bearer ${tokens.federationToken}`) + .set('Authorization', `Bearer ${tokens.federatedIdentityToken}`) .send({ algorithm: hashDetails.algorithms[0], pepper: allPeppers[i], @@ -931,7 +938,7 @@ describe('Federation server', () => { } }) - it('should find all federation users and servers address of third party users on lookup', async () => { + it('should find all federated identity service and servers address of third party users on lookup', async () => { hashDetails = await getHashDetails() allPeppers = getAllPeppers(hashDetails) const lskywalkerHashes = allPeppers.map((pepper) => @@ -958,7 +965,7 @@ describe('Federation server', () => { const response = await request(app) .post('/_matrix/identity/v2/lookup') .set('Accept', 'application/json') - .set('Authorization', `Bearer ${tokens.federationToken}`) + .set('Authorization', `Bearer ${tokens.federatedIdentityToken}`) .send({ algorithm: hashDetails.algorithms[0], pepper: allPeppers[i], @@ -1005,9 +1012,9 @@ describe('Federation server', () => { }) describe('Mock tests', () => { - let federationServer: FederationServer + let federatedIdentityService: FederatedIdentityService let app: express.Application - let expressFederationServer: http.Server + let expressFederatedIdentityService: http.Server const trustedIpAddress = '192.168.1.1' const trustedIpv6Address = '2001:db8:3333:4444:5555:6666:7777:8888' const trustedNetwork = '192.168.200.4/30' @@ -1022,7 +1029,7 @@ describe('Federation server', () => { ] } - const stopFederationServer = ( + const stopFederatedIdentityService = ( done: jest.DoneCallback, filesToDelete = [ path.join(pathToTestDataFolder, 'database.db'), @@ -1033,9 +1040,9 @@ describe('Federation server', () => { filesToDelete.forEach((path: string) => { if (fs.existsSync(path)) fs.unlinkSync(path) }) - if (federationServer != null) federationServer.cleanJobs() - if (expressFederationServer != null) { - expressFederationServer.close((e) => { + if (federatedIdentityService != null) federatedIdentityService.cleanJobs() + if (expressFederatedIdentityService != null) { + expressFederatedIdentityService.close((e) => { if (e != null) { done(e) } @@ -1061,7 +1068,7 @@ describe('Federation server', () => { }) afterAll((done) => { - stopFederationServer(done) + stopFederatedIdentityService(done) }) beforeEach(() => { @@ -1077,25 +1084,26 @@ describe('Federation server', () => { let chewbaccaHashes: string[] let qjinnHashes: string[] - const setFederationServerDataAndRoutes = async (): Promise => { - await new Promise((resolve, _reject) => - setTimeout(() => { - resolve() - }, 16000) - ) // wait to set previousPepper in db - await federationServer.db.insert('accessTokens', { - id: authToken, - data: '{"sub": "@test:example.com"}' - }) - await new Promise((resolve, _reject) => { - app.use(federationServer.routes) - expressFederationServer = app.listen(3000, () => { - resolve() + const setFederatedIdentityServiceDataAndRoutes = + async (): Promise => { + await new Promise((resolve, _reject) => + setTimeout(() => { + resolve() + }, 16000) + ) // wait to set previousPepper in db + await federatedIdentityService.db.insert('accessTokens', { + id: authToken, + data: '{"sub": "@test:example.com"}' }) - }) - } + await new Promise((resolve, _reject) => { + app.use(federatedIdentityService.routes) + expressFederatedIdentityService = app.listen(3000, () => { + resolve() + }) + }) + } - const pushHashesToFederationServer = async ( + const pushHashesToFederatedIdentityService = async ( fedServerHashDetails?: IHashDetails ): Promise => { hashDetails = @@ -1188,13 +1196,15 @@ describe('Federation server', () => { .join(',') .concat(',invalid_ip') process.env.TRUST_X_FORWARDED_FOR = String(trustXForwardedFor) - federationServer = new FederationServer(mIdentityServerConfig) + federatedIdentityService = new FederatedIdentityService( + mIdentityServerConfig + ) app = express() - federationServer.ready + federatedIdentityService.ready // eslint-disable-next-line @typescript-eslint/promise-function-async - .then(() => setFederationServerDataAndRoutes()) + .then(() => setFederatedIdentityServiceDataAndRoutes()) // eslint-disable-next-line @typescript-eslint/promise-function-async - .then(() => pushHashesToFederationServer()) + .then(() => pushHashesToFederatedIdentityService()) .then(() => { done() }) @@ -1206,7 +1216,7 @@ describe('Federation server', () => { afterAll((done) => { delete process.env.TRUSTED_SERVERS_ADDRESSES delete process.env.TRUST_X_FORWARDED_FOR - stopFederationServer(done, [ + stopFederatedIdentityService(done, [ path.join(pathToTestDataFolder, 'database.db') ]) }) @@ -1234,7 +1244,7 @@ describe('Federation server', () => { expect(hosts.has('identity2.example.com:443')).toEqual(true) }) - it('should get user of federation server environment on lookup', async () => { + it('should get user of federated identity service environment on lookup', async () => { const matrixAddresses = new Set() for (let i = 0; i < allPeppers.length; i++) { const response = await request(app) @@ -1334,7 +1344,7 @@ describe('Federation server', () => { expect(hosts.has('identity2.example.com:443')).toEqual(true) }) - it('should find all federation users and servers address of third party users on lookup', async () => { + it('should find all federated identity service users and servers address of third party users on lookup', async () => { const matrixAddresses = new Set() const askywalkerHosts = new Set() const lskywalkerHosts = new Set() @@ -1394,13 +1404,13 @@ describe('Federation server', () => { describe('Use JSON configuration object', () => { beforeAll((done) => { - federationServer = new FederationServer(testConfig) + federatedIdentityService = new FederatedIdentityService(testConfig) app = express() - federationServer.ready + federatedIdentityService.ready // eslint-disable-next-line @typescript-eslint/promise-function-async - .then(() => setFederationServerDataAndRoutes()) + .then(() => setFederatedIdentityServiceDataAndRoutes()) // eslint-disable-next-line @typescript-eslint/promise-function-async - .then(() => pushHashesToFederationServer()) + .then(() => pushHashesToFederatedIdentityService()) .then(() => { done() }) @@ -1432,7 +1442,7 @@ describe('Federation server', () => { expect(hosts.has('identity2.example.com:443')).toEqual(true) }) - it('should get user of federation server environment on lookup', async () => { + it('should get user of federated identity service environment on lookup', async () => { const matrixAddresses = new Set() for (let i = 0; i < allPeppers.length; i++) { const response = await request(app) @@ -1532,7 +1542,7 @@ describe('Federation server', () => { expect(hosts.has('identity2.example.com:443')).toEqual(true) }) - it('should find all federation users and servers address of third party users on lookup', async () => { + it('should find all federated identity service users and servers address of third party users on lookup', async () => { const matrixAddresses = new Set() const askywalkerHosts = new Set() const lskywalkerHosts = new Set() @@ -1604,9 +1614,11 @@ describe('Federation server', () => { let handledPeppers = [ ...new Set( - (await federationServer.db.getAll(hashByServer, ['pepper'])).map( - (row) => row.pepper as string - ) + ( + await federatedIdentityService.db.getAll(hashByServer, [ + 'pepper' + ]) + ).map((row) => row.pepper as string) ) ] @@ -1632,13 +1644,15 @@ describe('Federation server', () => { ...(newHashDetails.alt_lookup_peppers ?? []) ] - await pushHashesToFederationServer(newHashDetails) + await pushHashesToFederatedIdentityService(newHashDetails) handledPeppers = [ ...new Set( - (await federationServer.db.getAll(hashByServer, ['pepper'])).map( - (row) => row.pepper as string - ) + ( + await federatedIdentityService.db.getAll(hashByServer, [ + 'pepper' + ]) + ).map((row) => row.pepper as string) ) ] @@ -1739,7 +1753,7 @@ describe('Federation server', () => { it('should send an error if token data in accessTokens table does not contain "sub" field', async () => { jest - .spyOn(federationServer.db, 'get') + .spyOn(federatedIdentityService.db, 'get') .mockResolvedValue([{ data: JSON.stringify({}) }]) const jsonParseSpy = jest.spyOn(JSON, 'parse') @@ -1925,7 +1939,7 @@ describe('Federation server', () => { it('should send an error if getting hashes from db fails', async () => { jest - .spyOn(federationServer.db, 'get') + .spyOn(federatedIdentityService.db, 'get') .mockResolvedValueOnce([ { data: JSON.stringify({ sub: '@test:example.com' }) } ]) @@ -1952,7 +1966,7 @@ describe('Federation server', () => { it('should send an error if getting hashes from hashes table fails', async () => { const dbGetSpy = jest - .spyOn(federationServer.db, 'get') + .spyOn(federatedIdentityService.db, 'get') .mockResolvedValueOnce([ { data: JSON.stringify({ sub: '@test:example.com' }) } ]) @@ -1980,7 +1994,7 @@ describe('Federation server', () => { it('should send an error if getting hashes from hashbyserver table fails', async () => { const dbGetSpy = jest - .spyOn(federationServer.db, 'get') + .spyOn(federatedIdentityService.db, 'get') .mockResolvedValueOnce([ { data: JSON.stringify({ sub: '@test:example.com' }) } ]) @@ -2227,7 +2241,7 @@ describe('Federation server', () => { it('should send an error if getting pepper in keys table fails', async () => { jest - .spyOn(federationServer.db, 'get') + .spyOn(federatedIdentityService.db, 'get') .mockRejectedValueOnce(new Error(errorMessage)) const response = await request(app) @@ -2251,7 +2265,7 @@ describe('Federation server', () => { it('should send an error if deleting hashes in hashbyserver table fails', async () => { jest - .spyOn(federationServer.db, 'deleteWhere') + .spyOn(federatedIdentityService.db, 'deleteWhere') .mockRejectedValue(new Error(errorMessage)) const response = await request(app) @@ -2275,7 +2289,7 @@ describe('Federation server', () => { it('should send an error if inserting hashes in hashbyserver table fails', async () => { const insertSpyOn = jest - .spyOn(federationServer.db, 'insert') + .spyOn(federatedIdentityService.db, 'insert') .mockResolvedValueOnce([]) .mockResolvedValueOnce([]) .mockRejectedValueOnce(new Error(errorMessage)) @@ -2337,7 +2351,7 @@ describe('Federation server', () => { it('should send an error if deleting hashes in hashbyserver table fails', async () => { jest - .spyOn(federationServer.db, 'get') + .spyOn(federatedIdentityService.db, 'get') .mockResolvedValueOnce([ { data: JSON.stringify({ sub: '@test:example.com' }) } ]) diff --git a/packages/federation-server/src/index.ts b/packages/federation-server/src/index.ts index c066bab4..9ad08eaf 100644 --- a/packages/federation-server/src/index.ts +++ b/packages/federation-server/src/index.ts @@ -2,7 +2,6 @@ import configParser, { type ConfigDescription } from '@twake/config-parser' import { type TwakeLogger } from '@twake/logger' import MatrixIdentityServer from '@twake/matrix-identity-server' import { Router } from 'express' -import rateLimit from 'express-rate-limit' import fs from 'fs' import defaultConfig from './config.json' import initializeDb from './db' @@ -11,7 +10,7 @@ import Routes from './routes/routes' import { type Config } from './types' import { isIpLiteral, isNetwork } from './utils/ip-address' -export default class FederationServer extends MatrixIdentityServer { +export default class FederatedIdentityService extends MatrixIdentityServer { routes = Router() declare conf: Config constructor( @@ -23,10 +22,10 @@ export default class FederationServer extends MatrixIdentityServer { const serverConf = configParser( confDesc, /* istanbul ignore next */ - fs.existsSync('/etc/twake/federation-server.conf') - ? '/etc/twake/federation-server.conf' - : process.env.TWAKE_FEDERATION_SERVER_CONF != null - ? process.env.TWAKE_FEDERATION_SERVER_CONF + fs.existsSync('/etc/twake/federated-identity-service.conf') + ? '/etc/twake/federated-identity-service.conf' + : process.env.TWAKE_FEDERATED_IDENTITY_SERVICE_CONF != null + ? process.env.TWAKE_FEDERATED_IDENTITY_SERVICE_CONF : conf != null ? conf : undefined diff --git a/packages/federation-server/src/middlewares/errors.ts b/packages/federation-server/src/middlewares/errors.ts index ed4ad465..ecf351b0 100644 --- a/packages/federation-server/src/middlewares/errors.ts +++ b/packages/federation-server/src/middlewares/errors.ts @@ -4,20 +4,20 @@ import { validationResult, type ValidationError } from 'express-validator' import { type ErrorResponseBody, type expressAppHandlerError, - type federationServerErrorCode + type federatedIdentityServiceErrorCode } from '../types' export const defaultErrorMsg = 'Internal server error' -export class FederationServerError extends Error { +export class FederatedIdentityServiceError extends Error { statusCode: number - errcode?: federationServerErrorCode + errcode?: federatedIdentityServiceErrorCode constructor( error: { status?: number message?: string - code?: federationServerErrorCode + code?: federatedIdentityServiceErrorCode } = {} ) { let errorMessage = defaultErrorMsg @@ -40,18 +40,21 @@ export const errorMiddleware: expressAppHandlerError = ( res, next ) => { - const federationServerError: FederationServerError = - error instanceof FederationServerError + const federatedIdentityServiceError: FederatedIdentityServiceError = + error instanceof FederatedIdentityServiceError ? error - : new FederationServerError({ message: error.message }) - res.status(federationServerError.statusCode) + : new FederatedIdentityServiceError({ message: error.message }) + res.status(federatedIdentityServiceError.statusCode) let bodyResponse: ErrorResponseBody = { - error: federationServerError.message + error: federatedIdentityServiceError.message } - if (federationServerError.errcode != null) { - bodyResponse = { errcode: federationServerError.errcode, ...bodyResponse } + if (federatedIdentityServiceError.errcode != null) { + bodyResponse = { + errcode: federatedIdentityServiceError.errcode, + ...bodyResponse + } } - res.statusMessage = federationServerError.message + res.statusMessage = federatedIdentityServiceError.message res.json(bodyResponse) } @@ -67,7 +70,7 @@ export const validationErrorHandler = (req: Request): void => { }` ) .join(', ') - throw new FederationServerError({ + throw new FederatedIdentityServiceError({ status: 400, message: errorMessage, code: MatrixErrors.errCodes.invalidParam diff --git a/packages/federation-server/src/middlewares/utils.ts b/packages/federation-server/src/middlewares/utils.ts index d4fdf17a..a3003ad1 100644 --- a/packages/federation-server/src/middlewares/utils.ts +++ b/packages/federation-server/src/middlewares/utils.ts @@ -1,6 +1,6 @@ import { MatrixErrors } from '@twake/matrix-identity-server' import { type expressAppHandler } from '../types' -import { FederationServerError } from './errors' +import { FederatedIdentityServiceError } from './errors' export const allowCors: expressAppHandler = (req, res, next) => { res.setHeader('Access-Control-Allow-Origin', '*') @@ -16,14 +16,14 @@ export const allowCors: expressAppHandler = (req, res, next) => { } export const methodNotAllowed: expressAppHandler = (req, res, next) => { - throw new FederationServerError({ + throw new FederatedIdentityServiceError({ status: 405, code: MatrixErrors.errCodes.unrecognized }) } export const methodNotFound: expressAppHandler = (req, res, next) => { - throw new FederationServerError({ + throw new FederatedIdentityServiceError({ status: 404, code: MatrixErrors.errCodes.notFound }) diff --git a/packages/federation-server/src/routes/routes.ts b/packages/federation-server/src/routes/routes.ts index c4a3e4d5..ac985518 100644 --- a/packages/federation-server/src/routes/routes.ts +++ b/packages/federation-server/src/routes/routes.ts @@ -2,6 +2,7 @@ import { type TwakeLogger } from '@twake/logger' import { type IdServerAPI, type Utils } from '@twake/matrix-identity-server' import { Router, json, urlencoded } from 'express' import { hashDetails, lookup, lookups } from '../controllers/controllers' +import { auth } from '../middlewares/auth' import { errorMiddleware } from '../middlewares/errors' import { allowCors, @@ -19,7 +20,6 @@ import { type expressAppHandler, type middlewaresList } from '../types' -import { auth } from '../middlewares/auth' const errorMiddlewares = (middleware: expressAppHandler): middlewaresList => [ allowCors, @@ -44,7 +44,7 @@ export default ( * '/_matrix/identity/v2/lookup': * post: * tags: - * - Federation server + * - Federated identity service * description: Extends https://spec.matrix.org/v1.6/identity-service-api/#post_matrixidentityv2lookup to display inactive users and 3PID users * requestBody: * description: Object containing hashes of mails/phones to search @@ -145,7 +145,7 @@ export default ( * '/_matrix/identity/v2/hash_details': * get: * tags: - * - Federation server + * - Federated identity service * description: Implements https://spec.matrix.org/v1.6/identity-service-api/#get_matrixidentityv2hash_details */ routes @@ -183,10 +183,10 @@ export default ( * '/_matrix/identity/v2/lookups': * post: * tags: - * - Federation server + * - Federated identity service * description: Implements https://github.com/guimard/matrix-spec-proposals/blob/unified-identity-service/proposals/4004-unified-identity-service-view.md * requestBody: - * description: Object containing hashes to store in federation server database + * description: Object containing hashes to store in federated identity service database * required: true * content: * application/json: diff --git a/packages/federation-server/src/types.ts b/packages/federation-server/src/types.ts index 6f14925b..99265daf 100644 --- a/packages/federation-server/src/types.ts +++ b/packages/federation-server/src/types.ts @@ -23,12 +23,12 @@ export interface AuthRequest extends Request { accessToken?: string } -export type federationServerErrorCode = +export type federatedIdentityServiceErrorCode = (typeof MatrixErrors.errCodes)[keyof typeof MatrixErrors.errCodes] export interface ErrorResponseBody { error: string - errcode?: federationServerErrorCode + errcode?: federatedIdentityServiceErrorCode } export type middlewaresList = Array diff --git a/packages/matrix-identity-server/src/__testData__/registerConf.json b/packages/matrix-identity-server/src/__testData__/registerConf.json index a92646b6..da7c067f 100644 --- a/packages/matrix-identity-server/src/__testData__/registerConf.json +++ b/packages/matrix-identity-server/src/__testData__/registerConf.json @@ -3,7 +3,7 @@ "database_engine": "sqlite", "database_host": "./src/__testData__/test.db", "database_vacuum_delay": 7200, - "is_federation_server": false, + "is_federated_identity_service": false, "key_delay": 3600, "keys_depth": 5, "mail_link_delay": 7200, diff --git a/packages/matrix-identity-server/src/__testData__/termsConf.json b/packages/matrix-identity-server/src/__testData__/termsConf.json index bd6d688b..67b08b48 100644 --- a/packages/matrix-identity-server/src/__testData__/termsConf.json +++ b/packages/matrix-identity-server/src/__testData__/termsConf.json @@ -3,7 +3,7 @@ "database_engine": "sqlite", "database_host": "./src/__testData__/terms.db", "database_vacuum_delay": 7200, - "is_federation_server": false, + "is_federated_identity_service": false, "key_delay": 3600, "keys_depth": 5, "mail_link_delay": 7200, diff --git a/packages/matrix-identity-server/src/config.json b/packages/matrix-identity-server/src/config.json index 5bbb153a..015c75d4 100644 --- a/packages/matrix-identity-server/src/config.json +++ b/packages/matrix-identity-server/src/config.json @@ -10,9 +10,9 @@ "database_ssl": false, "database_user": "", "database_vacuum_delay": 3600, - "federation_servers": null, + "federated_identity_services": null, "hashes_rate_limit": 100, - "is_federation_server": false, + "is_federated_identity_service": false, "key_delay": 3600, "keys_depth": 5, "ldap_base": "", @@ -42,7 +42,7 @@ "smtp_server": "localhost", "smtp_port": 25, "trust_x_forwarded_for": false, - "update_federation_hashes_cron": "3 3 3 * * *", + "update_federated_identity_hashes_cron": "3 3 3 * * *", "update_users_cron": "*/10 * * * *", "userdb_engine": "sqlite", "userdb_host": "./tokens.db", diff --git a/packages/matrix-identity-server/src/cron/changePepper.ts b/packages/matrix-identity-server/src/cron/changePepper.ts index e7798f57..82ed86ef 100644 --- a/packages/matrix-identity-server/src/cron/changePepper.ts +++ b/packages/matrix-identity-server/src/cron/changePepper.ts @@ -35,9 +35,9 @@ export const filter = async ( matrixDb.close() /* istanbul ignore if */ if (entries == null || entries.length === 0) { - return (conf.federation_servers == null || - conf.federation_servers.length === 0) && - !conf.is_federation_server + return (conf.federated_identity_services == null || + conf.federated_identity_services.length === 0) && + !conf.is_federated_identity_service ? rows : [] } @@ -46,8 +46,9 @@ export const filter = async ( names.push((row.name as string).replace(/^@(.*?):(?:.*)$/, '$1')) }) if ( - (conf.federation_servers != null && conf.federation_servers.length > 0) || - conf.is_federation_server + (conf.federated_identity_services != null && + conf.federated_identity_services.length > 0) || + conf.is_federated_identity_service ) { rows = rows .filter((row) => names.includes(row.uid as string)) diff --git a/packages/matrix-identity-server/src/cron/index.test.ts b/packages/matrix-identity-server/src/cron/index.test.ts index e2d440fb..d6ec99cb 100644 --- a/packages/matrix-identity-server/src/cron/index.test.ts +++ b/packages/matrix-identity-server/src/cron/index.test.ts @@ -22,7 +22,7 @@ const conf: Config = { userdb_engine: 'sqlite', userdb_host: ':memory:', server_name: 'company.com', - federation_servers: ['federation.example.com'] + federated_identity_services: ['federated-identity.example.com'] } const logger: TwakeLogger = getLogger() diff --git a/packages/matrix-identity-server/src/cron/index.ts b/packages/matrix-identity-server/src/cron/index.ts index 8f8ac083..3390b321 100644 --- a/packages/matrix-identity-server/src/cron/index.ts +++ b/packages/matrix-identity-server/src/cron/index.ts @@ -9,7 +9,7 @@ import { type Config } from '../types' import type UserDB from '../userdb' import updateHashes from './changePepper' import checkQuota from './check-quota' -import updateFederationHashes from './update-federation-hashes' +import updateFederatedIdentityHashes from './update-federated-identity-hashes' import updateUsers from './updateUsers' class CronTasks { @@ -56,16 +56,16 @@ class CronTasks { ] if ( - conf.federation_servers != null && - conf.federation_servers.length > 0 + conf.federated_identity_services != null && + conf.federated_identity_services.length > 0 ) { logger.debug( - `Federation_servers set to [${conf.federation_servers.join( + `federated_identity_services set to [${conf.federated_identity_services.join( ', ' )}], add task` ) cronTasks.push( - this._addUpdateFederationServerHashesJob(conf, userDB, logger) + this._addUpdateFederatedIdentityHashesJob(conf, userDB, logger) ) } await Promise.all(cronTasks) @@ -192,19 +192,19 @@ class CronTasks { } /** - * Adds the federation server hashes job. + * Adds the federated identity service hashes job. * * @param {Config} conf - the config * @param {UserDB} userDB - the user db instance * @param {TwakeLogger} logger - the logger */ - private readonly _addUpdateFederationServerHashesJob = async ( + private readonly _addUpdateFederatedIdentityHashesJob = async ( conf: Config, userDB: UserDB, logger: TwakeLogger ): Promise => { const cronString: string = - conf.update_federation_hashes_cron ?? '3 3 3 * * *' + conf.update_federated_identity_hashes_cron ?? '3 3 3 * * *' if (!cron.validate(cronString)) { // istanbul ignore next @@ -214,8 +214,10 @@ class CronTasks { const task = cron.schedule( cronString, () => { - updateFederationHashes(conf, userDB, logger) - .then(() => logger.debug('Federation hashes update succeeded')) + updateFederatedIdentityHashes(conf, userDB, logger) + .then(() => + logger.debug('Federated identity hashes update succeeded') + ) .catch((e: Error) => { // istanbul ignore next logger.error(`${e.message}. Reason: ${e.cause as string}`) @@ -224,7 +226,7 @@ class CronTasks { this.options ) - logger.debug('Add task federationUpdates') + logger.debug('Add task federatedIdentityUpdates') this.tasks.push(task) } } diff --git a/packages/matrix-identity-server/src/cron/update-federation-hashes.test.ts b/packages/matrix-identity-server/src/cron/update-federation-hashes.test.ts index ac602053..e52ff537 100644 --- a/packages/matrix-identity-server/src/cron/update-federation-hashes.test.ts +++ b/packages/matrix-identity-server/src/cron/update-federation-hashes.test.ts @@ -6,7 +6,7 @@ import defaultConfig from '../config.json' import { type Config } from '../types' import UserDB from '../userdb' import { errCodes } from '../utils/errors' -import updateFederationHashes from './update-federation-hashes' +import updateFederatedIdentityHashes from './update-federated-identity-hashes' jest.mock('node-fetch', () => { return { @@ -27,10 +27,10 @@ const conf: Config = { userdb_engine: 'sqlite', userdb_host: './src/__testData__/hashes.db', server_name: 'company.com', - federation_servers: [ - 'federation1.example.com', - 'federation2.example.com', - 'federation3.example.com' + federated_identity_services: [ + 'federated-identity1.example.com', + 'federated-identity2.example.com', + 'federated-identity3.example.com' ] } @@ -125,7 +125,8 @@ type mockedRequest = | typeof errorOnParsingResponseBody const mockPromiseAllSettled = (mocks: mockedRequest[]): void => { - if (mocks.length < (conf.federation_servers as string[]).length) return + if (mocks.length < (conf.federated_identity_services as string[]).length) + return mocks.forEach((mock, index) => { if (mocks[index].state === 'resolved') { fetchMock.mockResolvedValueOnce(mock.value) @@ -182,8 +183,8 @@ afterAll(() => { logger.close() }) -describe('updateFederationHashes', () => { - it('should be able to calculate and push hashes to federation server', async () => { +describe('updateFederatedIdentityHashes', () => { + it('should be able to calculate and push hashes to federated identity service', async () => { const hash = new Hash() await hash.ready @@ -204,7 +205,7 @@ describe('updateFederationHashes', () => { mockRequests(mocks) - await updateFederationHashes(conf, userDB, logger) + await updateFederatedIdentityHashes(conf, userDB, logger) const getExpectedLookupsRequestBody = (pepper: string): RequestInit => ({ method: 'post', @@ -224,27 +225,37 @@ describe('updateFederationHashes', () => { expect(fetchMock).toHaveBeenCalledTimes(8) expect(fetchMock).toHaveBeenNthCalledWith( 4, - encodeURI(`https://federation1.example.com/_matrix/identity/v2/lookups`), + encodeURI( + `https://federated-identity1.example.com/_matrix/identity/v2/lookups` + ), getExpectedLookupsRequestBody(defaultPepper) ) expect(fetchMock).toHaveBeenNthCalledWith( 5, - encodeURI(`https://federation2.example.com/_matrix/identity/v2/lookups`), + encodeURI( + `https://federated-identity2.example.com/_matrix/identity/v2/lookups` + ), getExpectedLookupsRequestBody(defaultPepper) ) expect(fetchMock).toHaveBeenNthCalledWith( 6, - encodeURI(`https://federation3.example.com/_matrix/identity/v2/lookups`), + encodeURI( + `https://federated-identity3.example.com/_matrix/identity/v2/lookups` + ), getExpectedLookupsRequestBody(defaultPepper) ) expect(fetchMock).toHaveBeenNthCalledWith( 7, - encodeURI(`https://federation3.example.com/_matrix/identity/v2/lookups`), + encodeURI( + `https://federated-identity3.example.com/_matrix/identity/v2/lookups` + ), getExpectedLookupsRequestBody(altPeppers[0]) ) expect(fetchMock).toHaveBeenNthCalledWith( 8, - encodeURI(`https://federation3.example.com/_matrix/identity/v2/lookups`), + encodeURI( + `https://federated-identity3.example.com/_matrix/identity/v2/lookups` + ), getExpectedLookupsRequestBody(altPeppers[1]) ) }) @@ -258,10 +269,10 @@ describe('updateFederationHashes', () => { mockRequests(mocks) - await updateFederationHashes(conf, userDB, logger) + await updateFederatedIdentityHashes(conf, userDB, logger) expect(spyOnLoggerError).toHaveBeenCalledTimes(1) expect(spyOnLoggerError).toHaveBeenCalledWith( - `[Update federation server hashes] Request to get pepper and algorithms from federation server federation2.example.com failed. Reason: ${fetchFailed.value}` + `[Update federated identity service hashes] Request to get pepper and algorithms from federated identity service federated-identity2.example.com failed. Reason: ${fetchFailed.value}` ) expect(fetchMock).toHaveBeenCalledTimes(5) }) @@ -278,11 +289,11 @@ describe('updateFederationHashes', () => { mockRequests(mocks) - await updateFederationHashes(conf, userDB, logger) + await updateFederatedIdentityHashes(conf, userDB, logger) expect(spyOnLoggerError).toHaveBeenCalledTimes(1) expect(spyOnLoggerError).toHaveBeenCalledWith( new Error( - `[Update federation server hashes] Error on parsing response body of request to get pepper and algorithm from federation2.example.com. Reason: Error: Error on parsing response body` + `[Update federated identity service hashes] Error on parsing response body of request to get pepper and algorithm from federated-identity2.example.com. Reason: Error: Error on parsing response body` ) ) expect(fetchMock).toHaveBeenCalledTimes(5) @@ -296,13 +307,13 @@ describe('updateFederationHashes', () => { mockRequests(mocks) - await updateFederationHashes(conf, userDB, logger) + await updateFederatedIdentityHashes(conf, userDB, logger) expect(spyOnLoggerError).toHaveBeenCalledTimes(2) for (let i = 1; i <= 2; i++) { expect(spyOnLoggerError).toHaveBeenNthCalledWith( i, new Error( - `[Update federation server hashes] Error in response body of request to get pepper and algorithm from federation${i}.example.com. Reason: Unauthorized` + `[Update federated identity service hashes] Error in response body of request to get pepper and algorithm from federated-identity${i}.example.com. Reason: Unauthorized` ) ) } @@ -317,18 +328,18 @@ describe('updateFederationHashes', () => { mockRequests(mocks) - await updateFederationHashes(conf, userDB, logger) + await updateFederatedIdentityHashes(conf, userDB, logger) expect(spyOnLoggerError).toHaveBeenCalledTimes(2) expect(spyOnLoggerError).toHaveBeenNthCalledWith( 1, new Error( - '[Update federation server hashes] Error federation2.example.com did not provide algorithms' + '[Update federated identity service hashes] Error federated-identity2.example.com did not provide algorithms' ) ) expect(spyOnLoggerError).toHaveBeenNthCalledWith( 2, new Error( - `[Update federation server hashes] Error in response body of request to get pepper and algorithm from federation3.example.com. Reason: Unauthorized` + `[Update federated identity service hashes] Error in response body of request to get pepper and algorithm from federated-identity3.example.com. Reason: Unauthorized` ) ) expect(fetchMock).toHaveBeenCalledTimes(4) @@ -342,16 +353,16 @@ describe('updateFederationHashes', () => { mockRequests(mocks) - await updateFederationHashes(conf, userDB, logger) + await updateFederatedIdentityHashes(conf, userDB, logger) expect(spyOnLoggerError).toHaveBeenCalledTimes(2) expect(spyOnLoggerError).toHaveBeenNthCalledWith( 1, - `[Update federation server hashes] Request to get pepper and algorithms from federation server federation1.example.com failed. Reason: ${fetchFailed.value}` + `[Update federated identity service hashes] Request to get pepper and algorithms from federated identity service federated-identity1.example.com failed. Reason: ${fetchFailed.value}` ) expect(spyOnLoggerError).toHaveBeenNthCalledWith( 2, new Error( - '[Update federation server hashes] Error federation3.example.com did not provide lookup_pepper' + '[Update federated identity service hashes] Error federated-identity3.example.com did not provide lookup_pepper' ) ) expect(fetchMock).toHaveBeenCalledTimes(4) @@ -365,11 +376,11 @@ describe('updateFederationHashes', () => { mockRequests(mocks) - await updateFederationHashes(conf, userDB, logger) + await updateFederatedIdentityHashes(conf, userDB, logger) expect(fetchMock).toHaveBeenCalledTimes(6) expect(spyOnLoggerError).toHaveBeenCalledTimes(1) expect(spyOnLoggerError).toHaveBeenCalledWith( - `[Update federation server hashes] Request to post updated hashes on federation3.example.com failed. Reason: ${fetchFailed.value}` + `[Update federated identity service hashes] Request to post updated hashes on federated-identity3.example.com failed. Reason: ${fetchFailed.value}` ) }) @@ -381,11 +392,11 @@ describe('updateFederationHashes', () => { mockRequests(mocks) - await updateFederationHashes(conf, userDB, logger) + await updateFederatedIdentityHashes(conf, userDB, logger) expect(spyOnLoggerError).toHaveBeenCalledTimes(1) expect(spyOnLoggerError).toHaveBeenCalledWith( new Error( - `[Update federation server hashes] Error on parsing response body of request to push updated hashes to federation2.example.com. Reason: Error: Error on parsing response body` + `[Update federated identity service hashes] Error on parsing response body of request to push updated hashes to federated-identity2.example.com. Reason: Error: Error on parsing response body` ) ) expect(fetchMock).toHaveBeenCalledTimes(6) @@ -399,12 +410,12 @@ describe('updateFederationHashes', () => { mockRequests(mocks) - await updateFederationHashes(conf, userDB, logger) + await updateFederatedIdentityHashes(conf, userDB, logger) expect(fetchMock).toHaveBeenCalledTimes(6) expect(spyOnLoggerError).toHaveBeenCalledTimes(1) expect(spyOnLoggerError).toHaveBeenCalledWith( new Error( - `[Update federation server hashes] Error in response body of request to post updated hashes on federation2.example.com. Reason: Unauthorized` + `[Update federated identity service hashes] Error in response body of request to post updated hashes on federated-identity2.example.com. Reason: Unauthorized` ) ) }) diff --git a/packages/matrix-identity-server/src/cron/update-federation-hashes.ts b/packages/matrix-identity-server/src/cron/update-federation-hashes.ts index 035c7646..e2533bb1 100644 --- a/packages/matrix-identity-server/src/cron/update-federation-hashes.ts +++ b/packages/matrix-identity-server/src/cron/update-federation-hashes.ts @@ -23,7 +23,7 @@ interface LookupsDetail { updatedHashes: string[] } /** - * update federation server hashes cron job. + * update federated identity service hashes cron job. * * @param {MatrixIdentityServer} idServer - the matrix identity server instance. */ @@ -32,13 +32,13 @@ export default async ( userDB: UserDB, logger: TwakeLogger ): Promise => { - const prefixErrorMessage = '[Update federation server hashes]' + const prefixErrorMessage = '[Update federated identity service hashes]' - let federationServersAddresses = - typeof conf.federation_servers === 'object' - ? (conf.federation_servers as string[]) - : conf.federation_servers != null - ? (conf.federation_servers as string).split(/[,\s]+/) + let federatedIdentityServicesAddresses = + typeof conf.federated_identity_services === 'object' + ? (conf.federated_identity_services as string[]) + : conf.federated_identity_services != null + ? (conf.federated_identity_services as string).split(/[,\s]+/) : [] let serversIndexFail: number[] = [] @@ -46,7 +46,7 @@ export default async ( let responses = ( await Promise.allSettled( // eslint-disable-next-line @typescript-eslint/promise-function-async - federationServersAddresses.map((address) => + federatedIdentityServicesAddresses.map((address) => fetch(encodeURI(`https://${address}/_matrix/identity/v2/hash_details`)) ) ) @@ -55,7 +55,7 @@ export default async ( if (result.status === 'rejected') { logger.error( // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - `${prefixErrorMessage} Request to get pepper and algorithms from federation server ${federationServersAddresses[index]} failed. Reason: ${result.reason}` + `${prefixErrorMessage} Request to get pepper and algorithms from federated identity service ${federatedIdentityServicesAddresses[index]} failed. Reason: ${result.reason}` ) serversIndexFail.push(index) return false @@ -64,9 +64,10 @@ export default async ( }) .map((result) => (result as PromiseFulfilledResult).value) - federationServersAddresses = federationServersAddresses.filter( - (_address, index) => !serversIndexFail.includes(index) - ) + federatedIdentityServicesAddresses = + federatedIdentityServicesAddresses.filter( + (_address, index) => !serversIndexFail.includes(index) + ) serversIndexFail = [] const bodies = ( @@ -79,7 +80,7 @@ export default async ( if (curr.status === 'rejected') { throw new Error( // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - `${prefixErrorMessage} Error on parsing response body of request to get pepper and algorithm from ${federationServersAddresses[index]}. Reason: ${curr.reason}` + `${prefixErrorMessage} Error on parsing response body of request to get pepper and algorithm from ${federatedIdentityServicesAddresses[index]}. Reason: ${curr.reason}` ) } const body = curr.value as @@ -87,15 +88,15 @@ export default async ( | { error: string; errcode: string } if ('errcode' in body) { throw new Error( - `${prefixErrorMessage} Error in response body of request to get pepper and algorithm from ${federationServersAddresses[index]}. Reason: ${body.error}` + `${prefixErrorMessage} Error in response body of request to get pepper and algorithm from ${federatedIdentityServicesAddresses[index]}. Reason: ${body.error}` ) } else if (body.algorithms == null || body.algorithms.length < 1) { throw new Error( - `${prefixErrorMessage} Error ${federationServersAddresses[index]} did not provide algorithms` + `${prefixErrorMessage} Error ${federatedIdentityServicesAddresses[index]} did not provide algorithms` ) } else if (body.lookup_pepper == null) { throw new Error( - `${prefixErrorMessage} Error ${federationServersAddresses[index]} did not provide lookup_pepper` + `${prefixErrorMessage} Error ${federatedIdentityServicesAddresses[index]} did not provide lookup_pepper` ) } else { return [...acc, body] @@ -107,25 +108,27 @@ export default async ( } }, []) - federationServersAddresses = federationServersAddresses.filter( - (_address, index) => !serversIndexFail.includes(index) - ) + federatedIdentityServicesAddresses = + federatedIdentityServicesAddresses.filter( + (_address, index) => !serversIndexFail.includes(index) + ) - const federationServersDetail = federationServersAddresses.reduce< - Record - >( - (acc, curr, index) => ({ - ...acc, - [curr]: { - algorithm: bodies[index].algorithms[0], - peppers: [ - bodies[index].lookup_pepper, - ...(bodies[index].alt_lookup_peppers ?? []) - ] - } - }), - {} - ) + const federatedIdentityServicesDetail = + federatedIdentityServicesAddresses.reduce< + Record + >( + (acc, curr, index) => ({ + ...acc, + [curr]: { + algorithm: bodies[index].algorithms[0], + peppers: [ + bodies[index].lookup_pepper, + ...(bodies[index].alt_lookup_peppers ?? []) + ] + } + }), + {} + ) const isMatrixDbAvailable = Boolean(conf.matrix_database_host) && Boolean(conf.matrix_database_engine) @@ -174,17 +177,17 @@ export default async ( return result } - const lookupsRequestsDetails = federationServersAddresses.reduce< + const lookupsRequestsDetails = federatedIdentityServicesAddresses.reduce< LookupsDetail[] >( (acc, address) => [ ...acc, - ...federationServersDetail[address].peppers.map((pepper) => ({ + ...federatedIdentityServicesDetail[address].peppers.map((pepper) => ({ address, - algorithm: federationServersDetail[address].algorithm, + algorithm: federatedIdentityServicesDetail[address].algorithm, pepper, updatedHashes: getUsersHashes( - federationServersDetail[address].algorithm, + federatedIdentityServicesDetail[address].algorithm, pepper ) })) @@ -221,11 +224,13 @@ export default async ( if (result.status === 'rejected') { logger.error( // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - `${prefixErrorMessage} Request to post updated hashes on ${federationServersAddresses[index]} failed. Reason: ${result.reason}` + `${prefixErrorMessage} Request to post updated hashes on ${federatedIdentityServicesAddresses[index]} failed. Reason: ${result.reason}` ) return false } - logger.debug(`Hashes pushed to ${federationServersAddresses[index]}`) + logger.debug( + `Hashes pushed to ${federatedIdentityServicesAddresses[index]}` + ) return true }) .map((result) => (result as PromiseFulfilledResult).value) @@ -239,7 +244,7 @@ export default async ( if (result.status === 'rejected') { throw new Error( // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - `${prefixErrorMessage} Error on parsing response body of request to push updated hashes to ${federationServersAddresses[index]}. Reason: ${result.reason}` + `${prefixErrorMessage} Error on parsing response body of request to push updated hashes to ${federatedIdentityServicesAddresses[index]}. Reason: ${result.reason}` ) } const body = result.value as @@ -248,7 +253,7 @@ export default async ( if ('errcode' in body) { throw new Error( // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - `${prefixErrorMessage} Error in response body of request to post updated hashes on ${federationServersAddresses[index]}. Reason: ${body.error}` + `${prefixErrorMessage} Error in response body of request to post updated hashes on ${federatedIdentityServicesAddresses[index]}. Reason: ${body.error}` ) } } catch (e) { diff --git a/packages/matrix-identity-server/src/cron/updateUsers.ts b/packages/matrix-identity-server/src/cron/updateUsers.ts index 1cf848d8..e7ed2cac 100644 --- a/packages/matrix-identity-server/src/cron/updateUsers.ts +++ b/packages/matrix-identity-server/src/cron/updateUsers.ts @@ -1,9 +1,9 @@ import { type TwakeLogger } from '@twake/logger' -import MatrixDB from '../matrixDb' -import type UserDB from '../userdb' import type IdentityServerDb from '../db' import updateHash, { type UpdatableFields } from '../lookup/updateHash' +import MatrixDB from '../matrixDb' import { type Config, type DbGetResult } from '../types' +import type UserDB from '../userdb' import { epoch } from '../utils' /** @@ -30,9 +30,10 @@ const updateUsers = async ( ] const isMatrixDbAvailable: boolean = Boolean(conf.matrix_database_host) && Boolean(conf.matrix_database_engine) - const isFederationServerSet = - (conf.federation_servers != null && conf.federation_servers?.length > 0) || - conf.is_federation_server + const isFederatedIdentityServiceSet = + (conf.federated_identity_services != null && + conf.federated_identity_services?.length > 0) || + conf.is_federated_identity_service if (isMatrixDbAvailable) { promises.push( @@ -104,7 +105,7 @@ const updateUsers = async ( ? db.update('userHistory', data, 'address', matrixAddress) : db.insert('userHistory', data) ) - if (!isFederationServerSet || isMatrixUser) { + if (!isFederatedIdentityServiceSet || isMatrixUser) { usersToUpdate[matrixAddress] = { email: user.mail as string, phone: user.mobile as string, diff --git a/packages/matrix-identity-server/src/index.ts b/packages/matrix-identity-server/src/index.ts index 584f50fa..dd95602c 100644 --- a/packages/matrix-identity-server/src/index.ts +++ b/packages/matrix-identity-server/src/index.ts @@ -112,11 +112,11 @@ export default class MatrixIdentityServer { ? '/etc/twake/identity-server.conf' : undefined ) as Config - this.conf.federation_servers = - typeof this.conf.federation_servers === 'object' - ? this.conf.federation_servers - : typeof this.conf.federation_servers === 'string' - ? (this.conf.federation_servers as string) + this.conf.federated_identity_services = + typeof this.conf.federated_identity_services === 'object' + ? this.conf.federated_identity_services + : typeof this.conf.federated_identity_services === 'string' + ? (this.conf.federated_identity_services as string) .split(/[,\s]+/) .filter((addr) => addr.match(hostnameRe)) : [] diff --git a/packages/matrix-identity-server/src/types.ts b/packages/matrix-identity-server/src/types.ts index ad95ae2b..bbd3fde3 100644 --- a/packages/matrix-identity-server/src/types.ts +++ b/packages/matrix-identity-server/src/types.ts @@ -16,9 +16,9 @@ export interface Config { database_ssl?: boolean | ConnectionOptions | undefined database_user?: string database_vacuum_delay: number - federation_servers?: string[] | null + federated_identity_services?: string[] | null hashes_rate_limit?: number - is_federation_server: boolean + is_federated_identity_service: boolean key_delay: number keys_depth: number ldap_filter?: string @@ -49,7 +49,7 @@ export interface Config { smtp_user?: string smtp_verify_certificate?: boolean trust_x_forwarded_for?: boolean - update_federation_hashes_cron?: string + update_federated_identity_hashes_cron?: string update_users_cron?: string userdb_engine?: SupportedUserDatabases userdb_host?: string diff --git a/packages/tom-server/src/config.json b/packages/tom-server/src/config.json index f2074d8c..4937b204 100644 --- a/packages/tom-server/src/config.json +++ b/packages/tom-server/src/config.json @@ -10,9 +10,9 @@ "database_ssl": false, "database_user": "", "database_vacuum_delay": 3600, - "federation_servers": null, + "federated_identity_services": null, "hashes_rate_limit": 100, - "is_federation_server": false, + "is_federated_identity_service": false, "jitsiBaseUrl": "", "jitsiJwtAlgorithm": "HS256", "jitsiJwtIssuer": "", @@ -73,7 +73,7 @@ "smtp_sender": "", "smtp_server": "localhost", "smtp_port": 25, - "update_federation_hashes_cron": "*/10 * * * *", + "update_federated_identity_hashes_cron": "*/10 * * * *", "update_users_cron": "*/10 * * * *", "userdb_engine": "sqlite", "userdb_host": "./tokens.db", diff --git a/packages/tom-server/src/identity-server/__testData__/registerConf.json b/packages/tom-server/src/identity-server/__testData__/registerConf.json index e48a5c77..bb56a62a 100644 --- a/packages/tom-server/src/identity-server/__testData__/registerConf.json +++ b/packages/tom-server/src/identity-server/__testData__/registerConf.json @@ -5,7 +5,7 @@ "database_engine": "sqlite", "database_host": "./src/identity-server/__testData__/test.db", "database_vacuum_delay": 7200, - "is_federation_server": false, + "is_federated_identity_service": false, "jitsiBaseUrl": "https://jitsi.example.com/", "jitsiJwtAlgorithm": "HS256", "jitsiJwtIssuer": "", diff --git a/packages/tom-server/src/identity-server/__testData__/termsConf.json b/packages/tom-server/src/identity-server/__testData__/termsConf.json index 7bab7bb2..b17cc8ea 100644 --- a/packages/tom-server/src/identity-server/__testData__/termsConf.json +++ b/packages/tom-server/src/identity-server/__testData__/termsConf.json @@ -5,7 +5,7 @@ "database_engine": "sqlite", "database_host": "./src/identity-server/__testData__/terms.db", "database_vacuum_delay": 7200, - "is_federation_server": false, + "is_federated_identity_service": false, "jitsiBaseUrl": "", "jitsiJwtAlgorithm": "HS256", "jitsiJwtIssuer": "", diff --git a/packages/tom-server/src/identity-server/index.test.ts b/packages/tom-server/src/identity-server/index.test.ts index 3b8ef1d4..4a7c876c 100644 --- a/packages/tom-server/src/identity-server/index.test.ts +++ b/packages/tom-server/src/identity-server/index.test.ts @@ -41,7 +41,7 @@ process.env.TWAKE_IDENTITY_SERVER_CONF = path.join( let twakeServer: TwakeServer let app: express.Application // eslint-disable-next-line @typescript-eslint/no-unused-vars -let federationToken: string +let federatedIdentityToken: string beforeAll((done) => { const conf: Config = { @@ -437,7 +437,7 @@ describe('/_matrix/identity/v2/account/register', () => { .set('Accept', 'application/json') expect(response.statusCode).toBe(200) expect(response.body.token).toMatch(/^[a-zA-Z0-9]{64}$/) - federationToken = response.body.token + federatedIdentityToken = response.body.token }) }) @@ -445,12 +445,12 @@ describe('/_matrix/identity/v2/account', () => { it('should logout (/_matrix/identity/v2/account/logout)', async () => { let response = await request(app) .post('/_matrix/identity/v2/account/logout') - .set('Authorization', `Bearer ${federationToken}`) + .set('Authorization', `Bearer ${federatedIdentityToken}`) .set('Accept', 'application/json') expect(response.statusCode).toBe(200) response = await request(app) .get('/_matrix/identity/v2/account') - .set('Authorization', `Bearer ${federationToken}`) + .set('Authorization', `Bearer ${federatedIdentityToken}`) .set('Accept', 'application/json') expect(response.statusCode).toBe(401) }) diff --git a/packages/tom-server/src/identity-server/with-cache.test.ts b/packages/tom-server/src/identity-server/with-cache.test.ts index 0da47846..2741f82a 100644 --- a/packages/tom-server/src/identity-server/with-cache.test.ts +++ b/packages/tom-server/src/identity-server/with-cache.test.ts @@ -37,7 +37,7 @@ process.env.TWAKE_IDENTITY_SERVER_CONF = path.join( let twakeServer: TwakeServer let app: express.Application // eslint-disable-next-line @typescript-eslint/no-unused-vars -let federationToken: string +let federatedIdentityToken: string beforeAll((done) => { const conf: Config = { @@ -275,7 +275,7 @@ describe('/_matrix/identity/v2/account/register', () => { .set('Accept', 'application/json') expect(response.statusCode).toBe(200) expect(response.body.token).toMatch(/^[a-zA-Z0-9]{64}$/) - federationToken = response.body.token + federatedIdentityToken = response.body.token }) }) @@ -283,12 +283,12 @@ describe('/_matrix/identity/v2/account', () => { it('should logout (/_matrix/identity/v2/account/logout)', async () => { let response = await request(app) .post('/_matrix/identity/v2/account/logout') - .set('Authorization', `Bearer ${federationToken}`) + .set('Authorization', `Bearer ${federatedIdentityToken}`) .set('Accept', 'application/json') expect(response.statusCode).toBe(200) response = await request(app) .get('/_matrix/identity/v2/account') - .set('Authorization', `Bearer ${federationToken}`) + .set('Authorization', `Bearer ${federatedIdentityToken}`) .set('Accept', 'application/json') expect(response.statusCode).toBe(401) }) diff --git a/packages/tom-server/src/wellKnown/index.ts b/packages/tom-server/src/wellKnown/index.ts index 9b749af9..f5563e44 100644 --- a/packages/tom-server/src/wellKnown/index.ts +++ b/packages/tom-server/src/wellKnown/index.ts @@ -25,15 +25,15 @@ * base_url: * type: string * description: Base URL of Identity server - * m.federation_servers: + * m.federated_identity_services: * type: object * properties: * base_urls: * type: array * items: * type: string - * description: Base URL of Federation server - * description: Available Federation servers Base URL list + * description: Base URL of Federated identity service + * description: Available Federated identity services Base URL list * t.server: * type: object * properties: @@ -81,8 +81,8 @@ * base_url: matrix.example.com * m.identity_server: * base_url: global-id-server.twake.app - * m.federation_servers: - * base_urls: ["global-federation-server.twake.app", "other-federation-server.twake.app"] + * m.federated_identity_services: + * base_urls: ["global-federated_identity_service.twake.app", "other-federated-identity-service.twake.app"] * m.integrations: * jitsi: * baseUrl: https://jitsi.example.com/ @@ -108,7 +108,7 @@ interface WellKnownType { 'org.matrix.msc3575.proxy': { url: string } - 'm.federation_servers'?: { + 'm.federated_identity_services'?: { base_urls: string[] } 't.server'?: { @@ -164,18 +164,18 @@ class WellKnown { } } } - conf.federation_servers = - typeof conf.federation_servers === 'object' - ? conf.federation_servers - : typeof conf.federation_servers === 'string' - ? (conf.federation_servers as string).split(/[,\s]+/) + conf.federated_identity_services = + typeof conf.federated_identity_services === 'object' + ? conf.federated_identity_services + : typeof conf.federated_identity_services === 'string' + ? (conf.federated_identity_services as string).split(/[,\s]+/) : [] if ( - conf.federation_servers != null && - conf.federation_servers.length > 0 + conf.federated_identity_services != null && + conf.federated_identity_services.length > 0 ) { - wellKnown['m.federation_servers'] = { - base_urls: conf.federation_servers.map( + wellKnown['m.federated_identity_services'] = { + base_urls: conf.federated_identity_services.map( (address) => `https://${address}/` ) } diff --git a/server.mjs b/server.mjs index 4165394c..9d765ac3 100644 --- a/server.mjs +++ b/server.mjs @@ -28,11 +28,11 @@ let conf = { ? JSON.parse(process.env.DATABASE_SSL) : false, database_password: process.env.DATABASE_PASSWORD, - federation_servers: process.env.FEDERATION_SERVERS - ? process.env.FEDERATION_SERVERS.split(/[,\s]+/) + federated_identity_services: process.env.FEDERATED_IDENTITY_SERVICES + ? process.env.FEDERATED_IDENTITY_SERVICES.split(/[,\s]+/) : [], hashes_rate_limit: process.env.HASHES_RATE_LIMIT, - is_federation_server: false, + is_federated_identity_service: false, jitsiBaseUrl: process.env.JITSI_BASE_URL, jitsiJwtAlgorithm: process.env.JITSI_JWT_ALGORITHM, jitsiJwtIssuer: process.env.JITSI_JWT_ISSUER, @@ -73,8 +73,8 @@ let conf = { template_dir: process.env.TEMPLATE_DIR || path.join(__dirname, 'node_modules', '@twake', 'server', 'templates'), - update_federation_hashes_cron: - process.env.UDPATE_FEDERATION_HASHES_CRON || '*/10 * * * *', + update_federated_identity_hashes_cron: + process.env.UPDATE_FEDERATED_IDENTITY_HASHES_CRON || '*/10 * * * *', update_users_cron: process.env.UPDATE_USERS_CRON || '*/10 * * * *', userdb_engine: 'ldap', sms_api_key: process.env.SMS_API_KEY, From 2550d093fca2105ab7a87487a99756018400f147 Mon Sep 17 00:00:00 2001 From: Jordy CABANNES Date: Thu, 6 Jun 2024 17:32:11 +0200 Subject: [PATCH 2/6] fix: rename files and folders This closes #38 --- .../Dockerfile | 0 .../README.md | 0 .../example/federated-identity-service.ts} | 0 .../jest.config.js | 0 .../jest.globals.ts | 0 .../package.json | 0 .../rollup.config.js | 0 .../server.mjs | 0 .../src/__testData__/build-userdb.ts | 2 +- .../src/__testData__/config.json | 0 .../src/__testData__/db/init-id-db.sh | 0 .../src/__testData__/db/init-llng-db.sh | 0 .../src/__testData__/db/init-synapse-db.sh | 9 + .../src/__testData__/docker-compose.yml | 0 .../federated-identity-service.conf | 25 + .../generate-self-signed-certificate.sh | 0 .../__testData__/identity-server/Dockerfile | 0 .../conf/identity-server-1.conf | 0 .../conf/identity-server-2.conf | 0 .../conf/identity-server-3.conf | 0 .../__testData__/identity-server/server.mjs | 0 .../src/__testData__/ldap/Dockerfile | 0 .../ldap/ldif/base_ldap_users.ldif | 2 +- .../ldap/ldif/config-20230322180123.ldif | 0 .../src/__testData__/llng/lmConf-1.json | 0 .../src/__testData__/llng/ssl.conf | 0 .../src/__testData__/nginx/ssl/9da13359.0 | 0 .../nginx/ssl/auth.example.com.crt | 0 .../nginx/ssl/auth.example.com.key | 0 .../src/__testData__/nginx/ssl/ca.key | 0 .../src/__testData__/nginx/ssl/ca.pem | 0 .../ssl/federated-identity.example.com.crt | 0 .../ssl/federated-identity.example.com.key | 0 .../nginx/ssl/identity1.example.com.crt | 0 .../nginx/ssl/identity1.example.com.key | 0 .../nginx/ssl/identity2.example.com.crt | 0 .../nginx/ssl/identity2.example.com.key | 0 .../nginx/ssl/identity3.example.com.crt | 0 .../nginx/ssl/identity3.example.com.key | 0 .../nginx/ssl/matrix.example.com.crt | 0 .../nginx/ssl/matrix.example.com.key | 0 .../nginx/ssl/matrix1.example.com.crt | 0 .../nginx/ssl/matrix1.example.com.key | 0 .../nginx/ssl/matrix2.example.com.crt | 0 .../nginx/ssl/matrix2.example.com.key | 0 .../nginx/ssl/matrix3.example.com.crt | 0 .../nginx/ssl/matrix3.example.com.key | 0 .../homeserver-federated-identity.yaml | 60 + .../synapse-data/homeserver1.yaml | 0 .../synapse-data/homeserver2.yaml | 0 .../synapse-data/homeserver3.yaml | 0 .../matrix.example.com.log.config | 0 .../src/config.json | 0 .../src/controllers/controllers.ts | 0 .../src/db/index.ts | 0 .../src/index.test.ts | 2376 +++++++++++++++++ .../src/index.ts | 0 .../src/middlewares/auth.ts | 0 .../src/middlewares/errors.ts | 0 .../src/middlewares/utils.ts | 0 .../src/middlewares/validation.ts | 0 .../src/routes/routes.ts | 0 .../src/types.ts | 0 .../src/utils/ip-address.ts | 0 .../templates/mailVerification.tpl | 0 .../tsconfig.json | 0 ... update-federated-identity-hashes.test.ts} | 0 ...ts => update-federated-identity-hashes.ts} | 0 68 files changed, 2472 insertions(+), 2 deletions(-) rename packages/{federation-server => federated-identity-service}/Dockerfile (100%) rename packages/{federation-server => federated-identity-service}/README.md (100%) rename packages/{federation-server/example/federation-server.ts => federated-identity-service/example/federated-identity-service.ts} (100%) rename packages/{federation-server => federated-identity-service}/jest.config.js (100%) rename packages/{federation-server => federated-identity-service}/jest.globals.ts (100%) rename packages/{federation-server => federated-identity-service}/package.json (100%) rename packages/{federation-server => federated-identity-service}/rollup.config.js (100%) rename packages/{federation-server => federated-identity-service}/server.mjs (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/build-userdb.ts (97%) rename packages/{federation-server => federated-identity-service}/src/__testData__/config.json (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/db/init-id-db.sh (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/db/init-llng-db.sh (100%) create mode 100644 packages/federated-identity-service/src/__testData__/db/init-synapse-db.sh rename packages/{federation-server => federated-identity-service}/src/__testData__/docker-compose.yml (100%) create mode 100644 packages/federated-identity-service/src/__testData__/federated-identity-service/federated-identity-service.conf rename packages/{federation-server => federated-identity-service}/src/__testData__/generate-self-signed-certificate.sh (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/identity-server/Dockerfile (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/identity-server/conf/identity-server-1.conf (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/identity-server/conf/identity-server-2.conf (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/identity-server/conf/identity-server-3.conf (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/identity-server/server.mjs (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/ldap/Dockerfile (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/ldap/ldif/base_ldap_users.ldif (99%) rename packages/{federation-server => federated-identity-service}/src/__testData__/ldap/ldif/config-20230322180123.ldif (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/llng/lmConf-1.json (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/llng/ssl.conf (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/9da13359.0 (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/auth.example.com.crt (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/auth.example.com.key (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/ca.key (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/ca.pem (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/federated-identity.example.com.crt (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/federated-identity.example.com.key (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/identity1.example.com.crt (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/identity1.example.com.key (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/identity2.example.com.crt (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/identity2.example.com.key (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/identity3.example.com.crt (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/identity3.example.com.key (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/matrix.example.com.crt (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/matrix.example.com.key (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/matrix1.example.com.crt (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/matrix1.example.com.key (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/matrix2.example.com.crt (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/matrix2.example.com.key (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/matrix3.example.com.crt (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/nginx/ssl/matrix3.example.com.key (100%) create mode 100644 packages/federated-identity-service/src/__testData__/synapse-data/homeserver-federated-identity.yaml rename packages/{federation-server => federated-identity-service}/src/__testData__/synapse-data/homeserver1.yaml (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/synapse-data/homeserver2.yaml (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/synapse-data/homeserver3.yaml (100%) rename packages/{federation-server => federated-identity-service}/src/__testData__/synapse-data/matrix.example.com.log.config (100%) rename packages/{federation-server => federated-identity-service}/src/config.json (100%) rename packages/{federation-server => federated-identity-service}/src/controllers/controllers.ts (100%) rename packages/{federation-server => federated-identity-service}/src/db/index.ts (100%) create mode 100644 packages/federated-identity-service/src/index.test.ts rename packages/{federation-server => federated-identity-service}/src/index.ts (100%) rename packages/{federation-server => federated-identity-service}/src/middlewares/auth.ts (100%) rename packages/{federation-server => federated-identity-service}/src/middlewares/errors.ts (100%) rename packages/{federation-server => federated-identity-service}/src/middlewares/utils.ts (100%) rename packages/{federation-server => federated-identity-service}/src/middlewares/validation.ts (100%) rename packages/{federation-server => federated-identity-service}/src/routes/routes.ts (100%) rename packages/{federation-server => federated-identity-service}/src/types.ts (100%) rename packages/{federation-server => federated-identity-service}/src/utils/ip-address.ts (100%) rename packages/{federation-server => federated-identity-service}/templates/mailVerification.tpl (100%) rename packages/{federation-server => federated-identity-service}/tsconfig.json (100%) rename packages/matrix-identity-server/src/cron/{update-federation-hashes.test.ts => update-federated-identity-hashes.test.ts} (100%) rename packages/matrix-identity-server/src/cron/{update-federation-hashes.ts => update-federated-identity-hashes.ts} (100%) diff --git a/packages/federation-server/Dockerfile b/packages/federated-identity-service/Dockerfile similarity index 100% rename from packages/federation-server/Dockerfile rename to packages/federated-identity-service/Dockerfile diff --git a/packages/federation-server/README.md b/packages/federated-identity-service/README.md similarity index 100% rename from packages/federation-server/README.md rename to packages/federated-identity-service/README.md diff --git a/packages/federation-server/example/federation-server.ts b/packages/federated-identity-service/example/federated-identity-service.ts similarity index 100% rename from packages/federation-server/example/federation-server.ts rename to packages/federated-identity-service/example/federated-identity-service.ts diff --git a/packages/federation-server/jest.config.js b/packages/federated-identity-service/jest.config.js similarity index 100% rename from packages/federation-server/jest.config.js rename to packages/federated-identity-service/jest.config.js diff --git a/packages/federation-server/jest.globals.ts b/packages/federated-identity-service/jest.globals.ts similarity index 100% rename from packages/federation-server/jest.globals.ts rename to packages/federated-identity-service/jest.globals.ts diff --git a/packages/federation-server/package.json b/packages/federated-identity-service/package.json similarity index 100% rename from packages/federation-server/package.json rename to packages/federated-identity-service/package.json diff --git a/packages/federation-server/rollup.config.js b/packages/federated-identity-service/rollup.config.js similarity index 100% rename from packages/federation-server/rollup.config.js rename to packages/federated-identity-service/rollup.config.js diff --git a/packages/federation-server/server.mjs b/packages/federated-identity-service/server.mjs similarity index 100% rename from packages/federation-server/server.mjs rename to packages/federated-identity-service/server.mjs diff --git a/packages/federation-server/src/__testData__/build-userdb.ts b/packages/federated-identity-service/src/__testData__/build-userdb.ts similarity index 97% rename from packages/federation-server/src/__testData__/build-userdb.ts rename to packages/federated-identity-service/src/__testData__/build-userdb.ts index e94d2792..2620c30d 100644 --- a/packages/federation-server/src/__testData__/build-userdb.ts +++ b/packages/federated-identity-service/src/__testData__/build-userdb.ts @@ -14,7 +14,7 @@ interface UserDBSQLite { const logger: TwakeLogger = getLogger() const createUsersTable = 'CREATE TABLE users (uid varchar(32), cn varchar(32), sn varchar(32), mail varchar(32), mobile varchar(12))' -const insertLskywalker = "INSERT INTO users VALUES('lskywalker', 'Luc Skywalker', 'Lskywalker', 'lskywalker@example.com', '')" +const insertLskywalker = "INSERT INTO users VALUES('lskywalker', 'Luke Skywalker', 'Lskywalker', 'lskywalker@example.com', '')" const insertOkenobi = "INSERT INTO users VALUES('okenobi', 'Obi-Wan Kenobi', 'Okenobi', 'okenobi@example.com', '')" const insertAskywalker = "INSERT INTO users VALUES('askywalker', 'Anakin Skywalker', 'Askywalker', 'askywalker@example.com', '')" const insertQjinn = "INSERT INTO users VALUES('qjinn', 'Qgonjinn', 'Qjinn', 'qjinn@example.com', '')" diff --git a/packages/federation-server/src/__testData__/config.json b/packages/federated-identity-service/src/__testData__/config.json similarity index 100% rename from packages/federation-server/src/__testData__/config.json rename to packages/federated-identity-service/src/__testData__/config.json diff --git a/packages/federation-server/src/__testData__/db/init-id-db.sh b/packages/federated-identity-service/src/__testData__/db/init-id-db.sh similarity index 100% rename from packages/federation-server/src/__testData__/db/init-id-db.sh rename to packages/federated-identity-service/src/__testData__/db/init-id-db.sh diff --git a/packages/federation-server/src/__testData__/db/init-llng-db.sh b/packages/federated-identity-service/src/__testData__/db/init-llng-db.sh similarity index 100% rename from packages/federation-server/src/__testData__/db/init-llng-db.sh rename to packages/federated-identity-service/src/__testData__/db/init-llng-db.sh diff --git a/packages/federated-identity-service/src/__testData__/db/init-synapse-db.sh b/packages/federated-identity-service/src/__testData__/db/init-synapse-db.sh new file mode 100644 index 00000000..453261cd --- /dev/null +++ b/packages/federated-identity-service/src/__testData__/db/init-synapse-db.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +psql -U postgres <<-EOSQL + CREATE USER synapse PASSWORD 'synapse!1'; + CREATE DATABASE synapsefederatedidentity TEMPLATE='template0' LOCALE='C' ENCODING='UTF8' OWNER='synapse'; + CREATE DATABASE synapse1 TEMPLATE='template0' LOCALE='C' ENCODING='UTF8' OWNER='synapse'; + CREATE DATABASE synapse2 TEMPLATE='template0' LOCALE='C' ENCODING='UTF8' OWNER='synapse'; + CREATE DATABASE synapse3 TEMPLATE='template0' LOCALE='C' ENCODING='UTF8' OWNER='synapse'; +EOSQL \ No newline at end of file diff --git a/packages/federation-server/src/__testData__/docker-compose.yml b/packages/federated-identity-service/src/__testData__/docker-compose.yml similarity index 100% rename from packages/federation-server/src/__testData__/docker-compose.yml rename to packages/federated-identity-service/src/__testData__/docker-compose.yml diff --git a/packages/federated-identity-service/src/__testData__/federated-identity-service/federated-identity-service.conf b/packages/federated-identity-service/src/__testData__/federated-identity-service/federated-identity-service.conf new file mode 100644 index 00000000..26907e32 --- /dev/null +++ b/packages/federated-identity-service/src/__testData__/federated-identity-service/federated-identity-service.conf @@ -0,0 +1,25 @@ +{ + "additional_features": true, + "cron_service": true, + "base_url": "https://federated-identity.example.com/", + "database_engine": "pg", + "database_host": "postgresql", + "database_name": "federatedidentity", + "database_user": "twake", + "database_password": "twake!1", + "is_federated_identity_service": true, + "ldap_base": "dc=example,dc=com", + "ldap_uri": "ldap://annuaire", + "matrix_database_engine": "pg", + "matrix_database_host": "postgresql", + "matrix_database_name": "synapsefederatedidentity", + "matrix_database_password": "synapse!1", + "matrix_database_user": "synapse", + "pepperCron": "*/60 * * * * *", + "server_name": "example.com", + "template_dir": "/usr/src/app/node_modules/@twake/matrix-identity-server/templates", + "update_users_cron": "*/5 * * * * *", + "userdb_engine": "ldap", + "trust_x_forwarded_for": true, + "trusted_servers_addresses": [] +} \ No newline at end of file diff --git a/packages/federation-server/src/__testData__/generate-self-signed-certificate.sh b/packages/federated-identity-service/src/__testData__/generate-self-signed-certificate.sh similarity index 100% rename from packages/federation-server/src/__testData__/generate-self-signed-certificate.sh rename to packages/federated-identity-service/src/__testData__/generate-self-signed-certificate.sh diff --git a/packages/federation-server/src/__testData__/identity-server/Dockerfile b/packages/federated-identity-service/src/__testData__/identity-server/Dockerfile similarity index 100% rename from packages/federation-server/src/__testData__/identity-server/Dockerfile rename to packages/federated-identity-service/src/__testData__/identity-server/Dockerfile diff --git a/packages/federation-server/src/__testData__/identity-server/conf/identity-server-1.conf b/packages/federated-identity-service/src/__testData__/identity-server/conf/identity-server-1.conf similarity index 100% rename from packages/federation-server/src/__testData__/identity-server/conf/identity-server-1.conf rename to packages/federated-identity-service/src/__testData__/identity-server/conf/identity-server-1.conf diff --git a/packages/federation-server/src/__testData__/identity-server/conf/identity-server-2.conf b/packages/federated-identity-service/src/__testData__/identity-server/conf/identity-server-2.conf similarity index 100% rename from packages/federation-server/src/__testData__/identity-server/conf/identity-server-2.conf rename to packages/federated-identity-service/src/__testData__/identity-server/conf/identity-server-2.conf diff --git a/packages/federation-server/src/__testData__/identity-server/conf/identity-server-3.conf b/packages/federated-identity-service/src/__testData__/identity-server/conf/identity-server-3.conf similarity index 100% rename from packages/federation-server/src/__testData__/identity-server/conf/identity-server-3.conf rename to packages/federated-identity-service/src/__testData__/identity-server/conf/identity-server-3.conf diff --git a/packages/federation-server/src/__testData__/identity-server/server.mjs b/packages/federated-identity-service/src/__testData__/identity-server/server.mjs similarity index 100% rename from packages/federation-server/src/__testData__/identity-server/server.mjs rename to packages/federated-identity-service/src/__testData__/identity-server/server.mjs diff --git a/packages/federation-server/src/__testData__/ldap/Dockerfile b/packages/federated-identity-service/src/__testData__/ldap/Dockerfile similarity index 100% rename from packages/federation-server/src/__testData__/ldap/Dockerfile rename to packages/federated-identity-service/src/__testData__/ldap/Dockerfile diff --git a/packages/federation-server/src/__testData__/ldap/ldif/base_ldap_users.ldif b/packages/federated-identity-service/src/__testData__/ldap/ldif/base_ldap_users.ldif similarity index 99% rename from packages/federation-server/src/__testData__/ldap/ldif/base_ldap_users.ldif rename to packages/federated-identity-service/src/__testData__/ldap/ldif/base_ldap_users.ldif index 04025bd6..eb4e7f3f 100644 --- a/packages/federation-server/src/__testData__/ldap/ldif/base_ldap_users.ldif +++ b/packages/federated-identity-service/src/__testData__/ldap/ldif/base_ldap_users.ldif @@ -135,7 +135,7 @@ userPassword: jfett dn: uid=lskywalker,ou=users,dc=example,dc=com objectClass: inetOrgPerson uid: lskywalker -cn: Luc Skywalker +cn: Luke Skywalker sn: Lskywalker mail: lskywalker@example.com userPassword: lskywalker diff --git a/packages/federation-server/src/__testData__/ldap/ldif/config-20230322180123.ldif b/packages/federated-identity-service/src/__testData__/ldap/ldif/config-20230322180123.ldif similarity index 100% rename from packages/federation-server/src/__testData__/ldap/ldif/config-20230322180123.ldif rename to packages/federated-identity-service/src/__testData__/ldap/ldif/config-20230322180123.ldif diff --git a/packages/federation-server/src/__testData__/llng/lmConf-1.json b/packages/federated-identity-service/src/__testData__/llng/lmConf-1.json similarity index 100% rename from packages/federation-server/src/__testData__/llng/lmConf-1.json rename to packages/federated-identity-service/src/__testData__/llng/lmConf-1.json diff --git a/packages/federation-server/src/__testData__/llng/ssl.conf b/packages/federated-identity-service/src/__testData__/llng/ssl.conf similarity index 100% rename from packages/federation-server/src/__testData__/llng/ssl.conf rename to packages/federated-identity-service/src/__testData__/llng/ssl.conf diff --git a/packages/federation-server/src/__testData__/nginx/ssl/9da13359.0 b/packages/federated-identity-service/src/__testData__/nginx/ssl/9da13359.0 similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/9da13359.0 rename to packages/federated-identity-service/src/__testData__/nginx/ssl/9da13359.0 diff --git a/packages/federation-server/src/__testData__/nginx/ssl/auth.example.com.crt b/packages/federated-identity-service/src/__testData__/nginx/ssl/auth.example.com.crt similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/auth.example.com.crt rename to packages/federated-identity-service/src/__testData__/nginx/ssl/auth.example.com.crt diff --git a/packages/federation-server/src/__testData__/nginx/ssl/auth.example.com.key b/packages/federated-identity-service/src/__testData__/nginx/ssl/auth.example.com.key similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/auth.example.com.key rename to packages/federated-identity-service/src/__testData__/nginx/ssl/auth.example.com.key diff --git a/packages/federation-server/src/__testData__/nginx/ssl/ca.key b/packages/federated-identity-service/src/__testData__/nginx/ssl/ca.key similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/ca.key rename to packages/federated-identity-service/src/__testData__/nginx/ssl/ca.key diff --git a/packages/federation-server/src/__testData__/nginx/ssl/ca.pem b/packages/federated-identity-service/src/__testData__/nginx/ssl/ca.pem similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/ca.pem rename to packages/federated-identity-service/src/__testData__/nginx/ssl/ca.pem diff --git a/packages/federation-server/src/__testData__/nginx/ssl/federated-identity.example.com.crt b/packages/federated-identity-service/src/__testData__/nginx/ssl/federated-identity.example.com.crt similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/federated-identity.example.com.crt rename to packages/federated-identity-service/src/__testData__/nginx/ssl/federated-identity.example.com.crt diff --git a/packages/federation-server/src/__testData__/nginx/ssl/federated-identity.example.com.key b/packages/federated-identity-service/src/__testData__/nginx/ssl/federated-identity.example.com.key similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/federated-identity.example.com.key rename to packages/federated-identity-service/src/__testData__/nginx/ssl/federated-identity.example.com.key diff --git a/packages/federation-server/src/__testData__/nginx/ssl/identity1.example.com.crt b/packages/federated-identity-service/src/__testData__/nginx/ssl/identity1.example.com.crt similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/identity1.example.com.crt rename to packages/federated-identity-service/src/__testData__/nginx/ssl/identity1.example.com.crt diff --git a/packages/federation-server/src/__testData__/nginx/ssl/identity1.example.com.key b/packages/federated-identity-service/src/__testData__/nginx/ssl/identity1.example.com.key similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/identity1.example.com.key rename to packages/federated-identity-service/src/__testData__/nginx/ssl/identity1.example.com.key diff --git a/packages/federation-server/src/__testData__/nginx/ssl/identity2.example.com.crt b/packages/federated-identity-service/src/__testData__/nginx/ssl/identity2.example.com.crt similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/identity2.example.com.crt rename to packages/federated-identity-service/src/__testData__/nginx/ssl/identity2.example.com.crt diff --git a/packages/federation-server/src/__testData__/nginx/ssl/identity2.example.com.key b/packages/federated-identity-service/src/__testData__/nginx/ssl/identity2.example.com.key similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/identity2.example.com.key rename to packages/federated-identity-service/src/__testData__/nginx/ssl/identity2.example.com.key diff --git a/packages/federation-server/src/__testData__/nginx/ssl/identity3.example.com.crt b/packages/federated-identity-service/src/__testData__/nginx/ssl/identity3.example.com.crt similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/identity3.example.com.crt rename to packages/federated-identity-service/src/__testData__/nginx/ssl/identity3.example.com.crt diff --git a/packages/federation-server/src/__testData__/nginx/ssl/identity3.example.com.key b/packages/federated-identity-service/src/__testData__/nginx/ssl/identity3.example.com.key similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/identity3.example.com.key rename to packages/federated-identity-service/src/__testData__/nginx/ssl/identity3.example.com.key diff --git a/packages/federation-server/src/__testData__/nginx/ssl/matrix.example.com.crt b/packages/federated-identity-service/src/__testData__/nginx/ssl/matrix.example.com.crt similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/matrix.example.com.crt rename to packages/federated-identity-service/src/__testData__/nginx/ssl/matrix.example.com.crt diff --git a/packages/federation-server/src/__testData__/nginx/ssl/matrix.example.com.key b/packages/federated-identity-service/src/__testData__/nginx/ssl/matrix.example.com.key similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/matrix.example.com.key rename to packages/federated-identity-service/src/__testData__/nginx/ssl/matrix.example.com.key diff --git a/packages/federation-server/src/__testData__/nginx/ssl/matrix1.example.com.crt b/packages/federated-identity-service/src/__testData__/nginx/ssl/matrix1.example.com.crt similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/matrix1.example.com.crt rename to packages/federated-identity-service/src/__testData__/nginx/ssl/matrix1.example.com.crt diff --git a/packages/federation-server/src/__testData__/nginx/ssl/matrix1.example.com.key b/packages/federated-identity-service/src/__testData__/nginx/ssl/matrix1.example.com.key similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/matrix1.example.com.key rename to packages/federated-identity-service/src/__testData__/nginx/ssl/matrix1.example.com.key diff --git a/packages/federation-server/src/__testData__/nginx/ssl/matrix2.example.com.crt b/packages/federated-identity-service/src/__testData__/nginx/ssl/matrix2.example.com.crt similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/matrix2.example.com.crt rename to packages/federated-identity-service/src/__testData__/nginx/ssl/matrix2.example.com.crt diff --git a/packages/federation-server/src/__testData__/nginx/ssl/matrix2.example.com.key b/packages/federated-identity-service/src/__testData__/nginx/ssl/matrix2.example.com.key similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/matrix2.example.com.key rename to packages/federated-identity-service/src/__testData__/nginx/ssl/matrix2.example.com.key diff --git a/packages/federation-server/src/__testData__/nginx/ssl/matrix3.example.com.crt b/packages/federated-identity-service/src/__testData__/nginx/ssl/matrix3.example.com.crt similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/matrix3.example.com.crt rename to packages/federated-identity-service/src/__testData__/nginx/ssl/matrix3.example.com.crt diff --git a/packages/federation-server/src/__testData__/nginx/ssl/matrix3.example.com.key b/packages/federated-identity-service/src/__testData__/nginx/ssl/matrix3.example.com.key similarity index 100% rename from packages/federation-server/src/__testData__/nginx/ssl/matrix3.example.com.key rename to packages/federated-identity-service/src/__testData__/nginx/ssl/matrix3.example.com.key diff --git a/packages/federated-identity-service/src/__testData__/synapse-data/homeserver-federated-identity.yaml b/packages/federated-identity-service/src/__testData__/synapse-data/homeserver-federated-identity.yaml new file mode 100644 index 00000000..9ad173c8 --- /dev/null +++ b/packages/federated-identity-service/src/__testData__/synapse-data/homeserver-federated-identity.yaml @@ -0,0 +1,60 @@ +# Configuration file for Synapse. +# +# This is a YAML file: see [1] for a quick introduction. Note in particular +# that *indentation is important*: all the elements of a list or dictionary +# should have the same indentation. +# +# [1] https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html +# +# For more information on how to configure Synapse, including a complete accounting of +# each option, go to docs/usage/configuration/config_documentation.md or +# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html +server_name: "example.com" +public_baseurl: "https://matrix.example.com/" +pid_file: /data/homeserver-federated-identity.pid +listeners: + - port: 8008 + tls: false + type: http + x_forwarded: true + resources: + - names: [client, federation] + compress: false +database: + name: psycopg2 + args: + user: synapse + password: 'synapse!1' + database: synapsefederatedidentity + host: postgresql + cp_min: 2 + cp_max: 4 + keepalives_idle: 10 + keepalives_interval: 10 + keepalives_count: 3 +log_config: "/data/matrix.example.com.log.config" +media_store_path: /data/media_store_federated_identity +registration_shared_secret: "u+Q^i6&*Y9azZ*~pID^.a=qrvd+mUIBX9SAreEPGJ=xzP&c+Sk" +report_stats: false +macaroon_secret_key: "=0ws-1~ztzXm&xh+As;7YL5.-U~r-T,F4zR3mW#E;6Y::Rb7&G" +form_secret: "&YFO.XSc*2^2ZsW#hmoR+t:wf03~u#fin#O.R&erFcl9_mEayv" +signing_key_path: "/data/matrix.example.com.signing.key" +trusted_key_servers: + - server_name: "matrix.org" + accept_keys_insecurely: true +accept_keys_insecurely: true +oidc_config: + idp_id: lemonldap + idp_name: lemonldap + enabled: true + issuer: "https://auth.example.com/" + client_id: "matrix0" + client_secret: "matrix0*" + scopes: ["openid", "profile"] + discover: true + user_profile_method: "userinfo_endpoint" + user_mapping_provider: + config: + subject_claim: "sub" + localpart_template: "{{ user.preferred_username }}" + display_name_template: "{{ user.name }}" \ No newline at end of file diff --git a/packages/federation-server/src/__testData__/synapse-data/homeserver1.yaml b/packages/federated-identity-service/src/__testData__/synapse-data/homeserver1.yaml similarity index 100% rename from packages/federation-server/src/__testData__/synapse-data/homeserver1.yaml rename to packages/federated-identity-service/src/__testData__/synapse-data/homeserver1.yaml diff --git a/packages/federation-server/src/__testData__/synapse-data/homeserver2.yaml b/packages/federated-identity-service/src/__testData__/synapse-data/homeserver2.yaml similarity index 100% rename from packages/federation-server/src/__testData__/synapse-data/homeserver2.yaml rename to packages/federated-identity-service/src/__testData__/synapse-data/homeserver2.yaml diff --git a/packages/federation-server/src/__testData__/synapse-data/homeserver3.yaml b/packages/federated-identity-service/src/__testData__/synapse-data/homeserver3.yaml similarity index 100% rename from packages/federation-server/src/__testData__/synapse-data/homeserver3.yaml rename to packages/federated-identity-service/src/__testData__/synapse-data/homeserver3.yaml diff --git a/packages/federation-server/src/__testData__/synapse-data/matrix.example.com.log.config b/packages/federated-identity-service/src/__testData__/synapse-data/matrix.example.com.log.config similarity index 100% rename from packages/federation-server/src/__testData__/synapse-data/matrix.example.com.log.config rename to packages/federated-identity-service/src/__testData__/synapse-data/matrix.example.com.log.config diff --git a/packages/federation-server/src/config.json b/packages/federated-identity-service/src/config.json similarity index 100% rename from packages/federation-server/src/config.json rename to packages/federated-identity-service/src/config.json diff --git a/packages/federation-server/src/controllers/controllers.ts b/packages/federated-identity-service/src/controllers/controllers.ts similarity index 100% rename from packages/federation-server/src/controllers/controllers.ts rename to packages/federated-identity-service/src/controllers/controllers.ts diff --git a/packages/federation-server/src/db/index.ts b/packages/federated-identity-service/src/db/index.ts similarity index 100% rename from packages/federation-server/src/db/index.ts rename to packages/federated-identity-service/src/db/index.ts diff --git a/packages/federated-identity-service/src/index.test.ts b/packages/federated-identity-service/src/index.test.ts new file mode 100644 index 00000000..f7bf3c27 --- /dev/null +++ b/packages/federated-identity-service/src/index.test.ts @@ -0,0 +1,2376 @@ +import { Hash } from '@twake/crypto' +import express from 'express' +import fs from 'fs' +import type * as http from 'http' +import * as fetch from 'node-fetch' +import { execFileSync } from 'node:child_process' +import { createServer } from 'node:https' +import os from 'os' +import path from 'path' +import request, { type Response } from 'supertest' +import { + DockerComposeEnvironment, + Wait, + type StartedDockerComposeEnvironment, + type StartedTestContainer +} from 'testcontainers' +import FederatedIdentityService from '.' +import JEST_PROCESS_ROOT_PATH from '../jest.globals' +import { buildMatrixDb, buildUserDB } from './__testData__/build-userdb' +import defaultConfig from './__testData__/config.json' +import { hashByServer } from './db' +import { type Config } from './types' + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const syswideCas = require('@small-tech/syswide-cas') + +const pathToTestDataFolder = path.join( + JEST_PROCESS_ROOT_PATH, + 'src', + '__testData__' +) +const pathToSynapseDataFolder = path.join(pathToTestDataFolder, 'synapse-data') + +const authToken = + 'authTokenddddddddddddddddddddddddddddddddddddddddddddddddddddddd' + +jest.unmock('node-fetch') + +interface IHashDetails { + algorithms: ['sha256'] + lookup_pepper: string + alt_lookup_peppers?: string[] +} + +describe('Federated identity service', () => { + const hash = new Hash() + + beforeAll((done) => { + hash.ready + .then(() => { + done() + }) + .catch((e) => { + done(e) + }) + }) + + describe('Integration tests', () => { + let startedCompose: StartedDockerComposeEnvironment + let identity1IPAddress: string + let identity2IPAddress: string + let tokens: { matrixToken: string; federatedIdentityToken: string } + let hashDetails: IHashDetails + let allPeppers: string[] + + const simulationConnection = async ( + username: string, + password: string, + matrixServer: string, + federatedIdentityService?: string + ): Promise< + { matrixToken: string; federatedIdentityToken?: string } | undefined + > => { + let response = await fetch.default( + encodeURI( + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + `https://${matrixServer}/_matrix/client/v3/login` + ) + ) + let body = (await response.json()) as any + const providerId = body.flows[0].identity_providers[0].id + response = await fetch.default( + encodeURI( + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + `https://${matrixServer}/_matrix/client/r0/login/sso/redirect/${providerId}?redirectUrl=http://localhost:9876` + ), + { + redirect: 'manual' + } + ) + let location = response.headers.get('location') as string + const matrixCookies = response.headers.get('set-cookie') + response = await fetch.default(location) + body = await response.text() + const hiddenInputFieldsWithValue = [ + ...(body as string).matchAll(/ `${matchElt[1]}=${matchElt[2]}&`) + .join('') + const formWithToken = `${hiddenInputFieldsWithValue}user=${username}&password=${password}` + response = await fetch.default(location, { + method: 'POST', + body: new URLSearchParams(formWithToken), + redirect: 'manual' + }) + location = response.headers.get('location') as string + response = await fetch.default(location, { + headers: { + cookie: matrixCookies as string + } + }) + body = await response.text() + const loginTokenValue = [ + ...(body as string).matchAll(/loginToken=(\S+?)"/g) + ][0][1] + response = await fetch.default( + encodeURI(`https://${matrixServer}/_matrix/client/v3/login`), + { + method: 'POST', + body: JSON.stringify({ + initial_device_display_name: 'Jest Test Client', + token: loginTokenValue, + type: 'm.login.token' + }) + } + ) + body = (await response.json()) as any + const matrixToken = body.access_token as string + if (federatedIdentityService != null) { + const userId = body.user_id as string + response = await fetch.default( + encodeURI( + `https://${matrixServer}/_matrix/client/v3/user/${userId}/openid/request_token` + ), + { + method: 'POST', + headers: { + Authorization: `Bearer ${matrixToken}` + }, + body: JSON.stringify({}) + } + ) + body = await response.json() + response = await fetch.default( + encodeURI( + `https://${federatedIdentityService}/_matrix/identity/v2/account/register` + ), + { + method: 'POST', + body: JSON.stringify({ + ...body, + matrix_server_name: `${matrixServer}:443` + }) + } + ) + body = await response.json() + } + return { + matrixToken, + federatedIdentityToken: + federatedIdentityService != null ? body.token : null + } + } + + const getAllPeppers = (hashDetails: IHashDetails): string[] => [ + hashDetails.lookup_pepper, + ...(hashDetails.alt_lookup_peppers ?? []) + ] + + beforeAll((done) => { + syswideCas.addCAs( + path.join(pathToTestDataFolder, 'nginx', 'ssl', 'ca.pem') + ) + + new DockerComposeEnvironment( + path.join(pathToTestDataFolder), + 'docker-compose.yml' + ) + .withEnvironment({ MYUID: os.userInfo().uid.toString() }) + .withWaitStrategy('postgresql', Wait.forHealthCheck()) + .withWaitStrategy( + 'synapse-federated-identity-service', + Wait.forHealthCheck() + ) + .withWaitStrategy('synapse-1', Wait.forHealthCheck()) + .withWaitStrategy('synapse-2', Wait.forHealthCheck()) + .withWaitStrategy('synapse-3', Wait.forHealthCheck()) + .up() + // eslint-disable-next-line @typescript-eslint/promise-function-async + .then((upResult) => { + startedCompose = upResult + done() + }) + .catch((e) => { + done(e) + }) + }) + + afterAll((done) => { + const filesToDelete: string[] = [ + path.join(pathToSynapseDataFolder, 'matrix.example.com.signing.key'), + path.join(pathToSynapseDataFolder, 'matrix1.example.com.signing.key'), + path.join(pathToSynapseDataFolder, 'matrix2.example.com.signing.key'), + path.join(pathToSynapseDataFolder, 'matrix3.example.com.signing.key'), + path.join(pathToSynapseDataFolder, 'homeserver.log'), + path.join(pathToSynapseDataFolder, 'media_store1'), + path.join(pathToSynapseDataFolder, 'media_store2'), + path.join(pathToSynapseDataFolder, 'media_store3'), + path.join(pathToSynapseDataFolder, 'media_store_federated_identity') + ] + filesToDelete.forEach((path: string) => { + if (fs.existsSync(path)) { + const isDir = fs.statSync(path).isDirectory() + isDir ? fs.rmdirSync(path) : fs.unlinkSync(path) + } + }) + if (startedCompose != null) { + startedCompose + .down() + .then(() => { + done() + }) + .catch((e) => { + done(e) + }) + } else { + done() + } + }) + + describe('Federated identity service in docker container', () => { + let federatedIdentityServiceContainer: StartedTestContainer + const federatedIdentityServiceHostname = 'federated-identity.example.com' + const pathToFederatedIdentityServiceConf = path.join( + pathToTestDataFolder, + 'federated-identity-service', + 'federated-identity-service.conf' + ) + let confOriginalContent: string + + const getHashDetails = async (): Promise => { + const response = await fetch.default( + encodeURI( + `https://${federatedIdentityServiceHostname}/_matrix/identity/v2/hash_details` + ), + { + headers: { + Authorization: `Bearer ${tokens.federatedIdentityToken}` + } + } + ) + return (await response.json()) as IHashDetails + } + + beforeAll((done) => { + identity1IPAddress = startedCompose + .getContainer(`identity-server-1`) + .getIpAddress('test') + identity2IPAddress = startedCompose + .getContainer(`identity-server-2`) + .getIpAddress('test') + + confOriginalContent = fs.readFileSync( + pathToFederatedIdentityServiceConf, + 'utf-8' + ) + + fs.writeFileSync( + pathToFederatedIdentityServiceConf, + confOriginalContent.replace( + /"trusted_servers_addresses": \[\]/g, + `"trusted_servers_addresses": ["${identity1IPAddress}", "${identity2IPAddress}"]` + ), + 'utf-8' + ) + + federatedIdentityServiceContainer = startedCompose.getContainer( + 'federated-identity-service' + ) + + federatedIdentityServiceContainer + .restart() + // eslint-disable-next-line @typescript-eslint/promise-function-async + .then(() => { + return simulationConnection( + 'askywalker', + 'askywalker', + 'matrix1.example.com', + federatedIdentityServiceHostname + ) + }) + // eslint-disable-next-line @typescript-eslint/promise-function-async + .then((askywalkerTokens) => { + tokens = askywalkerTokens as { + matrixToken: string + federatedIdentityToken: string + } + return Promise.all([ + simulationConnection( + 'lskywalker', + 'lskywalker', + 'matrix2.example.com' + ), + simulationConnection('okenobi', 'okenobi', 'matrix3.example.com') + ]) + }) + // eslint-disable-next-line @typescript-eslint/promise-function-async + .then(() => { + // wait for identity servers to push hashes to federated identity service + return new Promise((resolve) => setTimeout(resolve, 8000)) + }) + .then(() => { + done() + }) + .catch((e) => { + done(e) + }) + }) + + afterAll((done) => { + fs.writeFileSync( + pathToFederatedIdentityServiceConf, + confOriginalContent, + 'utf-8' + ) + if (federatedIdentityServiceContainer != null) { + federatedIdentityServiceContainer + .stop() + .then(() => { + done() + }) + .catch((e) => { + done(e) + }) + } else { + done() + } + }) + + it('should get server DNS in which searched users is registered', async () => { + hashDetails = await getHashDetails() + allPeppers = getAllPeppers(hashDetails) + const lskywalkerHashes = allPeppers.map((pepper) => + hash.sha256(`lskywalker@example.com email ${pepper}`) + ) + const hosts = new Set() + for (let i = 0; i < allPeppers.length; i++) { + const response = await fetch.default( + encodeURI( + `https://${federatedIdentityServiceHostname}/_matrix/identity/v2/lookup` + ), + { + method: 'post', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${tokens.federatedIdentityToken}` + }, + body: JSON.stringify({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [lskywalkerHashes[i]] + }) + } + ) + /* + Body example: + { + mappings: {}, + inactive_mappings: {}, + third_party_mappings: { + 'identity2.example.com:443': ['gxkUW11GNrH5YASQhG_I7ijwdUBoMpqqSCc_OtbpOm0'] + } + } + } + */ + const body = (await response.json()) as Record< + string, + Record + > + expect(body).toHaveProperty('mappings', {}) + expect(body).toHaveProperty('inactive_mappings', {}) + expect(body).toHaveProperty('third_party_mappings') + Object.keys(body.third_party_mappings).forEach((host) => + hosts.add(host) + ) + } + expect(hosts.size).toEqual(1) + expect(hosts.has('identity2.example.com:443')).toEqual(true) + }) + + it('should get user of federated identity service environment on lookup', async () => { + await simulationConnection( + 'chewbacca', + 'chewbacca', + 'matrix.example.com' + ) + await new Promise((resolve) => setTimeout(resolve, 8000)) + hashDetails = await getHashDetails() + allPeppers = getAllPeppers(hashDetails) + const chewbaccaHashes = allPeppers.map((pepper) => + hash.sha256(`chewbacca@example.com email ${pepper}`) + ) + + const matrixAddresses = new Set() + for (let i = 0; i < allPeppers.length; i++) { + const response = await fetch.default( + encodeURI( + `https://${federatedIdentityServiceHostname}/_matrix/identity/v2/lookup` + ), + { + method: 'post', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${tokens.federatedIdentityToken}` + }, + body: JSON.stringify({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [chewbaccaHashes[i]] + }) + } + ) + const body = (await response.json()) as Record< + string, + Record + > + expect(body).toHaveProperty('inactive_mappings', {}) + expect(body).toHaveProperty('third_party_mappings', {}) + expect(body).toHaveProperty('mappings') + Object.values(body.mappings as Record).forEach( + (address) => matrixAddresses.add(address) + ) + } + expect(matrixAddresses.size).toEqual(1) + expect(matrixAddresses.has('@chewbacca:example.com')).toEqual(true) + }) + + it('should find all servers on which a third party user is connected on lookup', async () => { + await simulationConnection( + 'lskywalker', + 'lskywalker', + 'matrix1.example.com' + ) + await new Promise((resolve) => setTimeout(resolve, 8000)) + hashDetails = await getHashDetails() + allPeppers = getAllPeppers(hashDetails) + const lskywalkerHashes = allPeppers.map((pepper) => + hash.sha256(`lskywalker@example.com email ${pepper}`) + ) + const hosts = new Set() + for (let i = 0; i < allPeppers.length; i++) { + const response = await fetch.default( + encodeURI( + `https://${federatedIdentityServiceHostname}/_matrix/identity/v2/lookup` + ), + { + method: 'post', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${tokens.federatedIdentityToken}` + }, + body: JSON.stringify({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [lskywalkerHashes[i]] + }) + } + ) + const body = (await response.json()) as Record< + string, + Record + > + expect(body).toHaveProperty('mappings', {}) + expect(body).toHaveProperty('inactive_mappings', {}) + expect(body).toHaveProperty('third_party_mappings') + Object.keys(body.third_party_mappings).forEach((host) => + hosts.add(host) + ) + } + expect(hosts.size).toEqual(2) + expect(hosts.has('identity1.example.com:443')).toEqual(true) + expect(hosts.has('identity2.example.com:443')).toEqual(true) + }) + + it('should find all federated identity service users and servers address of third party users on lookup', async () => { + hashDetails = await getHashDetails() + allPeppers = getAllPeppers(hashDetails) + const lskywalkerHashes = allPeppers.map((pepper) => + hash.sha256(`lskywalker@example.com email ${pepper}`) + ) + const chewbaccaHashes = allPeppers.map((pepper) => + hash.sha256(`chewbacca@example.com email ${pepper}`) + ) + const qjinnHashes = allPeppers.map((pepper) => + hash.sha256(`qjinn@example.com email ${pepper}`) + ) + const okenobiHashes = allPeppers.map((pepper) => + hash.sha256(`okenobi@example.com email ${pepper}`) + ) + const askywalkerHashes = allPeppers.map((pepper) => + hash.sha256(`askywalker@example.com email ${pepper}`) + ) + const matrixAddresses = new Set() + const askywalkerHosts = new Set() + const lskywalkerHosts = new Set() + + for (let i = 0; i < allPeppers.length; i++) { + const response = await fetch.default( + encodeURI( + `https://${federatedIdentityServiceHostname}/_matrix/identity/v2/lookup` + ), + { + method: 'post', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${tokens.federatedIdentityToken}` + }, + body: JSON.stringify({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [ + lskywalkerHashes[i], + qjinnHashes[i], + chewbaccaHashes[i], + okenobiHashes[i], + askywalkerHashes[i] + ] + }) + } + ) + const body = (await response.json()) as Record< + string, + Record + > + expect(body).toHaveProperty('inactive_mappings', {}) + expect(body).toHaveProperty('mappings') + Object.values(body.mappings as Record).forEach( + (address) => matrixAddresses.add(address) + ) + expect(body).toHaveProperty('third_party_mappings') + Object.keys(body.third_party_mappings).forEach((host) => { + ;(body.third_party_mappings[host] as string[]).forEach((hash) => { + switch (hash) { + case lskywalkerHashes[i]: + lskywalkerHosts.add(host) + break + case askywalkerHashes[i]: + askywalkerHosts.add(host) + break + default: + break + } + }) + }) + } + expect(askywalkerHosts.size).toEqual(1) + expect(askywalkerHosts.has('identity1.example.com:443')).toEqual(true) + expect(lskywalkerHosts.size).toEqual(2) + expect(lskywalkerHosts.has('identity1.example.com:443')).toEqual(true) + expect(lskywalkerHosts.has('identity2.example.com:443')).toEqual(true) + expect(matrixAddresses.size).toEqual(1) + expect(matrixAddresses.has('@chewbacca:example.com')).toEqual(true) + }) + + it('should not find user from not trusted identity server on lookup', async () => { + hashDetails = await getHashDetails() + allPeppers = getAllPeppers(hashDetails) + const okenobiHashes = allPeppers.map((pepper) => + hash.sha256(`okenobi@example.com email ${pepper}`) + ) + for (let i = 0; i < allPeppers.length; i++) { + const response = await fetch.default( + encodeURI( + `https://${federatedIdentityServiceHostname}/_matrix/identity/v2/lookup` + ), + { + method: 'post', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${tokens.federatedIdentityToken}` + }, + body: JSON.stringify({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [okenobiHashes[i]] + }) + } + ) + const body = (await response.json()) as Record< + string, + Record + > + expect(body).toHaveProperty('inactive_mappings', {}) + expect(body).toHaveProperty('third_party_mappings', {}) + expect(body).toHaveProperty('mappings', {}) + } + }) + + it('should not find user not connected on any matrix server on lookup', async () => { + hashDetails = await getHashDetails() + allPeppers = getAllPeppers(hashDetails) + const qjinnHashes = allPeppers.map((pepper) => + hash.sha256(`qjinn@example.com email ${pepper}`) + ) + for (let i = 0; i < allPeppers.length; i++) { + const response = await fetch.default( + encodeURI( + `https://${federatedIdentityServiceHostname}/_matrix/identity/v2/lookup` + ), + { + method: 'post', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${tokens.federatedIdentityToken}` + }, + body: JSON.stringify({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [qjinnHashes[i]] + }) + } + ) + const body = (await response.json()) as Record< + string, + Record + > + expect(body).toHaveProperty('inactive_mappings', {}) + expect(body).toHaveProperty('third_party_mappings', {}) + expect(body).toHaveProperty('mappings', {}) + } + }) + }) + + describe('Federated Identity Service as express app', () => { + let federatedIdentityService: FederatedIdentityService + let app: express.Application + let expressFederatedIdentityService: http.Server + const pathToIdentityServerConf = path.join( + pathToTestDataFolder, + 'identity-server', + 'conf' + ) + const pathToNginxSsl = path.join(pathToTestDataFolder, 'nginx', 'ssl') + let federatedIdentityServiceCrtFilePath: string + let federatedIdentityServiceKeyFilePath: string + + const originalContents: string[] = [] + const interfaces = os.networkInterfaces() + const hostNetworkInterface = Object.keys(interfaces) + .reduce((acc, key) => { + return interfaces[key] != null + ? [...acc, ...(interfaces[key] as os.NetworkInterfaceInfo[])] + : acc + }, []) + .find( + (networkInterface) => + networkInterface.family === 'IPv4' && !networkInterface.internal + ) as os.NetworkInterfaceInfo + + const getHashDetails = async (): Promise => { + const response = await request(app) + .get('/_matrix/identity/v2/hash_details') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${tokens.federatedIdentityToken}`) + + return response.body as IHashDetails + } + + beforeAll((done) => { + execFileSync( + path.join( + pathToTestDataFolder, + 'generate-self-signed-certificate.sh' + ), + ['-ip', hostNetworkInterface.address] + ) + + for (let i = 1; i <= 3; i++) { + const confFilePath = path.join( + pathToIdentityServerConf, + `identity-server-${i}.conf` + ) + const content = fs.readFileSync(confFilePath, 'utf-8') + originalContents.push(content) + const newContent = content.replace( + /federated-identity\.example\.com/g, + `${hostNetworkInterface.address}:3000` + ) + fs.writeFileSync(confFilePath, newContent, 'utf-8') + } + + federatedIdentityServiceCrtFilePath = path.join( + pathToNginxSsl, + `${hostNetworkInterface.address}.crt` + ) + federatedIdentityServiceKeyFilePath = path.join( + pathToNginxSsl, + `${hostNetworkInterface.address}.key` + ) + + const waitForFilesExist = async ( + filesPath: string[], + currentTime = 0, + timeout = 5000 + ): Promise => { + if (filesPath.every((path) => fs.existsSync(path))) return true + if (currentTime === timeout) return false + await new Promise((resolve, reject) => + setTimeout(() => { + resolve() + }, 1000) + ) + return await waitForFilesExist(filesPath, currentTime + 1000, timeout) + } + + waitForFilesExist([ + federatedIdentityServiceCrtFilePath, + federatedIdentityServiceKeyFilePath + ]) + // eslint-disable-next-line @typescript-eslint/promise-function-async + .then((areFilesCreated) => { + if (!areFilesCreated) + throw new Error( + 'Certificates files for federated identity service has not been created' + ) + return Promise.all([ + startedCompose.getContainer('identity-server-1').restart(), + startedCompose.getContainer('identity-server-2').restart(), + startedCompose.getContainer('identity-server-3').restart() + ]) + }) + // eslint-disable-next-line @typescript-eslint/promise-function-async + .then(() => { + identity1IPAddress = startedCompose + .getContainer(`identity-server-1`) + .getIpAddress('test') + + identity2IPAddress = startedCompose + .getContainer(`identity-server-2`) + .getIpAddress('test') + + const testConfig: Config = { + ...(defaultConfig as Config), + additional_features: true, + cron_service: true, + base_url: `https://${hostNetworkInterface.address}:3000`, + database_engine: 'pg', + database_user: 'twake', + database_password: 'twake!1', + database_host: `${startedCompose + .getContainer(`postgresql`) + .getHost()}:5432`, + database_name: 'federatedidentity', + ldap_base: 'dc=example,dc=com', + ldap_uri: `ldap://${startedCompose + .getContainer(`postgresql`) + .getHost()}:389`, + matrix_database_engine: 'pg', + matrix_database_host: `${startedCompose + .getContainer(`postgresql`) + .getHost()}:5432`, + matrix_database_name: 'synapsefederatedidentity', + matrix_database_user: 'synapse', + matrix_database_password: 'synapse!1', + pepperCron: '*/2 * * * *', + server_name: 'example.com', + template_dir: path.join( + JEST_PROCESS_ROOT_PATH, + '..', + 'matrix-identity-server', + 'templates' + ), + trust_x_forwarded_for: true, + trusted_servers_addresses: [ + identity1IPAddress, + identity2IPAddress + ], + update_users_cron: '*/5 * * * * *', + userdb_engine: 'ldap' + } + federatedIdentityService = new FederatedIdentityService(testConfig) + app = express() + return federatedIdentityService.ready + }) + // eslint-disable-next-line @typescript-eslint/promise-function-async + .then(() => { + app.use(federatedIdentityService.routes) + const key = fs.readFileSync(federatedIdentityServiceKeyFilePath) + const cert = fs.readFileSync(federatedIdentityServiceCrtFilePath) + expressFederatedIdentityService = createServer({ key, cert }, app) + return new Promise((resolve, _reject) => { + expressFederatedIdentityService.listen(3000, () => { + resolve() + }) + }) + }) + // eslint-disable-next-line @typescript-eslint/promise-function-async + .then(() => { + // wait for identity servers to push hashes to federated identity service + return new Promise((resolve) => setTimeout(resolve, 8000)) + }) + .then(() => { + done() + }) + .catch((e) => { + done(e) + }) + }) + + afterAll((done) => { + for (let i = 1; i <= 3; i++) { + fs.writeFileSync( + path.join(pathToIdentityServerConf, `identity-server-${i}.conf`), + originalContents[i - 1], + 'utf-8' + ) + } + const filesToDelete = [ + federatedIdentityServiceCrtFilePath, + federatedIdentityServiceKeyFilePath + ] + filesToDelete.forEach((path: string) => { + if (fs.existsSync(path)) fs.unlinkSync(path) + }) + if (federatedIdentityService != null) + federatedIdentityService.cleanJobs() + if (expressFederatedIdentityService != null) { + expressFederatedIdentityService.close((e) => { + if (e != null) { + done(e) + } + done() + }) + } else { + done() + } + }) + + it('should find all servers on which a third party user is connected on lookup', async () => { + hashDetails = await getHashDetails() + allPeppers = getAllPeppers(hashDetails) + const lskywalkerHashes = allPeppers.map((pepper) => + hash.sha256(`lskywalker@example.com email ${pepper}`) + ) + const hosts = new Set() + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${tokens.federatedIdentityToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [lskywalkerHashes[i]] + }) + expect(response.body).toHaveProperty('mappings', {}) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('third_party_mappings') + Object.keys(response.body.third_party_mappings).forEach((host) => + hosts.add(host) + ) + } + expect(hosts.size).toEqual(2) + expect(hosts.has('identity1.example.com:443')).toEqual(true) + expect(hosts.has('identity2.example.com:443')).toEqual(true) + }) + + it('should get user of federated identity service environment on lookup', async () => { + hashDetails = await getHashDetails() + allPeppers = getAllPeppers(hashDetails) + const chewbaccaHashes = allPeppers.map((pepper) => + hash.sha256(`chewbacca@example.com email ${pepper}`) + ) + + const matrixAddresses = new Set() + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${tokens.federatedIdentityToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [chewbaccaHashes[i]] + }) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('third_party_mappings', {}) + expect(response.body).toHaveProperty('mappings') + Object.values( + response.body.mappings as Record + ).forEach((address) => matrixAddresses.add(address)) + } + expect(matrixAddresses.size).toEqual(1) + expect(matrixAddresses.has('@chewbacca:example.com')).toEqual(true) + }) + + it('should not find user from not trusted identity server on lookup', async () => { + hashDetails = await getHashDetails() + allPeppers = getAllPeppers(hashDetails) + const okenobiHashes = allPeppers.map((pepper) => + hash.sha256(`okenobi@example.com email ${pepper}`) + ) + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${tokens.federatedIdentityToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [okenobiHashes[i]] + }) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('third_party_mappings', {}) + expect(response.body).toHaveProperty('mappings', {}) + } + }) + + it('should not find user not connected on any matrix server on lookup', async () => { + hashDetails = await getHashDetails() + allPeppers = getAllPeppers(hashDetails) + const qjinnHashes = allPeppers.map((pepper) => + hash.sha256(`qjinn@example.com email ${pepper}`) + ) + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${tokens.federatedIdentityToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [qjinnHashes[i]] + }) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('third_party_mappings', {}) + expect(response.body).toHaveProperty('mappings', {}) + } + }) + + it('should find all federated identity service and servers address of third party users on lookup', async () => { + hashDetails = await getHashDetails() + allPeppers = getAllPeppers(hashDetails) + const lskywalkerHashes = allPeppers.map((pepper) => + hash.sha256(`lskywalker@example.com email ${pepper}`) + ) + const chewbaccaHashes = allPeppers.map((pepper) => + hash.sha256(`chewbacca@example.com email ${pepper}`) + ) + const qjinnHashes = allPeppers.map((pepper) => + hash.sha256(`qjinn@example.com email ${pepper}`) + ) + const okenobiHashes = allPeppers.map((pepper) => + hash.sha256(`okenobi@example.com email ${pepper}`) + ) + const askywalkerHashes = allPeppers.map((pepper) => + hash.sha256(`askywalker@example.com email ${pepper}`) + ) + + const matrixAddresses = new Set() + const askywalkerHosts = new Set() + const lskywalkerHosts = new Set() + + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${tokens.federatedIdentityToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [ + lskywalkerHashes[i], + qjinnHashes[i], + chewbaccaHashes[i], + okenobiHashes[i], + askywalkerHashes[i] + ] + }) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('mappings') + Object.values( + response.body.mappings as Record + ).forEach((address) => matrixAddresses.add(address)) + expect(response.body).toHaveProperty('third_party_mappings') + Object.keys(response.body.third_party_mappings).forEach((host) => { + ;(response.body.third_party_mappings[host] as string[]).forEach( + (hash) => { + switch (hash) { + case lskywalkerHashes[i]: + lskywalkerHosts.add(host) + break + case askywalkerHashes[i]: + askywalkerHosts.add(host) + break + default: + break + } + } + ) + }) + } + expect(askywalkerHosts.size).toEqual(1) + expect(askywalkerHosts.has('identity1.example.com:443')).toEqual(true) + expect(lskywalkerHosts.size).toEqual(2) + expect(lskywalkerHosts.has('identity1.example.com:443')).toEqual(true) + expect(lskywalkerHosts.has('identity2.example.com:443')).toEqual(true) + expect(matrixAddresses.size).toEqual(1) + expect(matrixAddresses.has('@chewbacca:example.com')).toEqual(true) + }) + }) + }) + + describe('Mock tests', () => { + let federatedIdentityService: FederatedIdentityService + let app: express.Application + let expressFederatedIdentityService: http.Server + const trustedIpAddress = '192.168.1.1' + const trustedIpv6Address = '2001:db8:3333:4444:5555:6666:7777:8888' + const trustedNetwork = '192.168.200.4/30' + const testConfig = { + ...(defaultConfig as Partial), + additional_features: true, + cron_service: true, + trusted_servers_addresses: [ + trustedIpAddress, + trustedNetwork, + trustedIpv6Address + ] + } + + const stopFederatedIdentityService = ( + done: jest.DoneCallback, + filesToDelete = [ + path.join(pathToTestDataFolder, 'database.db'), + path.join(pathToTestDataFolder, 'matrix.db'), + path.join(pathToTestDataFolder, 'user.db') + ] + ): void => { + filesToDelete.forEach((path: string) => { + if (fs.existsSync(path)) fs.unlinkSync(path) + }) + if (federatedIdentityService != null) federatedIdentityService.cleanJobs() + if (expressFederatedIdentityService != null) { + expressFederatedIdentityService.close((e) => { + if (e != null) { + done(e) + } + done() + }) + } else { + done() + } + } + + beforeAll((done) => { + Promise.all([ + buildUserDB(testConfig as Config), + buildMatrixDb(testConfig as Config) + ]) + // eslint-disable-next-line @typescript-eslint/promise-function-async + .then(() => { + done() + }) + .catch((e) => { + done(e) + }) + }) + + afterAll((done) => { + stopFederatedIdentityService(done) + }) + + beforeEach(() => { + jest.restoreAllMocks() + }) + + describe('Working cases', () => { + let hashDetails: IHashDetails + let allPeppers: string[] + let askywalkerHashes: string[] + let lskywalkerHashes: string[] + let okenobiHashes: string[] + let chewbaccaHashes: string[] + let qjinnHashes: string[] + + const setFederatedIdentityServiceDataAndRoutes = + async (): Promise => { + await new Promise((resolve, _reject) => + setTimeout(() => { + resolve() + }, 16000) + ) // wait to set previousPepper in db + await federatedIdentityService.db.insert('accessTokens', { + id: authToken, + data: '{"sub": "@test:example.com"}' + }) + await new Promise((resolve, _reject) => { + app.use(federatedIdentityService.routes) + expressFederatedIdentityService = app.listen(3000, () => { + resolve() + }) + }) + } + + const pushHashesToFederatedIdentityService = async ( + fedServerHashDetails?: IHashDetails + ): Promise => { + hashDetails = + fedServerHashDetails ?? + (( + await request(app) + .get('/_matrix/identity/v2/hash_details') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + ).body as IHashDetails) + + allPeppers = [ + hashDetails.lookup_pepper, + ...(hashDetails.alt_lookup_peppers ?? []) + ] + + askywalkerHashes = allPeppers.map((pepper) => + hash.sha256(`askywalker@example.com email ${pepper}`) + ) + lskywalkerHashes = allPeppers.map((pepper) => + hash.sha256(`lskywalker@example.com email ${pepper}`) + ) + okenobiHashes = allPeppers.map((pepper) => + hash.sha256(`okenobi@example.com email ${pepper}`) + ) + + chewbaccaHashes = allPeppers.map((pepper) => + hash.sha256(`chewbacca@example.com email ${pepper}`) + ) + + qjinnHashes = allPeppers.map((pepper) => + hash.sha256(`qjinn@example.com email ${pepper}`) + ) + + await Promise.all([ + // eslint-disable-next-line @typescript-eslint/promise-function-async + ...askywalkerHashes.map((askywalkerHash, index) => + request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', trustedIpAddress) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[index], + mappings: { + 'identity1.example.com:8448': [askywalkerHash] + } + }) + ), + // eslint-disable-next-line @typescript-eslint/promise-function-async + ...lskywalkerHashes.map((lskywalkerHash, index) => + request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', '192.168.200.5') + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[index], + mappings: { + 'identity2.example.com:443': [lskywalkerHash] + } + }) + ), + // eslint-disable-next-line @typescript-eslint/promise-function-async + ...okenobiHashes.map((okenobiHash, index) => + request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', 'falsy_ip_address') + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[index], + mappings: { + 'identity4.example.com:443': [okenobiHash] + } + }) + ) + ]) + } + + describe('Use environment variables', () => { + const { + trust_x_forwarded_for: trustXForwardedFor, + trusted_servers_addresses: trustedServersAddresses, + ...mIdentityServerConfig + } = testConfig + + beforeAll((done) => { + process.env.TRUSTED_SERVERS_ADDRESSES = trustedServersAddresses + .join(',') + .concat(',invalid_ip') + process.env.TRUST_X_FORWARDED_FOR = String(trustXForwardedFor) + federatedIdentityService = new FederatedIdentityService( + mIdentityServerConfig + ) + app = express() + federatedIdentityService.ready + // eslint-disable-next-line @typescript-eslint/promise-function-async + .then(() => setFederatedIdentityServiceDataAndRoutes()) + // eslint-disable-next-line @typescript-eslint/promise-function-async + .then(() => pushHashesToFederatedIdentityService()) + .then(() => { + done() + }) + .catch((e) => { + done(e) + }) + }) + + afterAll((done) => { + delete process.env.TRUSTED_SERVERS_ADDRESSES + delete process.env.TRUST_X_FORWARDED_FOR + stopFederatedIdentityService(done, [ + path.join(pathToTestDataFolder, 'database.db') + ]) + }) + + it('should get server in which third party user is registered on lookup', async () => { + const hosts = new Set() + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [lskywalkerHashes[i]] + }) + expect(response.body).toHaveProperty('mappings', {}) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('third_party_mappings') + Object.keys(response.body.third_party_mappings).forEach((host) => + hosts.add(host) + ) + } + expect(hosts.size).toEqual(1) + expect(hosts.has('identity2.example.com:443')).toEqual(true) + }) + + it('should get user of federated identity service environment on lookup', async () => { + const matrixAddresses = new Set() + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [chewbaccaHashes[i]] + }) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('third_party_mappings', {}) + expect(response.body).toHaveProperty('mappings') + Object.values( + response.body.mappings as Record + ).forEach((address) => matrixAddresses.add(address)) + } + expect(matrixAddresses.size).toEqual(1) + expect(matrixAddresses.has('@chewbacca:example.com')).toEqual(true) + }) + + it('should not find user from not trusted identity server on lookup', async () => { + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [okenobiHashes[i]] + }) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('third_party_mappings', {}) + expect(response.body).toHaveProperty('mappings', {}) + } + }) + + it('should not find user not connected on any matrix server on lookup', async () => { + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [qjinnHashes[i]] + }) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('third_party_mappings', {}) + expect(response.body).toHaveProperty('mappings', {}) + } + }) + + it('should find all servers on which a third party user is connected on lookup', async () => { + await Promise.all( + allPeppers.map(async (pepper, i) => { + await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', trustedIpAddress) + .send({ + algorithm: hashDetails.algorithms[0], + pepper, + mappings: { + 'identity1.example.com:8448': [ + lskywalkerHashes[i], + askywalkerHashes[i] + ] + } + }) + }) + ) + + const hosts = new Set() + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [lskywalkerHashes[i]] + }) + expect(response.body).toHaveProperty('mappings', {}) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('third_party_mappings') + Object.keys(response.body.third_party_mappings).forEach((host) => + hosts.add(host) + ) + } + expect(hosts.size).toEqual(2) + expect(hosts.has('identity1.example.com:8448')).toEqual(true) + expect(hosts.has('identity2.example.com:443')).toEqual(true) + }) + + it('should find all federated identity service users and servers address of third party users on lookup', async () => { + const matrixAddresses = new Set() + const askywalkerHosts = new Set() + const lskywalkerHosts = new Set() + + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: hashDetails.lookup_pepper, + addresses: [ + lskywalkerHashes[i], + chewbaccaHashes[i], + qjinnHashes[i], + okenobiHashes[i], + askywalkerHashes[i] + ] + }) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('mappings') + Object.values( + response.body.mappings as Record + ).forEach((address) => matrixAddresses.add(address)) + expect(response.body).toHaveProperty('third_party_mappings') + Object.keys(response.body.third_party_mappings).forEach((host) => { + ;(response.body.third_party_mappings[host] as string[]).forEach( + (hash) => { + switch (hash) { + case lskywalkerHashes[i]: + lskywalkerHosts.add(host) + break + case askywalkerHashes[i]: + askywalkerHosts.add(host) + break + default: + break + } + } + ) + }) + } + expect(askywalkerHosts.size).toEqual(1) + expect(askywalkerHosts.has('identity1.example.com:8448')).toEqual( + true + ) + expect(lskywalkerHosts.size).toEqual(2) + expect(lskywalkerHosts.has('identity1.example.com:8448')).toEqual( + true + ) + expect(lskywalkerHosts.has('identity2.example.com:443')).toEqual(true) + expect(matrixAddresses.size).toEqual(1) + expect(matrixAddresses.has('@chewbacca:example.com')).toEqual(true) + }) + }) + + describe('Use JSON configuration object', () => { + beforeAll((done) => { + federatedIdentityService = new FederatedIdentityService(testConfig) + app = express() + federatedIdentityService.ready + // eslint-disable-next-line @typescript-eslint/promise-function-async + .then(() => setFederatedIdentityServiceDataAndRoutes()) + // eslint-disable-next-line @typescript-eslint/promise-function-async + .then(() => pushHashesToFederatedIdentityService()) + .then(() => { + done() + }) + .catch((e) => { + done(e) + }) + }) + + it('should get server in which third party user is registered on lookup', async () => { + const hosts = new Set() + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [lskywalkerHashes[i]] + }) + expect(response.body).toHaveProperty('mappings', {}) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('third_party_mappings') + Object.keys(response.body.third_party_mappings).forEach((host) => + hosts.add(host) + ) + } + expect(hosts.size).toEqual(1) + expect(hosts.has('identity2.example.com:443')).toEqual(true) + }) + + it('should get user of federated identity service environment on lookup', async () => { + const matrixAddresses = new Set() + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [chewbaccaHashes[i]] + }) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('third_party_mappings', {}) + expect(response.body).toHaveProperty('mappings') + Object.values( + response.body.mappings as Record + ).forEach((address) => matrixAddresses.add(address)) + } + expect(matrixAddresses.size).toEqual(1) + expect(matrixAddresses.has('@chewbacca:example.com')).toEqual(true) + }) + + it('should not find user from not trusted identity server on lookup', async () => { + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [okenobiHashes[i]] + }) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('third_party_mappings', {}) + expect(response.body).toHaveProperty('mappings', {}) + } + }) + + it('should not find user not connected on any matrix server on lookup', async () => { + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [qjinnHashes[i]] + }) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('third_party_mappings', {}) + expect(response.body).toHaveProperty('mappings', {}) + } + }) + + it('should find all servers on which a third party user is connected on lookup', async () => { + await Promise.all( + allPeppers.map(async (pepper, i) => { + await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', trustedIpAddress) + .send({ + algorithm: hashDetails.algorithms[0], + pepper, + mappings: { + 'identity1.example.com:8448': [ + lskywalkerHashes[i], + askywalkerHashes[i] + ] + } + }) + }) + ) + + const hosts = new Set() + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: allPeppers[i], + addresses: [lskywalkerHashes[i]] + }) + expect(response.body).toHaveProperty('mappings', {}) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('third_party_mappings') + Object.keys(response.body.third_party_mappings).forEach((host) => + hosts.add(host) + ) + } + expect(hosts.size).toEqual(2) + expect(hosts.has('identity1.example.com:8448')).toEqual(true) + expect(hosts.has('identity2.example.com:443')).toEqual(true) + }) + + it('should find all federated identity service users and servers address of third party users on lookup', async () => { + const matrixAddresses = new Set() + const askywalkerHosts = new Set() + const lskywalkerHosts = new Set() + + for (let i = 0; i < allPeppers.length; i++) { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + algorithm: hashDetails.algorithms[0], + pepper: hashDetails.lookup_pepper, + addresses: [ + lskywalkerHashes[i], + chewbaccaHashes[i], + qjinnHashes[i], + okenobiHashes[i], + askywalkerHashes[i] + ] + }) + expect(response.body).toHaveProperty('inactive_mappings', {}) + expect(response.body).toHaveProperty('mappings') + Object.values( + response.body.mappings as Record + ).forEach((address) => matrixAddresses.add(address)) + expect(response.body).toHaveProperty('third_party_mappings') + Object.keys(response.body.third_party_mappings).forEach((host) => { + ;(response.body.third_party_mappings[host] as string[]).forEach( + (hash) => { + switch (hash) { + case lskywalkerHashes[i]: + lskywalkerHosts.add(host) + break + case askywalkerHashes[i]: + askywalkerHosts.add(host) + break + default: + break + } + } + ) + }) + } + expect(askywalkerHosts.size).toEqual(1) + expect(askywalkerHosts.has('identity1.example.com:8448')).toEqual( + true + ) + expect(lskywalkerHosts.size).toEqual(2) + expect(lskywalkerHosts.has('identity1.example.com:8448')).toEqual( + true + ) + expect(lskywalkerHosts.has('identity2.example.com:443')).toEqual(true) + expect(matrixAddresses.size).toEqual(1) + expect(matrixAddresses.has('@chewbacca:example.com')).toEqual(true) + }) + + it('should store only hashes based on current peppers', async () => { + let response = await request(app) + .get('/_matrix/identity/v2/hash_details') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + + const oldHashDetails = response.body as IHashDetails + + const oldPeppers = [ + oldHashDetails.lookup_pepper, + ...(oldHashDetails.alt_lookup_peppers ?? []) + ] + + let handledPeppers = [ + ...new Set( + ( + await federatedIdentityService.db.getAll(hashByServer, [ + 'pepper' + ]) + ).map((row) => row.pepper as string) + ) + ] + + expect(oldPeppers.length).toEqual(2) + expect(handledPeppers.length).toEqual(2) + expect(handledPeppers).toEqual(expect.arrayContaining(oldPeppers)) + + await new Promise((resolve) => + setTimeout(() => { + resolve() + }, 33000) + ) + + response = await request(app) + .get('/_matrix/identity/v2/hash_details') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + + const newHashDetails = response.body as IHashDetails + + const newPeppers = [ + newHashDetails.lookup_pepper, + ...(newHashDetails.alt_lookup_peppers ?? []) + ] + + await pushHashesToFederatedIdentityService(newHashDetails) + + handledPeppers = [ + ...new Set( + ( + await federatedIdentityService.db.getAll(hashByServer, [ + 'pepper' + ]) + ).map((row) => row.pepper as string) + ) + ] + + expect(newPeppers.length).toEqual(2) + expect(handledPeppers.length).toEqual(2) + expect(handledPeppers).toEqual(expect.arrayContaining(newPeppers)) + expect(handledPeppers).toEqual(expect.not.arrayContaining(oldPeppers)) + }) + }) + }) + + describe('Error cases', () => { + const errorMessage = 'error message' + + it('reject unimplemented endpoint with 404', async () => { + const response = await request(app).get('/unkown') + expect(response.statusCode).toBe(404) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ errcode: 'M_NOT_FOUND', error: 'Not Found' }) + ) + }) + + describe('Lookup endpoint', () => { + it('reject not allowed method with 405 status code', async () => { + const response = await request(app) + .get('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + + expect(response.statusCode).toBe(405) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_UNRECOGNIZED', + error: 'Unrecognized' + }) + ) + }) + + it('should reject if more than 100 requests are done in less than 10 seconds', async () => { + let response + let token + // eslint-disable-next-line @typescript-eslint/no-for-in-array, @typescript-eslint/no-unused-vars + for (const i in [...Array(101).keys()]) { + token = Number(i) % 2 === 0 ? `Bearer ${authToken}` : 'falsy_token' + response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', token) + .send({ + addresse: [], + algorithm: 'sha256', + pepper: 'test_pepper' + }) + } + expect((response as Response).statusCode).toEqual(429) + await new Promise((resolve) => setTimeout(resolve, 11000)) + }) + + it('should send an error if auth token is invalid', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', 'falsy_token') + .send({ + addresse: [], + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(401) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_UNAUTHORIZED', + error: 'Unauthorized' + }) + ) + }) + + it('should send an error if auth token is not in accessTokens table', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken.replace('a', 'f')}`) + .send({ + addresse: [], + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(401) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_UNAUTHORIZED', + error: 'Unauthorized' + }) + ) + }) + + it('should send an error if token data in accessTokens table does not contain "sub" field', async () => { + jest + .spyOn(federatedIdentityService.db, 'get') + .mockResolvedValue([{ data: JSON.stringify({}) }]) + + const jsonParseSpy = jest.spyOn(JSON, 'parse') + + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + addresse: [], + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(jsonParseSpy).toHaveBeenNthCalledWith(2, '{}') + expect(response.statusCode).toEqual(401) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_UNAUTHORIZED', + error: 'Unauthorized' + }) + ) + }) + + it('should send an error if "algorithm" is not in body', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + addresses: [], + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: 'Error field: Invalid value (property: algorithm)' + }) + ) + }) + + it('should send an error if "algorithm" is not a string', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + addresses: [], + algorithm: 2, + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: 'Error field: Invalid value (property: algorithm)' + }) + ) + }) + + it('should send an error if "pepper" is not in body', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + addresses: [], + algorithm: 'sha256' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: 'Error field: Invalid value (property: pepper)' + }) + ) + }) + + it('should send an error if "pepper" is not a string', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + addresses: [], + algorithm: 'sha256', + pepper: 2 + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: 'Error field: Invalid value (property: pepper)' + }) + ) + }) + + it('should send an error if "addresses" is not in body', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: 'Error field: Invalid value (property: addresses)' + }) + ) + }) + + it('should send an error if "addresses" is not an array', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + addresses: 2, + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: 'Error field: Invalid value (property: addresses)' + }) + ) + }) + + it('should send an error if one address is not a string', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + addresses: ['hash1', 'hash2', 2, 'hash3'], + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: + 'Error field: One of the address is not a string (property: addresses)' + }) + ) + }) + + it('should send an error if exceeds hashes limit', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + addresses: Array.from({ length: 101 }, (_, i) => `hash${i}`), + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: + 'Error field: Adresses limit of 100 exceeded (property: addresses)' + }) + ) + }) + + it('should send an error if getting hashes from db fails', async () => { + jest + .spyOn(federatedIdentityService.db, 'get') + .mockResolvedValueOnce([ + { data: JSON.stringify({ sub: '@test:example.com' }) } + ]) + .mockRejectedValueOnce(new Error(errorMessage)) + + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + addresses: ['hash1', 'hash2'], + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(500) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_UNKNOWN', + error: `Error: ${errorMessage}` + }) + ) + }) + + it('should send an error if getting hashes from hashes table fails', async () => { + const dbGetSpy = jest + .spyOn(federatedIdentityService.db, 'get') + .mockResolvedValueOnce([ + { data: JSON.stringify({ sub: '@test:example.com' }) } + ]) + .mockRejectedValueOnce(new Error(errorMessage)) + + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + addresses: ['hash1', 'hash2'], + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(dbGetSpy).toHaveBeenCalledTimes(2) + expect(response.statusCode).toEqual(500) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_UNKNOWN', + error: `Error: ${errorMessage}` + }) + ) + }) + + it('should send an error if getting hashes from hashbyserver table fails', async () => { + const dbGetSpy = jest + .spyOn(federatedIdentityService.db, 'get') + .mockResolvedValueOnce([ + { data: JSON.stringify({ sub: '@test:example.com' }) } + ]) + .mockResolvedValueOnce([]) + .mockRejectedValueOnce(new Error(errorMessage)) + + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + addresses: ['hash1', 'hash2'], + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(dbGetSpy).toHaveBeenCalledTimes(3) + expect(response.statusCode).toEqual(500) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_UNKNOWN', + error: `Error: ${errorMessage}` + }) + ) + }) + }) + + describe('Lookups endpoint', () => { + it('reject not allowed method with 405 status code', async () => { + const response = await request(app) + .get('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', trustedIpAddress) + + expect(response.statusCode).toBe(405) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_UNRECOGNIZED', + error: 'Unrecognized' + }) + ) + }) + + it('should reject if more than 100 requests are done in less than 10 seconds', async () => { + let response + let ipAddress + // eslint-disable-next-line @typescript-eslint/no-for-in-array, @typescript-eslint/no-unused-vars + for (const i in [...Array(101).keys()]) { + ipAddress = Number(i) % 2 === 0 ? trustedIpAddress : '192.168.1.25' + response = await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', ipAddress) + .send({ + mappings: {}, + algorithm: 'sha256', + pepper: 'test_pepper' + }) + } + expect((response as Response).statusCode).toEqual(429) + await new Promise((resolve) => setTimeout(resolve, 11000)) + }) + + it('should send an error if requester ip does not belong to trusted ip addresses', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', '192.168.1.25') + .send({ + mappings: {}, + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(401) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_UNAUTHORIZED', + error: 'Unauthorized' + }) + ) + }) + + it('should send an error if requester ip is not a valid address', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', 'falsy_ip_address') + .send({ + mappings: {}, + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(401) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_UNAUTHORIZED', + error: 'Unauthorized' + }) + ) + }) + + it('should send an error if "pepper" is not in body', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', trustedIpAddress) + .send({ + mappings: { 'test.example.com': [] }, + algorithm: 'sha256' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: 'Error field: Invalid value (property: pepper)' + }) + ) + }) + + it('should send an error if "pepper" is not a string', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', trustedIpAddress) + .send({ + mappings: { 'test.example.com': [] }, + algorithm: 'sha256', + pepper: 2 + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: 'Error field: Invalid value (property: pepper)' + }) + ) + }) + + it('should send an error if "mappings" is not in body', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', trustedIpAddress) + .send({ + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: 'Error field: Invalid value (property: mappings)' + }) + ) + }) + + it('should send an error if "mappings" is not an object', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', trustedIpAddress) + .send({ + mappings: 2, + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: 'Error field: Invalid value (property: mappings)' + }) + ) + }) + + it('should send an error if "mappings" contains more than one server hostname', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', trustedIpAddress) + .send({ + mappings: { 'test.example.com': [], 'test2.example.com': [] }, + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: + 'Error field: Only one server address is allowed (property: mappings)' + }) + ) + }) + + it('should send an error if "mappings" values is not an array', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + mappings: { 'test.example.com': 2 }, + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: + 'Error field: Mappings object values are not string arrays (property: mappings)' + }) + ) + }) + + it('should send an error if one address is not a string', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + mappings: { 'test.example.com': ['hash1', 'hash2', 2, 'hash3'] }, + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: + 'Error field: Mappings object values are not string arrays (property: mappings)' + }) + ) + }) + + it('should send an error if getting pepper in keys table fails', async () => { + jest + .spyOn(federatedIdentityService.db, 'get') + .mockRejectedValueOnce(new Error(errorMessage)) + + const response = await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', trustedIpAddress) + .send({ + mappings: { 'test.example.com': [] }, + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(500) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_UNKNOWN', + error: `Error: ${errorMessage}` + }) + ) + }) + + it('should send an error if deleting hashes in hashbyserver table fails', async () => { + jest + .spyOn(federatedIdentityService.db, 'deleteWhere') + .mockRejectedValue(new Error(errorMessage)) + + const response = await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', trustedIpAddress) + .send({ + mappings: { 'test.example.com': [] }, + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(500) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_UNKNOWN', + error: `Error: ${errorMessage}` + }) + ) + }) + + it('should send an error if inserting hashes in hashbyserver table fails', async () => { + const insertSpyOn = jest + .spyOn(federatedIdentityService.db, 'insert') + .mockResolvedValueOnce([]) + .mockResolvedValueOnce([]) + .mockRejectedValueOnce(new Error(errorMessage)) + .mockResolvedValueOnce([]) + + const response = await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('X-forwarded-for', trustedIpAddress) + .send({ + mappings: { + 'test.example.com': ['test1', 'test2', 'test3', 'test4'] + }, + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(insertSpyOn).toHaveBeenCalledTimes(4) + expect(response.statusCode).toEqual(500) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_UNKNOWN', + error: `Error: ${errorMessage}` + }) + ) + }) + }) + + describe('Hash_details endpoint', () => { + it('reject not allowed method with 405 status code', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/hash_details') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + + expect(response.statusCode).toBe(405) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_UNRECOGNIZED', + error: 'Unrecognized' + }) + ) + }) + + it('should reject if more than 100 requests are done in less than 10 seconds', async () => { + let response + let token + // eslint-disable-next-line @typescript-eslint/no-for-in-array, @typescript-eslint/no-unused-vars + for (const i in [...Array(101).keys()]) { + token = Number(i) % 2 === 0 ? `Bearer ${authToken}` : 'falsy_token' + response = await request(app) + .get('/_matrix/identity/v2/hash_details') + .set('Accept', 'application/json') + .set('Authorization', token) + } + expect((response as Response).statusCode).toEqual(429) + await new Promise((resolve) => setTimeout(resolve, 11000)) + }) + + it('should send an error if deleting hashes in hashbyserver table fails', async () => { + jest + .spyOn(federatedIdentityService.db, 'get') + .mockResolvedValueOnce([ + { data: JSON.stringify({ sub: '@test:example.com' }) } + ]) + .mockRejectedValueOnce(new Error(errorMessage)) + + const response = await request(app) + .get('/_matrix/identity/v2/hash_details') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + + expect(response.statusCode).toEqual(500) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_UNKNOWN', + error: `Error: ${errorMessage}` + }) + ) + }) + }) + }) + }) +}) diff --git a/packages/federation-server/src/index.ts b/packages/federated-identity-service/src/index.ts similarity index 100% rename from packages/federation-server/src/index.ts rename to packages/federated-identity-service/src/index.ts diff --git a/packages/federation-server/src/middlewares/auth.ts b/packages/federated-identity-service/src/middlewares/auth.ts similarity index 100% rename from packages/federation-server/src/middlewares/auth.ts rename to packages/federated-identity-service/src/middlewares/auth.ts diff --git a/packages/federation-server/src/middlewares/errors.ts b/packages/federated-identity-service/src/middlewares/errors.ts similarity index 100% rename from packages/federation-server/src/middlewares/errors.ts rename to packages/federated-identity-service/src/middlewares/errors.ts diff --git a/packages/federation-server/src/middlewares/utils.ts b/packages/federated-identity-service/src/middlewares/utils.ts similarity index 100% rename from packages/federation-server/src/middlewares/utils.ts rename to packages/federated-identity-service/src/middlewares/utils.ts diff --git a/packages/federation-server/src/middlewares/validation.ts b/packages/federated-identity-service/src/middlewares/validation.ts similarity index 100% rename from packages/federation-server/src/middlewares/validation.ts rename to packages/federated-identity-service/src/middlewares/validation.ts diff --git a/packages/federation-server/src/routes/routes.ts b/packages/federated-identity-service/src/routes/routes.ts similarity index 100% rename from packages/federation-server/src/routes/routes.ts rename to packages/federated-identity-service/src/routes/routes.ts diff --git a/packages/federation-server/src/types.ts b/packages/federated-identity-service/src/types.ts similarity index 100% rename from packages/federation-server/src/types.ts rename to packages/federated-identity-service/src/types.ts diff --git a/packages/federation-server/src/utils/ip-address.ts b/packages/federated-identity-service/src/utils/ip-address.ts similarity index 100% rename from packages/federation-server/src/utils/ip-address.ts rename to packages/federated-identity-service/src/utils/ip-address.ts diff --git a/packages/federation-server/templates/mailVerification.tpl b/packages/federated-identity-service/templates/mailVerification.tpl similarity index 100% rename from packages/federation-server/templates/mailVerification.tpl rename to packages/federated-identity-service/templates/mailVerification.tpl diff --git a/packages/federation-server/tsconfig.json b/packages/federated-identity-service/tsconfig.json similarity index 100% rename from packages/federation-server/tsconfig.json rename to packages/federated-identity-service/tsconfig.json diff --git a/packages/matrix-identity-server/src/cron/update-federation-hashes.test.ts b/packages/matrix-identity-server/src/cron/update-federated-identity-hashes.test.ts similarity index 100% rename from packages/matrix-identity-server/src/cron/update-federation-hashes.test.ts rename to packages/matrix-identity-server/src/cron/update-federated-identity-hashes.test.ts diff --git a/packages/matrix-identity-server/src/cron/update-federation-hashes.ts b/packages/matrix-identity-server/src/cron/update-federated-identity-hashes.ts similarity index 100% rename from packages/matrix-identity-server/src/cron/update-federation-hashes.ts rename to packages/matrix-identity-server/src/cron/update-federated-identity-hashes.ts From 2cd8fcb74950f7d08305560eebd330b48e2f0265 Mon Sep 17 00:00:00 2001 From: Jordy CABANNES Date: Thu, 6 Jun 2024 17:32:43 +0200 Subject: [PATCH 3/6] fix: test after updating dependencies --- .../src/routes/routes.test.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/matrix-application-server/src/routes/routes.test.ts b/packages/matrix-application-server/src/routes/routes.test.ts index 7747d121..88a47ba6 100644 --- a/packages/matrix-application-server/src/routes/routes.test.ts +++ b/packages/matrix-application-server/src/routes/routes.test.ts @@ -38,15 +38,17 @@ describe('MASRouter', () => { const stack = router.routes.stack expect(stack).toHaveLength(4) for (let i = 0; i < 3; i++) { - expect(stack[i].route.path).toEqual(expectedPaths[i]) - expect(stack[i].route.methods).toStrictEqual( + expect(stack[i].route?.path).toEqual(expectedPaths[i]) + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + expect((stack[i].route as any).methods).toStrictEqual( expectedRoutes[expectedPaths[i]] ) } - expect(stack[3].route.path.toString()).toEqual( + expect(stack[3].route?.path.toString()).toEqual( '/^\\/(users|rooms|transactions)\\/[a-zA-Z0-9]*/g' ) - expect(stack[3].route.methods).toStrictEqual({ _all: true }) + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + expect((stack[3].route as any).methods).toStrictEqual({ _all: true }) }) it('should add route', () => { @@ -82,8 +84,9 @@ describe('MASRouter', () => { const stack = router.routes.stack expect(stack).toHaveLength(9) for (let i = 4; i < 9; i++) { - expect(stack[i].route.path).toEqual(newRoutes[keys[i - 4]].path) - expect(stack[i].route.methods).toStrictEqual( + expect(stack[i].route?.path).toEqual(newRoutes[keys[i - 4]].path) + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + expect((stack[i].route as any).methods).toStrictEqual( newRoutes[keys[i - 4]].methods ) } From c12e17e87097e513964d3e0b147a5c3c1f48f5f1 Mon Sep 17 00:00:00 2001 From: Jordy CABANNES Date: Thu, 6 Jun 2024 17:33:02 +0200 Subject: [PATCH 4/6] chore: update package-lock.json --- package-lock.json | 2512 +++++++++++++++++++++++---------------------- 1 file changed, 1259 insertions(+), 1253 deletions(-) diff --git a/package-lock.json b/package-lock.json index 80b41e88..cc252c9a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -112,15 +112,6 @@ "node": ">=14.17" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -191,12 +182,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" }, "engines": { @@ -204,30 +195,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -252,9 +243,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", - "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz", + "integrity": "sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -266,7 +257,7 @@ }, "peerDependencies": { "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/@babel/eslint-parser/node_modules/semver": { @@ -279,12 +270,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -306,37 +297,38 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -355,19 +347,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "semver": "^6.3.1" }, "engines": { @@ -387,12 +379,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -429,74 +421,79 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -506,35 +503,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -544,14 +541,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -561,103 +558,105 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", + "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", "dev": true, "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -738,9 +737,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -750,13 +749,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", - "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", + "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -766,12 +765,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -781,14 +780,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -798,13 +797,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", + "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -901,12 +900,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -916,12 +915,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -955,12 +954,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1072,12 +1071,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1103,12 +1102,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1118,14 +1117,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1136,14 +1135,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1153,12 +1152,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1168,12 +1167,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", + "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1183,13 +1182,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1199,13 +1198,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1216,18 +1215,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", + "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "globals": "^11.1.0" }, "engines": { @@ -1238,13 +1237,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1254,12 +1253,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", + "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1269,13 +1268,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1285,12 +1284,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1300,12 +1299,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1316,13 +1315,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1332,12 +1331,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1348,13 +1347,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1364,14 +1363,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1381,12 +1380,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1397,12 +1396,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1412,12 +1411,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1428,12 +1427,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1443,13 +1442,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1459,14 +1458,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", + "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1476,15 +1475,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1494,13 +1493,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1510,13 +1509,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1526,12 +1525,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1541,12 +1540,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1557,12 +1556,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1573,15 +1572,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1591,13 +1590,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1607,12 +1606,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1623,13 +1622,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", + "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1640,12 +1639,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1655,13 +1654,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1671,14 +1670,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1689,12 +1688,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1704,12 +1703,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", - "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", + "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1719,16 +1718,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz", + "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1738,12 +1737,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", + "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", "dev": true, "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" + "@babel/plugin-transform-react-jsx": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1753,13 +1752,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", - "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", + "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1769,12 +1768,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1785,12 +1784,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1800,12 +1799,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1815,13 +1814,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1831,12 +1830,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1846,12 +1845,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1861,12 +1860,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", + "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1876,15 +1875,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz", - "integrity": "sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz", + "integrity": "sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-typescript": "^7.24.1" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1894,12 +1893,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1909,13 +1908,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1925,13 +1924,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1941,13 +1940,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1957,27 +1956,27 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", - "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", + "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1989,54 +1988,54 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.4", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.1", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.24.7", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.7", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.7", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.4", @@ -2075,17 +2074,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", - "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz", + "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-react-display-name": "^7.24.1", - "@babel/plugin-transform-react-jsx": "^7.23.4", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.24.7", + "@babel/plugin-transform-react-jsx-development": "^7.24.7", + "@babel/plugin-transform-react-pure-annotations": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2095,16 +2094,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", - "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-syntax-jsx": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-typescript": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2120,9 +2119,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2132,33 +2131,33 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2167,13 +2166,13 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2625,9 +2624,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", + "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -3190,6 +3189,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -3812,25 +3812,25 @@ } }, "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", "dev": true, "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" }, "bin": { - "installed-package-contents": "lib/index.js" + "installed-package-contents": "bin/index.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", "dev": true, "dependencies": { "npm-normalize-package-bin": "^3.0.0" @@ -3876,6 +3876,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "devOptional": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -3908,6 +3909,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "devOptional": true, "dependencies": { "glob": "^7.1.3" @@ -4008,12 +4010,12 @@ } }, "node_modules/@nrwl/nx-cloud": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@nrwl/nx-cloud/-/nx-cloud-18.0.0.tgz", - "integrity": "sha512-rjjcJgzDmKwFD1QVIMs5O3X4SoMQIk0bzh3pL90ZP/B5YJUlTySv7+R0JoGQ6ROGwVQHjPFMVKKLB09zl5perA==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@nrwl/nx-cloud/-/nx-cloud-19.0.0.tgz", + "integrity": "sha512-3WuXq3KKXwKnbjOkYK0OXosjD02LIjC3kEkyMIbaE36O9dMp3k/sa4ZtDVC3tAoIrj17VLVmjKfoDYbED1rapw==", "dev": true, "dependencies": { - "nx-cloud": "18.0.0" + "nx-cloud": "19.0.0" } }, "node_modules/@nrwl/tao": { @@ -4447,13 +4449,14 @@ } }, "node_modules/@opensearch-project/opensearch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@opensearch-project/opensearch/-/opensearch-2.7.0.tgz", - "integrity": "sha512-ee4XEU0CSwbThGgKcROmQPwG48QjMaMJzJdgUaGqeIeni7YMJqlZ6g4pbPD7iDE19Y1e2/OEzeW54DE/Fyky2g==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@opensearch-project/opensearch/-/opensearch-2.9.0.tgz", + "integrity": "sha512-BXPWSBME1rszZ8OvtBVQ9F6kLiZSENDSFPawbPa1fv0GouuQfWxkKSI9TcnfGLp869fgLTEIfeC5Qexd4RbAYw==", "dependencies": { "aws4": "^1.11.0", "debug": "^4.3.1", "hpagent": "^1.2.0", + "json11": "^1.0.4", "ms": "^2.1.3", "secure-json-parse": "^2.4.0" }, @@ -4496,12 +4499,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.43.1.tgz", - "integrity": "sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==", + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.44.1.tgz", + "integrity": "sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==", "dev": true, "dependencies": { - "playwright": "1.43.1" + "playwright": "1.44.1" }, "bin": { "playwright": "cli.js" @@ -4525,9 +4528,9 @@ } }, "node_modules/@redis/client": { - "version": "1.5.14", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.14.tgz", - "integrity": "sha512-YGn0GqsRBFUQxklhY7v562VMOP0DcmlrHHs3IV1mFE3cbxe31IITUkqhBcIhVSI/2JqtWAJXg5mjV4aU+zD0HA==", + "version": "1.5.16", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.16.tgz", + "integrity": "sha512-X1a3xQ5kEMvTib5fBrHKh6Y+pXbeKXqziYuxOUo1ojQNECg4M5Etd1qqyhMap+lFUOAh8S7UYevgJHOm4A+NOg==", "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -4840,9 +4843,9 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "25.0.7", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz", - "integrity": "sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==", + "version": "25.0.8", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz", + "integrity": "sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -4980,9 +4983,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.3.tgz", - "integrity": "sha512-1ACInKIT0pXmTYuPoJAL8sOT0lV3PEACFSVxnD03hGIojJ1CmbzZmLJyk2xew+yxqTlmx7xydkiJcBzdp0V+AQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", "cpu": [ "arm" ], @@ -4993,9 +4996,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.3.tgz", - "integrity": "sha512-vGl+Bny8cawCM7ExugzqEB8ke3t7Pm9/mo+ciA9kJh6pMuNyM+31qhewMwHwseDZ/LtdW0SCocW1CsMxcq1Lsg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", "cpu": [ "arm64" ], @@ -5006,9 +5009,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.3.tgz", - "integrity": "sha512-Lj8J9WzQRvfWO4GfI+bBkIThUFV1PtI+es/YH/3cwUQ+edXu8Mre0JRJfRrAeRjPiHDPFFZaX51zfgHHEhgRAg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", "cpu": [ "arm64" ], @@ -5019,9 +5022,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.3.tgz", - "integrity": "sha512-NPPOXMTIWJk50lgZmRReEYJFvLG5rgMDzaVauWNB2MgFQYm9HuNXQdVVg3iEZ3A5StIzxhMlPjVyS5fsv4PJmg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", "cpu": [ "x64" ], @@ -5032,9 +5035,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.3.tgz", - "integrity": "sha512-ij4tv1XtWcDScaTgoMnvDEYZ2Wjl2ZhDFEyftjBKu6sNNLHIkKuXBol/bVSh+md5zSJ6em9hUXyPO3cVPCsl4Q==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", "cpu": [ "arm" ], @@ -5045,9 +5048,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.3.tgz", - "integrity": "sha512-MTMAl30dzcfYB+smHe1sJuS2P1/hB8pqylkCe0/8/Lo8CADjy/eM8x43nBoR5eqcYgpOtCh7IgHpvqSMAE38xw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", "cpu": [ "arm" ], @@ -5058,9 +5061,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.3.tgz", - "integrity": "sha512-vY3fAg6JLDoNh781HHHMPvt8K6RWG3OmEj3xI9BOFSQTD5PNaGKvCB815MyGlDnFYUw7lH+WvvQqoBwLtRDR1A==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", "cpu": [ "arm64" ], @@ -5071,9 +5074,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.3.tgz", - "integrity": "sha512-61SpQGBSb8QkfV/hUYWezlEig4ro55t8NcE5wWmy1bqRsRVHCEDkF534d+Lln/YeLUoSWtJHvvG3bx9lH/S6uA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", "cpu": [ "arm64" ], @@ -5084,9 +5087,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.3.tgz", - "integrity": "sha512-4XGexJthsNhEEgv/zK4/NnAOjYKoeCsIoT+GkqTY2u3rse0lbJ8ft1bpDCdlkvifsLDL2uwe4fn8PLR4IMTKQQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", "cpu": [ "ppc64" ], @@ -5097,9 +5100,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.3.tgz", - "integrity": "sha512-/pArXjqnEdhbQ1qe4CTTlJ6/GjWGdWNRucKAp4fqKnKf7QC0BES3QEV34ACumHHQ4uEGt4GctF2ISCMRhkli0A==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", "cpu": [ "riscv64" ], @@ -5110,9 +5113,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.3.tgz", - "integrity": "sha512-vu4f3Y8iwjtRfSZdmtP8nC1jmRx1IrRVo2cLQlQfpFZ0e2AE9YbPgfIzpuK+i3C4zFETaLLNGezbBns2NuS/uA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", "cpu": [ "s390x" ], @@ -5123,9 +5126,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.3.tgz", - "integrity": "sha512-n4HEgIJulNSmAKT3SYF/1wuzf9od14woSBseNkzur7a+KJIbh2Jb+J9KIsdGt3jJnsLW0BT1Sj6MiwL4Zzku6Q==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", "cpu": [ "x64" ], @@ -5136,9 +5139,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.3.tgz", - "integrity": "sha512-guO/4N1884ig2AzTKPc6qA7OTnFMUEg/X2wiesywRO1eRD7FzHiaiTQQOLFmnUXWj2pgQXIT1g5g3e2RpezXcQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", "cpu": [ "x64" ], @@ -5149,9 +5152,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.3.tgz", - "integrity": "sha512-+rxD3memdkhGz0NhNqbYHXBoA33MoHBK4uubZjF1IeQv1Psi6tqgsCcC6vwQjxBM1qoCqOQQBy0cgNbbZKnGUg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", "cpu": [ "arm64" ], @@ -5162,9 +5165,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.3.tgz", - "integrity": "sha512-0NxVbLhBXmwANWWbgZY/RdSkeuHEgF+u8Dc0qBowUVBYsR2y2vwVGjKgUcj1wtu3jpjs057io5g9HAPr3Icqjg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", "cpu": [ "ia32" ], @@ -5175,9 +5178,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.3.tgz", - "integrity": "sha512-hutnZavtOx/G4uVdgoZz5279By9NVbgmxOmGGgnzUjZYuwp2+NzGq6KXQmHXBWz7W/vottXn38QmKYAdQLa/vQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", "cpu": [ "x64" ], @@ -5188,9 +5191,9 @@ ] }, "node_modules/@rushstack/eslint-patch": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz", - "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz", + "integrity": "sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==", "dev": true }, "node_modules/@sigstore/bundle": { @@ -5229,9 +5232,9 @@ } }, "node_modules/@sigstore/sign/node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -5264,9 +5267,9 @@ } }, "node_modules/@sigstore/sign/node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -5285,40 +5288,40 @@ } }, "node_modules/@sigstore/sign/node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/@sigstore/sign/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@sigstore/sign/node_modules/glob/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -5369,9 +5372,9 @@ } }, "node_modules/@sigstore/sign/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "dependencies": { "minipass": "^7.0.3", @@ -5386,18 +5389,18 @@ } }, "node_modules/@sigstore/sign/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/@sigstore/sign/node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "dependencies": { "minipass": "^7.0.3" @@ -5407,9 +5410,9 @@ } }, "node_modules/@sigstore/sign/node_modules/ssri/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -5718,8 +5721,8 @@ "resolved": "packages/crypto", "link": true }, - "node_modules/@twake/federation-server": { - "resolved": "packages/federation-server", + "node_modules/@twake/federated-identity-service": { + "resolved": "packages/federated-identity-service", "link": true }, "node_modules/@twake/landing": { @@ -5798,9 +5801,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -5829,9 +5832,9 @@ } }, "node_modules/@types/chai": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.14.tgz", - "integrity": "sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==", + "version": "4.3.16", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", + "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", "dev": true }, "node_modules/@types/chai-subset": { @@ -5892,9 +5895,9 @@ } }, "node_modules/@types/dockerode": { - "version": "3.3.28", - "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.28.tgz", - "integrity": "sha512-RjY96chW88t2QvSebCsec+mQYo3/nyOr+/tVcE+0ynlOg2m/i9wPE52DhptzF75QDlhv2uDYVPqKfHKeGTn6Fg==", + "version": "3.3.29", + "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.29.tgz", + "integrity": "sha512-5PRRq/yt5OT/Jf77ltIdz4EiR9+VLnPF+HpU4xGFwUqmV24Co2HKBNW3w+slqZ1CYchbcDeqJASHDYWzZCcMiQ==", "dev": true, "dependencies": { "@types/docker-modem": "*", @@ -5936,9 +5939,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", - "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz", + "integrity": "sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==", "dev": true, "dependencies": { "@types/node": "*", @@ -6064,9 +6067,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", - "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==", + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==", "dev": true }, "node_modules/@types/mdast": { @@ -6124,9 +6127,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -6139,9 +6142,9 @@ "dev": true }, "node_modules/@types/nodemailer": { - "version": "6.4.14", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.14.tgz", - "integrity": "sha512-fUWthHO9k9DSdPCSPRqcu6TWhYyxTBg382vlNIttSe9M7XfsT06y0f24KHXtbnijPGGRIcVvdKHTNikOI6qiHA==", + "version": "6.4.15", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.15.tgz", + "integrity": "sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -6154,9 +6157,9 @@ "dev": true }, "node_modules/@types/pg": { - "version": "8.11.5", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.5.tgz", - "integrity": "sha512-2xMjVviMxneZHDHX5p5S6tsRRs7TpDHeeK7kTTMe/kAC/mRRNjWHjZg0rkiY+e17jXSZV3zJYDxXV8Cy72/Vuw==", + "version": "8.11.6", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz", + "integrity": "sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==", "dev": true, "dependencies": { "@types/node": "*", @@ -6189,9 +6192,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.2.79", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.79.tgz", - "integrity": "sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -6199,9 +6202,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.25", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.25.tgz", - "integrity": "sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, "dependencies": { "@types/react": "*" @@ -6274,9 +6277,9 @@ } }, "node_modules/@types/ssh2/node_modules/@types/node": { - "version": "18.19.31", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.31.tgz", - "integrity": "sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==", + "version": "18.19.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.34.tgz", + "integrity": "sha512-eXF4pfBNV5DAMKGbI02NnDtWrQ40hAN558/2vvS4gMpMIxaf6JmD7YjnZbq0Q9TDSSkKBamime8ewRoomHdt4g==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -6289,9 +6292,9 @@ "dev": true }, "node_modules/@types/superagent": { - "version": "8.1.6", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.6.tgz", - "integrity": "sha512-yzBOv+6meEHSzV2NThYYOA6RtqvPr3Hbob9ZLp3i07SH27CrYVfm8CrF7ydTmidtelsFiKx2I4gZAiAOamGgvQ==", + "version": "8.1.7", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.7.tgz", + "integrity": "sha512-NmIsd0Yj4DDhftfWvvAku482PZum4DBW7U51OvS8gvOkDDY0WT1jsVyDV3hK+vplrsYw8oDwi9QxOM7U68iwww==", "dev": true, "dependencies": { "@types/cookiejar": "^2.1.5", @@ -6320,9 +6323,9 @@ "dev": true }, "node_modules/@types/validator": { - "version": "13.11.9", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", - "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==", + "version": "13.11.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.10.tgz", + "integrity": "sha512-e2PNXoXLr6Z+dbfx5zSh9TRlXJrELycxiaXznp4S5+D2M3b9bqJEitNHA5923jhnB2zzFiZHa2f0SI1HoIahpg==", "dev": true }, "node_modules/@types/yargs": { @@ -6547,31 +6550,31 @@ "dev": true }, "node_modules/@vanilla-extract/babel-plugin-debug-ids": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@vanilla-extract/babel-plugin-debug-ids/-/babel-plugin-debug-ids-1.0.5.tgz", - "integrity": "sha512-Rc9A6ylsw7EBErmpgqCMvc/Z/eEZxI5k1xfLQHw7f5HHh3oc5YfzsAsYU/PdmSNjF1dp3sGEViBdDltvwnfVaA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@vanilla-extract/babel-plugin-debug-ids/-/babel-plugin-debug-ids-1.0.6.tgz", + "integrity": "sha512-C188vUEYmw41yxg3QooTs8r1IdbDQQ2mH7L5RkORBnHx74QlmsNfqVmKwAVTgrlYt8JoRaWMtPfGm/Ql0BNQrA==", "dev": true, "dependencies": { "@babel/core": "^7.23.9" } }, "node_modules/@vanilla-extract/css": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.14.2.tgz", - "integrity": "sha512-OasEW4ojGqqRiUpsyEDUMrSkLnmwbChtafkogpCZ1eDAgAZ9eY9CHLYodj2nB8aV5T25kQ5shm92k25ngjYhhg==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.15.2.tgz", + "integrity": "sha512-Bi61iCAtojCuqvV+FYaF5i69vBjuMQJpHPdpgKYyQvx+e2Hp79V0ELglyYOdcyg9Wh0k0MFwgCDipVd7EloTXQ==", "dev": true, "dependencies": { "@emotion/hash": "^0.9.0", - "@vanilla-extract/private": "^1.0.4", - "chalk": "^4.1.1", + "@vanilla-extract/private": "^1.0.5", "css-what": "^6.1.0", "cssesc": "^3.0.0", "csstype": "^3.0.7", + "dedent": "^1.5.3", "deep-object-diff": "^1.1.9", "deepmerge": "^4.2.2", "media-query-parser": "^2.0.2", "modern-ahocorasick": "^1.0.0", - "outdent": "^0.8.0" + "picocolors": "^1.0.0" } }, "node_modules/@vanilla-extract/integration": { @@ -6948,9 +6951,9 @@ } }, "node_modules/@vanilla-extract/integration/node_modules/rollup": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.3.tgz", - "integrity": "sha512-Ygm4fFO4usWcAG3Ud36Lmif5nudoi0X6QPLC+kRgrRjulAbmFkaTawP7fTIkRDnCNSf/4IAQzXM1T8e691kRtw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -6963,29 +6966,29 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.16.3", - "@rollup/rollup-android-arm64": "4.16.3", - "@rollup/rollup-darwin-arm64": "4.16.3", - "@rollup/rollup-darwin-x64": "4.16.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.16.3", - "@rollup/rollup-linux-arm-musleabihf": "4.16.3", - "@rollup/rollup-linux-arm64-gnu": "4.16.3", - "@rollup/rollup-linux-arm64-musl": "4.16.3", - "@rollup/rollup-linux-powerpc64le-gnu": "4.16.3", - "@rollup/rollup-linux-riscv64-gnu": "4.16.3", - "@rollup/rollup-linux-s390x-gnu": "4.16.3", - "@rollup/rollup-linux-x64-gnu": "4.16.3", - "@rollup/rollup-linux-x64-musl": "4.16.3", - "@rollup/rollup-win32-arm64-msvc": "4.16.3", - "@rollup/rollup-win32-ia32-msvc": "4.16.3", - "@rollup/rollup-win32-x64-msvc": "4.16.3", + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", "fsevents": "~2.3.2" } }, "node_modules/@vanilla-extract/integration/node_modules/vite": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", - "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.12.tgz", + "integrity": "sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==", "dev": true, "dependencies": { "esbuild": "^0.20.1", @@ -7076,9 +7079,9 @@ } }, "node_modules/@vanilla-extract/private": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.4.tgz", - "integrity": "sha512-8FGD6AejeC/nXcblgNCM5rnZb9KXa4WNkR03HCWtdJBpANjTgjHEglNLFnhuvdQ78tC6afaxBPI+g7F2NX3tgg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.5.tgz", + "integrity": "sha512-6YXeOEKYTA3UV+RC8DeAjFk+/okoNz/h88R+McnzA2zpaVqTR/Ep+vszkWYlGBcMNO7vEkqbq5nT/JMMvhi+tw==", "dev": true }, "node_modules/@web3-storage/multipart-parser": { @@ -7401,6 +7404,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -7463,6 +7467,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", "devOptional": true, "dependencies": { "delegates": "^1.0.0", @@ -7646,16 +7651,19 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { @@ -7818,9 +7826,9 @@ } }, "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.0.tgz", + "integrity": "sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==" }, "node_modules/axe-core": { "version": "4.7.0", @@ -7832,9 +7840,9 @@ } }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "dev": true, "dependencies": { "follow-redirects": "^1.15.6", @@ -8050,41 +8058,51 @@ "devOptional": true }, "node_modules/bare-events": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz", - "integrity": "sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.3.1.tgz", + "integrity": "sha512-sJnSOTVESURZ61XgEleqmP255T6zTYwHPwE4r6SssIh0U9/uDvfpdoJYpVUerJJZH2fueO+CdT8ZT+OC/7aZDA==", "dev": true, "optional": true }, "node_modules/bare-fs": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.2.3.tgz", - "integrity": "sha512-amG72llr9pstfXOBOHve1WjiuKKAMnebcmMbPWDZ7BCevAoJLpugjuAPRsDINEyjT0a6tbaVx3DctkXIRbLuJw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", + "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", "dev": true, "optional": true, "dependencies": { "bare-events": "^2.0.0", "bare-path": "^2.0.0", - "streamx": "^2.13.0" + "bare-stream": "^2.0.0" } }, "node_modules/bare-os": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.2.1.tgz", - "integrity": "sha512-OwPyHgBBMkhC29Hl3O4/YfxW9n7mdTr2+SsO29XBWKKJsbgj3mnorDB80r5TiCQgQstgE5ga1qNYrpes6NvX2w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.3.0.tgz", + "integrity": "sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg==", "dev": true, "optional": true }, "node_modules/bare-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.1.tgz", - "integrity": "sha512-OHM+iwRDRMDBsSW7kl3dO62JyHdBKO3B25FB9vNQBPcGHMo4+eA8Yj41Lfbk3pS/seDY+siNge0LdRTulAau/A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", "dev": true, "optional": true, "dependencies": { "bare-os": "^2.1.0" } }, + "node_modules/bare-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.0.1.tgz", + "integrity": "sha512-ubLyoDqPnUf5o0kSFp709HC0WRZuxVuh4pbte5eY95Xvx5bdvz07c2JFmXBfqqe60q+9PJ8S4X5GRvmcNSKMxg==", + "dev": true, + "optional": true, + "dependencies": { + "streamx": "^2.18.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -8235,12 +8253,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -8455,6 +8473,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "devOptional": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -8499,6 +8518,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "devOptional": true, "dependencies": { "glob": "^7.1.3" @@ -8637,9 +8657,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001612", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", - "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", + "version": "1.0.30001629", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001629.tgz", + "integrity": "sha512-c3dl911slnQhmxUIT4HhYzT7wnBK/XYpGnYLOj4nJBaRiw52Ibe7YxlDaAeRECvA786zCuExhxIUJ2K7nHMrBw==", "dev": true, "funding": [ { @@ -8806,9 +8826,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", "dev": true }, "node_modules/clean-stack": { @@ -9371,9 +9391,9 @@ "dev": true }, "node_modules/core-js-compat": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", - "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dev": true, "dependencies": { "browserslist": "^4.23.0" @@ -9416,15 +9436,15 @@ } }, "node_modules/cpu-features": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.9.tgz", - "integrity": "sha512-AKjgn2rP2yJyfbepsmLfiYcmtNn/2eUvocUyM/09yB0YDiz39HteK/5/T4Onf0pmdYDMgkBoGvRLvEguzyL7wQ==", + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", + "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", "dev": true, "hasInstallScript": true, "optional": true, "dependencies": { "buildcheck": "~0.0.6", - "nan": "^2.17.0" + "nan": "^2.19.0" }, "engines": { "node": ">=10.0.0" @@ -9620,9 +9640,9 @@ } }, "node_modules/deasync": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.29.tgz", - "integrity": "sha512-EBtfUhVX23CE9GR6m+F8WPeImEE4hR/FW9RkK0PMl9V1t283s0elqsTD8EZjaKX28SY1BW2rYfCgNsAYdpamUw==", + "version": "0.1.30", + "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.30.tgz", + "integrity": "sha512-OaAjvEQuQ9tJsKG4oHO9nV1UHTwb2Qc2+fadB0VeVtD0Z9wiG1XPGLJ4W3aLhAoQSYTaLROFRbd5X20Dkzf7MQ==", "dev": true, "hasInstallScript": true, "optional": true, @@ -9642,9 +9662,9 @@ "optional": true }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dependencies": { "ms": "2.1.2" }, @@ -9746,9 +9766,9 @@ } }, "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, "dependencies": { "type-detect": "^4.0.0" @@ -10223,9 +10243,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.746", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.746.tgz", - "integrity": "sha512-jeWaIta2rIG2FzHaYIhSuVWqC6KJYo7oSBX4Jv7g+aVujKztfvdpf+n6MGwZdC5hQXbax4nntykLH2juIQrfPg==", + "version": "1.4.792", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.792.tgz", + "integrity": "sha512-rkg5/N3L+Y844JyfgPUyuKK0Hk0efo3JNxUDKvz3HgP6EmN4rNGhr2D8boLsfTV/hGo7ZGAL8djw+jlg99zQyA==", "dev": true }, "node_modules/emittery": { @@ -10299,9 +10319,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -10459,14 +10479,14 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", - "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", + "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", @@ -10579,9 +10599,9 @@ } }, "node_modules/esbuild-plugins-node-modules-polyfill": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.6.3.tgz", - "integrity": "sha512-nydQGT3RijD8mBd3Hek+2gSAxndgceZU9GIjYYiqU+7CE7veN8utTmupf0frcKpwIXCXWpRofL9CY9k0yU70CA==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.6.4.tgz", + "integrity": "sha512-x3MCOvZrKDGAfqAYS/pZUUSwiN+XH7x84A+Prup0CZBJKuGfuGkTAC4g01D6JPs/GCM9wzZVfd8bmiy+cP/iXA==", "dev": true, "dependencies": { "@jspm/core": "^2.0.1", @@ -10592,7 +10612,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "esbuild": "^0.14.0 || ^0.15.0 || ^0.16.0 || ^0.17.0 || ^0.18.0 || ^0.19.0 || ^0.20.0" + "esbuild": "^0.14.0 || ^0.15.0 || ^0.16.0 || ^0.17.0 || ^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0" } }, "node_modules/escalade": { @@ -11267,41 +11287,44 @@ } }, "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.2.0.tgz", + "integrity": "sha512-QmAqwizauvnKOlifxyDj2ObfULpHQawlg/zQdgEixur9vl0CvZGv/LCJV2rtj3210QCoeGBzVMfMXqGAOr/4fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/eslint-plugin-react": { - "version": "7.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", - "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "version": "7.34.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz", + "integrity": "sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==", "dev": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", "array.prototype.toreversed": "^1.1.2", "array.prototype.tosorted": "^1.1.3", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", + "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.hasown": "^1.1.4", + "object.values": "^1.2.0", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" + "string.prototype.matchall": "^4.0.11" }, "engines": { "node": ">=4" @@ -11311,9 +11334,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, "engines": { "node": ">=10" @@ -11915,9 +11938,9 @@ } }, "node_modules/express-rate-limit": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.2.0.tgz", - "integrity": "sha512-T7nul1t4TNyfZMJ7pKRKkdeVJWa2CqB8NA1P8BwYaoDI5QSBZARv5oMS43J7b7I5P+4asjVXjb7ONuwDKucahg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.3.0.tgz", + "integrity": "sha512-ZPfWlcQQ1PsZonB/vqksOsBQV74z5osi/QcdoBCyKJXl/wOVjS1yRDmvkpMM52KJeLbiF2+djwVEnEgVCDdvtw==", "engines": { "node": ">= 16" }, @@ -11929,12 +11952,12 @@ } }, "node_modules/express-validator": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.0.1.tgz", - "integrity": "sha512-oB+z9QOzQIE8FnlINqyIFA8eIckahC6qc8KtqLdLJcU3/phVyuhXH3bA4qzcrhme+1RYaCSwrq+TlZ/kAKIARA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.1.0.tgz", + "integrity": "sha512-ePn6NXjHRZiZkwTiU1Rl2hy6aUqmi6Cb4/s8sfUsKH7j2yYl9azSpl8xEHcOj1grzzQ+UBEoLWtE1s6FDxW++g==", "dependencies": { "lodash": "^4.17.21", - "validator": "^13.9.0" + "validator": "~13.12.0" }, "engines": { "node": ">= 8.0.0" @@ -12190,9 +12213,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -12284,6 +12307,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -12316,6 +12340,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -12563,6 +12588,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", "devOptional": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", @@ -12755,9 +12781,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", - "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", + "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", "dev": true, "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -12906,6 +12932,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -12955,12 +12982,13 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -13520,9 +13548,9 @@ } }, "node_modules/import-meta-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", - "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", "dev": true, "funding": { "type": "github", @@ -13557,6 +13585,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "devOptional": true, "dependencies": { "once": "^1.3.0", @@ -14473,9 +14502,9 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -14491,9 +14520,9 @@ } }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", "dev": true, "dependencies": { "async": "^3.2.3", @@ -14699,6 +14728,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -15040,6 +15070,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -15195,9 +15226,9 @@ } }, "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.3.tgz", + "integrity": "sha512-uy2bNX5zQ+tESe+TiC7ilGRz8AtRGmnJH55NC5S0nSUjvvvM2hJHmefHErugGXN4pNv4Qx7vLsnNw9qJ9mtIsw==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -15280,6 +15311,14 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, + "node_modules/json11": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/json11/-/json11-1.1.2.tgz", + "integrity": "sha512-5r1RHT1/Gr/jsI/XZZj/P6F11BKM8xvTaftRuiLkQI9Z2PFDukM82Ysxw8yDszb3NJP/NKnRlSGmhUdG99rlBw==", + "bin": { + "json11": "dist/cli.mjs" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -15383,9 +15422,9 @@ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", "dev": true }, "node_modules/language-tags": { @@ -15458,6 +15497,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.3.tgz", "integrity": "sha512-75QiiLJV/PQqtpH+HGls44dXweviFwQ6SiIK27EqzKQ5jU/7UFrl2E5nLdQ3IYRBzJ/AVFJI66u0MZ0uofKYwg==", + "deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md", "optional": true, "dependencies": { "abstract-logging": "^2.0.0", @@ -15911,9 +15951,9 @@ } }, "node_modules/libnpmpublish/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -15950,9 +15990,9 @@ } }, "node_modules/libnpmpublish/node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "dependencies": { "minipass": "^7.0.3" @@ -16007,9 +16047,9 @@ } }, "node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", "dev": true, "engines": { "node": ">= 12.13.0" @@ -16366,6 +16406,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -16381,6 +16422,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -17525,12 +17567,12 @@ ] }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -17763,15 +17805,15 @@ "devOptional": true }, "node_modules/mlly": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", - "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", "dev": true, "dependencies": { "acorn": "^8.11.3", "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" } }, "node_modules/modern-ahocorasick": { @@ -17998,9 +18040,9 @@ "dev": true }, "node_modules/node-abi": { - "version": "3.61.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.61.0.tgz", - "integrity": "sha512-dYDO1rxzvMXjEMi37PBeFuYgwh3QZpsw/jt+qOmnRSwiV4z4c+OLoRlTa3V8ID4TrkSQpzCVc9OI2sstFaINfQ==", + "version": "3.63.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.63.0.tgz", + "integrity": "sha512-vAszCsOUrUxjGAmdnM/pq7gUgie0IRteCQMX6d4A534fQCR93EJU5qgzBvU6EkFfK27s0T3HEV3BOyJIr7OMYw==", "optional": true, "dependencies": { "semver": "^7.3.5" @@ -18145,9 +18187,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", - "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", "dev": true, "bin": { "node-gyp-build": "bin.js", @@ -18169,6 +18211,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -18201,6 +18244,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -18239,9 +18283,9 @@ } }, "node_modules/nodemon": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", - "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.3.tgz", + "integrity": "sha512-m4Vqs+APdKzDFpuaL9F9EVOF85+h070FnkHVEoU4+rmT6Vw0bmNl7s61VEkY/cJkL7RCv1p4urnUDUMrS5rk2w==", "dev": true, "dependencies": { "chokidar": "^3.5.2", @@ -18552,9 +18596,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -18587,9 +18631,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -18608,40 +18652,40 @@ } }, "node_modules/npm-registry-fetch/node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/npm-registry-fetch/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/npm-registry-fetch/node_modules/glob/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -18704,9 +18748,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "dependencies": { "minipass": "^7.0.3", @@ -18721,9 +18765,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -18745,9 +18789,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "dependencies": { "minipass": "^7.0.3" @@ -18757,9 +18801,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/ssri/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -19002,6 +19046,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", "devOptional": true, "dependencies": { "are-we-there-yet": "^3.0.0", @@ -19086,37 +19131,26 @@ } }, "node_modules/nx-cloud": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/nx-cloud/-/nx-cloud-18.0.0.tgz", - "integrity": "sha512-VpPywcHmFIU3GSWb3KV3nQ+TAMLc06DTO39vTFsM+HreB6qRloDxbADRvfM5eHAbY26TNmwflT7wxd0fluv2+A==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/nx-cloud/-/nx-cloud-19.0.0.tgz", + "integrity": "sha512-Aq1vQD8yBIdb5jLVpzsqmu8yDmMvRVdjaM30Pp1hghhlSvorGBlpTwY+TccZJv/hBtVO+SpXK8SnnegRZMrxdw==", "dev": true, "dependencies": { - "@nrwl/nx-cloud": "18.0.0", - "axios": "1.1.3", + "@nrwl/nx-cloud": "19.0.0", + "axios": "^1.6.0", "chalk": "^4.1.0", "dotenv": "~10.0.0", "fs-extra": "^11.1.0", "node-machine-id": "^1.1.12", "open": "~8.4.0", "strip-json-comments": "^3.1.1", - "tar": "6.1.11", + "tar": "6.2.1", "yargs-parser": ">=21.1.1" }, "bin": { "nx-cloud": "bin/nx-cloud.js" } }, - "node_modules/nx-cloud/node_modules/axios": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", - "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/nx-cloud/node_modules/dotenv": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", @@ -19140,29 +19174,6 @@ "node": ">=14.14" } }, - "node_modules/nx-cloud/node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/nx-cloud/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/nx-cloud/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", @@ -19212,6 +19223,7 @@ "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -19531,17 +19543,17 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -19847,9 +19859,9 @@ } }, "node_modules/pacote/node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -19882,9 +19894,9 @@ } }, "node_modules/pacote/node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -19903,40 +19915,40 @@ } }, "node_modules/pacote/node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/pacote/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/pacote/node_modules/glob/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -19955,9 +19967,9 @@ } }, "node_modules/pacote/node_modules/ignore-walk": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", - "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", "dev": true, "dependencies": { "minimatch": "^9.0.0" @@ -20012,9 +20024,9 @@ } }, "node_modules/pacote/node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "dependencies": { "minipass": "^7.0.3" @@ -20024,9 +20036,9 @@ } }, "node_modules/pacote/node_modules/ssri/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -20186,34 +20198,34 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "dev": true, "engines": { "node": "14 || >=16.14" } }, "node_modules/path-scurry/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -20289,9 +20301,9 @@ } }, "node_modules/pg": { - "version": "8.11.5", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.5.tgz", - "integrity": "sha512-jqgNHSKL5cbDjFlHyYsCXmQDrfIX/3RsNwYqpd4N0Kt8niLuNoRNH+aazv6cOd43gPh9Y4DjQCtb+X0MH0Hvnw==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", + "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", "optional": true, "dependencies": { "pg-connection-string": "^2.6.4", @@ -20452,9 +20464,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -20567,23 +20579,23 @@ } }, "node_modules/pkg-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.0.tgz", - "integrity": "sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz", + "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==", "dev": true, "dependencies": { "confbox": "^0.1.7", - "mlly": "^1.6.1", + "mlly": "^1.7.0", "pathe": "^1.1.2" } }, "node_modules/playwright": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.1.tgz", - "integrity": "sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==", + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.44.1.tgz", + "integrity": "sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==", "dev": true, "dependencies": { - "playwright-core": "1.43.1" + "playwright-core": "1.44.1" }, "bin": { "playwright": "cli.js" @@ -20596,9 +20608,9 @@ } }, "node_modules/playwright-core": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.1.tgz", - "integrity": "sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==", + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.1.tgz", + "integrity": "sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -20838,9 +20850,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -21078,9 +21090,9 @@ } }, "node_modules/promzard": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-1.0.1.tgz", - "integrity": "sha512-ulDF77aULEHUoJkN5XZgRV5loHXBaqd9eorMvLNLvi2gXMuRAtwH6Gh4zsMHQY1kTt7tyv/YZwZW5C2gtj8F2A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promzard/-/promzard-1.0.2.tgz", + "integrity": "sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ==", "dev": true, "dependencies": { "read": "^3.0.1" @@ -21433,9 +21445,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -21444,27 +21456,27 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -21543,6 +21555,7 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", "dev": true, "dependencies": { "glob": "^10.2.2", @@ -21568,9 +21581,9 @@ } }, "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -21586,22 +21599,22 @@ } }, "node_modules/read-package-json/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -21620,9 +21633,9 @@ } }, "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -21638,9 +21651,9 @@ } }, "node_modules/read-package-json/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -21954,15 +21967,15 @@ } }, "node_modules/redis": { - "version": "4.6.13", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.13.tgz", - "integrity": "sha512-MHgkS4B+sPjCXpf+HfdetBwbRz6vCtsceTmw1pHNYJAsYxrfpOP6dz+piJWGos8wqG7qb3vj/Rrc5qOlmInUuA==", + "version": "4.6.14", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.14.tgz", + "integrity": "sha512-GrNg/e33HtsQwNXL7kJT+iNFPSwE1IPmd7wzV3j4f2z0EYxZfZE7FVTmUysgAtqQQtg5NXF5SNLR9OdO/UHOfw==", "workspaces": [ "./packages/*" ], "dependencies": { "@redis/bloom": "1.2.0", - "@redis/client": "1.5.14", + "@redis/client": "1.5.16", "@redis/graph": "1.1.1", "@redis/json": "1.0.6", "@redis/search": "1.1.6", @@ -22400,6 +22413,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -22432,6 +22446,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -22572,6 +22587,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -22616,6 +22632,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -22625,9 +22642,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -22638,13 +22655,10 @@ "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "devOptional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -22652,24 +22666,6 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "devOptional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -22864,9 +22860,9 @@ } }, "node_modules/sigstore/node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -22899,9 +22895,9 @@ } }, "node_modules/sigstore/node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -22920,40 +22916,40 @@ } }, "node_modules/sigstore/node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/sigstore/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/sigstore/node_modules/glob/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -23004,9 +23000,9 @@ } }, "node_modules/sigstore/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "dependencies": { "minipass": "^7.0.3", @@ -23021,18 +23017,18 @@ } }, "node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/sigstore/node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "dependencies": { "minipass": "^7.0.3" @@ -23042,9 +23038,9 @@ } }, "node_modules/sigstore/node_modules/ssri/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -23309,6 +23305,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -23436,9 +23433,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", "dev": true }, "node_modules/split": { @@ -23521,6 +23518,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "optional": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -23671,6 +23669,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "optional": true, "dependencies": { "glob": "^7.1.3" @@ -23813,13 +23812,14 @@ "integrity": "sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==" }, "node_modules/streamx": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz", - "integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", + "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", "dev": true, "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" }, "optionalDependencies": { "bare-events": "^2.2.0" @@ -24156,22 +24156,22 @@ } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -24184,9 +24184,9 @@ "dev": true }, "node_modules/sucrase/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -24196,6 +24196,7 @@ "version": "8.1.2", "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net", "dev": true, "dependencies": { "component-emitter": "^1.3.0", @@ -24272,9 +24273,9 @@ } }, "node_modules/svelte-check": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.9.tgz", - "integrity": "sha512-hDQrk3L0osX07djQyMiXocKysTLfusqi8AriNcCiQxhQR49/LonYolcUGMtZ0fbUR8HTR198Prrgf52WWU9wEg==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.8.0.tgz", + "integrity": "sha512-7Nxn+3X97oIvMzYJ7t27w00qUf1Y52irE2RU2dQAd5PyvfGp4E7NLhFKVhb6PV2fx7dCRMpNKDIuazmGthjpSQ==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", @@ -24426,6 +24427,7 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -24482,9 +24484,9 @@ "dev": true }, "node_modules/tailwindcss": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", - "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", + "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -24662,9 +24664,9 @@ } }, "node_modules/terser": { - "version": "5.30.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.4.tgz", - "integrity": "sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ==", + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", + "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -24713,6 +24715,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -24742,9 +24745,9 @@ } }, "node_modules/testcontainers": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-10.8.2.tgz", - "integrity": "sha512-9Ink7NUyYZwOjQhk0C6R6basWy2WADNly+md3D9YDap0pcDr3C+vrO8Ah1bkYco/9Zg8VoYTHO+blkLeebBYkA==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-10.9.0.tgz", + "integrity": "sha512-LN+cKAOd61Up9SVMJW+3VFVGeVQG8JBqZhEQo2U0HBfIsAynyAXcsLBSo+KZrOfy9SBz7pGHctWN/KabLDbNFA==", "dev": true, "dependencies": { "@balena/dockerignore": "^1.0.2", @@ -24795,9 +24798,9 @@ } }, "node_modules/testcontainers/node_modules/tar-fs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", - "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", "dev": true, "dependencies": { "pump": "^3.0.0", @@ -24828,6 +24831,15 @@ "node": ">=14.14" } }, + "node_modules/text-decoder": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", + "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", @@ -25027,32 +25039,14 @@ } }, "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, "bin": { "nodetouch": "bin/nodetouch.js" } }, - "node_modules/touch/node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -25093,9 +25087,9 @@ "dev": true }, "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "version": "29.1.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.4.tgz", + "integrity": "sha512-YiHwDhSvCiItoAgsKtoLFCuakDzDsJ1DLDnSouTaTmdOcOwIkSzbLXduaQ6M5DRVhuZC/NYaaZ/mtHbWMv/S6Q==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -25111,10 +25105,11 @@ "ts-jest": "cli.js" }, "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", @@ -25124,6 +25119,9 @@ "@babel/core": { "optional": true }, + "@jest/transform": { + "optional": true + }, "@jest/types": { "optional": true }, @@ -25168,9 +25166,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "dev": true }, "node_modules/tsutils": { @@ -25209,9 +25207,9 @@ } }, "node_modules/tuf-js/node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -25244,9 +25242,9 @@ } }, "node_modules/tuf-js/node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -25265,40 +25263,40 @@ } }, "node_modules/tuf-js/node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/tuf-js/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/tuf-js/node_modules/glob/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -25349,9 +25347,9 @@ } }, "node_modules/tuf-js/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "dependencies": { "minipass": "^7.0.3", @@ -25366,18 +25364,18 @@ } }, "node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/tuf-js/node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "dependencies": { "minipass": "^7.0.3" @@ -25387,9 +25385,9 @@ } }, "node_modules/tuf-js/node_modules/ssri/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -25873,9 +25871,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "dev": true, "funding": [ { @@ -25892,8 +25890,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -26010,9 +26008,9 @@ } }, "node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", "engines": { "node": ">= 0.10" } @@ -26163,9 +26161,9 @@ } }, "node_modules/vite-node": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.5.0.tgz", - "integrity": "sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", + "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -26575,9 +26573,9 @@ } }, "node_modules/vite-node/node_modules/rollup": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.3.tgz", - "integrity": "sha512-Ygm4fFO4usWcAG3Ud36Lmif5nudoi0X6QPLC+kRgrRjulAbmFkaTawP7fTIkRDnCNSf/4IAQzXM1T8e691kRtw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -26590,29 +26588,29 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.16.3", - "@rollup/rollup-android-arm64": "4.16.3", - "@rollup/rollup-darwin-arm64": "4.16.3", - "@rollup/rollup-darwin-x64": "4.16.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.16.3", - "@rollup/rollup-linux-arm-musleabihf": "4.16.3", - "@rollup/rollup-linux-arm64-gnu": "4.16.3", - "@rollup/rollup-linux-arm64-musl": "4.16.3", - "@rollup/rollup-linux-powerpc64le-gnu": "4.16.3", - "@rollup/rollup-linux-riscv64-gnu": "4.16.3", - "@rollup/rollup-linux-s390x-gnu": "4.16.3", - "@rollup/rollup-linux-x64-gnu": "4.16.3", - "@rollup/rollup-linux-x64-musl": "4.16.3", - "@rollup/rollup-win32-arm64-msvc": "4.16.3", - "@rollup/rollup-win32-ia32-msvc": "4.16.3", - "@rollup/rollup-win32-x64-msvc": "4.16.3", + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", "fsevents": "~2.3.2" } }, "node_modules/vite-node/node_modules/vite": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", - "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.12.tgz", + "integrity": "sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==", "dev": true, "dependencies": { "esbuild": "^0.20.1", @@ -27362,6 +27360,15 @@ "node": ">= 12.0.0" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -27644,9 +27651,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.3.tgz", + "integrity": "sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==", "dev": true, "bin": { "yaml": "bin.mjs" @@ -27782,6 +27789,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -27833,8 +27841,8 @@ "js-nacl": "^1.4.0" } }, - "packages/federation-server": { - "name": "@twake/federation-server", + "packages/federated-identity-service": { + "name": "@twake/federated-identity-service", "version": "0.0.1", "license": "AGPL-3.0-or-later", "dependencies": { @@ -27850,10 +27858,9 @@ "@crowdsec/express-bouncer": "^0.1.0" } }, - "packages/federation-server/node_modules/ip-address": { + "packages/federated-identity-service/node_modules/ip-address": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "license": "MIT", "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -27862,10 +27869,9 @@ "node": ">= 12" } }, - "packages/federation-server/node_modules/sprintf-js": { + "packages/federated-identity-service/node_modules/sprintf-js": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + "license": "BSD-3-Clause" }, "packages/logger": { "name": "@twake/logger", From 46328b9ee8155f80c16a39ee2341131fcc930634 Mon Sep 17 00:00:00 2001 From: jcabannes Date: Thu, 6 Jun 2024 15:40:40 +0000 Subject: [PATCH 5/6] chore: update documentation --- docs/openapi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/openapi.json b/docs/openapi.json index bde22a78..f6c04052 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1 +1 @@ -{"openapi":"3.0.0","info":{"title":"Twake on Matrix APIs documentation","version":"0.0.1","description":"This is The documentation of all available APIs of this repository"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"MatrixError":{"type":"object","properties":{"errcode":{"type":"string","description":"A Matrix error code"},"error":{"type":"string","description":"A human-readable error message"}},"required":["error"]},"MutualRooms":{"type":"array","items":{"type":"object","properties":{"roomId":{"type":"string","description":"the room id"},"name":{"type":"string","description":"the room name"},"topic":{"type":"string","description":"the room topic"},"room_type":{"type":"string","description":"the room type"}}}},"PrivateNote":{"type":"object","properties":{"id":{"type":"string","description":"The private note id"},"content":{"type":"string","description":"The private note content"},"authorId":{"type":"string","description":"The author user id"},"targetId":{"type":"string","description":"The target user id"}}},"CreatePrivateNote":{"type":"object","properties":{"content":{"type":"string","description":"The private note content"},"authorId":{"type":"string","description":"The author user id"},"targetId":{"type":"string","description":"The target user id"}}},"UpdatePrivateNote":{"type":"object","properties":{"id":{"type":"string","description":"The private note id"},"content":{"type":"string","description":"The private note content"}}},"RoomTags":{"type":"object","properties":{"tags":{"description":"the room tags list","type":"array","items":{"type":"string"}}}},"RoomTagCreation":{"type":"object","properties":{"content":{"type":"array","description":"the room tags strings","items":{"type":"string"}},"roomId":{"type":"string","description":"the room id"}}},"RoomTagsUpdate":{"type":"object","properties":{"content":{"type":"array","description":"the room tags strings","items":{"type":"string"}}}},"sms":{"type":"object","properties":{"to":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"text":{"type":"string"}}},"UserInfo":{"type":"object","properties":{"uid":{"type":"string","description":"the user id"},"givenName":{"type":"string","description":"the user given name"},"sn":{"type":"string","description":"the user surname"}}}},"responses":{"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"The message describing the internal error"}}}}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"example":{"errcode":"M_UNAUTHORIZED","error":"Unauthorized"}}}},"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"example":{"errcode":"M_MISSING_PARAMS","error":"Properties are missing in the request body"}}}},"Forbidden":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"example":{"errcode":"M_FORBIDDEN","error":"Forbidden"}}}},"Conflict":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"example":{"error":"Conflict"}}}},"PermanentRedirect":{"description":"Permanent Redirect","headers":{"Location":{"schema":{"type":"string","description":"URL to use for recdirect"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"example":{"errcode":"M_UNKNOWN","error":"This non-standard endpoint has been removed"}}}},"NotFound":{"description":"Private note not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"example":{"errcode":"M_NOT_FOUND","error":"Not Found"}}}},"Unrecognized":{"description":"Unrecognized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"example":{"errcode":"M_UNRECOGNIZED","error":"Unrecognized"}}}},"InternalError":{"description":"Internal error"},"Created":{"description":"Created"},"NoContent":{"description":"operation successful and no content returned"}},"parameters":{"target_userid":{"name":"target_userid","in":"path","required":true,"description":"the target user id","schema":{"type":"string"}},"user_id":{"name":"user_id","in":"query","description":"the author user id","required":true,"schema":{"type":"string"}},"target_user_id":{"name":"target_user_id","in":"query","description":"the target user id","required":true,"schema":{"type":"string"}},"private_note_id":{"name":"private_note_id","in":"path","description":"the private note id","required":true,"schema":{"type":"string"}},"roomId":{"in":"path","name":"roomId","description":"the room id","required":true,"schema":{"type":"string"}},"userId":{"in":"path","name":"userId","description":"the user id","required":true,"schema":{"type":"string"}}}},"security":[{"bearerAuth":[]}],"paths":{"/_matrix/identity/v2":{"get":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#get_matrixidentityv2"}},"/_matrix/identity/v2/hash_details":{"get":{"tags":["Federation server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#get_matrixidentityv2hash_details"}},"/_matrix/identity/v2/lookup":{"post":{"tags":["Federation server"],"description":"Extends https://spec.matrix.org/v1.6/identity-service-api/#post_matrixidentityv2lookup to display inactive users and 3PID users","requestBody":{"description":"Object containing hashes of mails/phones to search","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"addresses":{"type":"array","items":{"type":"string","description":"List of (hashed) addresses to lookup"}},"algorithm":{"type":"string","description":"Algorithm the client is using to encode the addresses"},"pepper":{"type":"string","description":"Pepper from '/hash_details'"}},"required":["addresses","algorithm","pepper"]},"example":{"addresses":["4kenr7N9drpCJ4AfalmlGQVsOn3o2RHjkADUpXJWZUc","nlo35_T5fzSGZzJApqu8lgIudJvmOQtDaHtr-I4rU7I"],"algorithm":"sha256","pepper":"matrixrocks"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"mappings":{"type":"object","additionalProperties":{"type":"string"},"description":"List of active accounts"},"inactive_mappings":{"type":"object","additionalProperties":{"type":"string"},"description":"List of inactive accounts"},"third_party_mappings":{"type":"object","description":"List of hashed addresses by identity server hostname","properties":{"hostname":{"type":"object","properties":{"actives":{"type":"array","items":{"type":"string","description":"List of (hashed) active accounts addresses matching request body addresses"}},"inactives":{"type":"array","items":{"type":"string","description":"List of (hashed) inactive accounts addresses matching request body addresses"}}}}}}}},"example":{"mappings":{"4kenr7N9drpCJ4AfalmlGQVsOn3o2RHjkADUpXJWZUc":"@dwho:company.com"},"inactive_mappings":{"nlo35_T5fzSGZzJApqu8lgIudJvmOQtDaHtr-I4rU7I":"@rtyler:company.com"},"third_party_mappings":{"identity1.example.com":{"actives":["78jnr7N9drpCJ4AfalmlGQVsOn3o2RHjkADUpXJWZUc","gtr42_T5fzSGZzJAmlp5lgIudJvmOQtDaHtr-I4rU7I"],"inactives":["qfgt57N9drpCJ4AfalmlGQVsOn3o2RHjkADUpXJWZUc","lnbc8_T5fzSGZzJAmlp5lgIudJvmOQtDaHtr-I4rU7I"]}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/Unrecognized"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_matrix/identity/v2/account":{"get":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#get_matrixidentityv2account"}},"/_matrix/identity/v2/account/register":{"post":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#post_matrixidentityv2accountregister"}},"/_matrix/identity/v2/account/logout":{"post":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#post_matrixidentityv2accountlogout"}},"/_matrix/identity/v2/terms":{"get":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#get_matrixidentityv2terms"}},"/_matrix/identity/v2/validate/email/requestToken":{"post":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#post_matrixidentityv2validateemailrequesttoken"}},"/_matrix/identity/v2/validate/email/submitToken":{"post":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#post_matrixidentityv2validateemailsubmittoken"}},"/_matrix/identity/versions":{"get":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#get_matrixidentityversions"}},"/_twake/identity/v1/lookup/match":{"post":{"tags":["Identity server"],"description":"Looks up the Organization User IDs which match value sent","requestBody":{"description":"Object containing detail for the search and the returned data","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"scope":{"type":"array","items":{"type":"string","description":"List of fields to search in (uid, mail,...)"}},"fields":{"type":"array","items":{"type":"string","description":"List of fields to return for matching users (uid, mail, mobile, displayName, givenName, cn, sn)"}},"val":{"type":"string","description":"Optional value to search"},"limit":{"type":"integer","description":"Optional max number of result to return (default 30)"},"offset":{"type":"integer","description":"Optional offset for pagination"}},"required":["scope","fields"]},"example":{"scope":["mail","uid"],"fields":["uid","displayName","sn","givenName","mobile"],"val":"rtyler","limit":3}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"matches":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string","description":"Matrix address"},"uid":{"type":"string","description":"id of a matching user"},"mail":{"type":"string","description":"email address of a matching user"}}},"description":"List of users that match"}}},"example":{"matches":[{"uid":"dwho","mail":"dwho@badwolf.com"}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/_twake/identity/v1/lookup/diff":{"post":{"tags":["Identity server"],"description":"Looks up the Organization User IDs updated since X","requestBody":{"description":"Object containing the timestamp","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"since":{"type":"integer","description":"timestamp"},"fields":{"type":"array","items":{"type":"string","description":"List of fields to return for matching users"}},"limit":{"type":"integer","description":"Optional max number of result to return (default 30)"},"offset":{"type":"integer","description":"Optional offset for pagination"}}},"example":{"since":1685074279,"fields":["uid","mail"],"limit":3}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"matches":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string","description":"Matrix address"},"timestamp":{"type":"integer","description":"current server timestamp"},"uid":{"type":"string","description":"id of a matching user"},"mail":{"type":"string","description":"email address of a matching user"}}},"description":"List of users that match"}}},"example":{"matches":[{"uid":"dwho","mail":"dwho@badwolf.com"}]}}}}}}},"/_twake/recoveryWords":{"get":{"tags":["Vault API"],"description":"Allow for the connected user to retrieve its recovery words","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"words":{"type":"string","description":"Recovery words of the connected user"}}},"example":{"words":"This is the recovery sentence of rtyler"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Connected user has no recovery sentence"}}},"example":{"error":"User has no recovery sentence"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Connected user has multiple recovery sentence"}}},"example":{"error":"User has more than one recovery sentence"}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}},"post":{"tags":["Vault API"],"description":"Store connected user recovery words in database","requestBody":{"description":"Object containing the recovery words of the connected user","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"words":{"type":"string","description":"The recovery words of the connected user"}},"required":["words"]},"example":{"words":"This is the recovery sentence of rtyler"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Message indicating that words have been successfully saved"}},"example":{"message":"Saved recovery words sucessfully"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"delete":{"tags":["Vault API"],"description":"Delete the user recovery words in the database","responses":{"204":{"description":"Delete success"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Connected user has no recovery sentence"}}},"example":{"error":"User has no recovery sentence"}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/.well-knwon/matrix/client":{"get":{"tags":["Auto configuration"],"description":"Get server metadata for auto configuration","responses":{"200":{"description":"Give server metadata","content":{"application/json":{"schema":{"type":"object","properties":{"m.homeserver":{"type":"object","properties":{"base_url":{"type":"string","description":"Base URL of Matrix server"}}},"m.identity_server":{"type":"object","properties":{"base_url":{"type":"string","description":"Base URL of Identity server"}}},"m.federation_servers":{"type":"object","properties":{"base_urls":{"type":"array","items":{"type":"string","description":"Base URL of Federation server"},"description":"Available Federation servers Base URL list"}}},"t.server":{"type":"object","properties":{"base_url":{"type":"string","description":"Base URL of Identity server"},"server_name":{"type":"string","description":"Domain handled by Matrix server"}}},"m.integrations":{"type":"object","properties":{"jitsi":{"type":"object","properties":{"preferredDomain":{"type":"string","description":"Jitsi's preffered domain"},"baseUrl":{"type":"string","description":"URL of Jitsi server"},"useJwt":{"type":"boolean","description":"True if Jitsi server requires a JWT"},"jwt":{"type":"object","properties":{"algorithm":{"type":"string","description":"algorithm used to generate JWT"},"secret":{"type":"string","description":"password of JWTs"},"issuer":{"type":"string","description":"issuer of JWTs"}}}}}}},"m.authentication":{"type":"object","properties":{"issuer":{"type":"string","description":"URL of OIDC issuer"}}}}},"example":{"m.homeserver":{"base_url":"matrix.example.com"},"m.identity_server":{"base_url":"global-id-server.twake.app"},"m.federation_servers":{"base_urls":["global-federation-server.twake.app","other-federation-server.twake.app"]},"m.integrations":{"jitsi":{"baseUrl":"https://jitsi.example.com/","preferredDomain":"jitsi.example.com","useJwt":false}},"m.authentication":{"issuer":"https://auth.example.com"},"t.server":{"base_url":"https://tom.example.com","server_name":"example.com"}}}}}}}},"/_matrix/identity/v2/lookups":{"post":{"tags":["Federation server"],"description":"Implements https://github.com/guimard/matrix-spec-proposals/blob/unified-identity-service/proposals/4004-unified-identity-service-view.md","requestBody":{"description":"Object containing hashes to store in federation server database","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mappings":{"type":"object","description":"List of hashed addresses by identity server hostname","properties":{"hostname":{"type":"array","items":{"type":"object","properties":{"hash":{"type":"string"},"active":{"type":"number"}}}}}},"algorithm":{"type":"string","description":"Algorithm the client is using to encode the addresses"},"pepper":{"type":"string","description":"Pepper from '/hash_details'"}},"required":["addresses","algorithm","pepper"]},"example":{"mappings":{"identity1.example.com":[{"hash":"4kenr7N9drpCJ4AfalmlGQVsOn3o2RHjkADUpXJWZUc","active":1},{"hash":"nlo35_T5fzSGZzJApqu8lgIudJvmOQtDaHtr-I4rU7I","active":0}]},"algorithm":"sha256","pepper":"matrixrocks"}}}},"responses":{"201":{"description":"Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/Unrecognized"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_matrix/app/v1/transactions/{txnId}":{"put":{"parameters":[{"in":"path","name":"txnId","required":true,"schema":{"type":"integer"},"description":"The transaction id"}],"tags":["Application server"],"description":"Implements https://spec.matrix.org/v1.6/application-service-api/#put_matrixappv1transactionstxnid","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"308":{"$ref":"#/components/responses/PermanentRedirect"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_matrix/app/v1/users/{userId}":{"get":{"parameters":[{"in":"path","name":"userId","required":true,"schema":{"type":"integer"},"description":"The user id"}],"tags":["Application server"],"description":"Implements https://spec.matrix.org/v1.6/application-service-api/#get_matrixappv1usersuserid","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_matrix/app/v1/rooms/{roomAlias}":{"get":{"parameters":[{"in":"path","name":"roomAlias","required":true,"schema":{"type":"integer"},"description":"The room alias"}],"tags":["Application server"],"description":"Implements https://spec.matrix.org/v1.6/application-service-api/#get_matrixappv1roomsroomalias","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_twake/app/v1/rooms":{"post":{"tags":["Application server"],"description":"Implements https://www.notion.so/Automatic-channels-89ba6f97bc90474ca482a28cf3228d3e","requestBody":{"description":"Object containing room's details","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ldapFilter":{"type":"object","additionalProperties":true,"description":"An object containing keys/values to build a ldap filter"},"aliasName":{"type":"string","description":"The desired room alias local part. If aliasName is equal to foo the complete room alias will be"},"name":{"type":"string","description":"The room name"},"topic":{"type":"string","description":"A short message detailing what is currently being discussed in the room."},"visibility":{"type":"string","enum":["public","private"],"description":"visibility values:\n * `public` - The room will be shown in the published room list\n * `private` - Hide the room from the published room list\n"}},"required":["ldapFilter","aliasName"]},"example":{"ldapFilter":{"mail":"example@test.com","cn":"example"},"aliasName":"exp","name":"Example","topic":"This is an example of a room topic","visibility":"public"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"errcode":{"type":"string"},"error":{"type":"string"}},"additionalProperties":{"type":"string"},"description":"List of users uid not added to the new room due to an error"},"example":[{"uid":"test1","errcode":"M_FORBIDDEN","error":"The user has been banned from the room"},{"uid":"test2","errcode":"M_UNKNOWN","error":"Internal server error"}]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"examples":{"example1":{"value":{"error":"Error field: Invalid value (property: name)"}},"example2":{"value":{"errcode":"M_NOT_JSON","error":"Not_json"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"examples":{"example1":{"value":{"error":"This room already exits in Twake database"}},"example2":{"value":{"errcode":"M_ROOM_IN_USE","error":"A room with alias foo already exists in Matrix database"}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_twake/mutual_rooms/{target_userid}":{"get":{"tags":["Mutual Rooms"],"description":"Get the list of mutual rooms between two users","parameters":[{"$ref":"#/components/parameters/target_userid"}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MutualRooms"}}}},"400":{"description":"Bad request"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal error"}}}},"/_twake/private_note":{"get":{"tags":["Private Note"],"description":"Get the private note made by the user for a target user","parameters":[{"$ref":"#/components/parameters/user_id"},{"$ref":"#/components/parameters/target_user_id"}],"responses":{"200":{"description":"Private note found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivateNote"}}}},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"404":{"description":"Private note not found"},"500":{"description":"Internal error"}}},"post":{"tags":["Private Note"],"description":"Create a private note for a target user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePrivateNote"}}}},"responses":{"201":{"description":"Private note created"},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"500":{"description":"Internal error"}}},"put":{"tags":["Private Note"],"description":"Update a private note","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePrivateNote"}}}},"responses":{"204":{"description":"Private note created"},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"500":{"description":"Internal error"}}}},"/_twake/private_note/{private_note_id}":{"delete":{"tags":["Private Note"],"description":"Delete a private note","parameters":[{"$ref":"#/components/parameters/private_note_id"}],"responses":{"204":{"description":"Private note deleted"},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"500":{"description":"Internal error"}}}},"/_twake/v1/room_tags/{roomId}":{"get":{"tags":["Room tags"],"description":"Get room tags","parameters":[{"$ref":"#/components/parameters/roomId"}],"responses":{"200":{"description":"Room tags found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomTags"}}}},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"500":{"description":"Internal error"}}},"put":{"tags":["Room tags"],"description":"Update room tags","parameters":[{"$ref":"#/components/parameters/roomId"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomTagsUpdate"}}}},"responses":{"204":{"description":"Room tags updated"},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"500":{"description":"Internal error"}}},"delete":{"tags":["Room tags"],"description":"delete tags for a room","parameters":[{"$ref":"#/components/parameters/roomId"}],"responses":{"204":{"description":"Room tags deleted"},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"500":{"description":"Internal error"}}}},"/_twake/v1/room_tags":{"post":{"tags":["Room tags"],"description":"Create room tags","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomTagCreation"}}}},"responses":{"201":{"description":"Room tags created"},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"500":{"description":"Internal error"}}}},"/_twake/app/v1/search":{"post":{"tags":["Search Engine"],"description":"Search performs with OpenSearch on Tchat messages and rooms","requestBody":{"description":"Object containing search query details","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"searchValue":{"type":"string","description":"Value used to perform the search on rooms and messages data"}},"required":["searchValue"]},"example":{"searchValue":"hello"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rooms":{"type":"array","description":"List of rooms whose name contains the search value","items":{"type":"object","properties":{"room_id":{"type":"string"},"name":{"type":"string"},"avatar_url":{"type":"string","description":"Url of the room's avatar"}}}},"messages":{"type":"array","description":"List of messages whose content or/and sender display name contain the search value","items":{"type":"object","properties":{"room_id":{"type":"string"},"event_id":{"type":"string","description":"Id of the message"},"content":{"type":"string"},"display_name":{"type":"string","description":"Sender display name"},"avatar_url":{"type":"string","description":"Sender's avatar url if it is a direct chat, otherwise it is the room's avatar url"},"room_name":{"type":"string","description":"Room's name in case of the message is not part of a direct chat"}}}},"mails":{"type":"array","description":"List of mails from Tmail whose meta or content contain the search value","items":{"type":"object","properties":{"attachments":{"type":"array","items":{"type":"object","properties":{"contentDisposition":{"type":"string"},"fileExtension":{"type":"string"},"fileName":{"type":"string"},"mediaType":{"type":"string"},"subtype":{"type":"string"},"textContent":{"type":"string"}}}},"bcc":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"domain":{"type":"string"},"name":{"type":"string"}}}},"cc":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"domain":{"type":"string"},"name":{"type":"string"}}}},"date":{"type":"string"},"from":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"domain":{"type":"string"},"name":{"type":"string"}}}},"hasAttachment":{"type":"boolean"},"headers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"}}}},"htmlBody":{"type":"string"},"isAnswered":{"type":"boolean"},"isDeleted":{"type":"boolean"},"isDraft":{"type":"boolean"},"isFlagged":{"type":"boolean"},"isRecent":{"type":"boolean"},"isUnread":{"type":"boolean"},"mailboxId":{"type":"string"},"mediaType":{"type":"string"},"messageId":{"type":"string"},"mimeMessageID":{"type":"string"},"modSeq":{"type":"number"},"saveDate":{"type":"string"},"sentDate":{"type":"string"},"size":{"type":"number"},"subject":{"type":"array","items":{"type":"string"}},"subtype":{"type":"string"},"textBody":{"type":"string"},"threadId":{"type":"string"},"to":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"domain":{"type":"string"},"name":{"type":"string"}}}},"uid":{"type":"number"},"userFlags":{"type":"array","items":{"type":"string"}}}}}}},"example":{"rooms":[{"room_id":"!dYqMpBXVQgKWETVAtJ:example.com","name":"Hello world room","avatar_url":"mxc://linagora.com/IBGFusHnOOzCNfePjaIVHpgR"},{"room_id":"!dugSgNYwppGGoeJwYB:example.com","name":"Worldwide room","avatar_url":null}],"messages":[{"room_id":"!dYqMpBXVQgKWETVAtJ:example.com","event_id":"$c0hW6db_GUjk0NRBUuO12IyMpi48LE_tQK6sH3dkd1U","content":"Hello world","display_name":"Anakin Skywalker","avatar_url":"mxc://linagora.com/IBGFusHnOOzCNfePjaIVHpgR","room_name":"Hello world room"},{"room_id":"!ftGqINYwppGGoeJwYB:example.com","event_id":"$IUzFofxHCvvoHJ-k2nfx7OlWOO8AuPvlHHqkeJLzxJ8","content":"Hello world my friends in direct chat","display_name":"Luke Skywalker","avatar_url":"mxc://matrix.org/wefh34uihSDRGhw34"}],"mails":[{"id":"message1","attachments":[{"contentDisposition":"attachment","fileExtension":"jpg","fileName":"image1.jpg","mediaType":"image/jpeg","textContent":"A beautiful galaxy far, far away."}],"bcc":[{"address":"okenobi@example.com","domain":"example.com","name":"Obi-Wan Kenobi"}],"cc":[{"address":"pamidala@example.com","domain":"example.com","name":"Padme Amidala"}],"date":"2024-02-24T10:15:00Z","from":[{"address":"dmaul@example.com","domain":"example.com","name":"Dark Maul"}],"hasAttachment":true,"headers":[{"name":"Header5","value":"Value5"},{"name":"Header6","value":"Value6"}],"htmlBody":"

A beautiful galaxy far, far away.

","isAnswered":true,"isDeleted":false,"isDraft":false,"isFlagged":true,"isRecent":true,"isUnread":false,"mailboxId":"mailbox3","mediaType":"image/jpeg","messageId":"message3","mimeMessageID":"mimeMessageID3","modSeq":98765,"saveDate":"2024-02-24T10:15:00Z","sentDate":"2024-02-24T10:15:00Z","size":4096,"subject":["Star Wars Message 3"],"subtype":"subtype3","textBody":"A beautiful galaxy far, far away.","threadId":"thread3","to":[{"address":"kren@example.com","domain":"example.com","name":"Kylo Ren"}],"uid":987654,"userFlags":["Flag4","Flag5"]}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/Unrecognized"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_twake/app/v1/opensearch/restore":{"post":{"tags":["Search Engine"],"description":"Restore OpenSearch indexes using Matrix homeserver database","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"204":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"405":{"$ref":"#/components/responses/Unrecognized"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_twake/sms":{"post":{"requestBody":{"description":"SMS object","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sms"}}}},"tags":["SMS"],"description":"Send an SMS to a phone number","responses":{"200":{"description":"SMS sent successfully"},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"},"500":{"description":"Internal server error"}}}},"/_twake/v1/user_info/{userId}":{"get":{"tags":["User Info"],"description":"Get user info","parameters":[{"$ref":"#/components/parameters/userId"}],"responses":{"200":{"description":"User info found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserInfo"}}}},"400":{"description":"Bad request"},"401":{"description":"Unauthorized"},"404":{"description":"User info not found"},"500":{"description":"Internal server error"}}}}},"tags":[]} \ No newline at end of file +{"openapi":"3.0.0","info":{"title":"Twake on Matrix APIs documentation","version":"0.0.1","description":"This is The documentation of all available APIs of this repository"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"MatrixError":{"type":"object","properties":{"errcode":{"type":"string","description":"A Matrix error code"},"error":{"type":"string","description":"A human-readable error message"}},"required":["error"]},"MutualRooms":{"type":"array","items":{"type":"object","properties":{"roomId":{"type":"string","description":"the room id"},"name":{"type":"string","description":"the room name"},"topic":{"type":"string","description":"the room topic"},"room_type":{"type":"string","description":"the room type"}}}},"PrivateNote":{"type":"object","properties":{"id":{"type":"string","description":"The private note id"},"content":{"type":"string","description":"The private note content"},"authorId":{"type":"string","description":"The author user id"},"targetId":{"type":"string","description":"The target user id"}}},"CreatePrivateNote":{"type":"object","properties":{"content":{"type":"string","description":"The private note content"},"authorId":{"type":"string","description":"The author user id"},"targetId":{"type":"string","description":"The target user id"}}},"UpdatePrivateNote":{"type":"object","properties":{"id":{"type":"string","description":"The private note id"},"content":{"type":"string","description":"The private note content"}}},"RoomTags":{"type":"object","properties":{"tags":{"description":"the room tags list","type":"array","items":{"type":"string"}}}},"RoomTagCreation":{"type":"object","properties":{"content":{"type":"array","description":"the room tags strings","items":{"type":"string"}},"roomId":{"type":"string","description":"the room id"}}},"RoomTagsUpdate":{"type":"object","properties":{"content":{"type":"array","description":"the room tags strings","items":{"type":"string"}}}},"sms":{"type":"object","properties":{"to":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"text":{"type":"string"}}},"UserInfo":{"type":"object","properties":{"uid":{"type":"string","description":"the user id"},"givenName":{"type":"string","description":"the user given name"},"sn":{"type":"string","description":"the user surname"}}}},"responses":{"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"The message describing the internal error"}}}}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"example":{"errcode":"M_UNAUTHORIZED","error":"Unauthorized"}}}},"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"example":{"errcode":"M_MISSING_PARAMS","error":"Properties are missing in the request body"}}}},"Forbidden":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"example":{"errcode":"M_FORBIDDEN","error":"Forbidden"}}}},"Conflict":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"example":{"error":"Conflict"}}}},"PermanentRedirect":{"description":"Permanent Redirect","headers":{"Location":{"schema":{"type":"string","description":"URL to use for recdirect"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"example":{"errcode":"M_UNKNOWN","error":"This non-standard endpoint has been removed"}}}},"NotFound":{"description":"Private note not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"example":{"errcode":"M_NOT_FOUND","error":"Not Found"}}}},"Unrecognized":{"description":"Unrecognized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"example":{"errcode":"M_UNRECOGNIZED","error":"Unrecognized"}}}},"InternalError":{"description":"Internal error"},"Created":{"description":"Created"},"NoContent":{"description":"operation successful and no content returned"}},"parameters":{"target_userid":{"name":"target_userid","in":"path","required":true,"description":"the target user id","schema":{"type":"string"}},"user_id":{"name":"user_id","in":"query","description":"the author user id","required":true,"schema":{"type":"string"}},"target_user_id":{"name":"target_user_id","in":"query","description":"the target user id","required":true,"schema":{"type":"string"}},"private_note_id":{"name":"private_note_id","in":"path","description":"the private note id","required":true,"schema":{"type":"string"}},"roomId":{"in":"path","name":"roomId","description":"the room id","required":true,"schema":{"type":"string"}},"userId":{"in":"path","name":"userId","description":"the user id","required":true,"schema":{"type":"string"}}}},"security":[{"bearerAuth":[]}],"paths":{"/_matrix/identity/v2":{"get":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#get_matrixidentityv2"}},"/_matrix/identity/v2/hash_details":{"get":{"tags":["Federated identity service"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#get_matrixidentityv2hash_details"}},"/_matrix/identity/v2/lookup":{"post":{"tags":["Federated identity service"],"description":"Extends https://spec.matrix.org/v1.6/identity-service-api/#post_matrixidentityv2lookup to display inactive users and 3PID users","requestBody":{"description":"Object containing hashes of mails/phones to search","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"addresses":{"type":"array","items":{"type":"string","description":"List of (hashed) addresses to lookup"}},"algorithm":{"type":"string","description":"Algorithm the client is using to encode the addresses"},"pepper":{"type":"string","description":"Pepper from '/hash_details'"}},"required":["addresses","algorithm","pepper"]},"example":{"addresses":["4kenr7N9drpCJ4AfalmlGQVsOn3o2RHjkADUpXJWZUc","nlo35_T5fzSGZzJApqu8lgIudJvmOQtDaHtr-I4rU7I"],"algorithm":"sha256","pepper":"matrixrocks"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"mappings":{"type":"object","additionalProperties":{"type":"string"},"description":"List of active accounts"},"inactive_mappings":{"type":"object","additionalProperties":{"type":"string"},"description":"List of inactive accounts"},"third_party_mappings":{"type":"object","description":"List of hashed addresses by identity server hostname","properties":{"hostname":{"type":"object","properties":{"actives":{"type":"array","items":{"type":"string","description":"List of (hashed) active accounts addresses matching request body addresses"}},"inactives":{"type":"array","items":{"type":"string","description":"List of (hashed) inactive accounts addresses matching request body addresses"}}}}}}}},"example":{"mappings":{"4kenr7N9drpCJ4AfalmlGQVsOn3o2RHjkADUpXJWZUc":"@dwho:company.com"},"inactive_mappings":{"nlo35_T5fzSGZzJApqu8lgIudJvmOQtDaHtr-I4rU7I":"@rtyler:company.com"},"third_party_mappings":{"identity1.example.com":{"actives":["78jnr7N9drpCJ4AfalmlGQVsOn3o2RHjkADUpXJWZUc","gtr42_T5fzSGZzJAmlp5lgIudJvmOQtDaHtr-I4rU7I"],"inactives":["qfgt57N9drpCJ4AfalmlGQVsOn3o2RHjkADUpXJWZUc","lnbc8_T5fzSGZzJAmlp5lgIudJvmOQtDaHtr-I4rU7I"]}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/Unrecognized"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_matrix/identity/v2/account":{"get":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#get_matrixidentityv2account"}},"/_matrix/identity/v2/account/register":{"post":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#post_matrixidentityv2accountregister"}},"/_matrix/identity/v2/account/logout":{"post":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#post_matrixidentityv2accountlogout"}},"/_matrix/identity/v2/terms":{"get":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#get_matrixidentityv2terms"}},"/_matrix/identity/v2/validate/email/requestToken":{"post":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#post_matrixidentityv2validateemailrequesttoken"}},"/_matrix/identity/v2/validate/email/submitToken":{"post":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#post_matrixidentityv2validateemailsubmittoken"}},"/_matrix/identity/versions":{"get":{"tags":["Identity server"],"description":"Implements https://spec.matrix.org/v1.6/identity-service-api/#get_matrixidentityversions"}},"/_twake/identity/v1/lookup/match":{"post":{"tags":["Identity server"],"description":"Looks up the Organization User IDs which match value sent","requestBody":{"description":"Object containing detail for the search and the returned data","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"scope":{"type":"array","items":{"type":"string","description":"List of fields to search in (uid, mail,...)"}},"fields":{"type":"array","items":{"type":"string","description":"List of fields to return for matching users (uid, mail, mobile, displayName, givenName, cn, sn)"}},"val":{"type":"string","description":"Optional value to search"},"limit":{"type":"integer","description":"Optional max number of result to return (default 30)"},"offset":{"type":"integer","description":"Optional offset for pagination"}},"required":["scope","fields"]},"example":{"scope":["mail","uid"],"fields":["uid","displayName","sn","givenName","mobile"],"val":"rtyler","limit":3}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"matches":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string","description":"Matrix address"},"uid":{"type":"string","description":"id of a matching user"},"mail":{"type":"string","description":"email address of a matching user"}}},"description":"List of users that match"}}},"example":{"matches":[{"uid":"dwho","mail":"dwho@badwolf.com"}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/_twake/identity/v1/lookup/diff":{"post":{"tags":["Identity server"],"description":"Looks up the Organization User IDs updated since X","requestBody":{"description":"Object containing the timestamp","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"since":{"type":"integer","description":"timestamp"},"fields":{"type":"array","items":{"type":"string","description":"List of fields to return for matching users"}},"limit":{"type":"integer","description":"Optional max number of result to return (default 30)"},"offset":{"type":"integer","description":"Optional offset for pagination"}}},"example":{"since":1685074279,"fields":["uid","mail"],"limit":3}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"matches":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string","description":"Matrix address"},"timestamp":{"type":"integer","description":"current server timestamp"},"uid":{"type":"string","description":"id of a matching user"},"mail":{"type":"string","description":"email address of a matching user"}}},"description":"List of users that match"}}},"example":{"matches":[{"uid":"dwho","mail":"dwho@badwolf.com"}]}}}}}}},"/_twake/recoveryWords":{"get":{"tags":["Vault API"],"description":"Allow for the connected user to retrieve its recovery words","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"words":{"type":"string","description":"Recovery words of the connected user"}}},"example":{"words":"This is the recovery sentence of rtyler"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Connected user has no recovery sentence"}}},"example":{"error":"User has no recovery sentence"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Connected user has multiple recovery sentence"}}},"example":{"error":"User has more than one recovery sentence"}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}},"post":{"tags":["Vault API"],"description":"Store connected user recovery words in database","requestBody":{"description":"Object containing the recovery words of the connected user","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"words":{"type":"string","description":"The recovery words of the connected user"}},"required":["words"]},"example":{"words":"This is the recovery sentence of rtyler"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Message indicating that words have been successfully saved"}},"example":{"message":"Saved recovery words sucessfully"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"delete":{"tags":["Vault API"],"description":"Delete the user recovery words in the database","responses":{"204":{"description":"Delete success"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Connected user has no recovery sentence"}}},"example":{"error":"User has no recovery sentence"}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/.well-knwon/matrix/client":{"get":{"tags":["Auto configuration"],"description":"Get server metadata for auto configuration","responses":{"200":{"description":"Give server metadata","content":{"application/json":{"schema":{"type":"object","properties":{"m.homeserver":{"type":"object","properties":{"base_url":{"type":"string","description":"Base URL of Matrix server"}}},"m.identity_server":{"type":"object","properties":{"base_url":{"type":"string","description":"Base URL of Identity server"}}},"m.federated_identity_services":{"type":"object","properties":{"base_urls":{"type":"array","items":{"type":"string","description":"Base URL of Federated identity service"},"description":"Available Federated identity services Base URL list"}}},"t.server":{"type":"object","properties":{"base_url":{"type":"string","description":"Base URL of Identity server"},"server_name":{"type":"string","description":"Domain handled by Matrix server"}}},"m.integrations":{"type":"object","properties":{"jitsi":{"type":"object","properties":{"preferredDomain":{"type":"string","description":"Jitsi's preffered domain"},"baseUrl":{"type":"string","description":"URL of Jitsi server"},"useJwt":{"type":"boolean","description":"True if Jitsi server requires a JWT"},"jwt":{"type":"object","properties":{"algorithm":{"type":"string","description":"algorithm used to generate JWT"},"secret":{"type":"string","description":"password of JWTs"},"issuer":{"type":"string","description":"issuer of JWTs"}}}}}}},"m.authentication":{"type":"object","properties":{"issuer":{"type":"string","description":"URL of OIDC issuer"}}}}},"example":{"m.homeserver":{"base_url":"matrix.example.com"},"m.identity_server":{"base_url":"global-id-server.twake.app"},"m.federated_identity_services":{"base_urls":["global-federated_identity_service.twake.app","other-federated-identity-service.twake.app"]},"m.integrations":{"jitsi":{"baseUrl":"https://jitsi.example.com/","preferredDomain":"jitsi.example.com","useJwt":false}},"m.authentication":{"issuer":"https://auth.example.com"},"t.server":{"base_url":"https://tom.example.com","server_name":"example.com"}}}}}}}},"/_matrix/identity/v2/lookups":{"post":{"tags":["Federated identity service"],"description":"Implements https://github.com/guimard/matrix-spec-proposals/blob/unified-identity-service/proposals/4004-unified-identity-service-view.md","requestBody":{"description":"Object containing hashes to store in federated identity service database","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mappings":{"type":"object","description":"List of hashed addresses by identity server hostname","properties":{"hostname":{"type":"array","items":{"type":"object","properties":{"hash":{"type":"string"},"active":{"type":"number"}}}}}},"algorithm":{"type":"string","description":"Algorithm the client is using to encode the addresses"},"pepper":{"type":"string","description":"Pepper from '/hash_details'"}},"required":["addresses","algorithm","pepper"]},"example":{"mappings":{"identity1.example.com":[{"hash":"4kenr7N9drpCJ4AfalmlGQVsOn3o2RHjkADUpXJWZUc","active":1},{"hash":"nlo35_T5fzSGZzJApqu8lgIudJvmOQtDaHtr-I4rU7I","active":0}]},"algorithm":"sha256","pepper":"matrixrocks"}}}},"responses":{"201":{"description":"Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/Unrecognized"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_matrix/app/v1/transactions/{txnId}":{"put":{"parameters":[{"in":"path","name":"txnId","required":true,"schema":{"type":"integer"},"description":"The transaction id"}],"tags":["Application server"],"description":"Implements https://spec.matrix.org/v1.6/application-service-api/#put_matrixappv1transactionstxnid","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"308":{"$ref":"#/components/responses/PermanentRedirect"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_matrix/app/v1/users/{userId}":{"get":{"parameters":[{"in":"path","name":"userId","required":true,"schema":{"type":"integer"},"description":"The user id"}],"tags":["Application server"],"description":"Implements https://spec.matrix.org/v1.6/application-service-api/#get_matrixappv1usersuserid","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_matrix/app/v1/rooms/{roomAlias}":{"get":{"parameters":[{"in":"path","name":"roomAlias","required":true,"schema":{"type":"integer"},"description":"The room alias"}],"tags":["Application server"],"description":"Implements https://spec.matrix.org/v1.6/application-service-api/#get_matrixappv1roomsroomalias","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_twake/app/v1/rooms":{"post":{"tags":["Application server"],"description":"Implements https://www.notion.so/Automatic-channels-89ba6f97bc90474ca482a28cf3228d3e","requestBody":{"description":"Object containing room's details","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ldapFilter":{"type":"object","additionalProperties":true,"description":"An object containing keys/values to build a ldap filter"},"aliasName":{"type":"string","description":"The desired room alias local part. If aliasName is equal to foo the complete room alias will be"},"name":{"type":"string","description":"The room name"},"topic":{"type":"string","description":"A short message detailing what is currently being discussed in the room."},"visibility":{"type":"string","enum":["public","private"],"description":"visibility values:\n * `public` - The room will be shown in the published room list\n * `private` - Hide the room from the published room list\n"}},"required":["ldapFilter","aliasName"]},"example":{"ldapFilter":{"mail":"example@test.com","cn":"example"},"aliasName":"exp","name":"Example","topic":"This is an example of a room topic","visibility":"public"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"errcode":{"type":"string"},"error":{"type":"string"}},"additionalProperties":{"type":"string"},"description":"List of users uid not added to the new room due to an error"},"example":[{"uid":"test1","errcode":"M_FORBIDDEN","error":"The user has been banned from the room"},{"uid":"test2","errcode":"M_UNKNOWN","error":"Internal server error"}]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"examples":{"example1":{"value":{"error":"Error field: Invalid value (property: name)"}},"example2":{"value":{"errcode":"M_NOT_JSON","error":"Not_json"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixError"},"examples":{"example1":{"value":{"error":"This room already exits in Twake database"}},"example2":{"value":{"errcode":"M_ROOM_IN_USE","error":"A room with alias foo already exists in Matrix database"}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_twake/mutual_rooms/{target_userid}":{"get":{"tags":["Mutual Rooms"],"description":"Get the list of mutual rooms between two users","parameters":[{"$ref":"#/components/parameters/target_userid"}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MutualRooms"}}}},"400":{"description":"Bad request"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal error"}}}},"/_twake/private_note":{"get":{"tags":["Private Note"],"description":"Get the private note made by the user for a target user","parameters":[{"$ref":"#/components/parameters/user_id"},{"$ref":"#/components/parameters/target_user_id"}],"responses":{"200":{"description":"Private note found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivateNote"}}}},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"404":{"description":"Private note not found"},"500":{"description":"Internal error"}}},"post":{"tags":["Private Note"],"description":"Create a private note for a target user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePrivateNote"}}}},"responses":{"201":{"description":"Private note created"},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"500":{"description":"Internal error"}}},"put":{"tags":["Private Note"],"description":"Update a private note","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePrivateNote"}}}},"responses":{"204":{"description":"Private note created"},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"500":{"description":"Internal error"}}}},"/_twake/private_note/{private_note_id}":{"delete":{"tags":["Private Note"],"description":"Delete a private note","parameters":[{"$ref":"#/components/parameters/private_note_id"}],"responses":{"204":{"description":"Private note deleted"},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"500":{"description":"Internal error"}}}},"/_twake/v1/room_tags/{roomId}":{"get":{"tags":["Room tags"],"description":"Get room tags","parameters":[{"$ref":"#/components/parameters/roomId"}],"responses":{"200":{"description":"Room tags found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomTags"}}}},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"500":{"description":"Internal error"}}},"put":{"tags":["Room tags"],"description":"Update room tags","parameters":[{"$ref":"#/components/parameters/roomId"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomTagsUpdate"}}}},"responses":{"204":{"description":"Room tags updated"},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"500":{"description":"Internal error"}}},"delete":{"tags":["Room tags"],"description":"delete tags for a room","parameters":[{"$ref":"#/components/parameters/roomId"}],"responses":{"204":{"description":"Room tags deleted"},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"500":{"description":"Internal error"}}}},"/_twake/v1/room_tags":{"post":{"tags":["Room tags"],"description":"Create room tags","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomTagCreation"}}}},"responses":{"201":{"description":"Room tags created"},"400":{"description":"Bad request"},"401":{"description":"user is unauthorized"},"500":{"description":"Internal error"}}}},"/_twake/app/v1/search":{"post":{"tags":["Search Engine"],"description":"Search performs with OpenSearch on Tchat messages and rooms","requestBody":{"description":"Object containing search query details","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"searchValue":{"type":"string","description":"Value used to perform the search on rooms and messages data"}},"required":["searchValue"]},"example":{"searchValue":"hello"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rooms":{"type":"array","description":"List of rooms whose name contains the search value","items":{"type":"object","properties":{"room_id":{"type":"string"},"name":{"type":"string"},"avatar_url":{"type":"string","description":"Url of the room's avatar"}}}},"messages":{"type":"array","description":"List of messages whose content or/and sender display name contain the search value","items":{"type":"object","properties":{"room_id":{"type":"string"},"event_id":{"type":"string","description":"Id of the message"},"content":{"type":"string"},"display_name":{"type":"string","description":"Sender display name"},"avatar_url":{"type":"string","description":"Sender's avatar url if it is a direct chat, otherwise it is the room's avatar url"},"room_name":{"type":"string","description":"Room's name in case of the message is not part of a direct chat"}}}},"mails":{"type":"array","description":"List of mails from Tmail whose meta or content contain the search value","items":{"type":"object","properties":{"attachments":{"type":"array","items":{"type":"object","properties":{"contentDisposition":{"type":"string"},"fileExtension":{"type":"string"},"fileName":{"type":"string"},"mediaType":{"type":"string"},"subtype":{"type":"string"},"textContent":{"type":"string"}}}},"bcc":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"domain":{"type":"string"},"name":{"type":"string"}}}},"cc":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"domain":{"type":"string"},"name":{"type":"string"}}}},"date":{"type":"string"},"from":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"domain":{"type":"string"},"name":{"type":"string"}}}},"hasAttachment":{"type":"boolean"},"headers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"}}}},"htmlBody":{"type":"string"},"isAnswered":{"type":"boolean"},"isDeleted":{"type":"boolean"},"isDraft":{"type":"boolean"},"isFlagged":{"type":"boolean"},"isRecent":{"type":"boolean"},"isUnread":{"type":"boolean"},"mailboxId":{"type":"string"},"mediaType":{"type":"string"},"messageId":{"type":"string"},"mimeMessageID":{"type":"string"},"modSeq":{"type":"number"},"saveDate":{"type":"string"},"sentDate":{"type":"string"},"size":{"type":"number"},"subject":{"type":"array","items":{"type":"string"}},"subtype":{"type":"string"},"textBody":{"type":"string"},"threadId":{"type":"string"},"to":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"domain":{"type":"string"},"name":{"type":"string"}}}},"uid":{"type":"number"},"userFlags":{"type":"array","items":{"type":"string"}}}}}}},"example":{"rooms":[{"room_id":"!dYqMpBXVQgKWETVAtJ:example.com","name":"Hello world room","avatar_url":"mxc://linagora.com/IBGFusHnOOzCNfePjaIVHpgR"},{"room_id":"!dugSgNYwppGGoeJwYB:example.com","name":"Worldwide room","avatar_url":null}],"messages":[{"room_id":"!dYqMpBXVQgKWETVAtJ:example.com","event_id":"$c0hW6db_GUjk0NRBUuO12IyMpi48LE_tQK6sH3dkd1U","content":"Hello world","display_name":"Anakin Skywalker","avatar_url":"mxc://linagora.com/IBGFusHnOOzCNfePjaIVHpgR","room_name":"Hello world room"},{"room_id":"!ftGqINYwppGGoeJwYB:example.com","event_id":"$IUzFofxHCvvoHJ-k2nfx7OlWOO8AuPvlHHqkeJLzxJ8","content":"Hello world my friends in direct chat","display_name":"Luke Skywalker","avatar_url":"mxc://matrix.org/wefh34uihSDRGhw34"}],"mails":[{"id":"message1","attachments":[{"contentDisposition":"attachment","fileExtension":"jpg","fileName":"image1.jpg","mediaType":"image/jpeg","textContent":"A beautiful galaxy far, far away."}],"bcc":[{"address":"okenobi@example.com","domain":"example.com","name":"Obi-Wan Kenobi"}],"cc":[{"address":"pamidala@example.com","domain":"example.com","name":"Padme Amidala"}],"date":"2024-02-24T10:15:00Z","from":[{"address":"dmaul@example.com","domain":"example.com","name":"Dark Maul"}],"hasAttachment":true,"headers":[{"name":"Header5","value":"Value5"},{"name":"Header6","value":"Value6"}],"htmlBody":"

A beautiful galaxy far, far away.

","isAnswered":true,"isDeleted":false,"isDraft":false,"isFlagged":true,"isRecent":true,"isUnread":false,"mailboxId":"mailbox3","mediaType":"image/jpeg","messageId":"message3","mimeMessageID":"mimeMessageID3","modSeq":98765,"saveDate":"2024-02-24T10:15:00Z","sentDate":"2024-02-24T10:15:00Z","size":4096,"subject":["Star Wars Message 3"],"subtype":"subtype3","textBody":"A beautiful galaxy far, far away.","threadId":"thread3","to":[{"address":"kren@example.com","domain":"example.com","name":"Kylo Ren"}],"uid":987654,"userFlags":["Flag4","Flag5"]}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/Unrecognized"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_twake/app/v1/opensearch/restore":{"post":{"tags":["Search Engine"],"description":"Restore OpenSearch indexes using Matrix homeserver database","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"204":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"405":{"$ref":"#/components/responses/Unrecognized"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/_twake/sms":{"post":{"requestBody":{"description":"SMS object","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sms"}}}},"tags":["SMS"],"description":"Send an SMS to a phone number","responses":{"200":{"description":"SMS sent successfully"},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"},"500":{"description":"Internal server error"}}}},"/_twake/v1/user_info/{userId}":{"get":{"tags":["User Info"],"description":"Get user info","parameters":[{"$ref":"#/components/parameters/userId"}],"responses":{"200":{"description":"User info found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserInfo"}}}},"400":{"description":"Bad request"},"401":{"description":"Unauthorized"},"404":{"description":"User info not found"},"500":{"description":"Internal server error"}}}}},"tags":[]} \ No newline at end of file From 683164e0f71d22f9f66a14fef977a55f864e5dc1 Mon Sep 17 00:00:00 2001 From: Yadd Date: Thu, 6 Jun 2024 14:27:30 +0400 Subject: [PATCH 6/6] Update federated-identity-service doc --- packages/federated-identity-service/README.md | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/federated-identity-service/README.md b/packages/federated-identity-service/README.md index 1301eabb..245d1648 100644 --- a/packages/federated-identity-service/README.md +++ b/packages/federated-identity-service/README.md @@ -46,6 +46,26 @@ These are the steps to obtain a token that works on the federated identity servi For more details see [Matrix specification](https://spec.matrix.org/v1.8/identity-service-api/#post_matrixidentityv2accountregister) * The response body JSON of each request will contain a `token` field whose the value will allow to be authenticated on the matching federated identity service. +## Docker + +**Federation Identity Service** is available on [Docker](https://hub.docker.com/). +You can configure it using environment variables: + +* Required parameters: + * `TRUSTED_SERVERS_ADDRESSES`: the space separated list of Tom-Servers allowed + to push data. Networks or IP addresses + * `BASE_URL`; the public URL of this service _(example: https://fed-id-service.example.com/)_ + * `DATABASE_ENGINE` _(`sqlite` or `pg`)_, `DATABASE_HOST`, `DATABASE_NAME`, + `DATABASE_USER`, `DATABASE_PASSWORD`: the database parameters +* Optional parameters: + * `CRON_SERVICE` _(true/false)_: enable ot disable cron tasks. It is required + to have at least one active federated-odentity-service with `CRON_SERVICE` + active per database + +A federation server is also a [Matrix Identity Service](matrix-identity-server/README.md), +thus all parameters of this service can also be enabled but this is interseting +only if this instance is also used as ToM-Server. + ## Copyright and license Copyright (c) 2023-present Linagora