From dafa8ab4dfe82b17b1de18bc1829d056ad771b83 Mon Sep 17 00:00:00 2001 From: Max Peintner Date: Fri, 9 Jun 2023 15:14:15 +0200 Subject: [PATCH 01/37] fix(console): fallback to default language if browser language not supported (#5999) fix: fallback to default language if browser language not supported --- console/src/app/app.component.ts | 11 ++++++----- console/src/app/services/grpc.service.ts | 6 +++++- console/src/app/utils/language.ts | 3 +++ 3 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 console/src/app/utils/language.ts diff --git a/console/src/app/app.component.ts b/console/src/app/app.component.ts index 9c473a288..7249dad12 100644 --- a/console/src/app/app.component.ts +++ b/console/src/app/app.component.ts @@ -19,6 +19,7 @@ import { KeyboardShortcutsService } from './services/keyboard-shortcuts/keyboard import { ManagementService } from './services/mgmt.service'; import { ThemeService } from './services/theme.service'; import { UpdateService } from './services/update.service'; +import { fallbackLanguage, supportedLanguages, supportedLanguagesRegexp } from './utils/language'; @Component({ selector: 'cnsl-root', @@ -267,15 +268,15 @@ export class AppComponent implements OnDestroy { } private setLanguage(): void { - this.translate.addLangs(['de', 'en', 'es', 'fr', 'it', 'ja', 'pl', 'zh']); - this.translate.setDefaultLang('en'); + this.translate.addLangs(supportedLanguages); + this.translate.setDefaultLang(fallbackLanguage); this.authService.user.subscribe((userprofile) => { if (userprofile) { - const cropped = navigator.language.split('-')[0] ?? 'en'; - const fallbackLang = cropped.match(/de|en|es|fr|it|ja|pl|zh/) ? cropped : 'en'; + const cropped = navigator.language.split('-')[0] ?? fallbackLanguage; + const fallbackLang = cropped.match(supportedLanguagesRegexp) ? cropped : fallbackLanguage; - const lang = userprofile?.human?.profile?.preferredLanguage.match(/de|en|es|fr|it|ja|pl|zh/) + const lang = userprofile?.human?.profile?.preferredLanguage.match(supportedLanguagesRegexp) ? userprofile.human.profile?.preferredLanguage : fallbackLang; this.translate.use(lang); diff --git a/console/src/app/services/grpc.service.ts b/console/src/app/services/grpc.service.ts index a842edfb2..e8897fbc3 100644 --- a/console/src/app/services/grpc.service.ts +++ b/console/src/app/services/grpc.service.ts @@ -8,6 +8,7 @@ import { catchError, switchMap, tap, throwError } from 'rxjs'; import { AdminServiceClient } from '../proto/generated/zitadel/AdminServiceClientPb'; import { AuthServiceClient } from '../proto/generated/zitadel/AuthServiceClientPb'; import { ManagementServiceClient } from '../proto/generated/zitadel/ManagementServiceClientPb'; +import { fallbackLanguage, supportedLanguagesRegexp } from '../utils/language'; import { AuthenticationService } from './authentication.service'; import { EnvironmentService } from './environment.service'; import { ExhaustedService } from './exhausted.service'; @@ -40,8 +41,11 @@ export class GrpcService { public loadAppEnvironment(): Promise { this.themeService.applyLabelPolicy(); // We use the browser language until we can make API requests to get the users configured language. + + const browserLanguage = this.translate.getBrowserLang(); + const language = browserLanguage?.match(supportedLanguagesRegexp) ? browserLanguage : fallbackLanguage; return this.translate - .use(this.translate.getBrowserLang() || this.translate.defaultLang) + .use(language || this.translate.defaultLang) .pipe( switchMap(() => this.envService.env), tap((env) => { diff --git a/console/src/app/utils/language.ts b/console/src/app/utils/language.ts new file mode 100644 index 000000000..d4c54f375 --- /dev/null +++ b/console/src/app/utils/language.ts @@ -0,0 +1,3 @@ +export const supportedLanguages = ['de', 'en', 'es', 'fr', 'it', 'ja', 'pl', 'zh']; +export const supportedLanguagesRegexp: RegExp = /de|en|es|fr|it|ja|pl|zh/; +export const fallbackLanguage: string = 'en'; From 0a035b63471149142980617eb46d06e4f1bc0e24 Mon Sep 17 00:00:00 2001 From: mffap Date: Fri, 9 Jun 2023 16:06:59 +0200 Subject: [PATCH 02/37] docs(migrate): applications (#6001) * docs(migrate): applications * Update docs/docs/guides/migrate/introduction.md Co-authored-by: Florian Forster --------- Co-authored-by: Florian Forster --- docs/docs/guides/migrate/introduction.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/docs/guides/migrate/introduction.md b/docs/docs/guides/migrate/introduction.md index 6ac351f43..2955f91d4 100644 --- a/docs/docs/guides/migrate/introduction.md +++ b/docs/docs/guides/migrate/introduction.md @@ -10,7 +10,7 @@ When moving from a previous auth solution to ZITADEL, it is important to note th Without duplicating too much content here are some important features and patterns to consider in terms of solution architecture. You can read more about the basic structure and important concepts of ZITADEL in our [concepts section](/docs/concepts/). -## Multi-Tenancy Architecture +## Multi-tenancy architecture Multi-tenancy in ZITADEL can be achieved through either [Instances](/docs/concepts/structure/instance) or [Organizations](/docs/concepts/structure/organizations). Where instances represent isolated ZITADEL instances, Organizations provide a more permeable approach to multi-tenancy. @@ -19,7 +19,7 @@ In most cases, when you want to achieve multi-tenancy, you use Organizations. Ea Please also consult our guide on [Solution Scenarios](/docs/guides/solution-scenarios/introduction ) for B2C and B2B for more details. -## Delegated Access Management +## Delegated access management Some solutions, that offer multi-tenancy, require you to copy applications and settings to each tenant and manage changes individually. ZITADEL works differently by using [Granted Projects](/docs/concepts/structure/granted_projects). @@ -47,17 +47,24 @@ You can store arbitrary key-value pairs of data on objects such as Users or Orga Metadata could link a user to a specific backend user-id or represent an "organizational unit" for your business logic. Metadata can be access directly with the correct [scopes](/docs/apis/openidoauth/scopes#reserved-scopes) or transformed to custom claims (see above). -## Migrating users +## Migrating resources + +### Migrating users Migrating users with minimal impact on users can be a challenging task. We provide some more information on migrating users and secrets in [this guide](./users.md). +### Migrating clients / applications + +After you have set up or imported your applications to ZITADEL, you need to update your client's configurations, such as issuer, clientID or credentials. +It is not possible to create an application with a pre-defined clientID or import existing credentials. + ## Technical considerations ### Batch migration **Batch migration** is the easiest way, if you can afford some minimal downtime to move all users and applications over to ZITADEL. -See the [User guide](./users.md) for batch migration of users. +See the [User guide](./users.md) for batch migration of users. ### Just-in-time migration @@ -71,7 +78,7 @@ For all other cases, we recommend that the **legacy system orchestrates the migr - Update your legacy system to create a user in ZITADEL on their next login, if not already flagged as migrated, by using our APIs (you can set the password and a verified email) - Redirect migrated users with a login hint in the [auth request](/docs/apis/openidoauth/authrequest.mdx) to ZITADEL to pre-select the user -In this case the migration can also be done as an import job or also allowing to create user session in both the legacy auth solution and ZITADEL in parallel with identity brokering: +In this case the migration can also be done as an import job or also allowing to create user session in both the legacy auth solution and ZITADEL in parallel with identity brokering: - Setup ZITADEL to use your legacy system as external identity provider (note: you can also use JWT-IDP, if you only have a token). - Configure your app to use ZITADEL, which will redirect users automatically to the external identity provider to login. From 6907b52b321a61cbda44fffea1047117dcd540a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Fri, 9 Jun 2023 17:18:14 +0200 Subject: [PATCH 03/37] chore(deps): update oidc (#6002) --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index eeca72a61..74ff7c774 100644 --- a/go.mod +++ b/go.mod @@ -55,11 +55,11 @@ require ( github.com/sony/sonyflake v1.1.0 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.3 + github.com/stretchr/testify v1.8.4 github.com/superseriousbusiness/exifremove v0.0.0-20210330092427-6acd27eac203 github.com/ttacon/libphonenumber v1.2.1 github.com/zitadel/logging v0.3.4 - github.com/zitadel/oidc/v2 v2.6.1 + github.com/zitadel/oidc/v2 v2.6.3 github.com/zitadel/saml v0.0.11 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.40.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.40.0 @@ -183,7 +183,7 @@ require ( github.com/prometheus/procfs v0.9.0 // indirect github.com/rs/xid v1.4.0 // indirect github.com/russellhaering/goxmldsig v1.3.0 // indirect - github.com/sirupsen/logrus v1.9.2 + github.com/sirupsen/logrus v1.9.3 github.com/spf13/afero v1.9.5 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect diff --git a/go.sum b/go.sum index 716d80a78..162c573e2 100644 --- a/go.sum +++ b/go.sum @@ -812,8 +812,8 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= -github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= @@ -864,8 +864,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/superseriousbusiness/exifremove v0.0.0-20210330092427-6acd27eac203 h1:1SWXcTphBQjYGWRRxLFIAR1LVtQEj4eR7xPtyeOVM/c= @@ -900,8 +900,8 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= github.com/zitadel/logging v0.3.4 h1:9hZsTjMMTE3X2LUi0xcF9Q9EdLo+FAezeu52ireBbHM= github.com/zitadel/logging v0.3.4/go.mod h1:aPpLQhE+v6ocNK0TWrBrd363hZ95KcI17Q1ixAQwZF0= -github.com/zitadel/oidc/v2 v2.6.1 h1:NIW4/KPi9Q2Pae6MKEhrSl+DSC5W4574GlboHildroc= -github.com/zitadel/oidc/v2 v2.6.1/go.mod h1:vsFNrYCj2x0it0pYmIRVZ12HJ1VGaMVyGl7HLqw5p+Y= +github.com/zitadel/oidc/v2 v2.6.3 h1:YY87cAcdI+3voZqcRU2RGz3Pxky/2KsjDmYDVb6EgWw= +github.com/zitadel/oidc/v2 v2.6.3/go.mod h1:2LrbdKYLSgKxXBfct56ev4e186J7TXotlZxb6tExOO4= github.com/zitadel/saml v0.0.11 h1:kObucnBrcu1PHCO7RGT0iVeuJL/5I50gUgr40S41nMs= github.com/zitadel/saml v0.0.11/go.mod h1:YGWAvPZRv4DbEZ78Ht/2P0AWzGn+6WGhFf90PMXl0Po= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= From 5693e4093004a9b7a80707505c26477239a27445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Mon, 12 Jun 2023 15:24:51 +0200 Subject: [PATCH 04/37] chore(v2): user register factors proto definitions (#6017) * chore(v2): user register factors proto definitions * use uri --- proto/zitadel/user/v2alpha/user_service.proto | 213 ++++++++++++++++++ 1 file changed, 213 insertions(+) diff --git a/proto/zitadel/user/v2alpha/user_service.proto b/proto/zitadel/user/v2alpha/user_service.proto index 9522cd96a..15d9eb2b6 100644 --- a/proto/zitadel/user/v2alpha/user_service.proto +++ b/proto/zitadel/user/v2alpha/user_service.proto @@ -225,6 +225,98 @@ service UserService { }; } + rpc RegisterU2F (RegisterU2FRequest) returns (RegisterU2FResponse) { + option (google.api.http) = { + post: "/v2alpha/users/{user_id}/u2f" + body: "*" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "authenticated" + } + }; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "Start the registration of passkey for a user"; + description: "Start the registration of a u2f token for a user, as a response the public key credential creation options are returned, which are used to verify the u2f token." + responses: { + key: "200" + value: { + description: "OK"; + } + }; + }; + } + + rpc VerifyU2FRegistration (VerifyU2FRegistrationRequest) returns (VerifyU2FRegistrationResponse) { + option (google.api.http) = { + post: "/v2alpha/users/{user_id}/u2f/{u2f_id}" + body: "*" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "authenticated" + } + }; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "Verify a u2f token for a user"; + description: "Verify the u2f token registration with the public key credential." + responses: { + key: "200" + value: { + description: "OK"; + } + }; + }; + } + + rpc RegisterOTP (RegisterOTPRequest) returns (RegisterOTPResponse) { + option (google.api.http) = { + post: "/v2alpha/users/{user_id}/otp" + body: "*" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "authenticated" + } + }; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "Start the registration of an OTP generator for a user"; + description: "Start the registration of a OTP generator for a user, as a response a secret returned, which is used to initialize a TOTP app or device." + responses: { + key: "200" + value: { + description: "OK"; + } + }; + }; + } + + rpc VerifyOTPRegistration (VerifyOTPRegistrationRequest) returns (VerifyOTPRegistrationResponse) { + option (google.api.http) = { + post: "/v2alpha/users/{user_id}/otp/_verify" // Why underscore here?? + body: "*" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "authenticated" + } + }; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "Verify a u2f token for a user"; + description: "Verify the OTP registration with a generated code." + responses: { + key: "200" + value: { + description: "OK"; + } + }; + }; + } + // Start an IDP authentication (for external login, registration or linking) rpc StartIdentityProviderFlow (StartIdentityProviderFlowRequest) returns (StartIdentityProviderFlowResponse) { option (google.api.http) = { @@ -482,6 +574,127 @@ message VerifyPasskeyRegistrationResponse{ zitadel.object.v2alpha.Details details = 1; } +message RegisterU2FRequest{ + string user_id = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1; + max_length: 200; + example: "\"d654e6ba-70a3-48ef-a95d-37c8d8a7901a\""; + } + ]; +} + +message RegisterU2FResponse{ + zitadel.object.v2alpha.Details details = 1; + string u2f_id = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"fabde5c8-c13f-481d-a90b-5e59a001a076\"" + } + ]; + google.protobuf.Struct public_key_credential_creation_options = 3 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "Options for Credential Creation (dictionary PublicKeyCredentialCreationOptions). Generated helper methods transform the field to JSON, for use in a WebauthN client. See also: https://www.w3.org/TR/webauthn/#dictdef-publickeycredentialcreationoptions" + example: "{\"publicKey\":{\"attestation\":\"none\",\"authenticatorSelection\":{\"userVerification\":\"required\"},\"challenge\":\"XaMYwWOZ5hj6pwtwJJlpcI-ExkO5TxevBMG4R8DoKQQ\",\"excludeCredentials\":[{\"id\":\"tVp1QfYhT8DkyEHVrv7blnpAo2YJzbZgZNBf7zPs6CI\",\"type\":\"public-key\"}],\"pubKeyCredParams\":[{\"alg\":-7,\"type\":\"public-key\"}],\"rp\":{\"id\":\"localhost\",\"name\":\"ZITADEL\"},\"timeout\":300000,\"user\":{\"displayName\":\"Tim Mohlmann\",\"id\":\"MjE1NTk4MDAwNDY0OTk4OTQw\",\"name\":\"tim\"}}}" + } + ]; +} + +message VerifyU2FRegistrationRequest{ + string user_id = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1; + max_length: 200; + example: "\"d654e6ba-70a3-48ef-a95d-37c8d8a7901a\""; + } + ]; + string u2f_id = 2 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1; + max_length: 200; + example: "\"fabde5c8-c13f-481d-a90b-5e59a001a076\""; + } + ]; + google.protobuf.Struct public_key_credential = 3 [ + (validate.rules).message.required = true, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "PublicKeyCredential Interface. Generated helper methods populate the field from JSON created by a WebauthN client. See also: https://www.w3.org/TR/webauthn/#publickeycredential"; + example: "{\"type\":\"public-key\",\"id\":\"pawVarF4xPxLFmfCnRkwXWeTrKGzabcAi92LEI1WC00\",\"rawId\":\"pawVarF4xPxLFmfCnRkwXWeTrKGzabcAi92LEI1WC00\",\"response\":{\"attestationObject\":\"o2NmbXRmcGFja2VkZ2F0dFN0bXSiY2FsZyZjc2lnWEcwRQIgRKS3VpeE9tfExXRzkoUKnG4rQWPvtSSt4YtDGgTx32oCIQDPey-2YJ4uIg-QCM4jj6aE2U3tgMFM_RP7Efx6xRu3JGhhdXRoRGF0YVikSZYN5YgOjGh0NBcPZHZgW4_krrmihjLHmVzzuoMdl2NFAAAAADju76085Yhmlt1CEOHkwLQAIKWsFWqxeMT8SxZnwp0ZMF1nk6yhs2m3AIvdixCNVgtNpQECAyYgASFYIMGUDSP2FAQn2MIfPMy7cyB_Y30VqixVgGULTBtFjfRiIlggjUGfQo3_-CrMmH3S-ZQkFKWKnNBQEAMkFtG-9A4zqW0\",\"clientDataJSON\":\"eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIiwiY2hhbGxlbmdlIjoiQlhXdHh0WGxJeFZZa0pHT1dVaUVmM25zby02aXZKdWw2YmNmWHdMVlFIayIsIm9yaWdpbiI6Imh0dHBzOi8vbG9jYWxob3N0OjgwODAifQ\"}}"; + min_length: 55; + max_length: 1048576; //1 MB + } + ]; + string token_name = 4 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1; + max_length: 200; + example: "\"fido key\"" + } + ]; +} + +message VerifyU2FRegistrationResponse{ + zitadel.object.v2alpha.Details details = 1; +} + +message RegisterOTPRequest { + string user_id = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1; + max_length: 200; + example: "\"d654e6ba-70a3-48ef-a95d-37c8d8a7901a\""; + } + ]; +} + +message RegisterOTPResponse { + zitadel.object.v2alpha.Details details = 1; + string uri = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"otpauth://totp/ZITADEL:gigi@acme.zitadel.cloud?algorithm=SHA1&digits=6&issuer=ZITADEL&period=30&secret=TJOPWSDYILLHXFV4MLKNNJOWFG7VSDCK\""; + } + ]; + string secret = 3 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"TJOPWSDYILLHXFV4MLKNNJOWFG7VSDCK\""; + } + ]; +} + +message VerifyOTPRegistrationRequest { + string user_id = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1; + max_length: 200; + example: "\"d654e6ba-70a3-48ef-a95d-37c8d8a7901a\""; + } + ]; + string code = 2 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "Code generated by OTP app or device" + example: "\"123456\""; + } + ]; +} + +message VerifyOTPRegistrationResponse { + zitadel.object.v2alpha.Details details = 1; +} + message CreatePasskeyRegistrationLinkRequest{ string user_id = 1 [ (validate.rules).string = {min_len: 1, max_len: 200}, From e39d1b7d822c5aa374fa5d188da45c963d6b09c4 Mon Sep 17 00:00:00 2001 From: Max Peintner Date: Tue, 13 Jun 2023 07:37:22 +0200 Subject: [PATCH 05/37] fix(console): url safe base64 to array buffer (#6019) fix: console base64 to array buffer Co-authored-by: Livio Spring --- .../app/pages/users/user-detail/u2f-util.ts | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/console/src/app/pages/users/user-detail/u2f-util.ts b/console/src/app/pages/users/user-detail/u2f-util.ts index b19c61a54..fab5a8aff 100644 --- a/console/src/app/pages/users/user-detail/u2f-util.ts +++ b/console/src/app/pages/users/user-detail/u2f-util.ts @@ -1,9 +1,31 @@ -export function _base64ToArrayBuffer(base64: string): any { - const binaryString = atob(base64); - const len = binaryString.length; - const bytes = new Uint8Array(len); - for (let i = 0; i < len; i++) { - bytes[i] = binaryString.charCodeAt(i); +export function _base64ToArrayBuffer(thing: any) { + if (typeof thing === 'string') { + // base64url to base64 + thing = thing.replace(/-/g, '+').replace(/_/g, '/'); + + // base64 to Uint8Array + var str = window.atob(thing); + var bytes = new Uint8Array(str.length); + for (var i = 0; i < str.length; i++) { + bytes[i] = str.charCodeAt(i); + } + thing = bytes; } - return bytes.buffer; + + // Array to Uint8Array + if (Array.isArray(thing)) { + thing = new Uint8Array(thing); + } + + // Uint8Array to ArrayBuffer + if (thing instanceof Uint8Array) { + thing = thing.buffer; + } + + // error if none of the above worked + if (!(thing instanceof ArrayBuffer)) { + throw new TypeError('could not coerce to ArrayBuffer'); + } + + return thing; } From 33a8ab4ecff7e563e0f9b808118c143b8644a368 Mon Sep 17 00:00:00 2001 From: Miguel Cabrerizo <30386061+doncicuto@users.noreply.github.com> Date: Tue, 13 Jun 2023 17:31:18 +0200 Subject: [PATCH 06/37] feat(console): warning if backdrop click or escape key is pressed when new action form is dirty (#5989) * fix: add action control esc and backdrop click * fix: set values for new action and update action * feat: add translations for supported languages * feat: add some comments * fix: add suggested changes by @peintnermax --- .../action-table/action-table.component.ts | 2 + .../add-action-dialog.component.html | 38 ++++---- .../add-action-dialog.component.ts | 87 ++++++++++++++----- console/src/assets/i18n/de.json | 9 +- console/src/assets/i18n/en.json | 9 +- console/src/assets/i18n/es.json | 9 +- console/src/assets/i18n/fr.json | 9 +- console/src/assets/i18n/it.json | 8 +- console/src/assets/i18n/ja.json | 9 +- console/src/assets/i18n/pl.json | 9 +- console/src/assets/i18n/zh.json | 11 ++- 11 files changed, 151 insertions(+), 49 deletions(-) diff --git a/console/src/app/pages/actions/action-table/action-table.component.ts b/console/src/app/pages/actions/action-table/action-table.component.ts index 0b3f7a594..f767c098b 100644 --- a/console/src/app/pages/actions/action-table/action-table.component.ts +++ b/console/src/app/pages/actions/action-table/action-table.component.ts @@ -98,6 +98,7 @@ export class ActionTableComponent implements OnInit { const dialogRef = this.dialog.open(AddActionDialogComponent, { data: {}, width: '500px', + disableClose: true, }); dialogRef.afterClosed().subscribe((req: CreateActionRequest) => { @@ -120,6 +121,7 @@ export class ActionTableComponent implements OnInit { action: action, }, width: '500px', + disableClose: true, }); dialogRef.afterClosed().subscribe((req: UpdateActionRequest) => { diff --git a/console/src/app/pages/actions/add-action-dialog/add-action-dialog.component.html b/console/src/app/pages/actions/add-action-dialog/add-action-dialog.component.html index 3cd135799..4fbce57fc 100644 --- a/console/src/app/pages/actions/add-action-dialog/add-action-dialog.component.html +++ b/console/src/app/pages/actions/add-action-dialog/add-action-dialog.component.html @@ -2,27 +2,29 @@ {{ 'FLOWS.DIALOG.UPDATE.TITLE' | translate }}
- - {{ 'FLOWS.NAME' | translate }} - - +
+ + {{ 'FLOWS.NAME' | translate }} + + - + - - {{ 'FLOWS.TIMEOUTINSEC' | translate }} - - + + {{ 'FLOWS.TIMEOUTINSEC' | translate }} + + - {{ 'FLOWS.ALLOWEDTOFAIL' | translate }} + {{ 'FLOWS.ALLOWEDTOFAIL' | translate }} +
diff --git a/internal/notification/static/i18n/bg.yaml b/internal/notification/static/i18n/bg.yaml new file mode 100644 index 000000000..963eeb272 --- /dev/null +++ b/internal/notification/static/i18n/bg.yaml @@ -0,0 +1,59 @@ +InitCode: + Title: ZITADEL - Инициализиране на потребител + PreHeader: Инициализиране на потребителя + Subject: Инициализиране на потребителя + Greeting: 'Здравейте {{.DisplayName}},' + Text: >- + Този потребител е създаден в ZITADEL. {{.PreferredLoginName}} за да + влезете. {{.Code}}) Ако не сте поискали този имейл, моля, игнорирайте го. + ButtonText: Завършете инициализацията +PasswordReset: + Title: ZITADEL - Нулиране на парола + PreHeader: Нулирайте паролата + Subject: Нулирайте паролата + Greeting: 'Здравейте {{.DisplayName}},' + Text: >- + Получихме заявка за повторно задаване на парола. {{.Code}}) Ако не сте + поискали този имейл, моля, игнорирайте го. + ButtonText: Нулирайте паролата +VerifyEmail: + Title: ZITADEL - Потвърдете имейл + PreHeader: Потвърди Имейл + Subject: Потвърди Имейл + Greeting: 'Здравейте {{.DisplayName}},' + Text: >- + Добавен е нов имейл. {{.Code}}) Ако не сте добавили нов имейл, моля, + игнорирайте този имейл. + ButtonText: Потвърди Имейл +VerifyPhone: + Title: ZITADEL - Потвърдете телефона + PreHeader: Потвърдете телефона + Subject: Потвърдете телефона + Greeting: 'Здравейте {{.DisplayName}},' + Text: 'Добавен е нов телефонен номер. {{.Code}}' + ButtonText: Потвърдете телефона +DomainClaimed: + Title: ZITADEL - Домейнът е заявен + PreHeader: Промяна на имейл/потребителско име + Subject: Домейнът е заявен + Greeting: 'Здравейте {{.DisplayName}},' + Text: >- + Домейнът {{.Domain}} е заявено от организация. {{.Username}} не е част от + тази организация. {{.TempUsername}}) за това влизане. + ButtonText: Влизам +PasswordlessRegistration: + Title: ZITADEL - Добавете вход без парола + PreHeader: Добавете вход без парола + Subject: Добавете вход без парола + Greeting: 'Здравейте {{.DisplayName}},' + Text: 'Получихме заявка за добавяне на токен за влизане без парола. ' + ButtonText: Добавете вход без парола +PasswordChange: + Title: ZITADEL - Паролата на потребителя е променена + PreHeader: Промяна на паролата + Subject: Паролата на потребителя е променена + Greeting: 'Здравейте {{.DisplayName}},' + Text: >- + Паролата на вашия потребител е променена, ако тази промяна не е направена от + вас, моля, незабавно нулирайте паролата си. + ButtonText: Влизам diff --git a/internal/static/i18n/bg.yaml b/internal/static/i18n/bg.yaml new file mode 100644 index 000000000..e9d9510be --- /dev/null +++ b/internal/static/i18n/bg.yaml @@ -0,0 +1,1238 @@ +Errors: + Internal: Възникна вътрешна грешка + NoChangesFound: Без промени + OriginNotAllowed: Този "Произход" не е разрешен + IDMissing: Липсва лична карта + ResourceOwnerMissing: Липсва организация на собственика на ресурса + RemoveFailed: Не можа да бъде премахнат + ProjectionName: + Invalid: Невалидно име на проекцията + Assets: + EmptyKey: Ключът на актива е празен + Store: + NotInitialized: Съхранението на активи не е инициализирано + NotConfigured: Съхранението на активи не е конфигурирано + Bucket: + Internal: Вътрешна грешка при създаване на контейнер + AlreadyExists: Кофата вече съществува + CreateFailed: Кофата не е създадена + ListFailed: Кофите не могат да бъдат прочетени + RemoveFailed: Кофата не е изтрита + SetPublicFailed: Кофата не можа да се зададе като публична + Object: + PutFailed: Обектът не е създаден + GetFailed: Обектът не можа да бъде прочетен + NotFound: Обектът не може да бъде намерен + PresignedTokenFailed: Подписаният токен не можа да бъде създаден + ListFailed: Списъкът с обекти не можа да бъде прочетен + RemoveFailed: Обектът не можа да бъде премахнат + Limit: + ExceedsDefault: Лимитът надвишава лимита по подразбиране + Language: + NotParsed: Езикът не можа да бъде анализиран синтактично + OIDCSettings: + NotFound: Конфигурацията на OIDC не е намерена + AlreadyExists: OIDC конфигурацията вече съществува + SecretGenerator: + AlreadyExists: Таен генератор вече съществува + TypeMissing: Липсва тип таен генератор + NotFound: Тайният генератор не е намерен + SMSConfig: + NotFound: SMS конфигурацията не е намерена + AlreadyActive: SMS конфигурацията вече е активна + AlreadyDeactivated: SMS конфигурацията вече е деактивирана + SMTPConfig: + NotFound: SMTP конфигурацията не е намерена + AlreadyExists: SMTP конфигурация вече съществува + SenderAdressNotCustomDomain: >- + Адресът на изпращача трябва да бъде конфигуриран като персонализиран + домейн в екземпляра. + Notification: + NoDomain: Няма намерен домейн за съобщение + User: + NotFound: Потребителят не може да бъде намерен + AlreadyExists: Вече съществува потребител + NotFoundOnOrg: Потребителят не може да бъде намерен в избраната организация + NotAllowedOrg: Потребителят не е член на необходимата организация + UserIDMissing: Липсва потребителско име + UserIDWrong: Потребителят на заявката не е равен на удостоверения потребител + DomainPolicyNil: Правилата на организацията са празни + EmailAsUsernameNotAllowed: Имейлът не е разрешен като потребителско име + Invalid: Потребителските данни са невалидни + DomainNotAllowedAsUsername: Домейнът вече е резервиран и не може да се използва + AlreadyInactive: Потребителят вече е неактивен + NotInactive: Потребителят не е неактивен + CantDeactivateInitial: 'Потребител с начално състояние може да бъде изтрит, но не и деактивиран' + ShouldBeActiveOrInitial: Потребителят не е активен или начален + AlreadyInitialised: Потребителят вече е инициализиран + NotInitialised: Потребителят все още не е инициализиран + NotLocked: Потребителят не е заключен + NoChanges: Няма намерени промени + InitCodeNotFound: Кодът за инициализиране не е намерен + UsernameNotChanged: Потребителското име не е променено + InvalidURLTemplate: URL шаблонът е невалиден + Profile: + NotFound: Профилът не е намерен + NotChanged: Профилът не е променен + Empty: Профилът е празен + FirstNameEmpty: Първото име в профила е празно + LastNameEmpty: Фамилията в профила е празна + IDMissing: Липсва ID на потребителския профил + Email: + NotFound: Имейлът не е намерен + Invalid: Имейлът е невалиден + AlreadyVerified: Имейлът вече е потвърден + NotChanged: Имейлът не е променен + Empty: Имейлът е празен + IDMissing: Имейл ID липсва + Phone: + NotFound: Телефонът не е намерен + Invalid: Телефонът е невалиден + AlreadyVerified: Телефонът вече е потвърден + Empty: Телефонът е празен + NotChanged: Телефонът не е сменен + Address: + NotFound: Адресът не е намерен + NotChanged: Адресът не е променен + Machine: + Key: + NotFound: Машинният ключ не е намерен + AlreadyExisting: Машинният ключ вече съществува + Secret: + NotExisting: Тайната не съществува + Invalid: Тайната е невалидна + CouldNotGenerate: Тайната не можа да бъде генерирана + PAT: + NotFound: Личен токен за достъп не е намерен + NotHuman: Потребителят трябва да е личен + NotMachine: Потребителят трябва да е техничен + WrongType: Не е разрешено за този тип потребител + NotAllowedToLink: Потребителят няма право да се свързва с външен доставчик на данни за вход + Username: + AlreadyExists: Потребителско име вече е заето + Reserved: Потребителско име вече е заето + Empty: Потребителското име е празно + Code: + Empty: Кодът е празен + NotFound: Кодът не е намерен + Expired: Кодът е изтекъл + GeneratorAlgNotSupported: Неподдържан генераторен алгоритъм + Password: + NotFound: Паролата не е намерена + Empty: Паролата е празна + Invalid: Паролата е невалидна + NotSet: Потребителят не е задал парола + PasswordComplexityPolicy: + NotFound: Политиката за парола не е намерена + MinLength: Паролата е твърде кратка + MinLengthNotAllowed: Дадена минимална дължина не е разрешена + HasLower: Паролата трябва да съдържа малки букви + HasUpper: Паролата трябва да съдържа главни букви + HasNumber: Паролата трябва да съдържа число + HasSymbol: Паролата трябва да съдържа символ + ExternalIDP: + Invalid: Невалиден външен IDP + IDPConfigNotExisting: Невалиден доставчик на IDP за тази организация + NotAllowed: Външен IDP не е разрешен в тази организация + MinimumExternalIDPNeeded: Трябва да се добави поне един IDP + AlreadyExists: Външен IDP вече е зает + NotFound: Външен IDP не е намерен + MFA: + OTP: + AlreadyReady: Многофакторният OTP (OneTimePassword) вече е настроен + NotExisting: Многофакторният OTP (OneTimePassword) не съществува + NotReady: Многофакторният OTP (OneTimePassword) не е готов + InvalidCode: Невалиден код + U2F: + NotExisting: U2F не съществува + Passwordless: + NotExisting: Без парола не съществува + WebAuthN: + NotFound: WebAuthN Token не можа да бъде намерен + BeginRegisterFailed: Неуспешна регистрация за стартиране на WebAuthN + MarshalError: Грешка в маршалските данни + ErrorOnParseCredential: Грешка при анализа на идентификационните данни + CreateCredentialFailed: Грешка при създаване на идентификационни данни + BeginLoginFailed: Началото на влизането в WebAuthN не бе успешно + ValidateLoginFailed: Грешка при потвърждаване на идентификационните данни за вход + CloneWarning: Идентификационните данни могат да бъдат клонирани + RefreshToken: + Invalid: Токенът за опресняване е невалиден + NotFound: Токенът за обновяване не е намерен + Instance: + NotFound: Екземплярът не е намерен + AlreadyExists: Екземплярът вече съществува + NotChanged: Екземплярът не е променен + Org: + AlreadyExists: Името на организацията вече е заето + Invalid: Организацията е невалидна + AlreadyDeactivated: Организацията вече е деактивирана + AlreadyActive: Организацията вече е активна + Empty: Организацията е празна + NotFound: Организацията не е намерена + NotChanged: Организацията не е променена + DefaultOrgNotDeletable: Организацията по подразбиране не трябва да се изтрива + ZitadelOrgNotDeletable: Организация с проект ZITADEL не трябва да се изтрива + InvalidDomain: Невалиден домейн + DomainMissing: Липсва домейн + DomainNotOnOrg: Домейнът не съществува в организацията + DomainNotVerified: Домейнът не е проверен + DomainAlreadyVerified: Домейнът вече е потвърден + DomainVerificationTypeInvalid: Типът проверка на домейна е невалиден + DomainVerificationMissing: Проверката на домейна все още не е започнала + DomainVerificationFailed: Неуспешна проверка на домейна + PrimaryDomainNotDeletable: Основният домейн не трябва да се изтрива + DomainNotFound: Домейнът не е намерен + MemberIDMissing: Липсва ID на член + MemberNotFound: Членът на организацията не е намерен + InvalidMember: Членът на организацията е невалиден + UserIDMissing: Липсва потребителско име + PolicyAlreadyExists: Политиката вече съществува + PolicyNotExisting: Политиката не съществува + IdpInvalid: IDP конфигурацията е невалидна + IdpNotExisting: IDP конфигурация не съществува + OIDCConfigInvalid: OIDC IDP конфигурацията е невалидна + IdpIsNotOIDC: IDP конфигурацията не е от тип oidc + Domain: + AlreadyExists: Домейнът вече съществува + InvalidCharacter: 'Само буквено-цифрови знаци, . ' + IDP: + InvalidSearchQuery: Невалидна заявка за търсене + LoginPolicy: + NotFound: Правилата за влизане не са намерени + Invalid: Правилата за влизане са невалидни + RedirectURIInvalid: URI адресът за пренасочване по подразбиране е невалиден + NotExisting: Политиката за влизане не съществува + AlreadyExists: Политиката за влизане вече съществува + IdpProviderAlreadyExisting: Вече съществува доставчик на самоличност + IdpProviderNotExisting: Доставчикът на самоличност не съществува + RegistrationNotAllowed: Регистрацията не е разрешена + UsernamePasswordNotAllowed: Влизането с потребителско име / парола не е разрешено + MFA: + AlreadyExists: Multifactor вече съществува + NotExisting: Мултифактор не съществува + Unspecified: Многофакторна невалидност + MailTemplate: + NotFound: Шаблонът за поща по подразбиране не е намерен + NotChanged: Шаблонът за поща по подразбиране не е променен + AlreadyExists: Шаблонът за поща по подразбиране вече съществува + Invalid: Шаблонът за имейл по подразбиране е невалиден + CustomMessageText: + NotFound: Текстът на съобщението по подразбиране не е намерен + NotChanged: Текстът на съобщението по подразбиране не е променен + AlreadyExists: Текстът на съобщението по подразбиране вече съществува + Invalid: Текстът на съобщението по подразбиране е невалиден + PasswordComplexityPolicy: + NotFound: Правилата за сложност на паролата не са намерени + Empty: Правилата за сложност на паролата са празни + NotExisting: Правилата за сложност на паролите не съществуват + AlreadyExists: Политиката за сложност на паролата вече съществува + PasswordLockoutPolicy: + NotFound: Правилата за блокиране на парола не са намерени + Empty: Правилата за блокиране на парола са празни + NotExisting: Правилата за блокиране на пароли не съществуват + AlreadyExists: Политиката за блокиране на парола вече съществува + PasswordAgePolicy: + NotFound: Правилата за възрастта на паролата не са намерени + Empty: Правилата за възрастта на паролата са празни + NotExisting: Правилата за възрастта на паролата не съществуват + AlreadyExists: Вече съществува политика за възрастта на паролата + OrgIAMPolicy: + Empty: Правилата за IAM на организацията са празни + NotExisting: IAM политиката на организацията не съществува + AlreadyExists: Политиката за IAM на организацията вече съществува + NotificationPolicy: + NotFound: Правилата за уведомяване не са намерени + NotChanged: Правилата за уведомяване не са променени + AlreadyExists: Политиката за уведомяване вече съществува + LabelPolicy: + NotFound: Правилата за лични етикети не са намерени + NotChanged: Политиката на частния етикет не е променена + Project: + ProjectIDMissing: Липсва ID на проекта + AlreadyExists: Проектът вече съществува в организацията + OrgNotExisting: Организацията не съществува + UserNotExisting: Потребителят не съществува + CouldNotGenerateClientSecret: Не можа да се генерира клиентска тайна + Invalid: Проектът е невалиден + NotActive: Проектът не е активен + NotInactive: Проектът не е деактивиран + NotFound: Проектът не е намерен + UserIDMissing: Липсва потребителско име + Member: + NotFound: Членът на проекта не е намерен + Invalid: Членът на проекта е невалиден + AlreadyExists: Член на проекта вече съществува + NotExisting: Член на проекта не съществува + MinimumOneRoleNeeded: Трябва да се добави поне една роля + Role: + AlreadyExists: Ролята вече съществува + Invalid: Ролята е невалидна + NotExisting: Ролята не съществува + IDMissing: Липсва лична карта + App: + AlreadyExists: Приложението вече съществува + NotFound: Приложението не е намерено + Invalid: Приложението е невалидно + NotExisting: Приложението не съществува + NotActive: Приложението не е активно + NotInactive: Приложението не е неактивно + OIDCConfigInvalid: OIDC конфигурацията е невалидна + APIConfigInvalid: API конфигурацията е невалидна + SAMLConfigInvalid: SAML конфигурацията е невалидна + IsNotOIDC: Приложението не е тип OIDC + IsNotAPI: Приложението не е тип API + IsNotSAML: Приложението не е тип SAML + SAMLMetadataMissing: Липсват SAML метаданни + SAMLMetadataFormat: Грешка във формата на SAML метаданни + SAMLEntityIDAlreadyExisting: SAML EntityID вече съществува + OIDCAuthMethodNoSecret: Избраният метод за удостоверяване на OIDC не изисква тайна + APIAuthMethodNoSecret: Избраният API Auth Method не изисква тайна + AuthMethodNoPrivateKeyJWT: Избраният метод за удостоверяване не изисква ключ + ClientSecretInvalid: Тайната на клиента е невалидна + Key: + AlreadyExisting: Вече съществува ключ за приложение + NotFound: Ключът на приложението не е намерен + RequiredFieldsMissing: Някои задължителни полета липсват + Grant: + AlreadyExists: Вече съществува субсидия за проекта + NotFound: Грантът не е намерен + Invalid: Грантът за проект е невалиден + NotExisting: Безвъзмездна помощ за проекта не съществува + HasNotExistingRole: Една роля не съществува в проекта + NotActive: Грантът по проекта не е активен + NotInactive: Грантът по проекта не е неактивен + IAM: + NotFound: Екземплярът не е намерен + Member: + RolesNotChanged: Ролите не са сменени + MemberInvalid: Членът е невалиден + MemberAlreadyExisting: Член вече съществува + MemberNotExisting: Членът не съществува + IDMissing: ID липсва + IAMProjectIDMissing: Липсва идентификатор на IAM проект + IamProjectAlreadySet: Идентификаторът на IAM проект вече е зададен + IdpInvalid: IDP конфигурацията е невалидна + IdpNotExisting: IDP конфигурация не съществува + OIDCConfigInvalid: OIDC IDP конфигурацията е невалидна + IdpIsNotOIDC: IDP конфигурацията не е от тип oidc + LoginPolicyInvalid: Правилата за влизане са невалидни + LoginPolicyNotExisting: Правилата за влизане не съществуват + IdpProviderInvalid: Доставчикът на самоличност е невалиден + LoginPolicy: + NotFound: Правилата за влизане по подразбиране не са намерени + NotChanged: Правилата за влизане по подразбиране не са променени + NotExisting: Политиката за влизане по подразбиране не съществува + AlreadyExists: Политиката за влизане по подразбиране вече съществува + RedirectURIInvalid: URI адресът за пренасочване по подразбиране е невалиден + MFA: + AlreadyExists: Multifactor вече съществува + NotExisting: Мултифактор не съществува + Unspecified: Многофакторна невалидност + IDP: + AlreadyExists: Доставчикът на самоличност вече съществува + NotExisting: Доставчикът на самоличност не съществува + Invalid: Доставчикът на самоличност е невалиден + IDPConfig: + AlreadyExists: Конфигурацията на доставчик на самоличност вече съществува + NotInactive: Конфигурацията на доставчик на самоличност не е неактивна + NotActive: Конфигурацията на доставчик на самоличност не е активна + LabelPolicy: + NotFound: Правилата за лични етикети по подразбиране не са намерени + NotChanged: Правилата за лични етикети по подразбиране не са променени + MailTemplate: + NotFound: Шаблонът за поща по подразбиране не е намерен + NotChanged: Шаблонът за поща по подразбиране не е променен + AlreadyExists: Шаблонът за поща по подразбиране вече съществува + Invalid: Шаблонът за имейл по подразбиране е невалиден + CustomMessageText: + NotFound: Текстът на съобщението по подразбиране не е намерен + NotChanged: Текстът на съобщението по подразбиране не е променен + AlreadyExists: Текстът на съобщението по подразбиране вече съществува + Invalid: Текстът на съобщението по подразбиране е невалиден + PasswordComplexityPolicy: + NotFound: Правилата за сложност на паролата по подразбиране не са намерени + NotExisting: Политиката за сложност на паролата по подразбиране не съществува + AlreadyExists: Политиката за сложност на паролата по подразбиране вече съществува + Empty: Правилата за сложност на паролата по подразбиране са празни + NotChanged: Правилата за сложност на паролата по подразбиране не са променени + PasswordAgePolicy: + NotFound: Правилата за възрастта на паролата по подразбиране не са намерени + NotExisting: Политиката за възрастта на паролата по подразбиране не съществува + AlreadyExists: Вече съществува стандартна политика за възрастта на паролата + Empty: Правилата за възрастта на паролата по подразбиране са празни + NotChanged: Правилата за възрастта на паролата по подразбиране не са променени + PasswordLockoutPolicy: + NotFound: Правилата за блокиране на парола по подразбиране не са намерени + NotExisting: Политиката за блокиране на парола по подразбиране не съществува + AlreadyExists: Политиката за блокиране на парола по подразбиране вече съществува + Empty: Правилата за блокиране на парола по подразбиране са празни + NotChanged: Правилата за блокиране на парола по подразбиране не са променени + DomainPolicy: + NotFound: IAM политиката на организацията не е намерена + Empty: Правилата за IAM на организацията са празни + NotExisting: IAM политиката на организацията не съществува + AlreadyExists: Политиката за IAM на организацията вече съществува + NotChanged: Политиката за IAM на организацията не е променена + NotificationPolicy: + NotFound: Правилата за уведомяване по подразбиране не са намерени + NotChanged: Правилата за уведомяване по подразбиране не са променени + AlreadyExists: Политиката за уведомяване по подразбиране вече съществува + Policy: + AlreadyExists: Политиката вече съществува + Label: + Invalid: + PrimaryColor: Основният цвят не е валидна стойност на шестнадесетичен цвят + BackgroundColor: Цветът на фона не е валидна шестнадесетична стойност на цвета + WarnColor: >- + Цветът на предупреждението не е валидна стойност на шестнадесетичен + цвят + FontColor: Цветът на шрифта не е валидна шестнадесетична стойност на цвета + PrimaryColorDark: >- + Основният цвят (тъмен режим) не е валидна стойност на шестнадесетичен + цвят + BackgroundColorDark: >- + Цветът на фона (тъмен режим) не е валидна стойност на шестнадесетичен + цвят + WarnColorDark: >- + Предупредителният цвят (тъмен режим) не е валидна стойност на + шестнадесетичен цвят + FontColorDark: >- + Цветът на шрифта (тъмен режим) не е валидна шестнадесетична цветова + стойност + UserGrant: + AlreadyExists: Потребителското разрешение вече съществува + NotFound: Потребителското разрешение не е намерено + Invalid: Потребителското разрешение е невалидно + NotChanged: Потребителското разрешение не е променено + IDMissing: ID липсва + NotActive: Потребителското разрешение не е активно + NotInactive: Предоставянето на потребител не е деактивирано + NoPermissionForProject: Потребителят няма разрешения за този проект + RoleKeyNotFound: Ролята не е намерена + Member: + AlreadyExists: Член вече съществува + IDPConfig: + AlreadyExists: IDP конфигурация с това име вече съществува + NotExisting: Конфигурацията на доставчик на самоличност не съществува + Changes: + NotFound: Няма намерена история + AuditRetention: Историята е извън съхранението на журнала за проверка + Token: + NotFound: Токенът не е намерен + UserSession: + NotFound: UserSession не е намерена + Key: + ExpireBeforeNow: Срокът на годност е в миналото + Login: + LoginPolicy: + MFA: + ForceAndNotConfigured: >- + Multifactor е конфигуриран според изискванията, но не са конфигурирани + възможни доставчици. + Step: + Started: + AlreadyExists: Започната стъпка вече съществува + Done: + AlreadyExists: Направената стъпка вече съществува + CustomText: + AlreadyExists: Персонализиран текст вече съществува + Invalid: Персонализираният текст е невалиден + NotFound: Персонализираният текст не е намерен + TranslationFile: + ReadError: Грешка при четене на файла за превод + MergeError: Файлът за превод не можа да бъде обединен с персонализирани преводи + NotFound: Файлът за превод не съществува + Metadata: + NotFound: Метаданните не са намерени + NoData: Списъкът с метаданни е празен + Invalid: Метаданните са невалидни + KeyNotExisting: Един или повече ключове не съществуват + Action: + Invalid: Действието е невалидно + NotFound: Действието не е намерено + NotActive: Действието не е активно + NotInactive: Действието не е неактивно + MaxAllowed: Не са разрешени допълнителни активни действия + Flow: + FlowTypeMissing: Липсва FlowType + Empty: Потокът вече е празен + WrongTriggerType: TriggerType е невалиден + NoChanges: Без промени + ActionIDsNotExist: ActionIDs не съществуват + Query: + CloseRows: SQL изразът не можа да бъде завършен + SQLStatement: SQL изразът не може да бъде създаден + InvalidRequest: Заявката е невалидна + Quota: + AlreadyExists: Вече съществува квота за тази единица + NotFound: Не е намерена квота за тази единица + Invalid: + CallURL: URL адресът за обаждане с квота е невалиден + Percent: Процентът на квотата е по-нисък от 1 + Unimplemented: За тази единица не се прилагат квоти + Amount: Сумата на квотата е по-ниска от 1 + ResetInterval: Интервалът за нулиране на квотата е по-кратък от минута + Noop: Неограничена квота без известия няма ефект + Access: + Exhausted: Квотата за удостоверени заявки е изчерпана + Execution: + Exhausted: Квотата за секунди за изпълнение е изчерпана + LogStore: + Access: + StorageFailed: >- + Съхраняването на регистрационния файл за достъп в базата данни не бе + успешно + ScanFailed: Неуспешно запитване за използване за удостоверени заявки + Execution: + StorageFailed: >- + Неуспешно съхраняване на регистрационния файл за изпълнение на действие + в базата данни + ScanFailed: Неуспешно запитване за използване за секунди изпълнение на действие + Session: + NotExisting: Сесията не съществува + Terminated: Сесията вече е прекратена + Token: + Invalid: Токенът на сесията е невалиден + Passkey: + NoChallenge: Сесия без предизвикателство за парола + Intent: + IDPMissing: IDP липсва в заявката + SuccessURLMissing: В заявката липсва URL адрес за успех + FailureURLMissing: В заявката липсва URL адрес за грешка + StateMissing: В заявката липсва параметър състояние + NotStarted: Намерението не е стартирано или вече е прекратено + NotSucceeded: Намерението не е успешно + TokenCreationFailed: Неуспешно създаване на токен + InvalidToken: Знакът за намерение е невалиден +AggregateTypes: + action: Действие + instance: Инстанция + key_pair: Двойка ключове + org: Организация + project: Проект + user: Потребител + usergrant: Предоставяне на потребител + quota: Квота +EventTypes: + user: + added: Добавен потребител + selfregistered: Потребителят се регистрира сам + initialization: + code: + added: Генериран код за инициализиране + sent: Кодът за инициализиране е изпратен + check: + succeeded: Проверката за инициализация е успешна + failed: Проверката на инициализацията е неуспешна + token: + added: Токенът за достъп е създаден + removed: Токенът за достъп е премахнат + username: + reserved: Потребителското име е запазено + released: Потребителското име е освободено + changed: Потребителското име е променено + email: + reserved: Имейл адресът е запазен + released: Имейл адресът е освободен + changed: Имейл адресът е променен + verified: Имейл адресът е потвърден + verification: + failed: Проверката на имейл адреса не бе успешна + code: + added: Генериран код за потвърждение на имейл адрес + sent: Кодът за потвърждение на имейл адреса е изпратен + machine: + added: Добавен е технически потребител + changed: Техническият потребител е променен + key: + added: Ключът е добавен + removed: Ключът е премахнат + secret: + set: Секретен комплект + removed: Тайната е премахната + check: + succeeded: Тайната проверка е успешна + failed: Тайната проверка е неуспешна + human: + added: Добавено лице + selfregistered: Човек се регистрира сам + avatar: + added: Аватарът е добавен + removed: Аватарът премахнат + initialization: + code: + added: Генериран код за инициализиране + sent: Кодът за инициализиране е изпратен + check: + succeeded: Проверката за инициализация е успешна + failed: Проверката на инициализацията е неуспешна + username: + reserved: Потребителското име е запазено + released: Потребителското име е освободено + email: + changed: Имейл адресът е променен + verified: Имейл адресът е потвърден + verification: + failed: Проверката на имейл адреса не бе успешна + code: + added: Генериран код за потвърждение на имейл адрес + sent: Кодът за потвърждение на имейл адреса е изпратен + password: + changed: паролата е сменена + code: + added: Кодът на паролата е генериран + sent: Кодът за парола е изпратен + check: + succeeded: Проверката на паролата е успешна + failed: Проверката на паролата е неуспешна + externallogin: + check: + succeeded: Външното влизане бе успешно + externalidp: + added: Добавен външен IDP + removed: Външният IDP е премахнат + cascade: + removed: Външната IDP каскада е премахната + phone: + changed: Телефонният номер е променен + verified: Телефонният номер е потвърден + verification: + failed: Неуспешна проверка на телефонния номер + code: + added: Генериран код на телефонен номер + sent: Кодът на телефонния номер е изпратен + removed: Телефонният номер е премахнат + profile: + changed: Променен потребителски профил + address: + changed: Потребителският адрес е променен + mfa: + otp: + added: Добавен е многофакторен OTP + verified: Многофакторно OTP потвърдено + removed: Многофакторният OTP премахнат + check: + succeeded: Многофакторната OTP проверка е успешна + failed: Многофакторната OTP проверка е неуспешна + u2f: + token: + added: Добавен е многофакторен U2F токен + verified: Multifactor U2F Token е проверен + removed: Multifactor U2F Token премахнат + begin: + login: Многофакторната U2F проверка започна + check: + succeeded: Многофакторната U2F проверка е успешна + failed: Многофакторната U2F проверка е неуспешна + signcount: + changed: Контролната сума на Multifactor U2F Token е променена + init: + skipped: Многофакторната инициализация е пропусната + passwordless: + token: + added: Добавен е токен за влизане без парола + verified: Токенът за влизане без парола е потвърден + removed: Токенът за влизане без парола е премахнат + begin: + login: Започна проверка за влизане без парола + check: + succeeded: Проверката за влизане без парола е успешна + failed: Проверката за влизане без парола е неуспешна + signcount: + changed: Контролната сума на токена за влизане без парола е променена + initialization: + code: + added: Добавен код за инициализация без парола + sent: Кодът за инициализация без парола е изпратен + requested: Изисква се код за инициализация без парола + check: + succeeded: Кодът за инициализация без парола е проверен успешно + failed: Проверката на кода за инициализация без парола е неуспешна + signed: + out: Потребителят е излязъл + refresh: + token: + added: Създаден токен за опресняване + renewed: Токенът за обновяване е подновен + removed: Токенът за обновяване е премахнат + locked: Потребителят е заключен + unlocked: Потребителят е отключен + deactivated: Потребителят е деактивиран + reactivated: Потребителят е повторно активиран + removed: Потребителят е премахнат + password: + changed: паролата е сменена + code: + added: Кодът на паролата е генериран + sent: Кодът за парола е изпратен + check: + succeeded: Проверката на паролата е успешна + failed: Проверката на паролата е неуспешна + phone: + changed: Телефонният номер е променен + verified: Телефонният номер е потвърден + verification: + failed: Неуспешна проверка на телефонния номер + code: + added: Генериран код на телефонен номер + sent: Кодът на телефонния номер е изпратен + removed: Телефонният номер е премахнат + profile: + changed: Променен потребителски профил + address: + changed: Потребителският адрес е променен + mfa: + otp: + added: Добавен е многофакторен OTP + verified: Многофакторно OTP потвърдено + removed: Многофакторният OTP премахнат + check: + succeeded: Многофакторната OTP проверка е успешна + failed: Многофакторната OTP проверка е неуспешна + init: + skipped: Многофакторната OTP инициализация е пропусната + init: + skipped: Многофакторната инициализация е пропусната + signed: + out: Потребителят е излязъл + grant: + added: Упълномощаването е добавено + changed: Разрешението е променено + removed: Упълномощаването е премахнато + deactivated: Упълномощаването е деактивирано + reactivated: Упълномощаването е повторно активирано + reserved: Разрешението е запазено + released: Разрешението е пуснато + cascade: + removed: Упълномощаването е премахнато + changed: Разрешението е променено + metadata: + set: Набор от потребителски метаданни + removed: Потребителските метаданни са премахнати + removed.all: Всички потребителски метаданни са премахнати + domain: + claimed: Заявен домейн + claimed.sent: Известието за заявен домейн е изпратено + pat: + added: Добавен личен токен за достъп + removed: Личният маркер за достъп е премахнат + org: + added: Добавена е организация + changed: Организацията се промени + deactivated: Организацията е деактивирана + reactivated: Организацията е активирана отново + removed: Организацията е премахната + domain: + added: Домейнът е добавен + verification: + added: Добавена е проверка на домейна + failed: Неуспешна проверка на домейна + verified: Домейнът е потвърден + removed: Домейнът премахнат + primary: + set: Основен набор от домейни + reserved: Домейнът е запазен + released: Домейнът е освободен + name: + reserved: Името на организацията е запазено + released: Името на организацията е публикувано + member: + added: Добавен е член на организацията + changed: Членът на организацията е променен + removed: Премахнат член на организацията + cascade: + removed: Каскадата на членовете на организацията е премахната + iam: + policy: + added: Добавена е системна политика + changed: Системната политика е променена + removed: Системната политика е премахната + idp: + config: + added: IDP конфигурация е добавена + changed: IDP конфигурацията е променена + removed: IDP конфигурацията е премахната + deactivated: IDP конфигурацията е деактивирана + reactivated: IDP конфигурацията е активирана отново + oidc: + config: + added: Добавена е OIDC IDP конфигурация + changed: IDP конфигурацията на OIDC е променена + saml: + config: + added: Добавена е SAML IDP конфигурация + changed: SAML IDP конфигурацията е променена + jwt: + config: + added: Добавена е конфигурация на JWT IDP + changed: Конфигурацията на JWT IDP е променена + customtext: + set: Персонализиран текстов набор + removed: Персонализираният текст е премахнат + template: + removed: Персонализираният текстов шаблон е премахнат + policy: + login: + added: Добавена е политика за влизане + changed: Правилата за влизане са променени + removed: Правилата за влизане са премахнати + idpprovider: + added: Доставчикът на самоличност е добавен към правилата за влизане + removed: Доставчикът на самоличност е премахнат от правилата за влизане + cascade: + removed: >- + Каскадата на доставчика на самоличност е премахната от правилата + за влизане + secondfactor: + added: Вторият фактор е добавен към правилата за влизане + removed: Вторият фактор е премахнат от правилата за влизане + multifactor: + added: 'Много фактор, добавен към правилата за влизане' + removed: Мултифакторът е премахнат от правилата за влизане + password: + complexity: + added: Добавена е политика за сложността на паролата + changed: Правилата за сложността на паролите са променени + removed: Правилата за сложността на паролите са премахнати + age: + added: Добавена е политика за възраст на паролата + changed: Правилата за възрастта на паролата са променени + removed: Правилото за възрастта на паролата е премахнато + lockout: + added: Добавена е политика за блокиране на парола + changed: Правилата за блокиране на пароли са променени + removed: Правилата за блокиране на пароли са премахнати + label: + added: Добавена е политика за етикети + changed: Правилата за етикети са променени + activated: Правилата за етикети са активирани + removed: Правилата за етикети са премахнати + logo: + added: Логото е добавено към правилата за етикети + removed: Логото е премахнато от правилата за етикети + dark: + added: Лого (тъмен режим) е добавено към правилата за етикети + removed: Логото (тъмен режим) е премахнато от правилата за етикети + icon: + added: Иконата е добавена към правилата за етикети + removed: Иконата е премахната от правилата за етикети + dark: + added: Икона (тъмен режим) е добавена към правилата за етикети + removed: Икона (тъмен режим) премахната от правилата за етикети + font: + added: Шрифтът е добавен към правилата за етикети + removed: Шрифтът е премахнат от правилата за етикети + assets: + removed: Активите са премахнати от правилата за етикети + privacy: + added: Добавени са политика за поверителност и TOS + changed: Политиката за поверителност и TOS са променени + removed: Правилата за поверителност и TOS премахнати + domain: + added: Добавена е политика за домейн + changed: Правилата на домейна са променени + removed: Правилата за домейни са премахнати + lockout: + added: Добавена е политика за блокиране + changed: Политиката за блокиране е променена + removed: Политиката за блокиране е премахната + notification: + added: Добавена е политика за уведомяване + changed: Правилата за уведомяване са променени + removed: Правилата за уведомяване са премахнати + flow: + trigger_actions: + set: Комплект действия + cascade: + removed: Каскадата от действия е премахната + removed: Премахнати действия + cleared: Потокът е изчистен + mail: + template: + added: Добавен шаблон за имейл + changed: Шаблонът за имейл е променен + removed: Шаблонът за имейл е премахнат + text: + added: Добавен е имейл текст + changed: Текстът на имейла е променен + removed: Текстът на имейла е премахнат + metadata: + removed: Метаданните са премахнати + removed.all: Всички метаданни са премахнати + set: Набор метаданни + project: + added: Проектът е добавен + changed: Проектът е променен + deactivated: Проектът е деактивиран + reactivated: Проектът е активиран отново + removed: Проектът е премахнат + member: + added: Добавен член на проекта + changed: Членът на проекта е променен + removed: Членът на проекта е премахнат + cascade: + removed: Каскадата от членове на проекта е премахната + role: + added: Добавена е роля в проекта + changed: Ролята на проекта е променена + removed: Ролята в проекта е премахната + grant: + added: Добавен е достъп за управление + changed: Достъпът за управление е променен + removed: Достъпът за управление е премахнат + deactivated: Достъпът за управление е деактивиран + reactivated: Достъпът за управление е активиран отново + cascade: + changed: Достъпът за управление е променен + member: + added: Добавен е член с достъп за управление + changed: Членът с достъп за управление е променен + removed: Членът с достъп за управление е премахнат + cascade: + removed: Каскадата за достъп до управление е премахната + application: + added: Приложението е добавено + changed: Приложението е променено + removed: Приложението е премахнато + deactivated: Приложението е деактивирано + reactivated: Приложението е активирано повторно + oidc: + secret: + check: + succeeded: Проверката на OIDC Client Secret е успешна + failed: Проверката на OIDC Client Secret е неуспешна + key: + added: Добавен ключ за приложение + removed: Ключът на приложението е премахнат + config: + saml: + added: Добавена е SAML конфигурация + changed: SAML конфигурацията е променена + oidc: + added: Добавена е OIDC конфигурация + changed: Конфигурацията на OIDC е променена + secret: + changed: Тайната на OIDC е променена + api: + added: Добавена е конфигурация на API + changed: Променена конфигурация на API + secret: + changed: Тайната на API е променена + policy: + password: + complexity: + added: Добавена е политика за сложността на паролата + changed: Правилата за сложността на паролите са променени + age: + added: Добавена е политика за възраст на паролата + changed: Правилата за възрастта на паролата са променени + lockout: + added: Добавена е политика за блокиране на парола + changed: Правилата за блокиране на пароли са променени + iam: + setup: + started: Настройката на ZITADEL започна + done: Настройката на ZITADEL е готова + global: + org: + set: Глобален организационен набор + project: + iam: + set: Комплект проект ZITADEL + member: + added: Добавен е член на ZITADEL + changed: Членът на ZITADEL е променен + removed: Член на ZITADEL премахнат + cascade: + removed: Каскадата на членове на ZITADEL е премахната + idp: + config: + added: IDP конфигурация е добавена + changed: IDP конфигурацията е променена + removed: IDP конфигурацията е премахната + deactivated: IDP конфигурацията е деактивирана + reactivated: IDP конфигурацията е активирана отново + oidc: + config: + added: Добавена е OIDC IDP конфигурация + changed: IDP конфигурацията на OIDC е променена + saml: + config: + added: Добавена е SAML IDP конфигурация + changed: SAML IDP конфигурацията е променена + jwt: + config: + added: Добавена е конфигурация на JWT към доставчик на идентичност + changed: Конфигурацията на JWT от доставчика на идентичност е премахната + customtext: + set: Текстът беше зададен + removed: Текстът беше премахнат + policy: + login: + added: Добавена е политиката за влизане по подразбиране + changed: Правилата за влизане по подразбиране са променени + idpprovider: + added: >- + Доставчикът на самоличност е добавен към правилата за влизане по + подразбиране + removed: >- + Доставчикът на самоличност е премахнат от правилата за влизане по + подразбиране + label: + added: Добавена е политика за етикети + changed: Правилата за етикети са променени + activated: Правилата за етикети са активирани + logo: + added: Логото е добавено към правилата за етикети + removed: Логото е премахнато от правилата за етикети + dark: + added: Лого (тъмен режим) е добавено към правилата за етикети + removed: Логото (тъмен режим) е премахнато от правилата за етикети + icon: + added: Иконата е добавена към правилата за етикети + removed: Иконата е премахната от правилата за етикети + dark: + added: Икона (тъмен режим) е добавена към правилата за етикети + removed: Икона (тъмен режим) премахната от правилата за етикети + font: + added: Шрифтът е добавен към правилата за етикети + removed: Шрифтът е премахнат от правилата за етикети + assets: + removed: Активите са премахнати от правилата за етикети + default: + language: + set: Зададен език по подразбиране + oidc: + settings: + added: Добавена е OIDC конфигурация + changed: Конфигурацията на OIDC е променена + removed: OIDC конфигурацията е премахната + secret: + generator: + added: Добавен е таен генератор + changed: Променен секретен генератор + removed: Секретният генератор е премахнат + smtp: + config: + added: Добавена е SMTP конфигурация + changed: SMTP конфигурацията е променена + password: + changed: Тайната на конфигурацията на SMTP е променена + sms: + config: + twilio: + added: Добавен е доставчик на SMS Twilio + changed: Доставчикът на Twilio SMS е променен + token: + changed: Токенът на доставчика на SMS на Twilio е променен + removed: Доставчикът на Twilio SMS е премахнат + activated: Twilio SMS доставчик е активиран + deactivated: Доставчикът на Twilio SMS е деактивиран + key_pair: + added: Добавена двойка ключове + certificate: + added: Сертификатът е добавен + action: + added: Добавено действие + changed: Действието е променено + deactivated: Действието е деактивирано + reactivated: Действието е активирано повторно + removed: Действието е премахнато + instance: + added: Добавен екземпляр + changed: Екземплярът е променен + customtext: + removed: Персонализираният текст е премахнат + set: Персонализиран текстов набор + template: + removed: Шаблонът за персонализиран текст е премахнат + default: + language: + set: Зададен език по подразбиране + org: + set: Организация по подразбиране + domain: + added: Домейнът е добавен + primary: + set: Основен набор от домейни + removed: Домейнът премахнат + iam: + console: + set: Комплект конзолни приложения ZITADEL + project: + set: Комплект проект ZITADEL + mail: + template: + added: Добавен шаблон за имейл + changed: Шаблонът за имейл е променен + text: + added: Добавен е имейл текст + changed: Текстът на имейла е променен + member: + added: Добавен е член на екземпляра + changed: Членът на екземпляра е променен + removed: Членът на екземпляра е премахнат + cascade: + removed: Каскадата от членове на екземпляра е премахната + notification: + provider: + debug: + fileadded: Добавен е доставчик на известия за отстраняване на грешки + filechanged: >- + Доставчикът на известия за отстраняване на грешки на файлове е + променен + fileremoved: >- + Доставчикът на известия за отстраняване на грешки на файлове е + премахнат + logadded: Добавен е доставчик на известия за отстраняване на грешки в журнала + logchanged: >- + Доставчикът на известия за отстраняване на грешки в журнала е + променен + logremoved: >- + Доставчикът на известия за отстраняване на грешки в журнала е + премахнат + oidc: + settings: + added: Добавени са настройки на OIDC + changed: Настройките на OIDC са променени + policy: + domain: + added: Добавена е политика за домейн + changed: Правилата на домейна са променени + label: + activated: Правилата за етикети са активирани + added: Добавена е политика за етикети + assets: + removed: Правилата за актив от етикета са премахнати + changed: Правилата за етикети са променени + font: + added: Шрифтът е добавен към правилата за етикети + removed: Шрифтът е премахнат от правилата за етикети + icon: + added: Иконата е добавена към правилата за етикети + removed: Иконата е премахната от правилата за етикети + dark: + added: Иконата е добавена към правилата за тъмни етикети + removed: Иконата е премахната от правилата за тъмни етикети + logo: + added: Логото е добавено към правилата за етикети + removed: Логото е премахнато от правилата за етикети + dark: + added: Логото е добавено към правилата за тъмни етикети + removed: Логото е премахнато от правилата за тъмни етикети + lockout: + added: Добавена е политика за блокиране + changed: Политиката за блокиране е променена + login: + added: Добавена е политика за влизане + changed: Правилата за влизане са променени + idpprovider: + added: Доставчикът на самоличност е добавен към правилата за влизане + cascade: + removed: >- + Каскадата на доставчика на самоличност е премахната от правилата + за влизане + removed: Доставчикът на самоличност е премахнат от правилата за влизане + multifactor: + added: Мултифакторът е добавен към правилата за влизане + removed: Multifactor е премахнат от политиката за влизане + secondfactor: + added: Вторият фактор е добавен към правилата за влизане + removed: Вторият фактор е премахнат от правилата за влизане + password: + age: + added: Добавена е политика за възраст на паролата + changed: Правилата за възрастта на паролата са променени + complexity: + added: Добавена е политика за сложността на паролата + changed: Правилата за сложността на паролите са премахнати + privacy: + added: Добавена е политика за поверителност + changed: Политиката за поверителност е променена + security: + set: Зададена политика за сигурност + removed: Екземплярът е премахнат + secret: + generator: + added: Добавен е таен генератор + changed: Променен секретен генератор + removed: Секретният генератор е премахнат + sms: + configtwilio: + activated: Конфигурацията на Twilio SMS е активирана + added: Добавена е конфигурация на Twilio SMS + changed: Конфигурацията на Twilio SMS е променена + deactivated: Конфигурацията на Twilio SMS е деактивирана + removed: SMS конфигурацията на Twilio е премахната + token: + changed: Конфигурацията на Token на Twilio SMS е променена + smtp: + config: + added: Добавена е SMTP конфигурация + changed: SMTP конфигурацията е променена + password: + changed: Паролата на SMTP конфигурацията е променена + removed: Премахната SMTP конфигурация +Application: + OIDC: + UnsupportedVersion: Вашата OIDC версия не се поддържа + V1: + NotCompliant: >- + Вашата конфигурация не е съвместима и се различава от стандарта OIDC + 1.0. + NoRedirectUris: Поне един uri адрес за пренасочване трябва да бъде регистриран. + NotAllCombinationsAreAllowed: >- + Конфигурацията е съвместима, но не всички възможни комбинации са + разрешени. + Code: + RedirectUris: + HttpOnlyForWeb: >- + Предоставяне на код за тип разрешено само http пренасочване URIS за + apptype web. + CustomOnlyForNative: >- + Кодът за тип предоставяне позволява само потребителски uris адрес за + пренасочване за родния тип на приложението (напр. име на + приложение:// ) + Implicit: + RedirectUris: + CustomNotAllowed: >- + Видът на предоставяне имплицитно не позволява потребителски uris + адрес за пренасочване + HttpNotAllowed: >- + Видът на предоставяне имплицитно не позволява URL адрес за + пренасочване на http + HttpLocalhostOnlyForNative: >- + URI за пренасочване на Http://localhost е разрешен само за собствени + приложения. + Native: + AuthMethodType: + NotNone: Родните приложения трябва да имат authmethodtype none. + RedirectUris: + MustBeHttpLocalhost: >- + URI адресите за пренасочване трябва да започват с вашия собствен + протокол, http://127.0.0.1, http://[::1] или http://localhost. + UserAgent: + AuthMethodType: + NotNone: >- + Приложението на потребителски агент трябва да има authmethodtype + none. + GrantType: + Refresh: + NoAuthCode: >- + Токенът за опресняване е разрешен само в комбинация с код за + оторизация. +Action: + Flow: + Type: + Unspecified: Неуточнено + ExternalAuthentication: Външно удостоверяване + CustomiseToken: Токен за допълнение + InternalAuthentication: Вътрешно удостоверяване + TriggerType: + Unspecified: Неуточнено + PostAuthentication: Публикуване на автентификация + PreCreation: Предварително създаване + PostCreation: Създаване на публикации + PreUserinfoCreation: Предварително създаване на потребителска информация + PreAccessTokenCreation: Създаване на маркер за предварителен достъп From 62f424e69a62959c3bc0948be98c2c1e1f5709dd Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Mon, 19 Jun 2023 11:59:14 +0200 Subject: [PATCH 16/37] chore: translation error in fr (#6052) --- internal/api/ui/login/static/i18n/fr.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/api/ui/login/static/i18n/fr.yaml b/internal/api/ui/login/static/i18n/fr.yaml index 65cfbca6a..b963c5837 100644 --- a/internal/api/ui/login/static/i18n/fr.yaml +++ b/internal/api/ui/login/static/i18n/fr.yaml @@ -60,7 +60,7 @@ InitPassword: CodeLabel: Code NewPasswordLabel: Nouveau mot de passe NewPasswordConfirmLabel: Confirmer le mot de passe - ResendButtonText: code de réexpédition + ResendButtonText: renvoyer le code NextButtonText: suivant InitPasswordDone: @@ -76,7 +76,7 @@ InitUser: NewPasswordLabel: Nouveau mot de passe NewPasswordConfirm: Confirmer le mot de passe NextButtonText: Suivant - ResendButtonText: code de réexpédition + ResendButtonText: renvoyer le code InitUserDone: Title: User Utilisateur activé @@ -189,7 +189,7 @@ EmailVerification: Description: Nous vous avons envoyé un e-mail pour vérifier votre adresse. Veuillez saisir le code dans le formulaire ci-dessous. CodeLabel: Code NextButtonText: suivant - ResendButtonText: code de réexpédition + ResendButtonText: renvoyer le code EmailVerificationDone: Title: E-Mail Verification From 4eaf3fb21e303da4c473aab9376c80f1b62a919a Mon Sep 17 00:00:00 2001 From: Firmino Changani Date: Mon, 19 Jun 2023 12:07:56 +0100 Subject: [PATCH 17/37] fix: typo at function's name: checkApplicationType (#6039) --- internal/domain/application_oidc.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/domain/application_oidc.go b/internal/domain/application_oidc.go index e0ae783e8..ac2918478 100644 --- a/internal/domain/application_oidc.go +++ b/internal/domain/application_oidc.go @@ -213,7 +213,7 @@ func GetOIDCV1Compliance(appType OIDCApplicationType, grantTypes []OIDCGrantType checkGrantTypesCombination(compliance, grantTypes) checkRedirectURIs(compliance, grantTypes, appType, redirectUris) - checkApplicaitonType(compliance, appType, authMethod) + checkApplicationType(compliance, appType, authMethod) if compliance.NoneCompliant { compliance.Problems = append([]string{"Application.OIDC.V1.NotCompliant"}, compliance.Problems...) @@ -246,7 +246,7 @@ func checkRedirectURIs(compliance *Compliance, grantTypes []OIDCGrantType, appTy } } -func checkApplicaitonType(compliance *Compliance, appType OIDCApplicationType, authMethod OIDCAuthMethodType) { +func checkApplicationType(compliance *Compliance, appType OIDCApplicationType, authMethod OIDCAuthMethodType) { switch appType { case OIDCApplicationTypeNative: GetOIDCV1NativeApplicationCompliance(compliance, authMethod) From 09aafb35eb7a9625e884d4c46b14413b0305cc1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Tue, 20 Jun 2023 12:36:21 +0200 Subject: [PATCH 18/37] feat(v2): implement user register OTP (#6030) * feat(v2): implement user register OTP * feat(v2): implement user verify OTP * session: retry on permission denied --- internal/api/grpc/user/v2/otp.go | 38 ++ .../api/grpc/user/v2/otp_integration_test.go | 155 ++++++ internal/api/grpc/user/v2/otp_test.go | 71 +++ internal/command/main_test.go | 12 + internal/command/user_human_otp.go | 46 +- internal/command/user_human_otp_test.go | 476 ++++++++++++++++++ internal/command/user_v2_otp.go | 33 ++ internal/command/user_v2_otp_test.go | 263 ++++++++++ internal/domain/human_otp.go | 9 +- .../repository/mock/repository.mock.impl.go | 22 + 10 files changed, 1113 insertions(+), 12 deletions(-) create mode 100644 internal/api/grpc/user/v2/otp.go create mode 100644 internal/api/grpc/user/v2/otp_integration_test.go create mode 100644 internal/api/grpc/user/v2/otp_test.go create mode 100644 internal/command/user_v2_otp.go create mode 100644 internal/command/user_v2_otp_test.go diff --git a/internal/api/grpc/user/v2/otp.go b/internal/api/grpc/user/v2/otp.go new file mode 100644 index 000000000..80ea81007 --- /dev/null +++ b/internal/api/grpc/user/v2/otp.go @@ -0,0 +1,38 @@ +package user + +import ( + "context" + + "github.com/zitadel/zitadel/internal/api/authz" + "github.com/zitadel/zitadel/internal/api/grpc/object/v2" + "github.com/zitadel/zitadel/internal/domain" + user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha" +) + +func (s *Server) RegisterOTP(ctx context.Context, req *user.RegisterOTPRequest) (*user.RegisterOTPResponse, error) { + return otpDetailsToPb( + s.command.AddUserOTP(ctx, req.GetUserId(), authz.GetCtxData(ctx).ResourceOwner), + ) + +} + +func otpDetailsToPb(otp *domain.OTPv2, err error) (*user.RegisterOTPResponse, error) { + if err != nil { + return nil, err + } + return &user.RegisterOTPResponse{ + Details: object.DomainToDetailsPb(otp.ObjectDetails), + Uri: otp.URI, + Secret: otp.Secret, + }, nil +} + +func (s *Server) VerifyOTPRegistration(ctx context.Context, req *user.VerifyOTPRegistrationRequest) (*user.VerifyOTPRegistrationResponse, error) { + objectDetails, err := s.command.CheckUserOTP(ctx, req.GetUserId(), req.GetCode(), authz.GetCtxData(ctx).ResourceOwner) + if err != nil { + return nil, err + } + return &user.VerifyOTPRegistrationResponse{ + Details: object.DomainToDetailsPb(objectDetails), + }, nil +} diff --git a/internal/api/grpc/user/v2/otp_integration_test.go b/internal/api/grpc/user/v2/otp_integration_test.go new file mode 100644 index 000000000..9bc788e06 --- /dev/null +++ b/internal/api/grpc/user/v2/otp_integration_test.go @@ -0,0 +1,155 @@ +//go:build integration + +package user_test + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/zitadel/zitadel/internal/integration" + user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha" +) + +func TestServer_RegisterOTP(t *testing.T) { + // userID := Tester.CreateHumanUser(CTX).GetUserId() + + type args struct { + ctx context.Context + req *user.RegisterOTPRequest + } + tests := []struct { + name string + args args + want *user.RegisterOTPResponse + wantErr bool + }{ + { + name: "missing user id", + args: args{ + ctx: CTX, + req: &user.RegisterOTPRequest{}, + }, + wantErr: true, + }, + { + name: "user mismatch", + args: args{ + ctx: CTX, + req: &user.RegisterOTPRequest{ + UserId: "wrong", + }, + }, + wantErr: true, + }, + /* TODO: after we are able to obtain a Bearer token for a human user + https://github.com/zitadel/zitadel/issues/6022 + { + name: "human user", + args: args{ + ctx: CTX, + req: &user.RegisterOTPRequest{ + UserId: userID, + }, + }, + want: &user.RegisterOTPResponse{ + Details: &object.Details{ + ResourceOwner: Tester.Organisation.ID, + }, + }, + }, + */ + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := Client.RegisterOTP(tt.args.ctx, tt.args.req) + if tt.wantErr { + require.Error(t, err) + return + } + require.NoError(t, err) + require.NotNil(t, got) + integration.AssertDetails(t, tt.want, got) + assert.NotEmpty(t, got.GetUri()) + assert.NotEmpty(t, got.GetSecret()) + }) + } +} + +func TestServer_VerifyOTPRegistration(t *testing.T) { + userID := Tester.CreateHumanUser(CTX).GetUserId() + + /* TODO: after we are able to obtain a Bearer token for a human user + reg, err := Client.RegisterOTP(CTX, &user.RegisterOTPRequest{ + UserId: userID, + }) + require.NoError(t, err) + code, err := totp.GenerateCode(reg.Secret, time.Now()) + require.NoError(t, err) + */ + + type args struct { + ctx context.Context + req *user.VerifyOTPRegistrationRequest + } + tests := []struct { + name string + args args + want *user.VerifyOTPRegistrationResponse + wantErr bool + }{ + { + name: "user mismatch", + args: args{ + ctx: CTX, + req: &user.VerifyOTPRegistrationRequest{ + UserId: "wrong", + }, + }, + wantErr: true, + }, + { + name: "wrong code", + args: args{ + ctx: CTX, + req: &user.VerifyOTPRegistrationRequest{ + UserId: userID, + Code: "123", + }, + }, + wantErr: true, + }, + /* TODO: after we are able to obtain a Bearer token for a human user + https://github.com/zitadel/zitadel/issues/6022 + { + name: "success", + args: args{ + ctx: CTX, + req: &user.VerifyOTPRegistrationRequest{ + UserId: userID, + Code: code, + }, + }, + want: &user.VerifyOTPRegistrationResponse{ + Details: &object.Details{ + ResourceOwner: Tester.Organisation.ResourceOwner, + }, + }, + }, + */ + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := Client.VerifyOTPRegistration(tt.args.ctx, tt.args.req) + if tt.wantErr { + require.Error(t, err) + return + } + require.NoError(t, err) + require.NotNil(t, got) + integration.AssertDetails(t, tt.want, got) + }) + } +} diff --git a/internal/api/grpc/user/v2/otp_test.go b/internal/api/grpc/user/v2/otp_test.go new file mode 100644 index 000000000..29dcb5911 --- /dev/null +++ b/internal/api/grpc/user/v2/otp_test.go @@ -0,0 +1,71 @@ +package user + +import ( + "io" + "testing" + "time" + + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" + + "github.com/zitadel/zitadel/internal/domain" + object "github.com/zitadel/zitadel/pkg/grpc/object/v2alpha" + user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha" +) + +func Test_otpDetailsToPb(t *testing.T) { + type args struct { + otp *domain.OTPv2 + err error + } + tests := []struct { + name string + args args + want *user.RegisterOTPResponse + wantErr error + }{ + { + name: "error", + args: args{ + err: io.ErrClosedPipe, + }, + wantErr: io.ErrClosedPipe, + }, + { + name: "success", + args: args{ + otp: &domain.OTPv2{ + ObjectDetails: &domain.ObjectDetails{ + Sequence: 123, + EventDate: time.Unix(456, 789), + ResourceOwner: "me", + }, + Secret: "secret", + URI: "URI", + }, + }, + want: &user.RegisterOTPResponse{ + Details: &object.Details{ + Sequence: 123, + ChangeDate: ×tamppb.Timestamp{ + Seconds: 456, + Nanos: 789, + }, + ResourceOwner: "me", + }, + Secret: "secret", + Uri: "URI", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := otpDetailsToPb(tt.args.otp, tt.args.err) + require.ErrorIs(t, err, tt.wantErr) + if !proto.Equal(tt.want, got) { + t.Errorf("RegisterOTPResponse =\n%v\nwant\n%v", got, tt.want) + } + }) + } +} diff --git a/internal/command/main_test.go b/internal/command/main_test.go index 5c7b42d3a..7b37e0f8d 100644 --- a/internal/command/main_test.go +++ b/internal/command/main_test.go @@ -125,6 +125,18 @@ func expectPushFailed(err error, events []*repository.Event, uniqueConstraints . } } +func expectRandomPush(events []*repository.Event, uniqueConstraints ...*repository.UniqueConstraint) expect { + return func(m *mock.MockRepository) { + m.ExpectRandomPush(events, uniqueConstraints...) + } +} + +func expectRandomPushFailed(err error, events []*repository.Event, uniqueConstraints ...*repository.UniqueConstraint) expect { + return func(m *mock.MockRepository) { + m.ExpectRandomPushFailed(err, events, uniqueConstraints...) + } +} + func expectFilter(events ...*repository.Event) expect { return func(m *mock.MockRepository) { m.ExpectFilterEvents(events...) diff --git a/internal/command/user_human_otp.go b/internal/command/user_human_otp.go index 96db142f7..7b779e37a 100644 --- a/internal/command/user_human_otp.go +++ b/internal/command/user_human_otp.go @@ -3,12 +3,14 @@ package command import ( "context" + "github.com/pquerna/otp" "github.com/zitadel/logging" "github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/crypto" "github.com/zitadel/zitadel/internal/domain" caos_errs "github.com/zitadel/zitadel/internal/errors" + "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/eventstore/v1/models" "github.com/zitadel/zitadel/internal/repository/user" "github.com/zitadel/zitadel/internal/telemetry/tracing" @@ -43,7 +45,32 @@ func (c *Commands) AddHumanOTP(ctx context.Context, userID, resourceowner string if userID == "" { return nil, caos_errs.ThrowInvalidArgument(nil, "COMMAND-5M0sd", "Errors.User.UserIDMissing") } - human, err := c.getHuman(ctx, userID, resourceowner) + prep, err := c.createHumanOTP(ctx, userID, resourceowner) + if err != nil { + return nil, err + } + _, err = c.eventstore.Push(ctx, prep.cmds...) + if err != nil { + return nil, err + } + return &domain.OTP{ + ObjectRoot: models.ObjectRoot{ + AggregateID: prep.userAgg.ID, + }, + SecretString: prep.key.Secret(), + Url: prep.key.URL(), + }, nil +} + +type preparedOTP struct { + wm *HumanOTPWriteModel + userAgg *eventstore.Aggregate + key *otp.Key + cmds []eventstore.Command +} + +func (c *Commands) createHumanOTP(ctx context.Context, userID, resourceOwner string) (*preparedOTP, error) { + human, err := c.getHuman(ctx, userID, resourceOwner) if err != nil { logging.Log("COMMAND-DAqe1").WithError(err).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Debug("unable to get human for loginname") return nil, caos_errs.ThrowPreconditionFailed(err, "COMMAND-MM9fs", "Errors.User.NotFound") @@ -59,7 +86,7 @@ func (c *Commands) AddHumanOTP(ctx context.Context, userID, resourceowner string return nil, caos_errs.ThrowPreconditionFailed(err, "COMMAND-8ugTs", "Errors.Org.DomainPolicy.NotFound") } - otpWriteModel, err := c.otpWriteModelByID(ctx, userID, resourceowner) + otpWriteModel, err := c.otpWriteModelByID(ctx, userID, resourceOwner) if err != nil { return nil, err } @@ -80,16 +107,13 @@ func (c *Commands) AddHumanOTP(ctx context.Context, userID, resourceowner string if err != nil { return nil, err } - _, err = c.eventstore.Push(ctx, user.NewHumanOTPAddedEvent(ctx, userAgg, secret)) - if err != nil { - return nil, err - } - return &domain.OTP{ - ObjectRoot: models.ObjectRoot{ - AggregateID: human.AggregateID, + return &preparedOTP{ + wm: otpWriteModel, + userAgg: userAgg, + key: key, + cmds: []eventstore.Command{ + user.NewHumanOTPAddedEvent(ctx, userAgg, secret), }, - SecretString: key.Secret(), - Url: key.URL(), }, nil } diff --git a/internal/command/user_human_otp_test.go b/internal/command/user_human_otp_test.go index c894a63f6..b04038bb3 100644 --- a/internal/command/user_human_otp_test.go +++ b/internal/command/user_human_otp_test.go @@ -2,11 +2,17 @@ package command import ( "context" + "io" "testing" + "time" + "github.com/golang/mock/gomock" + "github.com/pquerna/otp/totp" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "golang.org/x/text/language" + "github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/crypto" "github.com/zitadel/zitadel/internal/domain" caos_errs "github.com/zitadel/zitadel/internal/errors" @@ -231,6 +237,476 @@ func TestCommandSide_AddHumanOTP(t *testing.T) { } } +func TestCommands_createHumanOTP(t *testing.T) { + type fields struct { + eventstore *eventstore.Eventstore + } + type args struct { + ctx context.Context + userID string + resourceOwner string + } + tests := []struct { + name string + fields fields + args args + want bool + wantErr error + }{ + { + name: "user not existing, not found error", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter(), + ), + }, + args: args{ + ctx: context.Background(), + resourceOwner: "org1", + userID: "user1", + }, + wantErr: caos_errs.ThrowPreconditionFailed(nil, "COMMAND-MM9fs", "Errors.User.NotFound"), + }, + { + name: "org not existing, not found error", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), + &user.NewAggregate("user1", "org1").Aggregate, + "username", + "firstname", + "lastname", + "nickname", + "displayname", + language.German, + domain.GenderUnspecified, + "email@test.ch", + true, + ), + ), + ), + expectFilter(), + ), + }, + args: args{ + ctx: context.Background(), + resourceOwner: "org1", + userID: "user1", + }, + wantErr: caos_errs.ThrowPreconditionFailed(nil, "COMMAND-55M9f", "Errors.Org.NotFound"), + }, + { + name: "org iam policy not existing, not found error", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), + &user.NewAggregate("user1", "org1").Aggregate, + "username", + "firstname", + "lastname", + "nickname", + "displayname", + language.German, + domain.GenderUnspecified, + "email@test.ch", + true, + ), + ), + ), + expectFilter( + eventFromEventPusher( + org.NewOrgAddedEvent(context.Background(), + &user.NewAggregate("org1", "org1").Aggregate, + "org", + ), + ), + ), + expectFilter(), + expectFilter(), + ), + }, + args: args{ + ctx: context.Background(), + resourceOwner: "org1", + userID: "user1", + }, + wantErr: caos_errs.ThrowPreconditionFailed(nil, "COMMAND-8ugTs", "Errors.Org.DomainPolicy.NotFound"), + }, + { + name: "otp already exists, already exists error", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), + &user.NewAggregate("user1", "org1").Aggregate, + "username", + "firstname", + "lastname", + "nickname", + "displayname", + language.German, + domain.GenderUnspecified, + "email@test.ch", + true, + ), + ), + ), + expectFilter( + eventFromEventPusher( + org.NewOrgAddedEvent(context.Background(), + &user.NewAggregate("org1", "org1").Aggregate, + "org", + ), + ), + ), + expectFilter( + eventFromEventPusher( + org.NewDomainPolicyAddedEvent(context.Background(), + &org.NewAggregate("org1").Aggregate, + true, + true, + true, + ), + ), + ), + expectFilter( + eventFromEventPusher( + user.NewHumanOTPAddedEvent(context.Background(), + &user.NewAggregate("user1", "org1").Aggregate, + &crypto.CryptoValue{ + CryptoType: crypto.TypeEncryption, + Algorithm: "enc", + KeyID: "id", + Crypted: []byte("a"), + }), + ), + eventFromEventPusher( + user.NewHumanOTPVerifiedEvent(context.Background(), + &user.NewAggregate("user1", "org1").Aggregate, + "agent1")), + ), + ), + }, + args: args{ + ctx: context.Background(), + resourceOwner: "org1", + userID: "user1", + }, + wantErr: caos_errs.ThrowAlreadyExists(nil, "COMMAND-do9se", "Errors.User.MFA.OTP.AlreadyReady"), + }, + { + name: "issuer not in context", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), + &user.NewAggregate("user1", "org1").Aggregate, + "username", + "firstname", + "lastname", + "nickname", + "displayname", + language.German, + domain.GenderUnspecified, + "email@test.ch", + true, + ), + ), + ), + expectFilter( + eventFromEventPusher( + org.NewOrgAddedEvent(context.Background(), + &user.NewAggregate("org1", "org1").Aggregate, + "org", + ), + ), + ), + expectFilter( + eventFromEventPusher( + org.NewDomainPolicyAddedEvent(context.Background(), + &org.NewAggregate("org1").Aggregate, + true, + true, + true, + ), + ), + ), + expectFilter(), + ), + }, + args: args{ + ctx: context.Background(), + resourceOwner: "org1", + userID: "user1", + }, + wantErr: caos_errs.ThrowInternal(nil, "TOTP-ieY3o", "Errors.Internal"), + }, + { + name: "success", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), + &user.NewAggregate("user1", "org1").Aggregate, + "username", + "firstname", + "lastname", + "nickname", + "displayname", + language.German, + domain.GenderUnspecified, + "email@test.ch", + true, + ), + ), + ), + expectFilter( + eventFromEventPusher( + org.NewOrgAddedEvent(context.Background(), + &user.NewAggregate("org1", "org1").Aggregate, + "org", + ), + ), + ), + expectFilter( + eventFromEventPusher( + org.NewDomainPolicyAddedEvent(context.Background(), + &org.NewAggregate("org1").Aggregate, + true, + true, + true, + ), + ), + ), + expectFilter(), + ), + }, + args: args{ + ctx: authz.WithRequestedDomain(context.Background(), "zitadel.com"), + resourceOwner: "org1", + userID: "user1", + }, + want: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := &Commands{ + eventstore: tt.fields.eventstore, + multifactors: domain.MultifactorConfigs{ + OTP: domain.OTPConfig{ + CryptoMFA: crypto.CreateMockEncryptionAlg(gomock.NewController(t)), + }, + }, + } + got, err := c.createHumanOTP(tt.args.ctx, tt.args.userID, tt.args.resourceOwner) + require.ErrorIs(t, err, tt.wantErr) + if tt.want { + require.NotNil(t, got) + assert.NotNil(t, got.wm) + assert.NotNil(t, got.userAgg) + require.NotNil(t, got.key) + assert.NotEmpty(t, got.key.URL()) + assert.NotEmpty(t, got.key.Secret()) + assert.Len(t, got.cmds, 1) + } + }) + } +} + +func TestCommands_HumanCheckMFAOTPSetup(t *testing.T) { + ctx := authz.NewMockContext("inst1", "org1", "user1") + + cryptoAlg := crypto.CreateMockEncryptionAlg(gomock.NewController(t)) + key, secret, err := domain.NewOTPKey("example.com", "user1", cryptoAlg) + require.NoError(t, err) + userAgg := &user.NewAggregate("user1", "org1").Aggregate + + code, err := totp.GenerateCode(key.Secret(), time.Now()) + require.NoError(t, err) + + type fields struct { + eventstore *eventstore.Eventstore + } + type args struct { + userID string + code string + resourceOwner string + } + tests := []struct { + name string + fields fields + args args + want bool + wantErr error + }{ + { + name: "missing user id", + args: args{}, + wantErr: caos_errs.ThrowPreconditionFailed(nil, "COMMAND-8N9ds", "Errors.User.UserIDMissing"), + }, + { + name: "filter error", + fields: fields{ + eventstore: eventstoreExpect(t, + expectFilterError(io.ErrClosedPipe), + ), + }, + args: args{ + userID: "user1", + resourceOwner: "org1", + }, + wantErr: io.ErrClosedPipe, + }, + { + name: "otp not existing error", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + user.NewHumanOTPAddedEvent(ctx, userAgg, secret), + ), + eventFromEventPusher( + user.NewHumanOTPRemovedEvent(ctx, userAgg), + ), + ), + ), + }, + args: args{ + resourceOwner: "org1", + userID: "user1", + }, + wantErr: caos_errs.ThrowNotFound(nil, "COMMAND-3Mif9s", "Errors.User.MFA.OTP.NotExisting"), + }, + { + name: "otp already ready error", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + user.NewHumanOTPAddedEvent(ctx, userAgg, secret), + ), + eventFromEventPusher( + user.NewHumanOTPVerifiedEvent(context.Background(), + userAgg, + "agent1", + ), + ), + ), + ), + }, + args: args{ + resourceOwner: "org1", + userID: "user1", + }, + wantErr: caos_errs.ThrowPreconditionFailed(nil, "COMMAND-qx4ls", "Errors.Users.MFA.OTP.AlreadyReady"), + }, + { + name: "wrong code", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + user.NewHumanOTPAddedEvent(ctx, userAgg, secret), + ), + ), + ), + }, + args: args{ + resourceOwner: "org1", + code: "wrong", + userID: "user1", + }, + wantErr: caos_errs.ThrowInvalidArgument(nil, "EVENT-8isk2", "Errors.User.MFA.OTP.InvalidCode"), + }, + { + name: "push error", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + user.NewHumanOTPAddedEvent(ctx, userAgg, secret), + ), + ), + expectPushFailed(io.ErrClosedPipe, + []*repository.Event{eventFromEventPusher( + user.NewHumanOTPVerifiedEvent(ctx, + userAgg, + "agent1", + ), + )}, + ), + ), + }, + args: args{ + resourceOwner: "org1", + code: code, + userID: "user1", + }, + wantErr: io.ErrClosedPipe, + }, + { + name: "success", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + user.NewHumanOTPAddedEvent(ctx, userAgg, secret), + ), + ), + expectPush([]*repository.Event{eventFromEventPusher( + user.NewHumanOTPVerifiedEvent(ctx, + userAgg, + "agent1", + ), + )}), + ), + }, + args: args{ + resourceOwner: "org1", + code: code, + userID: "user1", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := &Commands{ + eventstore: tt.fields.eventstore, + multifactors: domain.MultifactorConfigs{ + OTP: domain.OTPConfig{ + CryptoMFA: cryptoAlg, + }, + }, + } + got, err := c.HumanCheckMFAOTPSetup(ctx, tt.args.userID, tt.args.code, "agent1", tt.args.resourceOwner) + require.ErrorIs(t, err, tt.wantErr) + if tt.want { + require.NotNil(t, got) + assert.Equal(t, "org1", got.ResourceOwner) + } + }) + } +} + func TestCommandSide_RemoveHumanOTP(t *testing.T) { type fields struct { eventstore *eventstore.Eventstore diff --git a/internal/command/user_v2_otp.go b/internal/command/user_v2_otp.go new file mode 100644 index 000000000..4a317c5e1 --- /dev/null +++ b/internal/command/user_v2_otp.go @@ -0,0 +1,33 @@ +package command + +import ( + "context" + + "github.com/zitadel/zitadel/internal/api/authz" + "github.com/zitadel/zitadel/internal/domain" +) + +func (c *Commands) AddUserOTP(ctx context.Context, userID, resourceowner string) (*domain.OTPv2, error) { + if err := authz.UserIDInCTX(ctx, userID); err != nil { + return nil, err + } + prep, err := c.createHumanOTP(ctx, userID, resourceowner) + if err != nil { + return nil, err + } + if err = c.pushAppendAndReduce(ctx, prep.wm, prep.cmds...); err != nil { + return nil, err + } + return &domain.OTPv2{ + ObjectDetails: writeModelToObjectDetails(&prep.wm.WriteModel), + Secret: prep.key.Secret(), + URI: prep.key.URL(), + }, nil +} + +func (c *Commands) CheckUserOTP(ctx context.Context, userID, code, resourceOwner string) (*domain.ObjectDetails, error) { + if err := authz.UserIDInCTX(ctx, userID); err != nil { + return nil, err + } + return c.HumanCheckMFAOTPSetup(ctx, userID, code, "", resourceOwner) +} diff --git a/internal/command/user_v2_otp_test.go b/internal/command/user_v2_otp_test.go new file mode 100644 index 000000000..43cf6813f --- /dev/null +++ b/internal/command/user_v2_otp_test.go @@ -0,0 +1,263 @@ +package command + +import ( + "io" + "testing" + "time" + + "github.com/golang/mock/gomock" + "github.com/pquerna/otp/totp" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/text/language" + + "github.com/zitadel/zitadel/internal/api/authz" + "github.com/zitadel/zitadel/internal/crypto" + "github.com/zitadel/zitadel/internal/domain" + caos_errs "github.com/zitadel/zitadel/internal/errors" + "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/repository" + "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/repository/user" +) + +func TestCommands_AddUserOTP(t *testing.T) { + ctx := authz.NewMockContext("inst1", "org1", "user1") + userAgg := &user.NewAggregate("user1", "org1").Aggregate + + type fields struct { + eventstore *eventstore.Eventstore + } + type args struct { + userID string + resourceowner string + } + tests := []struct { + name string + fields fields + args args + want bool + wantErr error + }{ + { + name: "wrong user", + args: args{ + userID: "foo", + resourceowner: "org1", + }, + wantErr: caos_errs.ThrowUnauthenticated(nil, "AUTH-Bohd2", "Errors.User.UserIDWrong"), + }, + { + name: "create otp error", + args: args{ + userID: "user1", + resourceowner: "org1", + }, + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter(), + ), + }, + wantErr: caos_errs.ThrowPreconditionFailed(nil, "COMMAND-MM9fs", "Errors.User.NotFound"), + }, + { + name: "push error", + args: args{ + userID: "user1", + resourceowner: "org1", + }, + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(ctx, + userAgg, + "username", + "firstname", + "lastname", + "nickname", + "displayname", + language.German, + domain.GenderUnspecified, + "email@test.ch", + true, + ), + ), + ), + expectFilter( + eventFromEventPusher( + org.NewOrgAddedEvent(ctx, + userAgg, + "org", + ), + ), + ), + expectFilter( + eventFromEventPusher( + org.NewDomainPolicyAddedEvent(ctx, + userAgg, + true, + true, + true, + ), + ), + ), + expectFilter(), + expectRandomPushFailed(io.ErrClosedPipe, []*repository.Event{eventFromEventPusher( + user.NewHumanOTPAddedEvent(ctx, userAgg, nil), + )}), + ), + }, + wantErr: io.ErrClosedPipe, + }, + { + name: "success", + args: args{ + userID: "user1", + resourceowner: "org1", + }, + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(ctx, + userAgg, + "username", + "firstname", + "lastname", + "nickname", + "displayname", + language.German, + domain.GenderUnspecified, + "email@test.ch", + true, + ), + ), + ), + expectFilter( + eventFromEventPusher( + org.NewOrgAddedEvent(ctx, + userAgg, + "org", + ), + ), + ), + expectFilter( + eventFromEventPusher( + org.NewDomainPolicyAddedEvent(ctx, + userAgg, + true, + true, + true, + ), + ), + ), + expectFilter(), + expectRandomPush([]*repository.Event{eventFromEventPusher( + user.NewHumanOTPAddedEvent(ctx, userAgg, nil), + )}), + ), + }, + want: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := &Commands{ + eventstore: tt.fields.eventstore, + multifactors: domain.MultifactorConfigs{ + OTP: domain.OTPConfig{ + Issuer: "zitadel.com", + CryptoMFA: crypto.CreateMockEncryptionAlg(gomock.NewController(t)), + }, + }, + } + got, err := c.AddUserOTP(ctx, tt.args.userID, tt.args.resourceowner) + require.ErrorIs(t, err, tt.wantErr) + if tt.want { + require.NotNil(t, got) + assert.Equal(t, "org1", got.ResourceOwner) + assert.NotEmpty(t, got.Secret) + assert.NotEmpty(t, got.URI) + } + }) + } +} + +func TestCommands_CheckUserOTP(t *testing.T) { + ctx := authz.NewMockContext("inst1", "org1", "user1") + + cryptoAlg := crypto.CreateMockEncryptionAlg(gomock.NewController(t)) + key, secret, err := domain.NewOTPKey("example.com", "user1", cryptoAlg) + require.NoError(t, err) + userAgg := &user.NewAggregate("user1", "org1").Aggregate + + code, err := totp.GenerateCode(key.Secret(), time.Now()) + require.NoError(t, err) + + type fields struct { + eventstore *eventstore.Eventstore + } + type args struct { + userID string + code string + resourceOwner string + } + tests := []struct { + name string + fields fields + args args + want bool + wantErr error + }{ + { + name: "wrong user id", + args: args{ + userID: "foo", + }, + wantErr: caos_errs.ThrowUnauthenticated(nil, "AUTH-Bohd2", "Errors.User.UserIDWrong"), + }, + { + name: "success", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + user.NewHumanOTPAddedEvent(ctx, userAgg, secret), + ), + ), + expectPush([]*repository.Event{eventFromEventPusher( + user.NewHumanOTPVerifiedEvent(ctx, userAgg, ""), + )}), + ), + }, + args: args{ + resourceOwner: "org1", + code: code, + userID: "user1", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := &Commands{ + eventstore: tt.fields.eventstore, + multifactors: domain.MultifactorConfigs{ + OTP: domain.OTPConfig{ + CryptoMFA: cryptoAlg, + }, + }, + } + got, err := c.CheckUserOTP(ctx, tt.args.userID, tt.args.code, tt.args.resourceOwner) + require.ErrorIs(t, err, tt.wantErr) + if tt.want { + require.NotNil(t, got) + assert.Equal(t, "org1", got.ResourceOwner) + } + }) + } +} diff --git a/internal/domain/human_otp.go b/internal/domain/human_otp.go index 354f9b174..b35d0f4d3 100644 --- a/internal/domain/human_otp.go +++ b/internal/domain/human_otp.go @@ -17,10 +17,17 @@ type OTP struct { State MFAState } +type OTPv2 struct { + *ObjectDetails + + Secret string + URI string +} + func NewOTPKey(issuer, accountName string, cryptoAlg crypto.EncryptionAlgorithm) (*otp.Key, *crypto.CryptoValue, error) { key, err := totp.Generate(totp.GenerateOpts{Issuer: issuer, AccountName: accountName}) if err != nil { - return nil, nil, err + return nil, nil, caos_errs.ThrowInternal(err, "TOTP-ieY3o", "Errors.Internal") } encryptedSecret, err := crypto.Encrypt([]byte(key.Secret()), cryptoAlg) if err != nil { diff --git a/internal/eventstore/repository/mock/repository.mock.impl.go b/internal/eventstore/repository/mock/repository.mock.impl.go index 9121d1379..e21f4fd7c 100644 --- a/internal/eventstore/repository/mock/repository.mock.impl.go +++ b/internal/eventstore/repository/mock/repository.mock.impl.go @@ -70,3 +70,25 @@ func (m *MockRepository) ExpectPushFailed(err error, expectedEvents []*repositor ) return m } + +func (m *MockRepository) ExpectRandomPush(expectedEvents []*repository.Event, expectedUniqueConstraints ...*repository.UniqueConstraint) *MockRepository { + m.EXPECT().Push(gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn( + func(ctx context.Context, events []*repository.Event, uniqueConstraints ...*repository.UniqueConstraint) error { + assert.Len(m.ctrl.T, events, len(expectedEvents)) + assert.Len(m.ctrl.T, expectedUniqueConstraints, len(uniqueConstraints)) + return nil + }, + ) + return m +} + +func (m *MockRepository) ExpectRandomPushFailed(err error, expectedEvents []*repository.Event, expectedUniqueConstraints ...*repository.UniqueConstraint) *MockRepository { + m.EXPECT().Push(gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn( + func(ctx context.Context, events []*repository.Event, uniqueConstraints ...*repository.UniqueConstraint) error { + assert.Len(m.ctrl.T, events, len(expectedEvents)) + assert.Len(m.ctrl.T, expectedUniqueConstraints, len(uniqueConstraints)) + return err + }, + ) + return m +} From 83da9cada71c05fe34009e43ec4c7dcf30318b0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Tue, 20 Jun 2023 13:06:57 +0200 Subject: [PATCH 19/37] fix(v2): typo in register u2f endpoint summary (#6059) Co-authored-by: Fabi --- proto/zitadel/user/v2alpha/user_service.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proto/zitadel/user/v2alpha/user_service.proto b/proto/zitadel/user/v2alpha/user_service.proto index 15d9eb2b6..c4489a04e 100644 --- a/proto/zitadel/user/v2alpha/user_service.proto +++ b/proto/zitadel/user/v2alpha/user_service.proto @@ -237,7 +237,7 @@ service UserService { } }; option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { - summary: "Start the registration of passkey for a user"; + summary: "Start the registration of a u2f token for a user"; description: "Start the registration of a u2f token for a user, as a response the public key credential creation options are returned, which are used to verify the u2f token." responses: { key: "200" From 1017568cf1e9fc3ac3c0d2c1e788ee47a4d5f5fc Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Tue, 20 Jun 2023 14:39:50 +0200 Subject: [PATCH 20/37] fix: provide more information in the retrieve idp information (#5927) * fix: provide more information in the retrieve idp information * change raw_information to proto struct * change unmarshal * improve description --- internal/api/grpc/fields.go | 31 ++++++++++ internal/api/grpc/user/v2/user.go | 20 ++++-- .../api/grpc/user/v2/user_integration_test.go | 62 ++++++++++++------- internal/api/grpc/user/v2/user_test.go | 35 ++++++++--- internal/command/idp_intent.go | 2 + internal/command/idp_intent_model.go | 4 ++ internal/command/idp_intent_test.go | 18 +++--- internal/repository/idpintent/intent.go | 6 ++ proto/zitadel/user/v2alpha/idp.proto | 43 ++++++++++--- 9 files changed, 169 insertions(+), 52 deletions(-) diff --git a/internal/api/grpc/fields.go b/internal/api/grpc/fields.go index f3701b21e..7e83c08f4 100644 --- a/internal/api/grpc/fields.go +++ b/internal/api/grpc/fields.go @@ -3,9 +3,19 @@ package grpc import ( "testing" + "github.com/stretchr/testify/require" "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/types/known/structpb" ) +var CustomMappers = map[protoreflect.FullName]func(testing.TB, protoreflect.ProtoMessage) any{ + "google.protobuf.Struct": func(t testing.TB, msg protoreflect.ProtoMessage) any { + e, ok := msg.(*structpb.Struct) + require.True(t, ok) + return e.AsMap() + }, +} + // AllFieldsSet recusively checks if all values in a message // have a non-zero value. func AllFieldsSet(t testing.TB, msg protoreflect.Message, ignoreTypes ...protoreflect.FullName) { @@ -36,3 +46,24 @@ func AllFieldsSet(t testing.TB, msg protoreflect.Message, ignoreTypes ...protore } } } + +func AllFieldsEqual(t testing.TB, expected, actual protoreflect.Message, customMappers map[protoreflect.FullName]func(testing.TB, protoreflect.ProtoMessage) any) { + md := expected.Descriptor() + name := md.FullName() + if mapper := customMappers[name]; mapper != nil { + require.Equal(t, mapper(t, expected.Interface()), mapper(t, actual.Interface())) + return + } + + fields := md.Fields() + + for i := 0; i < fields.Len(); i++ { + fd := fields.Get(i) + + if fd.Kind() == protoreflect.MessageKind { + AllFieldsEqual(t, expected.Get(fd).Message(), actual.Get(fd).Message(), customMappers) + } else { + require.Equal(t, expected.Get(fd).Interface(), actual.Get(fd).Interface()) + } + } +} diff --git a/internal/api/grpc/user/v2/user.go b/internal/api/grpc/user/v2/user.go index 97e13e05c..0a2507624 100644 --- a/internal/api/grpc/user/v2/user.go +++ b/internal/api/grpc/user/v2/user.go @@ -6,6 +6,7 @@ import ( "io" "golang.org/x/text/language" + "google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/timestamppb" "github.com/zitadel/zitadel/internal/api/authz" @@ -64,8 +65,8 @@ func addUserRequestToAddHuman(req *user.AddHumanUserRequest) (*command.AddHuman, for i, link := range req.GetIdpLinks() { links[i] = &command.AddLink{ IDPID: link.GetIdpId(), - IDPExternalID: link.GetIdpExternalId(), - DisplayName: link.GetDisplayName(), + IDPExternalID: link.GetUserId(), + DisplayName: link.GetUserName(), } } return &command.AddHuman{ @@ -124,8 +125,8 @@ func (s *Server) AddIDPLink(ctx context.Context, req *user.AddIDPLinkRequest) (_ orgID := authz.GetCtxData(ctx).OrgID details, err := s.command.AddUserIDPLink(ctx, req.UserId, orgID, &domain.UserIDPLink{ IDPConfigID: req.GetIdpLink().GetIdpId(), - ExternalUserID: req.GetIdpLink().GetIdpExternalId(), - DisplayName: req.GetIdpLink().GetDisplayName(), + ExternalUserID: req.GetIdpLink().GetUserId(), + DisplayName: req.GetIdpLink().GetUserName(), }) if err != nil { return nil, err @@ -176,6 +177,12 @@ func intentToIDPInformationPb(intent *command.IDPIntentWriteModel, alg crypto.En return nil, err } } + rawInformation := new(structpb.Struct) + err = rawInformation.UnmarshalJSON(intent.IDPUser) + if err != nil { + return nil, err + } + return &user.RetrieveIdentityProviderInformationResponse{ Details: &object_pb.Details{ Sequence: intent.ProcessedSequence, @@ -189,7 +196,10 @@ func intentToIDPInformationPb(intent *command.IDPIntentWriteModel, alg crypto.En IdToken: idToken, }, }, - IdpInformation: intent.IDPUser, + IdpId: intent.IDPID, + UserId: intent.IDPUserID, + UserName: intent.IDPUserName, + RawInformation: rawInformation, }, }, nil } diff --git a/internal/api/grpc/user/v2/user_integration_test.go b/internal/api/grpc/user/v2/user_integration_test.go index 137b4eabe..b78cf687c 100644 --- a/internal/api/grpc/user/v2/user_integration_test.go +++ b/internal/api/grpc/user/v2/user_integration_test.go @@ -15,11 +15,13 @@ import ( "github.com/stretchr/testify/require" "github.com/zitadel/oidc/v2/pkg/oidc" "golang.org/x/oauth2" + "google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/timestamppb" "github.com/zitadel/zitadel/internal/api/authz" + "github.com/zitadel/zitadel/internal/api/grpc" "github.com/zitadel/zitadel/internal/command" - "github.com/zitadel/zitadel/internal/idp/providers/oauth" + openid "github.com/zitadel/zitadel/internal/idp/providers/oidc" "github.com/zitadel/zitadel/internal/integration" "github.com/zitadel/zitadel/internal/repository/idp" object "github.com/zitadel/zitadel/pkg/grpc/object/v2alpha" @@ -81,12 +83,15 @@ func createSuccessfulIntent(t *testing.T, idpID string) (string, string, time.Ti intentID := createIntent(t, idpID) writeModel, err := Tester.Commands.GetIntentWriteModel(ctx, intentID, Tester.Organisation.ID) require.NoError(t, err) - idpUser := &oauth.UserMapper{ - RawInfo: map[string]interface{}{ - "id": "id", + idpUser := openid.NewUser( + &oidc.UserInfo{ + Subject: "id", + UserInfoProfile: oidc.UserInfoProfile{ + PreferredUsername: "username", + }, }, - } - idpSession := &oauth.Session{ + ) + idpSession := &openid.Session{ Tokens: &oidc.Tokens[*oidc.IDTokenClaims]{ Token: &oauth2.Token{ AccessToken: "accessToken", @@ -386,9 +391,9 @@ func TestServer_AddHumanUser(t *testing.T) { }, IdpLinks: []*user.IDPLink{ { - IdpId: "idpID", - IdpExternalId: "externalID", - DisplayName: "displayName", + IdpId: "idpID", + UserId: "userID", + UserName: "username", }, }, }, @@ -433,9 +438,9 @@ func TestServer_AddHumanUser(t *testing.T) { }, IdpLinks: []*user.IDPLink{ { - IdpId: idpID, - IdpExternalId: "externalID", - DisplayName: "displayName", + IdpId: idpID, + UserId: "userID", + UserName: "username", }, }, }, @@ -495,9 +500,9 @@ func TestServer_AddIDPLink(t *testing.T) { &user.AddIDPLinkRequest{ UserId: "userID", IdpLink: &user.IDPLink{ - IdpId: idpID, - IdpExternalId: "externalID", - DisplayName: "displayName", + IdpId: idpID, + UserId: "userID", + UserName: "username", }, }, }, @@ -511,9 +516,9 @@ func TestServer_AddIDPLink(t *testing.T) { &user.AddIDPLinkRequest{ UserId: Tester.Users[integration.OrgOwner].ID, IdpLink: &user.IDPLink{ - IdpId: "idpID", - IdpExternalId: "externalID", - DisplayName: "displayName", + IdpId: "idpID", + UserId: "userID", + UserName: "username", }, }, }, @@ -527,9 +532,9 @@ func TestServer_AddIDPLink(t *testing.T) { &user.AddIDPLinkRequest{ UserId: Tester.Users[integration.OrgOwner].ID, IdpLink: &user.IDPLink{ - IdpId: idpID, - IdpExternalId: "externalID", - DisplayName: "displayName", + IdpId: idpID, + UserId: "userID", + UserName: "username", }, }, }, @@ -678,7 +683,17 @@ func TestServer_RetrieveIdentityProviderInformation(t *testing.T) { IdToken: gu.Ptr("idToken"), }, }, - IdpInformation: []byte(`{"RawInfo":{"id":"id"}}`), + IdpId: idpID, + UserId: "id", + UserName: "username", + RawInformation: func() *structpb.Struct { + s, err := structpb.NewStruct(map[string]interface{}{ + "sub": "id", + "preferred_username": "username", + }) + require.NoError(t, err) + return s + }(), }, }, wantErr: false, @@ -693,8 +708,7 @@ func TestServer_RetrieveIdentityProviderInformation(t *testing.T) { require.NoError(t, err) } - require.Equal(t, tt.want.GetDetails(), got.GetDetails()) - require.Equal(t, tt.want.GetIdpInformation(), got.GetIdpInformation()) + grpc.AllFieldsEqual(t, got.ProtoReflect(), tt.want.ProtoReflect(), grpc.CustomMappers) }) } } diff --git a/internal/api/grpc/user/v2/user_test.go b/internal/api/grpc/user/v2/user_test.go index 044099a89..f6153f650 100644 --- a/internal/api/grpc/user/v2/user_test.go +++ b/internal/api/grpc/user/v2/user_test.go @@ -9,6 +9,8 @@ import ( "github.com/muhlemmer/gu" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/timestamppb" "github.com/zitadel/zitadel/internal/api/grpc" @@ -21,6 +23,8 @@ import ( user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha" ) +var ignoreTypes = []protoreflect.FullName{"google.protobuf.Duration", "google.protobuf.Struct"} + func Test_hashedPasswordToCommand(t *testing.T) { type args struct { hashed *user.HashedPassword @@ -128,8 +132,10 @@ func Test_intentToIDPInformationPb(t *testing.T) { InstanceID: "instanceID", ChangeDate: time.Date(2019, 4, 1, 1, 1, 1, 1, time.Local), }, - IDPID: "idpID", - IDPUser: []byte(`{"id": "id"}`), + IDPID: "idpID", + IDPUser: []byte(`{"userID": "idpUserID", "username": "username"}`), + IDPUserID: "idpUserID", + IDPUserName: "username", IDPAccessToken: &crypto.CryptoValue{ CryptoType: crypto.TypeEncryption, Algorithm: "enc", @@ -158,8 +164,10 @@ func Test_intentToIDPInformationPb(t *testing.T) { InstanceID: "instanceID", ChangeDate: time.Date(2019, 4, 1, 1, 1, 1, 1, time.Local), }, - IDPID: "idpID", - IDPUser: []byte(`{"id": "id"}`), + IDPID: "idpID", + IDPUser: []byte(`{"userID": "idpUserID", "username": "username"}`), + IDPUserID: "idpUserID", + IDPUserName: "username", IDPAccessToken: &crypto.CryptoValue{ CryptoType: crypto.TypeEncryption, Algorithm: "enc", @@ -184,8 +192,19 @@ func Test_intentToIDPInformationPb(t *testing.T) { Oauth: &user.IDPOAuthAccessInformation{ AccessToken: "accessToken", IdToken: gu.Ptr("idToken"), - }}, - IdpInformation: []byte(`{"id": "id"}`), + }, + }, + IdpId: "idpID", + UserId: "idpUserID", + UserName: "username", + RawInformation: func() *structpb.Struct { + s, err := structpb.NewStruct(map[string]interface{}{ + "userID": "idpUserID", + "username": "username", + }) + require.NoError(t, err) + return s + }(), }, }, err: nil, @@ -196,9 +215,9 @@ func Test_intentToIDPInformationPb(t *testing.T) { t.Run(tt.name, func(t *testing.T) { got, err := intentToIDPInformationPb(tt.args.intent, tt.args.alg) require.ErrorIs(t, err, tt.res.err) - assert.Equal(t, tt.res.resp, got) + grpc.AllFieldsEqual(t, got.ProtoReflect(), tt.res.resp.ProtoReflect(), grpc.CustomMappers) if tt.res.resp != nil { - grpc.AllFieldsSet(t, got.ProtoReflect()) + grpc.AllFieldsSet(t, got.ProtoReflect(), ignoreTypes...) } }) } diff --git a/internal/command/idp_intent.go b/internal/command/idp_intent.go index 1045b7701..a6d64dd78 100644 --- a/internal/command/idp_intent.go +++ b/internal/command/idp_intent.go @@ -123,6 +123,8 @@ func (c *Commands) SucceedIDPIntent(ctx context.Context, writeModel *IDPIntentWr ctx, &idpintent.NewAggregate(writeModel.AggregateID, writeModel.ResourceOwner).Aggregate, idpInfo, + idpUser.GetID(), + idpUser.GetPreferredUsername(), userID, accessToken, idToken, diff --git a/internal/command/idp_intent_model.go b/internal/command/idp_intent_model.go index cd0cb6e8e..182b06b3d 100644 --- a/internal/command/idp_intent_model.go +++ b/internal/command/idp_intent_model.go @@ -16,6 +16,8 @@ type IDPIntentWriteModel struct { FailureURL *url.URL IDPID string IDPUser []byte + IDPUserID string + IDPUserName string IDPAccessToken *crypto.CryptoValue IDPIDToken string UserID string @@ -72,6 +74,8 @@ func (wm *IDPIntentWriteModel) reduceStartedEvent(e *idpintent.StartedEvent) { func (wm *IDPIntentWriteModel) reduceSucceededEvent(e *idpintent.SucceededEvent) { wm.UserID = e.UserID wm.IDPUser = e.IDPUser + wm.IDPUserID = e.IDPUserID + wm.IDPUserName = e.IDPUserName wm.IDPAccessToken = e.IDPAccessToken wm.IDPIDToken = e.IDPIDToken wm.State = domain.IDPIntentStateSucceeded diff --git a/internal/command/idp_intent_test.go b/internal/command/idp_intent_test.go index a0be850fb..3eb64cb59 100644 --- a/internal/command/idp_intent_test.go +++ b/internal/command/idp_intent_test.go @@ -439,7 +439,9 @@ func TestCommands_SucceedIDPIntent(t *testing.T) { event, _ := idpintent.NewSucceededEvent( context.Background(), &idpintent.NewAggregate("id", "ro").Aggregate, - []byte(`{"RawInfo":{"id":"id"}}`), + []byte(`{"sub":"id","preferred_username":"username"}`), + "id", + "username", "", &crypto.CryptoValue{ CryptoType: crypto.TypeEncryption, @@ -447,7 +449,7 @@ func TestCommands_SucceedIDPIntent(t *testing.T) { KeyID: "id", Crypted: []byte("accessToken"), }, - "", + "idToken", ) return event }(), @@ -458,18 +460,20 @@ func TestCommands_SucceedIDPIntent(t *testing.T) { args{ ctx: context.Background(), writeModel: NewIDPIntentWriteModel("id", "ro"), - idpSession: &oauth.Session{ + idpSession: &openid.Session{ Tokens: &oidc.Tokens[*oidc.IDTokenClaims]{ Token: &oauth2.Token{ AccessToken: "accessToken", }, + IDToken: "idToken", }, }, - idpUser: &oauth.UserMapper{ - RawInfo: map[string]interface{}{ - "id": "id", + idpUser: openid.NewUser(&oidc.UserInfo{ + Subject: "id", + UserInfoProfile: oidc.UserInfoProfile{ + PreferredUsername: "username", }, - }, + }), }, res{ token: "aWQ", diff --git a/internal/repository/idpintent/intent.go b/internal/repository/idpintent/intent.go index eea0bf68f..52036b8a7 100644 --- a/internal/repository/idpintent/intent.go +++ b/internal/repository/idpintent/intent.go @@ -69,6 +69,8 @@ type SucceededEvent struct { eventstore.BaseEvent `json:"-"` IDPUser []byte `json:"idpUser"` + IDPUserID string `json:"idpUserId,omitempty"` + IDPUserName string `json:"idpUserName,omitempty"` UserID string `json:"userId,omitempty"` IDPAccessToken *crypto.CryptoValue `json:"idpAccessToken,omitempty"` IDPIDToken string `json:"idpIdToken,omitempty"` @@ -78,6 +80,8 @@ func NewSucceededEvent( ctx context.Context, aggregate *eventstore.Aggregate, idpUser []byte, + idpUserID, + idpUserName, userID string, idpAccessToken *crypto.CryptoValue, idpIDToken string, @@ -89,6 +93,8 @@ func NewSucceededEvent( SucceededEventType, ), IDPUser: idpUser, + IDPUserID: idpUserID, + IDPUserName: idpUserName, UserID: userID, IDPAccessToken: idpAccessToken, IDPIDToken: idpIDToken, diff --git a/proto/zitadel/user/v2alpha/idp.proto b/proto/zitadel/user/v2alpha/idp.proto index ed8f389c3..5996df57a 100644 --- a/proto/zitadel/user/v2alpha/idp.proto +++ b/proto/zitadel/user/v2alpha/idp.proto @@ -5,14 +5,41 @@ package zitadel.user.v2alpha; option go_package = "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha;user"; import "google/api/field_behavior.proto"; +import "google/protobuf/struct.proto"; import "protoc-gen-openapiv2/options/annotations.proto"; import "validate/validate.proto"; message IDPInformation{ oneof access{ - IDPOAuthAccessInformation oauth = 1; + IDPOAuthAccessInformation oauth = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "OAuth/OIDC access (and id_token) returned by the identity provider" + } + ]; } - bytes idp_information = 2; + string idp_id = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "ID of the identity provider" + example: "\"d654e6ba-70a3-48ef-a95d-37c8d8a7901a\""; + } + ]; + string user_id = 3 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "ID of the user of the identity provider" + example: "\"6516849804890468048461403518\""; + } + ]; + string user_name = 4 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "username of the user of the identity provider" + example: "\"user@external.com\""; + } + ]; + google.protobuf.Struct raw_information = 5 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "complete information returned by the identity provider" + } + ]; } message IDPOAuthAccessInformation{ @@ -30,22 +57,22 @@ message IDPLink { example: "\"d654e6ba-70a3-48ef-a95d-37c8d8a7901a\""; } ]; - string idp_external_id = 2 [ + string user_id = 2 [ (validate.rules).string = {min_len: 1, max_len: 200}, (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "ID of user of the identity provider" + description: "ID of the user of the identity provider" min_length: 1; max_length: 200; - example: "\"d654e6ba-70a3-48ef-a95d-37c8d8a7901a\""; + example: "\"6516849804890468048461403518\""; } ]; - string display_name = 3 [ + string user_name = 3 [ (validate.rules).string = {min_len: 1, max_len: 200}, (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "Display name of user of the identity provider" + description: "username of the user of the identity provider" min_length: 1; max_length: 200; - example: "\"Firstname Lastname\""; + example: "\"user@external.com\""; } ]; } From 82e7333169d76f2d8f6261c51f9448adb79c6f1e Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Tue, 20 Jun 2023 17:34:06 +0200 Subject: [PATCH 21/37] feat(api): add password reset and change to user service (#6036) * feat(api): add password reset and change to user service * integration tests * invalidate password check after password change * handle notification type * fix proto --- internal/api/grpc/user/v2/password.go | 71 ++ .../grpc/user/v2/password_integration_test.go | 232 +++++++ internal/api/grpc/user/v2/password_test.go | 39 ++ .../api/ui/login/init_password_handler.go | 11 +- internal/command/main_test.go | 6 + internal/command/user_human_password.go | 26 +- internal/command/user_human_password_test.go | 94 ++- internal/command/user_v2_passkey.go | 6 +- internal/command/user_v2_password.go | 71 ++ internal/command/user_v2_password_test.go | 611 ++++++++++++++++++ internal/crypto/code.go | 6 +- internal/crypto/code_test.go | 2 +- internal/eventstore/handler/crdb/statement.go | 13 + .../notification/handlers/usernotifier.go | 5 +- internal/notification/types/password_code.go | 15 +- internal/query/projection/session.go | 28 + internal/query/projection/session_test.go | 34 + internal/repository/user/human_password.go | 16 + proto/zitadel/user/v2alpha/password.proto | 28 +- proto/zitadel/user/v2alpha/user_service.proto | 113 ++++ 20 files changed, 1373 insertions(+), 54 deletions(-) create mode 100644 internal/api/grpc/user/v2/password.go create mode 100644 internal/api/grpc/user/v2/password_integration_test.go create mode 100644 internal/api/grpc/user/v2/password_test.go create mode 100644 internal/command/user_v2_password.go create mode 100644 internal/command/user_v2_password_test.go diff --git a/internal/api/grpc/user/v2/password.go b/internal/api/grpc/user/v2/password.go new file mode 100644 index 000000000..62a0b4458 --- /dev/null +++ b/internal/api/grpc/user/v2/password.go @@ -0,0 +1,71 @@ +package user + +import ( + "context" + + "github.com/zitadel/zitadel/internal/api/authz" + "github.com/zitadel/zitadel/internal/api/grpc/object/v2" + "github.com/zitadel/zitadel/internal/domain" + caos_errs "github.com/zitadel/zitadel/internal/errors" + user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha" +) + +func (s *Server) PasswordReset(ctx context.Context, req *user.PasswordResetRequest) (_ *user.PasswordResetResponse, err error) { + var details *domain.ObjectDetails + var code *string + + switch m := req.GetMedium().(type) { + case *user.PasswordResetRequest_SendLink: + details, code, err = s.command.RequestPasswordResetURLTemplate(ctx, req.GetUserId(), m.SendLink.GetUrlTemplate(), notificationTypeToDomain(m.SendLink.GetNotificationType())) + case *user.PasswordResetRequest_ReturnCode: + details, code, err = s.command.RequestPasswordResetReturnCode(ctx, req.GetUserId()) + case nil: + details, code, err = s.command.RequestPasswordReset(ctx, req.GetUserId()) + default: + err = caos_errs.ThrowUnimplementedf(nil, "USERv2-SDeeg", "verification oneOf %T in method RequestPasswordReset not implemented", m) + } + if err != nil { + return nil, err + } + + return &user.PasswordResetResponse{ + Details: object.DomainToDetailsPb(details), + VerificationCode: code, + }, nil +} + +func notificationTypeToDomain(notificationType user.NotificationType) domain.NotificationType { + switch notificationType { + case user.NotificationType_NOTIFICATION_TYPE_Email: + return domain.NotificationTypeEmail + case user.NotificationType_NOTIFICATION_TYPE_SMS: + return domain.NotificationTypeSms + case user.NotificationType_NOTIFICATION_TYPE_Unspecified: + return domain.NotificationTypeEmail + default: + return domain.NotificationTypeEmail + } +} + +func (s *Server) SetPassword(ctx context.Context, req *user.SetPasswordRequest) (_ *user.SetPasswordResponse, err error) { + var resourceOwner = authz.GetCtxData(ctx).ResourceOwner + var details *domain.ObjectDetails + + switch v := req.GetVerification().(type) { + case *user.SetPasswordRequest_CurrentPassword: + details, err = s.command.ChangePassword(ctx, resourceOwner, req.GetUserId(), v.CurrentPassword, req.GetNewPassword().GetPassword(), "") + case *user.SetPasswordRequest_VerificationCode: + details, err = s.command.SetPasswordWithVerifyCode(ctx, resourceOwner, req.GetUserId(), v.VerificationCode, req.GetNewPassword().GetPassword(), "") + case nil: + details, err = s.command.SetPassword(ctx, resourceOwner, req.GetUserId(), req.GetNewPassword().GetPassword(), req.GetNewPassword().GetChangeRequired()) + default: + err = caos_errs.ThrowUnimplementedf(nil, "USERv2-SFdf2", "verification oneOf %T in method SetPasswordRequest not implemented", v) + } + if err != nil { + return nil, err + } + + return &user.SetPasswordResponse{ + Details: object.DomainToDetailsPb(details), + }, nil +} diff --git a/internal/api/grpc/user/v2/password_integration_test.go b/internal/api/grpc/user/v2/password_integration_test.go new file mode 100644 index 000000000..2c8d50c9a --- /dev/null +++ b/internal/api/grpc/user/v2/password_integration_test.go @@ -0,0 +1,232 @@ +//go:build integration + +package user_test + +import ( + "context" + "testing" + + "github.com/muhlemmer/gu" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/timestamppb" + + "github.com/zitadel/zitadel/internal/integration" + object "github.com/zitadel/zitadel/pkg/grpc/object/v2alpha" + user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha" +) + +func TestServer_RequestPasswordReset(t *testing.T) { + userID := Tester.CreateHumanUser(CTX).GetUserId() + + tests := []struct { + name string + req *user.PasswordResetRequest + want *user.PasswordResetResponse + wantErr bool + }{ + { + name: "default medium", + req: &user.PasswordResetRequest{ + UserId: userID, + }, + want: &user.PasswordResetResponse{ + Details: &object.Details{ + Sequence: 1, + ChangeDate: timestamppb.Now(), + ResourceOwner: Tester.Organisation.ID, + }, + }, + }, + { + name: "custom url template", + req: &user.PasswordResetRequest{ + UserId: userID, + Medium: &user.PasswordResetRequest_SendLink{ + SendLink: &user.SendPasswordResetLink{ + NotificationType: user.NotificationType_NOTIFICATION_TYPE_Email, + UrlTemplate: gu.Ptr("https://example.com/password/change?userID={{.UserID}}&code={{.Code}}&orgID={{.OrgID}}"), + }, + }, + }, + want: &user.PasswordResetResponse{ + Details: &object.Details{ + Sequence: 1, + ChangeDate: timestamppb.Now(), + ResourceOwner: Tester.Organisation.ID, + }, + }, + }, + { + name: "template error", + req: &user.PasswordResetRequest{ + UserId: userID, + Medium: &user.PasswordResetRequest_SendLink{ + SendLink: &user.SendPasswordResetLink{ + UrlTemplate: gu.Ptr("{{"), + }, + }, + }, + wantErr: true, + }, + { + name: "return code", + req: &user.PasswordResetRequest{ + UserId: userID, + Medium: &user.PasswordResetRequest_ReturnCode{ + ReturnCode: &user.ReturnPasswordResetCode{}, + }, + }, + want: &user.PasswordResetResponse{ + Details: &object.Details{ + Sequence: 1, + ChangeDate: timestamppb.Now(), + ResourceOwner: Tester.Organisation.ID, + }, + VerificationCode: gu.Ptr("xxx"), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := Client.PasswordReset(CTX, tt.req) + if tt.wantErr { + require.Error(t, err) + } else { + require.NoError(t, err) + } + integration.AssertDetails(t, tt.want, got) + if tt.want.GetVerificationCode() != "" { + assert.NotEmpty(t, got.GetVerificationCode()) + } + }) + } +} + +func TestServer_SetPassword(t *testing.T) { + type args struct { + ctx context.Context + req *user.SetPasswordRequest + } + tests := []struct { + name string + prepare func(request *user.SetPasswordRequest) error + args args + want *user.SetPasswordResponse + wantErr bool + }{ + { + name: "missing user id", + prepare: func(request *user.SetPasswordRequest) error { + return nil + }, + args: args{ + ctx: CTX, + req: &user.SetPasswordRequest{}, + }, + wantErr: true, + }, + { + name: "set successful", + prepare: func(request *user.SetPasswordRequest) error { + userID := Tester.CreateHumanUser(CTX).GetUserId() + request.UserId = userID + return nil + }, + args: args{ + ctx: CTX, + req: &user.SetPasswordRequest{ + NewPassword: &user.Password{ + Password: "Secr3tP4ssw0rd!", + }, + }, + }, + want: &user.SetPasswordResponse{ + Details: &object.Details{ + ResourceOwner: Tester.Organisation.ID, + }, + }, + }, + { + name: "change successful", + prepare: func(request *user.SetPasswordRequest) error { + userID := Tester.CreateHumanUser(CTX).GetUserId() + request.UserId = userID + _, err := Client.SetPassword(CTX, &user.SetPasswordRequest{ + UserId: userID, + NewPassword: &user.Password{ + Password: "InitialPassw0rd!", + }, + }) + if err != nil { + return err + } + return nil + }, + args: args{ + ctx: CTX, + req: &user.SetPasswordRequest{ + NewPassword: &user.Password{ + Password: "Secr3tP4ssw0rd!", + }, + Verification: &user.SetPasswordRequest_CurrentPassword{ + CurrentPassword: "InitialPassw0rd!", + }, + }, + }, + want: &user.SetPasswordResponse{ + Details: &object.Details{ + ResourceOwner: Tester.Organisation.ID, + }, + }, + }, + { + name: "set with code successful", + prepare: func(request *user.SetPasswordRequest) error { + userID := Tester.CreateHumanUser(CTX).GetUserId() + request.UserId = userID + resp, err := Client.PasswordReset(CTX, &user.PasswordResetRequest{ + UserId: userID, + Medium: &user.PasswordResetRequest_ReturnCode{ + ReturnCode: &user.ReturnPasswordResetCode{}, + }, + }) + if err != nil { + return err + } + request.Verification = &user.SetPasswordRequest_VerificationCode{ + VerificationCode: resp.GetVerificationCode(), + } + return nil + }, + args: args{ + ctx: CTX, + req: &user.SetPasswordRequest{ + NewPassword: &user.Password{ + Password: "Secr3tP4ssw0rd!", + }, + }, + }, + want: &user.SetPasswordResponse{ + Details: &object.Details{ + ResourceOwner: Tester.Organisation.ID, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.prepare(tt.args.req) + require.NoError(t, err) + + got, err := Client.SetPassword(tt.args.ctx, tt.args.req) + if tt.wantErr { + require.Error(t, err) + return + } + require.NoError(t, err) + require.NotNil(t, got) + integration.AssertDetails(t, tt.want, got) + }) + } +} diff --git a/internal/api/grpc/user/v2/password_test.go b/internal/api/grpc/user/v2/password_test.go new file mode 100644 index 000000000..b80f0abd3 --- /dev/null +++ b/internal/api/grpc/user/v2/password_test.go @@ -0,0 +1,39 @@ +package user + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/zitadel/zitadel/internal/domain" + user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha" +) + +func Test_notificationTypeToDomain(t *testing.T) { + tests := []struct { + name string + notificationType user.NotificationType + want domain.NotificationType + }{ + { + "unspecified", + user.NotificationType_NOTIFICATION_TYPE_Unspecified, + domain.NotificationTypeEmail, + }, + { + "email", + user.NotificationType_NOTIFICATION_TYPE_Email, + domain.NotificationTypeEmail, + }, + { + "sms", + user.NotificationType_NOTIFICATION_TYPE_SMS, + domain.NotificationTypeSms, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equalf(t, tt.want, notificationTypeToDomain(tt.notificationType), "notificationTypeToDomain(%v)", tt.notificationType) + }) + } +} diff --git a/internal/api/ui/login/init_password_handler.go b/internal/api/ui/login/init_password_handler.go index 5418f702e..aac05bbb9 100644 --- a/internal/api/ui/login/init_password_handler.go +++ b/internal/api/ui/login/init_password_handler.go @@ -60,10 +60,10 @@ func (l *Login) handleInitPasswordCheck(w http.ResponseWriter, r *http.Request) l.resendPasswordSet(w, r, authReq) return } - l.checkPWCode(w, r, authReq, data, nil) + l.checkPWCode(w, r, authReq, data) } -func (l *Login) checkPWCode(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, data *initPasswordFormData, err error) { +func (l *Login) checkPWCode(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, data *initPasswordFormData) { if data.Password != data.PasswordConfirm { err := errors.ThrowInvalidArgument(nil, "VIEW-KaGue", "Errors.User.Password.ConfirmationWrong") l.renderInitPassword(w, r, authReq, data.UserID, data.Code, err) @@ -74,12 +74,7 @@ func (l *Login) checkPWCode(w http.ResponseWriter, r *http.Request, authReq *dom userOrg = authReq.UserOrgID } userAgentID, _ := http_mw.UserAgentIDFromCtx(r.Context()) - passwordCodeGenerator, err := l.query.InitEncryptionGenerator(r.Context(), domain.SecretGeneratorTypePasswordResetCode, l.userCodeAlg) - if err != nil { - l.renderInitPassword(w, r, authReq, data.UserID, "", err) - return - } - err = l.command.SetPasswordWithVerifyCode(setContext(r.Context(), userOrg), userOrg, data.UserID, data.Code, data.Password, userAgentID, passwordCodeGenerator) + _, err := l.command.SetPasswordWithVerifyCode(setContext(r.Context(), userOrg), userOrg, data.UserID, data.Code, data.Password, userAgentID) if err != nil { l.renderInitPassword(w, r, authReq, data.UserID, "", err) return diff --git a/internal/command/main_test.go b/internal/command/main_test.go index 7b37e0f8d..184b0a9b0 100644 --- a/internal/command/main_test.go +++ b/internal/command/main_test.go @@ -46,6 +46,12 @@ func eventstoreExpect(t *testing.T, expects ...expect) *eventstore.Eventstore { return es } +func expectEventstore(expects ...expect) func(*testing.T) *eventstore.Eventstore { + return func(t *testing.T) *eventstore.Eventstore { + return eventstoreExpect(t, expects...) + } +} + func eventPusherToEvents(eventsPushes ...eventstore.Command) []*repository.Event { events := make([]*repository.Event, len(eventsPushes)) for i, event := range eventsPushes { diff --git a/internal/command/user_human_password.go b/internal/command/user_human_password.go index 706fe2fcc..8d54727e2 100644 --- a/internal/command/user_human_password.go +++ b/internal/command/user_human_password.go @@ -26,6 +26,9 @@ func (c *Commands) SetPassword(ctx context.Context, orgID, userID, passwordStrin if !existingPassword.UserState.Exists() { return nil, caos_errs.ThrowPreconditionFailed(nil, "COMMAND-3M0fs", "Errors.User.NotFound") } + if err = c.checkPermission(ctx, domain.PermissionUserWrite, existingPassword.ResourceOwner, userID); err != nil { + return nil, err + } password := &domain.Password{ SecretString: passwordString, ChangeRequired: oneTime, @@ -46,28 +49,28 @@ func (c *Commands) SetPassword(ctx context.Context, orgID, userID, passwordStrin return writeModelToObjectDetails(&existingPassword.WriteModel), nil } -func (c *Commands) SetPasswordWithVerifyCode(ctx context.Context, orgID, userID, code, passwordString, userAgentID string, passwordVerificationCode crypto.Generator) (err error) { +func (c *Commands) SetPasswordWithVerifyCode(ctx context.Context, orgID, userID, code, passwordString, userAgentID string) (objectDetails *domain.ObjectDetails, err error) { ctx, span := tracing.NewSpan(ctx) defer func() { span.EndWithError(err) }() if userID == "" { - return caos_errs.ThrowInvalidArgument(nil, "COMMAND-3M9fs", "Errors.IDMissing") + return nil, caos_errs.ThrowInvalidArgument(nil, "COMMAND-3M9fs", "Errors.IDMissing") } if passwordString == "" { - return caos_errs.ThrowInvalidArgument(nil, "COMMAND-Mf0sd", "Errors.User.Password.Empty") + return nil, caos_errs.ThrowInvalidArgument(nil, "COMMAND-Mf0sd", "Errors.User.Password.Empty") } existingCode, err := c.passwordWriteModel(ctx, userID, orgID) if err != nil { - return err + return nil, err } if existingCode.Code == nil || existingCode.UserState == domain.UserStateUnspecified || existingCode.UserState == domain.UserStateDeleted { - return caos_errs.ThrowPreconditionFailed(nil, "COMMAND-2M9fs", "Errors.User.Code.NotFound") + return nil, caos_errs.ThrowPreconditionFailed(nil, "COMMAND-2M9fs", "Errors.User.Code.NotFound") } - err = crypto.VerifyCode(existingCode.CodeCreationDate, existingCode.CodeExpiry, existingCode.Code, code, passwordVerificationCode) + err = crypto.VerifyCodeWithAlgorithm(existingCode.CodeCreationDate, existingCode.CodeExpiry, existingCode.Code, code, c.userEncryption) if err != nil { - return err + return nil, err } password := &domain.Password{ @@ -77,10 +80,13 @@ func (c *Commands) SetPasswordWithVerifyCode(ctx context.Context, orgID, userID, userAgg := UserAggregateFromWriteModel(&existingCode.WriteModel) passwordEvent, err := c.changePassword(ctx, userAgentID, password, userAgg, existingCode) if err != nil { - return err + return nil, err } - _, err = c.eventstore.Push(ctx, passwordEvent) - return err + err = c.pushAppendAndReduce(ctx, existingCode, passwordEvent) + if err != nil { + return nil, err + } + return writeModelToObjectDetails(&existingCode.WriteModel), nil } func (c *Commands) ChangePassword(ctx context.Context, orgID, userID, oldPassword, newPassword, userAgentID string) (objectDetails *domain.ObjectDetails, err error) { diff --git a/internal/command/user_human_password_test.go b/internal/command/user_human_password_test.go index 883959f40..6eabda952 100644 --- a/internal/command/user_human_password_test.go +++ b/internal/command/user_human_password_test.go @@ -2,6 +2,7 @@ package command import ( "context" + "errors" "testing" "time" @@ -22,6 +23,7 @@ func TestCommandSide_SetOneTimePassword(t *testing.T) { type fields struct { eventstore *eventstore.Eventstore userPasswordAlg crypto.HashAlgorithm + checkPermission domain.PermissionCheck } type args struct { ctx context.Context @@ -72,6 +74,49 @@ func TestCommandSide_SetOneTimePassword(t *testing.T) { err: caos_errs.IsPreconditionFailed, }, }, + { + name: "missing permission, error", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), + &user.NewAggregate("user1", "org1").Aggregate, + "username", + "firstname", + "lastname", + "nickname", + "displayname", + language.German, + domain.GenderUnspecified, + "email@test.ch", + true, + ), + ), + eventFromEventPusher( + user.NewHumanEmailVerifiedEvent(context.Background(), + &user.NewAggregate("user1", "org1").Aggregate, + ), + ), + ), + ), + userPasswordAlg: crypto.CreateMockHashAlg(gomock.NewController(t)), + checkPermission: newMockPermissionCheckNotAllowed(), + }, + args: args{ + ctx: context.Background(), + userID: "user1", + resourceOwner: "org1", + password: "password", + oneTime: true, + }, + res: res{ + err: func(err error) bool { + return errors.Is(err, caos_errs.ThrowPermissionDenied(nil, "AUTHZ-HKJD33", "Errors.PermissionDenied")) + }, + }, + }, { name: "change password onetime, ok", fields: fields{ @@ -129,6 +174,7 @@ func TestCommandSide_SetOneTimePassword(t *testing.T) { ), ), userPasswordAlg: crypto.CreateMockHashAlg(gomock.NewController(t)), + checkPermission: newMockPermissionCheckAllowed(), }, args: args{ ctx: context.Background(), @@ -200,6 +246,7 @@ func TestCommandSide_SetOneTimePassword(t *testing.T) { ), ), userPasswordAlg: crypto.CreateMockHashAlg(gomock.NewController(t)), + checkPermission: newMockPermissionCheckAllowed(), }, args: args{ ctx: context.Background(), @@ -220,6 +267,7 @@ func TestCommandSide_SetOneTimePassword(t *testing.T) { r := &Commands{ eventstore: tt.fields.eventstore, userPasswordAlg: tt.fields.userPasswordAlg, + checkPermission: tt.fields.checkPermission, } got, err := r.SetPassword(tt.args.ctx, tt.args.resourceOwner, tt.args.userID, tt.args.password, tt.args.oneTime) if tt.res.err == nil { @@ -235,19 +283,19 @@ func TestCommandSide_SetOneTimePassword(t *testing.T) { } } -func TestCommandSide_SetPassword(t *testing.T) { +func TestCommandSide_SetPasswordWithVerifyCode(t *testing.T) { type fields struct { eventstore *eventstore.Eventstore + userEncryption crypto.EncryptionAlgorithm userPasswordAlg crypto.HashAlgorithm } type args struct { - ctx context.Context - userID string - code string - resourceOwner string - password string - agentID string - secretGenerator crypto.Generator + ctx context.Context + userID string + code string + resourceOwner string + password string + agentID string } type res struct { want *domain.ObjectDetails @@ -377,14 +425,14 @@ func TestCommandSide_SetPassword(t *testing.T) { ), ), ), + userEncryption: crypto.CreateMockEncryptionAlg(gomock.NewController(t)), }, args: args{ - ctx: context.Background(), - userID: "user1", - code: "test", - resourceOwner: "org1", - password: "password", - secretGenerator: GetMockSecretGenerator(t), + ctx: context.Background(), + userID: "user1", + code: "test", + resourceOwner: "org1", + password: "password", }, res: res{ err: caos_errs.IsPreconditionFailed, @@ -460,14 +508,14 @@ func TestCommandSide_SetPassword(t *testing.T) { ), ), userPasswordAlg: crypto.CreateMockHashAlg(gomock.NewController(t)), + userEncryption: crypto.CreateMockEncryptionAlg(gomock.NewController(t)), }, args: args{ - ctx: context.Background(), - userID: "user1", - resourceOwner: "org1", - password: "password", - code: "a", - secretGenerator: GetMockSecretGenerator(t), + ctx: context.Background(), + userID: "user1", + resourceOwner: "org1", + password: "password", + code: "a", }, res: res{ want: &domain.ObjectDetails{ @@ -481,14 +529,18 @@ func TestCommandSide_SetPassword(t *testing.T) { r := &Commands{ eventstore: tt.fields.eventstore, userPasswordAlg: tt.fields.userPasswordAlg, + userEncryption: tt.fields.userEncryption, } - err := r.SetPasswordWithVerifyCode(tt.args.ctx, tt.args.resourceOwner, tt.args.userID, tt.args.code, tt.args.password, tt.args.agentID, tt.args.secretGenerator) + got, err := r.SetPasswordWithVerifyCode(tt.args.ctx, tt.args.resourceOwner, tt.args.userID, tt.args.code, tt.args.password, tt.args.agentID) if tt.res.err == nil { assert.NoError(t, err) } if tt.res.err != nil && !tt.res.err(err) { t.Errorf("got wrong err: %v ", err) } + if tt.res.err == nil { + assert.Equal(t, tt.res.want, got) + } }) } } diff --git a/internal/command/user_v2_passkey.go b/internal/command/user_v2_passkey.go index fe2a42092..19b06d97f 100644 --- a/internal/command/user_v2_passkey.go +++ b/internal/command/user_v2_passkey.go @@ -15,7 +15,7 @@ import ( ) // RegisterUserPasskey creates a passkey registration for the current authenticated user. -// UserID, ussualy taken from the request is compaired against the user ID in the context. +// UserID, usually taken from the request is compared against the user ID in the context. func (c *Commands) RegisterUserPasskey(ctx context.Context, userID, resourceOwner string, authenticator domain.AuthenticatorAttachment) (*domain.WebAuthNRegistrationDetails, error) { if err := authz.UserIDInCTX(ctx, userID); err != nil { return nil, err @@ -40,7 +40,7 @@ type eventCallback func(context.Context, *eventstore.Aggregate) eventstore.Comma // A code can only be used once. // Upon success an event callback is returned, which must be called after // all other events for the current request are created. -// This prevent consuming a code when another error occurred after verification. +// This prevents consuming a code when another error occurred after verification. func (c *Commands) verifyUserPasskeyCode(ctx context.Context, userID, resourceOwner, codeID, code string, alg crypto.EncryptionAlgorithm) (eventCallback, error) { wm := NewHumanPasswordlessInitCodeWriteModel(userID, codeID, resourceOwner) err := c.eventstore.FilterToQueryReducer(ctx, wm) @@ -122,7 +122,7 @@ func (c *Commands) AddUserPasskeyCodeURLTemplate(ctx context.Context, userID, re } // AddUserPasskeyCodeReturn generates and returns a Passkey code. -// No email will be send to the user. +// No email will be sent to the user. func (c *Commands) AddUserPasskeyCodeReturn(ctx context.Context, userID, resourceOwner string, alg crypto.EncryptionAlgorithm) (*domain.PasskeyCodeDetails, error) { return c.addUserPasskeyCode(ctx, userID, resourceOwner, alg, "", true) } diff --git a/internal/command/user_v2_password.go b/internal/command/user_v2_password.go new file mode 100644 index 000000000..53b25c5e4 --- /dev/null +++ b/internal/command/user_v2_password.go @@ -0,0 +1,71 @@ +package command + +import ( + "context" + "io" + + "github.com/zitadel/zitadel/internal/api/authz" + "github.com/zitadel/zitadel/internal/domain" + caos_errs "github.com/zitadel/zitadel/internal/errors" + "github.com/zitadel/zitadel/internal/repository/user" +) + +// RequestPasswordReset generates a code +// and triggers a notification e-mail with the default confirmation URL format. +func (c *Commands) RequestPasswordReset(ctx context.Context, userID string) (*domain.ObjectDetails, *string, error) { + return c.requestPasswordReset(ctx, userID, false, "", domain.NotificationTypeEmail) +} + +// RequestPasswordResetURLTemplate generates a code +// and triggers a notification e-mail with the confirmation URL rendered from the passed urlTmpl. +// urlTmpl must be a valid [tmpl.Template]. +func (c *Commands) RequestPasswordResetURLTemplate(ctx context.Context, userID, urlTmpl string, notificationType domain.NotificationType) (*domain.ObjectDetails, *string, error) { + if err := domain.RenderConfirmURLTemplate(io.Discard, urlTmpl, userID, "code", "orgID"); err != nil { + return nil, nil, err + } + return c.requestPasswordReset(ctx, userID, false, urlTmpl, notificationType) +} + +// RequestPasswordResetReturnCode generates a code and does not send a notification email. +// The generated plain text code will be returned. +func (c *Commands) RequestPasswordResetReturnCode(ctx context.Context, userID string) (*domain.ObjectDetails, *string, error) { + return c.requestPasswordReset(ctx, userID, true, "", 0) +} + +// requestPasswordReset creates a code for a password change. +// returnCode controls if the plain text version of the code will be set in the return object. +// When the plain text code is returned, no notification e-mail will be sent to the user. +// urlTmpl allows changing the target URL that is used by the e-mail and should be a validated Go template, if used. +func (c *Commands) requestPasswordReset(ctx context.Context, userID string, returnCode bool, urlTmpl string, notificationType domain.NotificationType) (_ *domain.ObjectDetails, plainCode *string, err error) { + if userID == "" { + return nil, nil, caos_errs.ThrowInvalidArgument(nil, "COMMAND-SAFdda", "Errors.User.IDMissing") + } + model, err := c.getHumanWriteModelByID(ctx, userID, "") + if err != nil { + return nil, nil, err + } + if !model.UserState.Exists() { + return nil, nil, caos_errs.ThrowNotFound(nil, "COMMAND-SAF4f", "Errors.User.NotFound") + } + if model.UserState == domain.UserStateInitial { + return nil, nil, caos_errs.ThrowPreconditionFailed(nil, "COMMAND-Sfe4g", "Errors.User.NotInitialised") + } + if authz.GetCtxData(ctx).UserID != userID { + if err = c.checkPermission(ctx, domain.PermissionUserWrite, model.ResourceOwner, userID); err != nil { + return nil, nil, err + } + } + code, err := c.newCode(ctx, c.eventstore.Filter, domain.SecretGeneratorTypePasswordResetCode, c.userEncryption) + if err != nil { + return nil, nil, err + } + cmd := user.NewHumanPasswordCodeAddedEventV2(ctx, UserAggregateFromWriteModel(&model.WriteModel), code.Crypted, code.Expiry, notificationType, urlTmpl, returnCode) + + if returnCode { + plainCode = &code.Plain + } + if err = c.pushAppendAndReduce(ctx, model, cmd); err != nil { + return nil, nil, err + } + return writeModelToObjectDetails(&model.WriteModel), plainCode, nil +} diff --git a/internal/command/user_v2_password_test.go b/internal/command/user_v2_password_test.go new file mode 100644 index 000000000..ecf21ff18 --- /dev/null +++ b/internal/command/user_v2_password_test.go @@ -0,0 +1,611 @@ +package command + +import ( + "context" + "testing" + "time" + + "github.com/muhlemmer/gu" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/text/language" + + "github.com/zitadel/zitadel/internal/crypto" + "github.com/zitadel/zitadel/internal/domain" + caos_errs "github.com/zitadel/zitadel/internal/errors" + "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/repository/user" +) + +func TestCommands_RequestPasswordReset(t *testing.T) { + type fields struct { + checkPermission domain.PermissionCheck + eventstore func(t *testing.T) *eventstore.Eventstore + userEncryption crypto.EncryptionAlgorithm + } + type args struct { + ctx context.Context + userID string + } + tests := []struct { + name string + fields fields + args args + wantErr error + }{ + { + name: "missing userID", + fields: fields{ + eventstore: expectEventstore(), + }, + args: args{ + ctx: context.Background(), + userID: "", + }, + wantErr: caos_errs.ThrowInvalidArgument(nil, "COMMAND-SAFdda", "Errors.User.IDMissing"), + }, + { + name: "user not existing", + fields: fields{ + eventstore: expectEventstore( + expectFilter(), + ), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + }, + wantErr: caos_errs.ThrowNotFound(nil, "COMMAND-SAF4f", "Errors.User.NotFound"), + }, + { + name: "user not initialized", + fields: fields{ + eventstore: expectEventstore( + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + "username", "firstname", "lastname", "nickname", "displayname", + language.English, domain.GenderUnspecified, "email", false), + ), + eventFromEventPusher( + user.NewHumanInitialCodeAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + &crypto.CryptoValue{CryptoType: crypto.TypeEncryption, Algorithm: "enc", KeyID: "keyID", Crypted: []byte("code")}, 10*time.Second), + ), + ), + ), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + }, + wantErr: caos_errs.ThrowPreconditionFailed(nil, "COMMAND-Sfe4g", "Errors.User.NotInitialised"), + }, + { + name: "missing permission", + fields: fields{ + eventstore: expectEventstore( + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + "username", "firstname", "lastname", "nickname", "displayname", + language.English, domain.GenderUnspecified, "email", false), + ), + ), + ), + checkPermission: newMockPermissionCheckNotAllowed(), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + }, + wantErr: caos_errs.ThrowPermissionDenied(nil, "AUTHZ-HKJD33", "Errors.PermissionDenied"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := &Commands{ + checkPermission: tt.fields.checkPermission, + eventstore: tt.fields.eventstore(t), + userEncryption: tt.fields.userEncryption, + } + _, _, err := c.RequestPasswordReset(tt.args.ctx, tt.args.userID) + require.ErrorIs(t, err, tt.wantErr) + // successful cases are tested in TestCommands_requestPasswordReset + }) + } +} + +func TestCommands_RequestPasswordResetReturnCode(t *testing.T) { + type fields struct { + checkPermission domain.PermissionCheck + eventstore func(t *testing.T) *eventstore.Eventstore + userEncryption crypto.EncryptionAlgorithm + } + type args struct { + ctx context.Context + userID string + } + tests := []struct { + name string + fields fields + args args + wantErr error + }{ + { + name: "missing userID", + fields: fields{ + eventstore: expectEventstore(), + }, + args: args{ + ctx: context.Background(), + userID: "", + }, + wantErr: caos_errs.ThrowInvalidArgument(nil, "COMMAND-SAFdda", "Errors.User.IDMissing"), + }, + { + name: "user not existing", + fields: fields{ + eventstore: expectEventstore( + expectFilter(), + ), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + }, + wantErr: caos_errs.ThrowNotFound(nil, "COMMAND-SAF4f", "Errors.User.NotFound"), + }, + { + name: "user not initialized", + fields: fields{ + eventstore: expectEventstore( + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + "username", "firstname", "lastname", "nickname", "displayname", + language.English, domain.GenderUnspecified, "email", false), + ), + eventFromEventPusher( + user.NewHumanInitialCodeAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + &crypto.CryptoValue{CryptoType: crypto.TypeEncryption, Algorithm: "enc", KeyID: "keyID", Crypted: []byte("code")}, 10*time.Second), + ), + ), + ), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + }, + wantErr: caos_errs.ThrowPreconditionFailed(nil, "COMMAND-Sfe4g", "Errors.User.NotInitialised"), + }, + { + name: "missing permission", + fields: fields{ + eventstore: expectEventstore( + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + "username", "firstname", "lastname", "nickname", "displayname", + language.English, domain.GenderUnspecified, "email", false), + ), + ), + ), + checkPermission: newMockPermissionCheckNotAllowed(), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + }, + wantErr: caos_errs.ThrowPermissionDenied(nil, "AUTHZ-HKJD33", "Errors.PermissionDenied"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := &Commands{ + checkPermission: tt.fields.checkPermission, + eventstore: tt.fields.eventstore(t), + userEncryption: tt.fields.userEncryption, + } + _, _, err := c.RequestPasswordResetReturnCode(tt.args.ctx, tt.args.userID) + require.ErrorIs(t, err, tt.wantErr) + // successful cases are tested in TestCommands_requestPasswordReset + }) + } +} + +func TestCommands_RequestPasswordResetURLTemplate(t *testing.T) { + type fields struct { + checkPermission domain.PermissionCheck + eventstore func(t *testing.T) *eventstore.Eventstore + userEncryption crypto.EncryptionAlgorithm + } + type args struct { + ctx context.Context + userID string + urlTmpl string + notificationType domain.NotificationType + } + tests := []struct { + name string + fields fields + args args + wantErr error + }{ + { + name: "invalid template", + fields: fields{ + eventstore: expectEventstore(), + }, + args: args{ + userID: "user1", + urlTmpl: "{{", + }, + wantErr: caos_errs.ThrowInvalidArgument(nil, "DOMAIN-oGh5e", "Errors.User.InvalidURLTemplate"), + }, + + { + name: "missing userID", + fields: fields{ + eventstore: expectEventstore(), + }, + args: args{ + ctx: context.Background(), + userID: "", + }, + wantErr: caos_errs.ThrowInvalidArgument(nil, "COMMAND-SAFdda", "Errors.User.IDMissing"), + }, + { + name: "user not existing", + fields: fields{ + eventstore: expectEventstore( + expectFilter(), + ), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + }, + wantErr: caos_errs.ThrowNotFound(nil, "COMMAND-SAF4f", "Errors.User.NotFound"), + }, + { + name: "user not initialized", + fields: fields{ + eventstore: expectEventstore( + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + "username", "firstname", "lastname", "nickname", "displayname", + language.English, domain.GenderUnspecified, "email", false), + ), + eventFromEventPusher( + user.NewHumanInitialCodeAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + &crypto.CryptoValue{CryptoType: crypto.TypeEncryption, Algorithm: "enc", KeyID: "keyID", Crypted: []byte("code")}, 10*time.Second), + ), + ), + ), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + }, + wantErr: caos_errs.ThrowPreconditionFailed(nil, "COMMAND-Sfe4g", "Errors.User.NotInitialised"), + }, + { + name: "missing permission", + fields: fields{ + eventstore: expectEventstore( + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + "username", "firstname", "lastname", "nickname", "displayname", + language.English, domain.GenderUnspecified, "email", false), + ), + ), + ), + checkPermission: newMockPermissionCheckNotAllowed(), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + }, + wantErr: caos_errs.ThrowPermissionDenied(nil, "AUTHZ-HKJD33", "Errors.PermissionDenied"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := &Commands{ + checkPermission: tt.fields.checkPermission, + eventstore: tt.fields.eventstore(t), + userEncryption: tt.fields.userEncryption, + } + _, _, err := c.RequestPasswordResetURLTemplate(tt.args.ctx, tt.args.userID, tt.args.urlTmpl, tt.args.notificationType) + require.ErrorIs(t, err, tt.wantErr) + // successful cases are tested in TestCommands_requestPasswordReset + }) + } +} + +func TestCommands_requestPasswordReset(t *testing.T) { + type fields struct { + checkPermission domain.PermissionCheck + eventstore func(t *testing.T) *eventstore.Eventstore + userEncryption crypto.EncryptionAlgorithm + newCode cryptoCodeFunc + } + type args struct { + ctx context.Context + userID string + returnCode bool + urlTmpl string + notificationType domain.NotificationType + } + type res struct { + details *domain.ObjectDetails + code *string + err error + } + tests := []struct { + name string + fields fields + args args + res res + }{ + { + name: "missing userID", + fields: fields{ + eventstore: expectEventstore(), + }, + args: args{ + ctx: context.Background(), + userID: "", + }, + res: res{ + err: caos_errs.ThrowInvalidArgument(nil, "COMMAND-SAFdda", "Errors.User.IDMissing"), + }, + }, + { + name: "user not existing", + fields: fields{ + eventstore: expectEventstore( + expectFilter(), + ), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + }, + res: res{ + err: caos_errs.ThrowNotFound(nil, "COMMAND-SAF4f", "Errors.User.NotFound"), + }, + }, + { + name: "user not initialized", + fields: fields{ + eventstore: expectEventstore( + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + "username", "firstname", "lastname", "nickname", "displayname", + language.English, domain.GenderUnspecified, "email", false), + ), + eventFromEventPusher( + user.NewHumanInitialCodeAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + &crypto.CryptoValue{CryptoType: crypto.TypeEncryption, Algorithm: "enc", KeyID: "keyID", Crypted: []byte("code")}, 10*time.Second), + ), + ), + ), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + }, + res: res{ + err: caos_errs.ThrowPreconditionFailed(nil, "COMMAND-Sfe4g", "Errors.User.NotInitialised"), + }, + }, + { + name: "missing permission", + fields: fields{ + eventstore: expectEventstore( + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + "username", "firstname", "lastname", "nickname", "displayname", + language.English, domain.GenderUnspecified, "email", false), + ), + ), + ), + checkPermission: newMockPermissionCheckNotAllowed(), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + }, + res: res{ + err: caos_errs.ThrowPermissionDenied(nil, "AUTHZ-HKJD33", "Errors.PermissionDenied"), + }, + }, + { + name: "code generated", + fields: fields{ + eventstore: expectEventstore( + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + "username", "firstname", "lastname", "nickname", "displayname", + language.English, domain.GenderUnspecified, "email", false), + ), + ), + expectPush( + eventPusherToEvents( + user.NewHumanPasswordCodeAddedEventV2(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + &crypto.CryptoValue{ + CryptoType: crypto.TypeEncryption, + Algorithm: "enc", + KeyID: "id", + Crypted: []byte("code"), + }, + 10*time.Minute, + domain.NotificationTypeEmail, + "", + false, + )), + ), + ), + checkPermission: newMockPermissionCheckAllowed(), + newCode: mockCode("code", 10*time.Minute), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + }, + res: res{ + details: &domain.ObjectDetails{ + ResourceOwner: "org1", + }, + code: nil, + }, + }, + { + name: "code generated template", + fields: fields{ + eventstore: expectEventstore( + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + "username", "firstname", "lastname", "nickname", "displayname", + language.English, domain.GenderUnspecified, "email", false), + ), + ), + expectPush( + eventPusherToEvents( + user.NewHumanPasswordCodeAddedEventV2(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + &crypto.CryptoValue{ + CryptoType: crypto.TypeEncryption, + Algorithm: "enc", + KeyID: "id", + Crypted: []byte("code"), + }, + 10*time.Minute, + domain.NotificationTypeEmail, + "https://example.com/password/changey?userID={{.UserID}}&code={{.Code}}&orgID={{.OrgID}}", + false, + )), + ), + ), + checkPermission: newMockPermissionCheckAllowed(), + newCode: mockCode("code", 10*time.Minute), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + urlTmpl: "https://example.com/password/changey?userID={{.UserID}}&code={{.Code}}&orgID={{.OrgID}}", + }, + res: res{ + details: &domain.ObjectDetails{ + ResourceOwner: "org1", + }, + code: nil, + }, + }, + { + name: "code generated template sms", + fields: fields{ + eventstore: expectEventstore( + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + "username", "firstname", "lastname", "nickname", "displayname", + language.English, domain.GenderUnspecified, "email", false), + ), + ), + expectPush( + eventPusherToEvents( + user.NewHumanPasswordCodeAddedEventV2(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + &crypto.CryptoValue{ + CryptoType: crypto.TypeEncryption, + Algorithm: "enc", + KeyID: "id", + Crypted: []byte("code"), + }, + 10*time.Minute, + domain.NotificationTypeSms, + "https://example.com/password/changey?userID={{.UserID}}&code={{.Code}}&orgID={{.OrgID}}", + false, + )), + ), + ), + checkPermission: newMockPermissionCheckAllowed(), + newCode: mockCode("code", 10*time.Minute), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + urlTmpl: "https://example.com/password/changey?userID={{.UserID}}&code={{.Code}}&orgID={{.OrgID}}", + notificationType: domain.NotificationTypeSms, + }, + res: res{ + details: &domain.ObjectDetails{ + ResourceOwner: "org1", + }, + code: nil, + }, + }, + { + name: "code generated returned", + fields: fields{ + eventstore: expectEventstore( + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + "username", "firstname", "lastname", "nickname", "displayname", + language.English, domain.GenderUnspecified, "email", false), + ), + ), + expectPush( + eventPusherToEvents( + user.NewHumanPasswordCodeAddedEventV2(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + &crypto.CryptoValue{ + CryptoType: crypto.TypeEncryption, + Algorithm: "enc", + KeyID: "id", + Crypted: []byte("code"), + }, + 10*time.Minute, + domain.NotificationTypeEmail, + "", + true, + )), + ), + ), + checkPermission: newMockPermissionCheckAllowed(), + newCode: mockCode("code", 10*time.Minute), + }, + args: args{ + ctx: context.Background(), + userID: "userID", + returnCode: true, + }, + res: res{ + details: &domain.ObjectDetails{ + ResourceOwner: "org1", + }, + code: gu.Ptr("code"), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := &Commands{ + checkPermission: tt.fields.checkPermission, + eventstore: tt.fields.eventstore(t), + userEncryption: tt.fields.userEncryption, + newCode: tt.fields.newCode, + } + got, gotPlainCode, err := c.requestPasswordReset(tt.args.ctx, tt.args.userID, tt.args.returnCode, tt.args.urlTmpl, tt.args.notificationType) + require.ErrorIs(t, err, tt.res.err) + assert.Equal(t, tt.res.details, got) + assert.Equal(t, tt.res.code, gotPlainCode) + }) + } +} diff --git a/internal/crypto/code.go b/internal/crypto/code.go index 8901b8e27..60d1496ec 100644 --- a/internal/crypto/code.go +++ b/internal/crypto/code.go @@ -121,10 +121,14 @@ func IsCodeExpired(creationDate time.Time, expiry time.Duration) bool { } func VerifyCode(creationDate time.Time, expiry time.Duration, cryptoCode *CryptoValue, verificationCode string, g Generator) error { + return VerifyCodeWithAlgorithm(creationDate, expiry, cryptoCode, verificationCode, g.Alg()) +} + +func VerifyCodeWithAlgorithm(creationDate time.Time, expiry time.Duration, cryptoCode *CryptoValue, verificationCode string, algorithm Crypto) error { if IsCodeExpired(creationDate, expiry) { return errors.ThrowPreconditionFailed(nil, "CODE-QvUQ4P", "Errors.User.Code.Expired") } - switch alg := g.Alg().(type) { + switch alg := algorithm.(type) { case EncryptionAlgorithm: return verifyEncryptedCode(cryptoCode, verificationCode, alg) case HashAlgorithm: diff --git a/internal/crypto/code_test.go b/internal/crypto/code_test.go index 47c173d77..302ab141a 100644 --- a/internal/crypto/code_test.go +++ b/internal/crypto/code_test.go @@ -71,7 +71,7 @@ func TestVerifyCode(t *testing.T) { expiry: 5 * time.Minute, cryptoCode: nil, verificationCode: "", - g: nil, + g: createMockGenerator(t, createMockCrypto(t)), }, true, }, diff --git a/internal/eventstore/handler/crdb/statement.go b/internal/eventstore/handler/crdb/statement.go index 8601630cd..591751e66 100644 --- a/internal/eventstore/handler/crdb/statement.go +++ b/internal/eventstore/handler/crdb/statement.go @@ -285,6 +285,16 @@ func NewCopyCol(column, from string) handler.Column { } } +func NewLessThanCond(column string, value interface{}) handler.Condition { + return handler.Condition{ + Name: column, + Value: value, + ParameterOpt: func(placeholder string) string { + return " < " + placeholder + }, + } +} + // NewCopyStatement creates a new upsert statement which updates a column from an existing row // cols represent the columns which are objective to change. // if the value of a col is empty the data will be copied from the selected row @@ -390,6 +400,9 @@ func conditionsToWhere(cols []handler.Condition, paramOffset int) (wheres []stri for i, col := range cols { wheres[i] = "(" + col.Name + " = $" + strconv.Itoa(i+1+paramOffset) + ")" + if col.ParameterOpt != nil { + wheres[i] = "(" + col.Name + col.ParameterOpt("$"+strconv.Itoa(i+1+paramOffset)) + ")" + } values[i] = col.Value } diff --git a/internal/notification/handlers/usernotifier.go b/internal/notification/handlers/usernotifier.go index 5cd810236..cd2a48f09 100644 --- a/internal/notification/handlers/usernotifier.go +++ b/internal/notification/handlers/usernotifier.go @@ -251,6 +251,9 @@ func (u *userNotifier) reducePasswordCodeAdded(event eventstore.Event) (*handler if !ok { return nil, errors.ThrowInvalidArgumentf(nil, "HANDL-Eeg3s", "reduce.wrong.event.type %s", user.HumanPasswordCodeAddedType) } + if e.CodeReturned { + return crdb.NewNoOpStatement(e), nil + } ctx := HandlerContext(event.Aggregate()) alreadyHandled, err := u.checkIfCodeAlreadyHandledOrExpired(ctx, event, e.Expiry, nil, user.UserV1PasswordCodeAddedType, user.UserV1PasswordCodeSentType, @@ -317,7 +320,7 @@ func (u *userNotifier) reducePasswordCodeAdded(event eventstore.Event) (*handler u.metricFailedDeliveriesSMS, ) } - err = notify.SendPasswordCode(notifyUser, origin, code) + err = notify.SendPasswordCode(notifyUser, origin, code, e.URLTemplate) if err != nil { return nil, err } diff --git a/internal/notification/types/password_code.go b/internal/notification/types/password_code.go index e9b5df529..2285ba439 100644 --- a/internal/notification/types/password_code.go +++ b/internal/notification/types/password_code.go @@ -1,13 +1,24 @@ package types import ( + "strings" + "github.com/zitadel/zitadel/internal/api/ui/login" "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/query" ) -func (notify Notify) SendPasswordCode(user *query.NotifyUser, origin, code string) error { - url := login.InitPasswordLink(origin, user.ID, code, user.ResourceOwner) +func (notify Notify) SendPasswordCode(user *query.NotifyUser, origin, code, urlTmpl string) error { + var url string + if urlTmpl == "" { + url = login.InitPasswordLink(origin, user.ID, code, user.ResourceOwner) + } else { + var buf strings.Builder + if err := domain.RenderConfirmURLTemplate(&buf, urlTmpl, user.ID, code, user.ResourceOwner); err != nil { + return err + } + url = buf.String() + } args := make(map[string]interface{}) args["Code"] = code return notify(url, args, domain.PasswordResetMessageType, true) diff --git a/internal/query/projection/session.go b/internal/query/projection/session.go index d40302a84..a0f65a70a 100644 --- a/internal/query/projection/session.go +++ b/internal/query/projection/session.go @@ -10,6 +10,7 @@ import ( "github.com/zitadel/zitadel/internal/eventstore/handler/crdb" "github.com/zitadel/zitadel/internal/repository/instance" "github.com/zitadel/zitadel/internal/repository/session" + "github.com/zitadel/zitadel/internal/repository/user" ) const ( @@ -107,6 +108,15 @@ func (p *sessionProjection) reducers() []handler.AggregateReducer { }, }, }, + { + Aggregate: user.AggregateType, + EventRedusers: []handler.EventReducer{ + { + Event: user.HumanPasswordChangedType, + Reduce: p.reducePasswordChanged, + }, + }, + }, } } @@ -245,3 +255,21 @@ func (p *sessionProjection) reduceSessionTerminated(event eventstore.Event) (*ha }, ), nil } + +func (p *sessionProjection) reducePasswordChanged(event eventstore.Event) (*handler.Statement, error) { + e, ok := event.(*user.HumanPasswordChangedEvent) + if !ok { + return nil, errors.ThrowInvalidArgumentf(nil, "HANDL-Deg3d", "reduce.wrong.event.type %s", user.HumanPasswordChangedType) + } + + return crdb.NewUpdateStatement( + e, + []handler.Column{ + handler.NewCol(SessionColumnPasswordCheckedAt, nil), + }, + []handler.Condition{ + handler.NewCond(SessionColumnUserID, e.Aggregate().ID), + crdb.NewLessThanCond(SessionColumnPasswordCheckedAt, e.CreationDate()), + }, + ), nil +} diff --git a/internal/query/projection/session_test.go b/internal/query/projection/session_test.go index ecb96368c..2e4a7b645 100644 --- a/internal/query/projection/session_test.go +++ b/internal/query/projection/session_test.go @@ -11,6 +11,7 @@ import ( "github.com/zitadel/zitadel/internal/eventstore/repository" "github.com/zitadel/zitadel/internal/repository/instance" "github.com/zitadel/zitadel/internal/repository/session" + "github.com/zitadel/zitadel/internal/repository/user" ) func TestSessionProjection_reduces(t *testing.T) { @@ -243,6 +244,39 @@ func TestSessionProjection_reduces(t *testing.T) { }, }, }, + { + name: "reducePasswordChanged", + args: args{ + event: getEvent(testEvent( + repository.EventType(user.HumanPasswordChangedType), + user.AggregateType, + []byte(`{"secret": { + "cryptoType": 0, + "algorithm": "enc", + "keyID": "id", + "crypted": "cGFzc3dvcmQ=" + }}`), + ), user.HumanPasswordChangedEventMapper), + }, + reduce: (&sessionProjection{}).reducePasswordChanged, + want: wantReduce{ + aggregateType: eventstore.AggregateType("user"), + sequence: 15, + previousSequence: 10, + executer: &testExecuter{ + executions: []execution{ + { + expectedStmt: "UPDATE projections.sessions1 SET password_checked_at = $1 WHERE (user_id = $2) AND (password_checked_at < $3)", + expectedArgs: []interface{}{ + nil, + "agg-id", + anyArg{}, + }, + }, + }, + }, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/repository/user/human_password.go b/internal/repository/user/human_password.go index 26343d664..ccd38527d 100644 --- a/internal/repository/user/human_password.go +++ b/internal/repository/user/human_password.go @@ -76,6 +76,8 @@ type HumanPasswordCodeAddedEvent struct { Code *crypto.CryptoValue `json:"code,omitempty"` Expiry time.Duration `json:"expiry,omitempty"` NotificationType domain.NotificationType `json:"notificationType,omitempty"` + URLTemplate string `json:"url_template,omitempty"` + CodeReturned bool `json:"code_returned,omitempty"` } func (e *HumanPasswordCodeAddedEvent) Data() interface{} { @@ -92,6 +94,18 @@ func NewHumanPasswordCodeAddedEvent( code *crypto.CryptoValue, expiry time.Duration, notificationType domain.NotificationType, +) *HumanPasswordCodeAddedEvent { + return NewHumanPasswordCodeAddedEventV2(ctx, aggregate, code, expiry, notificationType, "", false) +} + +func NewHumanPasswordCodeAddedEventV2( + ctx context.Context, + aggregate *eventstore.Aggregate, + code *crypto.CryptoValue, + expiry time.Duration, + notificationType domain.NotificationType, + urlTemplate string, + codeReturned bool, ) *HumanPasswordCodeAddedEvent { return &HumanPasswordCodeAddedEvent{ BaseEvent: *eventstore.NewBaseEventForPush( @@ -102,6 +116,8 @@ func NewHumanPasswordCodeAddedEvent( Code: code, Expiry: expiry, NotificationType: notificationType, + URLTemplate: urlTemplate, + CodeReturned: codeReturned, } } diff --git a/proto/zitadel/user/v2alpha/password.proto b/proto/zitadel/user/v2alpha/password.proto index eb168f043..38089b0b0 100644 --- a/proto/zitadel/user/v2alpha/password.proto +++ b/proto/zitadel/user/v2alpha/password.proto @@ -8,13 +8,6 @@ import "google/api/field_behavior.proto"; import "protoc-gen-openapiv2/options/annotations.proto"; import "validate/validate.proto"; -message SetUserPassword { - oneof type { - Password password = 1; - HashedPassword hashed_password = 2; - } -} - message Password { string password = 1 [ (validate.rules).string = {min_len: 1, max_len: 200}, @@ -51,3 +44,24 @@ message HashedPassword { ]; bool change_required = 3; } + +message SendPasswordResetLink { + NotificationType notification_type = 1; + optional string url_template = 2 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1; + max_length: 200; + example: "\"https://example.com/password/changey?userID={{.UserID}}&code={{.Code}}&orgID={{.OrgID}}\""; + description: "\"Optionally set a url_template, which will be used in the password reset mail sent by ZITADEL to guide the user to your password change page. If no template is set, the default ZITADEL url will be used.\"" + } + ]; +} + +message ReturnPasswordResetCode {} + +enum NotificationType { + NOTIFICATION_TYPE_Unspecified = 0; + NOTIFICATION_TYPE_Email = 1; + NOTIFICATION_TYPE_SMS = 2; +} diff --git a/proto/zitadel/user/v2alpha/user_service.proto b/proto/zitadel/user/v2alpha/user_service.proto index c4489a04e..b5f776c6a 100644 --- a/proto/zitadel/user/v2alpha/user_service.proto +++ b/proto/zitadel/user/v2alpha/user_service.proto @@ -390,6 +390,56 @@ service UserService { }; }; } + + // Request password reset + rpc PasswordReset (PasswordResetRequest) returns (PasswordResetResponse) { + option (google.api.http) = { + post: "/v2alpha/users/{user_id}/password_reset" + body: "*" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "authenticated" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "Request a code to reset a password"; + description: "Request a code to reset a password"; + responses: { + key: "200" + value: { + description: "OK"; + } + }; + }; + } + + // Change password + rpc SetPassword (SetPasswordRequest) returns (SetPasswordResponse) { + option (google.api.http) = { + post: "/v2alpha/users/{user_id}/password" + body: "*" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "authenticated" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "Request a code to reset a password"; + description: "Request a code to reset a password"; + responses: { + key: "200" + value: { + description: "OK"; + } + }; + }; + } } message AddHumanUserRequest{ @@ -806,3 +856,66 @@ message AddIDPLinkRequest{ message AddIDPLinkResponse { zitadel.object.v2alpha.Details details = 1; } + +message PasswordResetRequest{ + string user_id = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1; + max_length: 200; + example: "\"69629026806489455\""; + } + ]; + // if no medium is specified, an email is sent with the default url + oneof medium { + SendPasswordResetLink send_link = 2; + ReturnPasswordResetCode return_code = 3; + } +} + +message PasswordResetResponse{ + zitadel.object.v2alpha.Details details = 1; + // in case the medium was set to return_code, the code will be returned + optional string verification_code = 2; +} + +message SetPasswordRequest{ + string user_id = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1; + max_length: 200; + example: "\"69629026806489455\""; + } + ]; + Password new_password = 2; + // if neither, the current password must be provided nor a verification code generated by the PasswordReset is provided, + // the user must be granted permission to set a password + oneof verification { + string current_password = 3 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1; + max_length: 200; + example: "\"Secr3tP4ssw0rd!\""; + } + ]; + string verification_code = 4 [ + (validate.rules).string = {min_len: 1, max_len: 20}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1; + max_length: 20; + example: "\"SKJd342k\""; + description: "\"the verification code generated during password reset request\""; + } + ]; + } +} + +message SetPasswordResponse{ + zitadel.object.v2alpha.Details details = 1; +} From 704619453079dbcc3335280e13cbd31ad17d4a99 Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Tue, 20 Jun 2023 18:23:28 +0200 Subject: [PATCH 22/37] feat(api): list authentication method types in user api v2 (#6058) --- cmd/start/start.go | 6 + internal/api/grpc/user/v2/user.go | 38 +++++ .../api/grpc/user/v2/user_integration_test.go | 107 ++++++++++++++ internal/api/grpc/user/v2/user_test.go | 72 ++++++++++ internal/domain/permission.go | 2 +- internal/domain/user.go | 2 + internal/integration/client.go | 3 + internal/query/query.go | 4 + internal/query/user_auth_method.go | 133 ++++++++++++++++++ internal/query/user_auth_method_test.go | 106 ++++++++++++++ proto/zitadel/user/v2alpha/user_service.proto | 51 +++++++ 11 files changed, 523 insertions(+), 1 deletion(-) diff --git a/cmd/start/start.go b/cmd/start/start.go index 75516fba4..e91b628d9 100644 --- a/cmd/start/start.go +++ b/cmd/start/start.go @@ -47,6 +47,7 @@ import ( auth_es "github.com/zitadel/zitadel/internal/auth/repository/eventsourcing" "github.com/zitadel/zitadel/internal/authz" authz_repo "github.com/zitadel/zitadel/internal/authz/repository" + authz_es "github.com/zitadel/zitadel/internal/authz/repository/eventsourcing/eventstore" "github.com/zitadel/zitadel/internal/command" "github.com/zitadel/zitadel/internal/crypto" cryptoDB "github.com/zitadel/zitadel/internal/crypto/database" @@ -145,6 +146,11 @@ func startZitadel(config *Config, masterKey string, server chan<- *Server) error keys.SAML, config.InternalAuthZ.RolePermissionMappings, sessionTokenVerifier, + func(q *query.Queries) domain.PermissionCheck { + return func(ctx context.Context, permission, orgID, resourceID string) (err error) { + return internal_authz.CheckPermission(ctx, &authz_es.UserMembershipRepo{Queries: q}, config.InternalAuthZ.RolePermissionMappings, permission, orgID, resourceID) + } + }, ) if err != nil { return fmt.Errorf("cannot start queries: %w", err) diff --git a/internal/api/grpc/user/v2/user.go b/internal/api/grpc/user/v2/user.go index 0a2507624..9969648c1 100644 --- a/internal/api/grpc/user/v2/user.go +++ b/internal/api/grpc/user/v2/user.go @@ -221,3 +221,41 @@ func (s *Server) checkIntentToken(token string, intentID string) error { } return nil } + +func (s *Server) ListAuthenticationMethodTypes(ctx context.Context, req *user.ListAuthenticationMethodTypesRequest) (*user.ListAuthenticationMethodTypesResponse, error) { + authMethods, err := s.query.ListActiveUserAuthMethodTypes(ctx, req.GetUserId(), false) + if err != nil { + return nil, err + } + return &user.ListAuthenticationMethodTypesResponse{ + Details: object.ToListDetails(authMethods.SearchResponse), + AuthMethodTypes: authMethodTypesToPb(authMethods.AuthMethodTypes), + }, nil +} + +func authMethodTypesToPb(methodTypes []domain.UserAuthMethodType) []user.AuthenticationMethodType { + methods := make([]user.AuthenticationMethodType, len(methodTypes)) + for i, method := range methodTypes { + methods[i] = authMethodTypeToPb(method) + } + return methods +} + +func authMethodTypeToPb(methodType domain.UserAuthMethodType) user.AuthenticationMethodType { + switch methodType { + case domain.UserAuthMethodTypeOTP: + return user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_TOTP + case domain.UserAuthMethodTypeU2F: + return user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_U2F + case domain.UserAuthMethodTypePasswordless: + return user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_PASSKEY + case domain.UserAuthMethodTypePassword: + return user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_PASSWORD + case domain.UserAuthMethodTypeIDP: + return user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_IDP + case domain.UserAuthMethodTypeUnspecified: + return user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_UNSPECIFIED + default: + return user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_UNSPECIFIED + } +} diff --git a/internal/api/grpc/user/v2/user_integration_test.go b/internal/api/grpc/user/v2/user_integration_test.go index b78cf687c..c30057524 100644 --- a/internal/api/grpc/user/v2/user_integration_test.go +++ b/internal/api/grpc/user/v2/user_integration_test.go @@ -24,6 +24,7 @@ import ( openid "github.com/zitadel/zitadel/internal/idp/providers/oidc" "github.com/zitadel/zitadel/internal/integration" "github.com/zitadel/zitadel/internal/repository/idp" + mgmt "github.com/zitadel/zitadel/pkg/grpc/management" object "github.com/zitadel/zitadel/pkg/grpc/object/v2alpha" user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha" ) @@ -712,3 +713,109 @@ func TestServer_RetrieveIdentityProviderInformation(t *testing.T) { }) } } + +func TestServer_ListAuthenticationMethodTypes(t *testing.T) { + userIDWithoutAuth := Tester.CreateHumanUser(CTX).GetUserId() + + userIDWithPasskey := Tester.CreateHumanUser(CTX).GetUserId() + Tester.RegisterUserPasskey(CTX, userIDWithPasskey) + + userMultipleAuth := Tester.CreateHumanUser(CTX).GetUserId() + Tester.RegisterUserPasskey(CTX, userMultipleAuth) + provider, err := Tester.Client.Mgmt.AddGenericOIDCProvider(CTX, &mgmt.AddGenericOIDCProviderRequest{ + Name: "ListAuthenticationMethodTypes", + Issuer: "https://example.com", + ClientId: "client_id", + ClientSecret: "client_secret", + }) + require.NoError(t, err) + idpLink, err := Tester.Client.UserV2.AddIDPLink(CTX, &user.AddIDPLinkRequest{UserId: userMultipleAuth, IdpLink: &user.IDPLink{ + IdpId: provider.GetId(), + UserId: "external-id", + UserName: "displayName", + }}) + require.NoError(t, err) + + type args struct { + ctx context.Context + req *user.ListAuthenticationMethodTypesRequest + } + tests := []struct { + name string + args args + want *user.ListAuthenticationMethodTypesResponse + }{ + { + name: "no auth", + args: args{ + CTX, + &user.ListAuthenticationMethodTypesRequest{ + UserId: userIDWithoutAuth, + }, + }, + want: &user.ListAuthenticationMethodTypesResponse{ + Details: &object.ListDetails{ + TotalResult: 0, + }, + }, + }, + { + name: "with auth (passkey)", + args: args{ + CTX, + &user.ListAuthenticationMethodTypesRequest{ + UserId: userIDWithPasskey, + }, + }, + want: &user.ListAuthenticationMethodTypesResponse{ + Details: &object.ListDetails{ + TotalResult: 1, + }, + AuthMethodTypes: []user.AuthenticationMethodType{ + user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_PASSKEY, + }, + }, + }, + { + name: "multiple auth", + args: args{ + CTX, + &user.ListAuthenticationMethodTypesRequest{ + UserId: userMultipleAuth, + }, + }, + want: &user.ListAuthenticationMethodTypesResponse{ + Details: &object.ListDetails{ + TotalResult: 2, + }, + AuthMethodTypes: []user.AuthenticationMethodType{ + user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_PASSKEY, + user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_IDP, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var got *user.ListAuthenticationMethodTypesResponse + var err error + + for { + got, err = Client.ListAuthenticationMethodTypes(tt.args.ctx, tt.args.req) + if err == nil && got.GetDetails().GetProcessedSequence() >= idpLink.GetDetails().GetSequence() { + break + } + select { + case <-CTX.Done(): + t.Fatal(CTX.Err(), err) + case <-time.After(time.Second): + t.Log("retrying ListAuthenticationMethodTypes") + continue + } + } + require.NoError(t, err) + assert.Equal(t, tt.want.GetDetails().GetTotalResult(), got.GetDetails().GetTotalResult()) + require.Equal(t, tt.want.GetAuthMethodTypes(), got.GetAuthMethodTypes()) + }) + } +} diff --git a/internal/api/grpc/user/v2/user_test.go b/internal/api/grpc/user/v2/user_test.go index f6153f650..8332c8703 100644 --- a/internal/api/grpc/user/v2/user_test.go +++ b/internal/api/grpc/user/v2/user_test.go @@ -222,3 +222,75 @@ func Test_intentToIDPInformationPb(t *testing.T) { }) } } + +func Test_authMethodTypesToPb(t *testing.T) { + tests := []struct { + name string + methodTypes []domain.UserAuthMethodType + want []user.AuthenticationMethodType + }{ + { + "empty list", + nil, + []user.AuthenticationMethodType{}, + }, + { + "list", + []domain.UserAuthMethodType{ + domain.UserAuthMethodTypePasswordless, + }, + []user.AuthenticationMethodType{ + user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_PASSKEY, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equalf(t, tt.want, authMethodTypesToPb(tt.methodTypes), "authMethodTypesToPb(%v)", tt.methodTypes) + }) + } +} + +func Test_authMethodTypeToPb(t *testing.T) { + tests := []struct { + name string + methodType domain.UserAuthMethodType + want user.AuthenticationMethodType + }{ + { + "uspecified", + domain.UserAuthMethodTypeUnspecified, + user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_UNSPECIFIED, + }, + { + "(t)otp", + domain.UserAuthMethodTypeOTP, + user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_TOTP, + }, + { + "u2f", + domain.UserAuthMethodTypeU2F, + user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_U2F, + }, + { + "passkey", + domain.UserAuthMethodTypePasswordless, + user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_PASSKEY, + }, + { + "password", + domain.UserAuthMethodTypePassword, + user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_PASSWORD, + }, + { + "idp", + domain.UserAuthMethodTypeIDP, + user.AuthenticationMethodType_AUTHENTICATION_METHOD_TYPE_IDP, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equalf(t, tt.want, authMethodTypeToPb(tt.methodType), "authMethodTypeToPb(%v)", tt.methodType) + }) + } +} diff --git a/internal/domain/permission.go b/internal/domain/permission.go index 5a51d7bdb..ebd7981ab 100644 --- a/internal/domain/permission.go +++ b/internal/domain/permission.go @@ -28,7 +28,7 @@ type PermissionCheck func(ctx context.Context, permission, orgID, resourceID str const ( PermissionUserWrite = "user.write" - PermissionSessionRead = "session.read" + PermissionUserRead = "user.read" PermissionSessionWrite = "session.write" PermissionSessionDelete = "session.delete" ) diff --git a/internal/domain/user.go b/internal/domain/user.go index 157edcc19..a5e01361f 100644 --- a/internal/domain/user.go +++ b/internal/domain/user.go @@ -51,6 +51,8 @@ const ( UserAuthMethodTypeOTP UserAuthMethodTypeU2F UserAuthMethodTypePasswordless + UserAuthMethodTypePassword + UserAuthMethodTypeIDP userAuthMethodTypeCount ) diff --git a/internal/integration/client.go b/internal/integration/client.go index c21b42f67..8f64936e0 100644 --- a/internal/integration/client.go +++ b/internal/integration/client.go @@ -9,6 +9,7 @@ import ( "google.golang.org/grpc" "github.com/zitadel/zitadel/pkg/grpc/admin" + mgmt "github.com/zitadel/zitadel/pkg/grpc/management" object "github.com/zitadel/zitadel/pkg/grpc/object/v2alpha" session "github.com/zitadel/zitadel/pkg/grpc/session/v2alpha" user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha" @@ -17,6 +18,7 @@ import ( type Client struct { CC *grpc.ClientConn Admin admin.AdminServiceClient + Mgmt mgmt.ManagementServiceClient UserV2 user.UserServiceClient SessionV2 session.SessionServiceClient } @@ -25,6 +27,7 @@ func newClient(cc *grpc.ClientConn) Client { return Client{ CC: cc, Admin: admin.NewAdminServiceClient(cc), + Mgmt: mgmt.NewManagementServiceClient(cc), UserV2: user.NewUserServiceClient(cc), SessionV2: session.NewSessionServiceClient(cc), } diff --git a/internal/query/query.go b/internal/query/query.go index 17990311b..464cf59aa 100644 --- a/internal/query/query.go +++ b/internal/query/query.go @@ -34,6 +34,7 @@ type Queries struct { idpConfigEncryption crypto.EncryptionAlgorithm sessionTokenVerifier func(ctx context.Context, sessionToken string, sessionID string, tokenID string) (err error) + checkPermission domain.PermissionCheck DefaultLanguage language.Tag LoginDir http.FileSystem @@ -55,6 +56,7 @@ func StartQueries( idpConfigEncryption, otpEncryption, keyEncryptionAlgorithm, certEncryptionAlgorithm crypto.EncryptionAlgorithm, zitadelRoles []authz.RoleMapping, sessionTokenVerifier func(ctx context.Context, sessionToken string, sessionID string, tokenID string) (err error), + permissionCheck func(q *Queries) domain.PermissionCheck, ) (repo *Queries, err error) { statikLoginFS, err := fs.NewWithNamespace("login") if err != nil { @@ -95,6 +97,8 @@ func StartQueries( }, } + repo.checkPermission = permissionCheck(repo) + err = projection.Create(ctx, sqlClient, es, projections, keyEncryptionAlgorithm, certEncryptionAlgorithm) if err != nil { return nil, err diff --git a/internal/query/user_auth_method.go b/internal/query/user_auth_method.go index 0321a8750..dde1a5a38 100644 --- a/internal/query/user_auth_method.go +++ b/internal/query/user_auth_method.go @@ -6,6 +6,7 @@ import ( "time" sq "github.com/Masterminds/squirrel" + "github.com/zitadel/logging" "github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/api/call" @@ -64,12 +65,27 @@ var ( name: projection.UserAuthMethodOwnerRemovedCol, table: userAuthMethodTable, } + + authMethodTypeTable = userAuthMethodTable.setAlias("auth_method_types") + authMethodTypeUserID = UserAuthMethodColumnUserID.setTable(authMethodTypeTable) + authMethodTypeInstanceID = UserAuthMethodColumnInstanceID.setTable(authMethodTypeTable) + authMethodTypeTypes = UserAuthMethodColumnMethodType.setTable(authMethodTypeTable) + authMethodTypeState = UserAuthMethodColumnState.setTable(authMethodTypeTable) + + userIDPsCountTable = idpUserLinkTable.setAlias("user_idps_count") + userIDPsCountUserID = IDPUserLinkUserIDCol.setTable(userIDPsCountTable) + userIDPsCountInstanceID = IDPUserLinkInstanceIDCol.setTable(userIDPsCountTable) + userIDPsCountCount = Column{ + name: "count", + table: userIDPsCountTable, + } ) type AuthMethods struct { SearchResponse AuthMethods []*AuthMethod } + type AuthMethod struct { UserID string CreationDate time.Time @@ -83,6 +99,11 @@ type AuthMethod struct { Type domain.UserAuthMethodType } +type AuthMethodTypes struct { + SearchResponse + AuthMethodTypes []domain.UserAuthMethodType +} + type UserAuthMethodSearchQueries struct { SearchRequest Queries []SearchQuery @@ -114,6 +135,41 @@ func (q *Queries) SearchUserAuthMethods(ctx context.Context, queries *UserAuthMe return userAuthMethods, err } +func (q *Queries) ListActiveUserAuthMethodTypes(ctx context.Context, userID string, withOwnerRemoved bool) (userAuthMethodTypes *AuthMethodTypes, err error) { + ctxData := authz.GetCtxData(ctx) + if ctxData.UserID != userID { + if err := q.checkPermission(ctx, domain.PermissionUserRead, ctxData.OrgID, userID); err != nil { + return nil, err + } + } + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + + query, scan := prepareActiveUserAuthMethodTypesQuery(ctx, q.client) + eq := sq.Eq{ + UserIDCol.identifier(): userID, + UserInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID(), + } + if !withOwnerRemoved { + eq[UserOwnerRemovedCol.identifier()] = false + } + stmt, args, err := query.Where(eq).ToSql() + if err != nil { + return nil, errors.ThrowInvalidArgument(err, "QUERY-Sfdrg", "Errors.Query.InvalidRequest") + } + + rows, err := q.client.QueryContext(ctx, stmt, args...) + if err != nil || rows.Err() != nil { + return nil, errors.ThrowInternal(err, "QUERY-SDgr3", "Errors.Internal") + } + userAuthMethodTypes, err = scan(rows) + if err != nil { + return nil, err + } + userAuthMethodTypes.LatestSequence, err = q.latestSequence(ctx, userTable, notifyTable, userAuthMethodTable, idpUserLinkTable) + return userAuthMethodTypes, err +} + func NewUserAuthMethodUserIDSearchQuery(value string) (SearchQuery, error) { return NewTextQuery(UserAuthMethodColumnUserID, value, TextEquals) } @@ -253,3 +309,80 @@ func prepareUserAuthMethodsQuery(ctx context.Context, db prepareDatabase) (sq.Se }, nil } } + +func prepareActiveUserAuthMethodTypesQuery(ctx context.Context, db prepareDatabase) (sq.SelectBuilder, func(*sql.Rows) (*AuthMethodTypes, error)) { + authMethodsQuery, authMethodsArgs, err := sq.Select( + "DISTINCT("+authMethodTypeTypes.identifier()+")", + authMethodTypeUserID.identifier(), + authMethodTypeInstanceID.identifier()). + From(authMethodTypeTable.identifier()). + Where(sq.Eq{authMethodTypeState.identifier(): domain.MFAStateReady}). + ToSql() + if err != nil { + return sq.SelectBuilder{}, nil + } + idpsQuery, _, err := sq.Select( + userIDPsCountUserID.identifier(), + userIDPsCountInstanceID.identifier(), + "COUNT("+userIDPsCountUserID.identifier()+") AS "+userIDPsCountCount.name). + From(userIDPsCountTable.identifier()). + GroupBy( + userIDPsCountUserID.identifier(), + userIDPsCountInstanceID.identifier(), + ). + ToSql() + if err != nil { + return sq.SelectBuilder{}, nil + } + return sq.Select( + NotifyPasswordSetCol.identifier(), + authMethodTypeTypes.identifier(), + userIDPsCountCount.identifier()). + From(userTable.identifier()). + LeftJoin(join(NotifyUserIDCol, UserIDCol)). + LeftJoin("("+authMethodsQuery+") AS "+authMethodTypeTable.alias+" ON "+ + authMethodTypeUserID.identifier()+" = "+UserIDCol.identifier()+" AND "+ + authMethodTypeInstanceID.identifier()+" = "+UserInstanceIDCol.identifier(), + authMethodsArgs...). + LeftJoin("(" + idpsQuery + ") AS " + userIDPsCountTable.alias + " ON " + + userIDPsCountUserID.identifier() + " = " + UserIDCol.identifier() + " AND " + + userIDPsCountInstanceID.identifier() + " = " + UserInstanceIDCol.identifier() + db.Timetravel(call.Took(ctx))). + PlaceholderFormat(sq.Dollar), + func(rows *sql.Rows) (*AuthMethodTypes, error) { + userAuthMethodTypes := make([]domain.UserAuthMethodType, 0) + var passwordSet sql.NullBool + var idp sql.NullInt64 + for rows.Next() { + var authMethodType sql.NullInt16 + err := rows.Scan( + &passwordSet, + &authMethodType, + &idp, + ) + if err != nil { + return nil, err + } + if authMethodType.Valid { + userAuthMethodTypes = append(userAuthMethodTypes, domain.UserAuthMethodType(authMethodType.Int16)) + } + } + if passwordSet.Valid && passwordSet.Bool { + userAuthMethodTypes = append(userAuthMethodTypes, domain.UserAuthMethodTypePassword) + } + if idp.Valid && idp.Int64 > 0 { + logging.Error("IDP", idp.Int64) + userAuthMethodTypes = append(userAuthMethodTypes, domain.UserAuthMethodTypeIDP) + } + + if err := rows.Close(); err != nil { + return nil, errors.ThrowInternal(err, "QUERY-3n9fl", "Errors.Query.CloseRows") + } + + return &AuthMethodTypes{ + AuthMethodTypes: userAuthMethodTypes, + SearchResponse: SearchResponse{ + Count: uint64(len(userAuthMethodTypes)), + }, + }, nil + } +} diff --git a/internal/query/user_auth_method_test.go b/internal/query/user_auth_method_test.go index b09d6c9e7..da86a02aa 100644 --- a/internal/query/user_auth_method_test.go +++ b/internal/query/user_auth_method_test.go @@ -36,6 +36,23 @@ var ( "method_type", "count", } + prepareActiveAuthMethodTypesStmt = `SELECT projections.users8_notifications.password_set,` + + ` auth_method_types.method_type,` + + ` user_idps_count.count` + + ` FROM projections.users8` + + ` LEFT JOIN projections.users8_notifications ON projections.users8.id = projections.users8_notifications.user_id AND projections.users8.instance_id = projections.users8_notifications.instance_id` + + ` LEFT JOIN (SELECT DISTINCT(auth_method_types.method_type), auth_method_types.user_id, auth_method_types.instance_id FROM projections.user_auth_methods4 AS auth_method_types` + + ` WHERE auth_method_types.state = $1) AS auth_method_types` + + ` ON auth_method_types.user_id = projections.users8.id AND auth_method_types.instance_id = projections.users8.instance_id` + + ` LEFT JOIN (SELECT user_idps_count.user_id, user_idps_count.instance_id, COUNT(user_idps_count.user_id) AS count FROM projections.idp_user_links3 AS user_idps_count` + + ` GROUP BY user_idps_count.user_id, user_idps_count.instance_id) AS user_idps_count` + + ` ON user_idps_count.user_id = projections.users8.id AND user_idps_count.instance_id = projections.users8.instance_id` + + ` AS OF SYSTEM TIME '-1 ms` + prepareActiveAuthMethodTypesCols = []string{ + "password_set", + "method_type", + "idps_count", + } ) func Test_UserAuthMethodPrepares(t *testing.T) { @@ -182,6 +199,95 @@ func Test_UserAuthMethodPrepares(t *testing.T) { }, object: nil, }, + { + name: "prepareActiveUserAuthMethodTypesQuery no result", + prepare: prepareActiveUserAuthMethodTypesQuery, + want: want{ + sqlExpectations: mockQueries( + regexp.QuoteMeta(prepareActiveAuthMethodTypesStmt), + nil, + nil, + ), + }, + object: &AuthMethodTypes{AuthMethodTypes: []domain.UserAuthMethodType{}}, + }, + { + name: "prepareActiveUserAuthMethodTypesQuery one second factor", + prepare: prepareActiveUserAuthMethodTypesQuery, + want: want{ + sqlExpectations: mockQueries( + regexp.QuoteMeta(prepareActiveAuthMethodTypesStmt), + prepareActiveAuthMethodTypesCols, + [][]driver.Value{ + { + true, + domain.UserAuthMethodTypePasswordless, + 1, + }, + }, + ), + }, + object: &AuthMethodTypes{ + SearchResponse: SearchResponse{ + Count: 3, + }, + AuthMethodTypes: []domain.UserAuthMethodType{ + domain.UserAuthMethodTypePasswordless, + domain.UserAuthMethodTypePassword, + domain.UserAuthMethodTypeIDP, + }, + }, + }, + { + name: "prepareActiveUserAuthMethodTypesQuery multiple second factors", + prepare: prepareActiveUserAuthMethodTypesQuery, + want: want{ + sqlExpectations: mockQueries( + regexp.QuoteMeta(prepareActiveAuthMethodTypesStmt), + prepareActiveAuthMethodTypesCols, + [][]driver.Value{ + { + true, + domain.UserAuthMethodTypePasswordless, + 1, + }, + { + true, + domain.UserAuthMethodTypeOTP, + 1, + }, + }, + ), + }, + object: &AuthMethodTypes{ + SearchResponse: SearchResponse{ + Count: 4, + }, + AuthMethodTypes: []domain.UserAuthMethodType{ + domain.UserAuthMethodTypePasswordless, + domain.UserAuthMethodTypeOTP, + domain.UserAuthMethodTypePassword, + domain.UserAuthMethodTypeIDP, + }, + }, + }, + { + name: "prepareActiveUserAuthMethodTypesQuery sql err", + prepare: prepareActiveUserAuthMethodTypesQuery, + want: want{ + sqlExpectations: mockQueryErr( + regexp.QuoteMeta(prepareActiveAuthMethodTypesStmt), + sql.ErrConnDone, + ), + err: func(err error) (error, bool) { + if !errors.Is(err, sql.ErrConnDone) { + return fmt.Errorf("err should be sql.ErrConnDone got: %w", err), false + } + return nil, true + }, + }, + object: nil, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/proto/zitadel/user/v2alpha/user_service.proto b/proto/zitadel/user/v2alpha/user_service.proto index b5f776c6a..ad30412d0 100644 --- a/proto/zitadel/user/v2alpha/user_service.proto +++ b/proto/zitadel/user/v2alpha/user_service.proto @@ -440,6 +440,30 @@ service UserService { }; }; } + + // List all possible authentication methods of a user + rpc ListAuthenticationMethodTypes (ListAuthenticationMethodTypesRequest) returns (ListAuthenticationMethodTypesResponse) { + option (google.api.http) = { + get: "/v2alpha/users/{user_id}/authentication_methods" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "authenticated" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "List all possible authentication methods of a user"; + description: "List all possible authentication methods of a user like password, passwordless, (T)OTP and more"; + responses: { + key: "200" + value: { + description: "OK"; + } + }; + }; + } } message AddHumanUserRequest{ @@ -857,6 +881,7 @@ message AddIDPLinkResponse { zitadel.object.v2alpha.Details details = 1; } + message PasswordResetRequest{ string user_id = 1 [ (validate.rules).string = {min_len: 1, max_len: 200}, @@ -919,3 +944,29 @@ message SetPasswordRequest{ message SetPasswordResponse{ zitadel.object.v2alpha.Details details = 1; } + +message ListAuthenticationMethodTypesRequest{ + string user_id = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1; + max_length: 200; + example: "\"69629026806489455\""; + } + ]; +} + +message ListAuthenticationMethodTypesResponse{ + zitadel.object.v2alpha.ListDetails details = 1; + repeated AuthenticationMethodType auth_method_types = 2; +} + +enum AuthenticationMethodType { + AUTHENTICATION_METHOD_TYPE_UNSPECIFIED = 0; + AUTHENTICATION_METHOD_TYPE_PASSWORD = 1; + AUTHENTICATION_METHOD_TYPE_PASSKEY = 2; + AUTHENTICATION_METHOD_TYPE_IDP = 3; + AUTHENTICATION_METHOD_TYPE_TOTP = 4; + AUTHENTICATION_METHOD_TYPE_U2F = 5; +} From 84085478ec4bd0df183ce71c33afba69db6826a9 Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Wed, 21 Jun 2023 07:00:03 +0200 Subject: [PATCH 23/37] fix(login): ensure auth request information is up-to-date in external user check (#6060) --- .../api/ui/login/external_provider_handler.go | 15 +++++++-------- .../eventsourcing/eventstore/auth_request.go | 2 ++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/internal/api/ui/login/external_provider_handler.go b/internal/api/ui/login/external_provider_handler.go index d54d29b4e..38029ad05 100644 --- a/internal/api/ui/login/external_provider_handler.go +++ b/internal/api/ui/login/external_provider_handler.go @@ -292,6 +292,13 @@ func (l *Login) handleExternalUserAuthenticated( l.renderError(w, r, authReq, externalErr) return } + var err error + // read current auth request state (incl. authorized user) + authReq, err = l.authRepo.AuthRequestByID(r.Context(), authReq.ID, authReq.AgentID) + if err != nil { + l.renderError(w, r, authReq, err) + return + } externalUser, externalUserChange, err := l.runPostExternalAuthenticationActions(externalUser, tokens(session), authReq, r, user, nil) if err != nil { l.renderError(w, r, authReq, err) @@ -302,14 +309,6 @@ func (l *Login) handleExternalUserAuthenticated( l.externalUserNotExisting(w, r, authReq, provider, externalUser, externalUserChange) return } - if provider.IsAutoUpdate || len(externalUser.Metadatas) > 0 || externalUserChange { - // read current auth request state (incl. authorized user) - authReq, err = l.authRepo.AuthRequestByID(r.Context(), authReq.ID, authReq.AgentID) - if err != nil { - l.renderError(w, r, authReq, err) - return - } - } if provider.IsAutoUpdate || externalUserChange { err = l.updateExternalUser(r.Context(), authReq, externalUser) if err != nil { diff --git a/internal/auth/repository/eventsourcing/eventstore/auth_request.go b/internal/auth/repository/eventsourcing/eventstore/auth_request.go index 6e7de351e..4de5b0237 100644 --- a/internal/auth/repository/eventsourcing/eventstore/auth_request.go +++ b/internal/auth/repository/eventsourcing/eventstore/auth_request.go @@ -247,6 +247,8 @@ func (repo *AuthRequestRepo) CheckExternalUserLogin(ctx context.Context, authReq } err = repo.checkExternalUserLogin(ctx, request, externalUser.IDPConfigID, externalUser.ExternalUserID) if errors.IsNotFound(err) { + // clear potential user information (e.g. when username was entered but another external user was returned) + request.SetUserInfo("", "", "", "", "", request.UserOrgID) if err := repo.setLinkingUser(ctx, request, externalUser); err != nil { return err } From 7e6434fa8c4bcf50d7a3189cefec0d3b5ebc6c4a Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Wed, 21 Jun 2023 08:30:39 +0200 Subject: [PATCH 24/37] fix: event handling on UserIDPLinkWriteModel (#6054) --- internal/command/user_idp_link_model.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/command/user_idp_link_model.go b/internal/command/user_idp_link_model.go index 0682afb31..41ff5c6d5 100644 --- a/internal/command/user_idp_link_model.go +++ b/internal/command/user_idp_link_model.go @@ -31,17 +31,17 @@ func (wm *UserIDPLinkWriteModel) AppendEvents(events ...eventstore.Event) { for _, event := range events { switch e := event.(type) { case *user.UserIDPLinkAddedEvent: - if e.IDPConfigID != wm.IDPConfigID && e.ExternalUserID != wm.ExternalUserID { + if e.IDPConfigID != wm.IDPConfigID || e.ExternalUserID != wm.ExternalUserID { continue } wm.WriteModel.AppendEvents(e) case *user.UserIDPLinkRemovedEvent: - if e.IDPConfigID != wm.IDPConfigID && e.ExternalUserID != wm.ExternalUserID { + if e.IDPConfigID != wm.IDPConfigID || e.ExternalUserID != wm.ExternalUserID { continue } wm.WriteModel.AppendEvents(e) case *user.UserIDPLinkCascadeRemovedEvent: - if e.IDPConfigID != wm.IDPConfigID && e.ExternalUserID != wm.ExternalUserID { + if e.IDPConfigID != wm.IDPConfigID || e.ExternalUserID != wm.ExternalUserID { continue } wm.WriteModel.AppendEvents(e) From 5ab3ed466c6f55a18e79a1d004f015dae3fe6c5e Mon Sep 17 00:00:00 2001 From: Dakshitha Ratnayake Date: Wed, 21 Jun 2023 17:02:53 +0530 Subject: [PATCH 25/37] docs:Update quickstart.mdx (#6056) Update quickstart.mdx --- docs/docs/guides/start/quickstart.mdx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/docs/guides/start/quickstart.mdx b/docs/docs/guides/start/quickstart.mdx index e3d680cac..11a9349a7 100644 --- a/docs/docs/guides/start/quickstart.mdx +++ b/docs/docs/guides/start/quickstart.mdx @@ -286,11 +286,7 @@ Once you have Node.js installed, you can use the following command to install Re ``` npm install -g react ``` -This will install the latest version of React globally on your system. You can then verify the installation by running the following command: - -``` react -v ``` - -This should output the version of React that you have installed. +This will install the latest version of React globally on your system. Visual Studio Code From c12d94f7d43cd39855a91985127deda86515072d Mon Sep 17 00:00:00 2001 From: mffap Date: Wed, 21 Jun 2023 15:09:37 +0200 Subject: [PATCH 26/37] docs(legal): add backup (#6064) --- docs/docs/legal/cloud-service-description.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/docs/legal/cloud-service-description.md b/docs/docs/legal/cloud-service-description.md index 6694dfad4..573fbeb6c 100644 --- a/docs/docs/legal/cloud-service-description.md +++ b/docs/docs/legal/cloud-service-description.md @@ -2,7 +2,6 @@ title: Cloud Service custom_edit_url: null --- -## Introduction This annex of the [Framework Agreement](terms-of-service) describes the service levels offered by us for our Services. @@ -28,4 +27,13 @@ The following regions will be available when using our cloud service. This list - **Switzerland**: Exclusively on Swiss region - **GDPR safe countries**: Exclusively [Adequate Countries](https://ec.europa.eu/info/law/law-topic/data-protection/international-dimension-data-protection/adequacy-decisions_en) as recognized by the European Commission under the GDPR -Last revised: June 14, 2022 \ No newline at end of file +## Backup + +Our backup strategy executes daily full backups and differential backups on much higher frequency. +In a disaster recovery scenario, our goal is to guarantee a recovery point objective (RPO) of 1h, and a higher but similar recovery time objective (RTO). +Under normal operations, RPO and RTO goals are below 1 minute. + +If you you have different requirements we provide you with a flexible approach to backup, restore, and transfer data (f.e. to a self-hosted setup) through our APIs. +Please consult the [migration guides](../guides/migrate/introduction.md) for more information. + +Last revised: June 21, 2023 \ No newline at end of file From 1b5d6ce89ecbbc03d8e54fc7890fb8618f720a4f Mon Sep 17 00:00:00 2001 From: Stefan Benz <46600784+stebenz@users.noreply.github.com> Date: Wed, 21 Jun 2023 16:06:18 +0200 Subject: [PATCH 27/37] feat: session checks with intent (#6031) * feat: session checks with intent * feat: session checks with intent * fix: integration tests for intent session * fix: integration tests for intent session * fix merge * fix: integration tests for intent session --------- Co-authored-by: Livio Spring --- internal/api/grpc/session/v2/session.go | 13 ++ .../session/v2/session_integration_test.go | 121 ++++++++++- internal/api/grpc/user/v2/user.go | 17 +- .../api/grpc/user/v2/user_integration_test.go | 73 +------ internal/command/idp_intent.go | 5 +- internal/command/idp_intent_test.go | 33 ++- internal/command/session.go | 39 ++++ internal/command/session_model.go | 12 ++ internal/command/session_test.go | 202 ++++++++++++++++++ internal/crypto/crypto.go | 19 ++ internal/integration/client.go | 79 +++++++ internal/query/projection/session.go | 28 ++- internal/query/projection/session_test.go | 48 ++++- internal/query/session.go | 17 ++ internal/query/sessions_test.go | 82 ++++--- internal/repository/idpintent/intent.go | 4 +- internal/repository/session/eventstore.go | 1 + internal/repository/session/session.go | 42 ++++ internal/static/i18n/bg.yaml | 2 + internal/static/i18n/de.yaml | 1 + internal/static/i18n/en.yaml | 1 + internal/static/i18n/es.yaml | 1 + internal/static/i18n/fr.yaml | 1 + internal/static/i18n/it.yaml | 1 + internal/static/i18n/ja.yaml | 1 + internal/static/i18n/pl.yaml | 1 + internal/static/i18n/zh.yaml | 1 + proto/zitadel/session/v2alpha/session.proto | 9 + .../session/v2alpha/session_service.proto | 26 +++ 29 files changed, 727 insertions(+), 153 deletions(-) diff --git a/internal/api/grpc/session/v2/session.go b/internal/api/grpc/session/v2/session.go index f4af6d99b..6c31fbeab 100644 --- a/internal/api/grpc/session/v2/session.go +++ b/internal/api/grpc/session/v2/session.go @@ -119,6 +119,7 @@ func factorsToPb(s *query.Session) *session.Factors { User: user, Password: passwordFactorToPb(s.PasswordFactor), Passkey: passkeyFactorToPb(s.PasskeyFactor), + Intent: intentFactorToPb(s.IntentFactor), } } @@ -131,6 +132,15 @@ func passwordFactorToPb(factor query.SessionPasswordFactor) *session.PasswordFac } } +func intentFactorToPb(factor query.SessionIntentFactor) *session.IntentFactor { + if factor.IntentCheckedAt.IsZero() { + return nil + } + return &session.IntentFactor{ + VerifiedAt: timestamppb.New(factor.IntentCheckedAt), + } +} + func passkeyFactorToPb(factor query.SessionPasskeyFactor) *session.PasskeyFactor { if factor.PasskeyCheckedAt.IsZero() { return nil @@ -229,6 +239,9 @@ func (s *Server) checksToCommand(ctx context.Context, checks *session.Checks) ([ if password := checks.GetPassword(); password != nil { sessionChecks = append(sessionChecks, command.CheckPassword(password.GetPassword())) } + if intent := checks.GetIntent(); intent != nil { + sessionChecks = append(sessionChecks, command.CheckIntent(intent.GetIntentId(), intent.GetToken())) + } if passkey := checks.GetPasskey(); passkey != nil { sessionChecks = append(sessionChecks, s.command.CheckPasskey(passkey.GetCredentialAssertionData())) } diff --git a/internal/api/grpc/session/v2/session_integration_test.go b/internal/api/grpc/session/v2/session_integration_test.go index 1b3e6d19e..097bba7be 100644 --- a/internal/api/grpc/session/v2/session_integration_test.go +++ b/internal/api/grpc/session/v2/session_integration_test.go @@ -10,19 +10,21 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "github.com/zitadel/zitadel/internal/integration" object "github.com/zitadel/zitadel/pkg/grpc/object/v2alpha" session "github.com/zitadel/zitadel/pkg/grpc/session/v2alpha" user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" ) var ( - CTX context.Context - Tester *integration.Tester - Client session.SessionServiceClient - User *user.AddHumanUserResponse + CTX context.Context + Tester *integration.Tester + Client session.SessionServiceClient + User *user.AddHumanUserResponse + GenericOAuthIDPID string ) func TestMain(m *testing.M) { @@ -82,6 +84,7 @@ const ( wantUserFactor wantFactor = iota wantPasswordFactor wantPasskeyFactor + wantIntentFactor ) func verifyFactors(t testing.TB, factors *session.Factors, window time.Duration, want []wantFactor) { @@ -100,6 +103,10 @@ func verifyFactors(t testing.TB, factors *session.Factors, window time.Duration, pf := factors.GetPasskey() assert.NotNil(t, pf) assert.WithinRange(t, pf.GetVerifiedAt().AsTime(), time.Now().Add(-window), time.Now().Add(window)) + case wantIntentFactor: + pf := factors.GetIntent() + assert.NotNil(t, pf) + assert.WithinRange(t, pf.GetVerifiedAt().AsTime(), time.Now().Add(-window), time.Now().Add(window)) } } } @@ -212,6 +219,108 @@ func TestServer_CreateSession_passkey(t *testing.T) { verifyCurrentSession(t, createResp.GetSessionId(), updateResp.GetSessionToken(), updateResp.GetDetails().GetSequence(), time.Minute, nil, wantUserFactor, wantPasskeyFactor) } +func TestServer_CreateSession_successfulIntent(t *testing.T) { + idpID := Tester.AddGenericOAuthProvider(t) + + createResp, err := Client.CreateSession(CTX, &session.CreateSessionRequest{ + Checks: &session.Checks{ + User: &session.CheckUser{ + Search: &session.CheckUser_UserId{ + UserId: User.GetUserId(), + }, + }, + }, + }) + require.NoError(t, err) + verifyCurrentSession(t, createResp.GetSessionId(), createResp.GetSessionToken(), createResp.GetDetails().GetSequence(), time.Minute, nil) + + intentID, token, _, _ := Tester.CreateSuccessfulIntent(t, idpID, User.GetUserId(), "id") + updateResp, err := Client.SetSession(CTX, &session.SetSessionRequest{ + SessionId: createResp.GetSessionId(), + SessionToken: createResp.GetSessionToken(), + Checks: &session.Checks{ + Intent: &session.CheckIntent{ + IntentId: intentID, + Token: token, + }, + }, + }) + require.NoError(t, err) + verifyCurrentSession(t, createResp.GetSessionId(), updateResp.GetSessionToken(), updateResp.GetDetails().GetSequence(), time.Minute, nil, wantUserFactor, wantIntentFactor) +} + +func TestServer_CreateSession_successfulIntentUnknownUserID(t *testing.T) { + idpID := Tester.AddGenericOAuthProvider(t) + + createResp, err := Client.CreateSession(CTX, &session.CreateSessionRequest{ + Checks: &session.Checks{ + User: &session.CheckUser{ + Search: &session.CheckUser_UserId{ + UserId: User.GetUserId(), + }, + }, + }, + }) + require.NoError(t, err) + verifyCurrentSession(t, createResp.GetSessionId(), createResp.GetSessionToken(), createResp.GetDetails().GetSequence(), time.Minute, nil) + + idpUserID := "id" + intentID, token, _, _ := Tester.CreateSuccessfulIntent(t, idpID, "", idpUserID) + updateResp, err := Client.SetSession(CTX, &session.SetSessionRequest{ + SessionId: createResp.GetSessionId(), + SessionToken: createResp.GetSessionToken(), + Checks: &session.Checks{ + Intent: &session.CheckIntent{ + IntentId: intentID, + Token: token, + }, + }, + }) + require.Error(t, err) + Tester.CreateUserIDPlink(CTX, User.GetUserId(), idpUserID, idpID, User.GetUserId()) + updateResp, err = Client.SetSession(CTX, &session.SetSessionRequest{ + SessionId: createResp.GetSessionId(), + SessionToken: createResp.GetSessionToken(), + Checks: &session.Checks{ + Intent: &session.CheckIntent{ + IntentId: intentID, + Token: token, + }, + }, + }) + require.NoError(t, err) + verifyCurrentSession(t, createResp.GetSessionId(), updateResp.GetSessionToken(), updateResp.GetDetails().GetSequence(), time.Minute, nil, wantUserFactor, wantIntentFactor) +} + +func TestServer_CreateSession_startedIntentFalseToken(t *testing.T) { + idpID := Tester.AddGenericOAuthProvider(t) + + createResp, err := Client.CreateSession(CTX, &session.CreateSessionRequest{ + Checks: &session.Checks{ + User: &session.CheckUser{ + Search: &session.CheckUser_UserId{ + UserId: User.GetUserId(), + }, + }, + }, + }) + require.NoError(t, err) + verifyCurrentSession(t, createResp.GetSessionId(), createResp.GetSessionToken(), createResp.GetDetails().GetSequence(), time.Minute, nil) + + intentID := Tester.CreateIntent(t, idpID) + _, err = Client.SetSession(CTX, &session.SetSessionRequest{ + SessionId: createResp.GetSessionId(), + SessionToken: createResp.GetSessionToken(), + Checks: &session.Checks{ + Intent: &session.CheckIntent{ + IntentId: intentID, + Token: "false", + }, + }, + }) + require.Error(t, err) +} + func TestServer_SetSession_flow(t *testing.T) { var wantFactors []wantFactor diff --git a/internal/api/grpc/user/v2/user.go b/internal/api/grpc/user/v2/user.go index 9969648c1..9e28b5029 100644 --- a/internal/api/grpc/user/v2/user.go +++ b/internal/api/grpc/user/v2/user.go @@ -2,7 +2,6 @@ package user import ( "context" - "encoding/base64" "io" "golang.org/x/text/language" @@ -205,21 +204,7 @@ func intentToIDPInformationPb(intent *command.IDPIntentWriteModel, alg crypto.En } func (s *Server) checkIntentToken(token string, intentID string) error { - if token == "" { - return errors.ThrowPermissionDenied(nil, "IDP-Sfefs", "Errors.Intent.InvalidToken") - } - data, err := base64.RawURLEncoding.DecodeString(token) - if err != nil { - return errors.ThrowPermissionDenied(err, "IDP-Swg31", "Errors.Intent.InvalidToken") - } - decryptedToken, err := s.idpAlg.Decrypt(data, s.idpAlg.EncryptionKeyID()) - if err != nil { - return errors.ThrowPermissionDenied(err, "IDP-Sf4gt", "Errors.Intent.InvalidToken") - } - if string(decryptedToken) != intentID { - return errors.ThrowPermissionDenied(nil, "IDP-dkje3", "Errors.Intent.InvalidToken") - } - return nil + return crypto.CheckToken(s.idpAlg, token, intentID) } func (s *Server) ListAuthenticationMethodTypes(ctx context.Context, req *user.ListAuthenticationMethodTypesRequest) (*user.ListAuthenticationMethodTypesResponse, error) { diff --git a/internal/api/grpc/user/v2/user_integration_test.go b/internal/api/grpc/user/v2/user_integration_test.go index c30057524..40efe6195 100644 --- a/internal/api/grpc/user/v2/user_integration_test.go +++ b/internal/api/grpc/user/v2/user_integration_test.go @@ -13,17 +13,11 @@ import ( "github.com/muhlemmer/gu" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/zitadel/oidc/v2/pkg/oidc" - "golang.org/x/oauth2" "google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/timestamppb" - "github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/api/grpc" - "github.com/zitadel/zitadel/internal/command" - openid "github.com/zitadel/zitadel/internal/idp/providers/oidc" "github.com/zitadel/zitadel/internal/integration" - "github.com/zitadel/zitadel/internal/repository/idp" mgmt "github.com/zitadel/zitadel/pkg/grpc/management" object "github.com/zitadel/zitadel/pkg/grpc/object/v2alpha" user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha" @@ -50,63 +44,8 @@ func TestMain(m *testing.M) { }()) } -func createProvider(t *testing.T) string { - ctx := authz.WithInstance(context.Background(), Tester.Instance) - id, _, err := Tester.Commands.AddOrgGenericOAuthProvider(ctx, Tester.Organisation.ID, command.GenericOAuthProvider{ - "idp", - "clientID", - "clientSecret", - "https://example.com/oauth/v2/authorize", - "https://example.com/oauth/v2/token", - "https://api.example.com/user", - []string{"openid", "profile", "email"}, - "id", - idp.Options{ - IsLinkingAllowed: true, - IsCreationAllowed: true, - IsAutoCreation: true, - IsAutoUpdate: true, - }, - }) - require.NoError(t, err) - return id -} - -func createIntent(t *testing.T, idpID string) string { - ctx := authz.WithInstance(context.Background(), Tester.Instance) - id, _, err := Tester.Commands.CreateIntent(ctx, idpID, "https://example.com/success", "https://example.com/failure", Tester.Organisation.ID) - require.NoError(t, err) - return id -} - -func createSuccessfulIntent(t *testing.T, idpID string) (string, string, time.Time, uint64) { - ctx := authz.WithInstance(context.Background(), Tester.Instance) - intentID := createIntent(t, idpID) - writeModel, err := Tester.Commands.GetIntentWriteModel(ctx, intentID, Tester.Organisation.ID) - require.NoError(t, err) - idpUser := openid.NewUser( - &oidc.UserInfo{ - Subject: "id", - UserInfoProfile: oidc.UserInfoProfile{ - PreferredUsername: "username", - }, - }, - ) - idpSession := &openid.Session{ - Tokens: &oidc.Tokens[*oidc.IDTokenClaims]{ - Token: &oauth2.Token{ - AccessToken: "accessToken", - }, - IDToken: "idToken", - }, - } - token, err := Tester.Commands.SucceedIDPIntent(ctx, writeModel, idpUser, idpSession, "") - require.NoError(t, err) - return intentID, token, writeModel.ChangeDate, writeModel.ProcessedSequence -} - func TestServer_AddHumanUser(t *testing.T) { - idpID := createProvider(t) + idpID := Tester.AddGenericOAuthProvider(t) type args struct { ctx context.Context req *user.AddHumanUserRequest @@ -483,7 +422,7 @@ func TestServer_AddHumanUser(t *testing.T) { } func TestServer_AddIDPLink(t *testing.T) { - idpID := createProvider(t) + idpID := Tester.AddGenericOAuthProvider(t) type args struct { ctx context.Context req *user.AddIDPLinkRequest @@ -563,7 +502,7 @@ func TestServer_AddIDPLink(t *testing.T) { } func TestServer_StartIdentityProviderFlow(t *testing.T) { - idpID := createProvider(t) + idpID := Tester.AddGenericOAuthProvider(t) type args struct { ctx context.Context req *user.StartIdentityProviderFlowRequest @@ -627,9 +566,9 @@ func TestServer_StartIdentityProviderFlow(t *testing.T) { } func TestServer_RetrieveIdentityProviderInformation(t *testing.T) { - idpID := createProvider(t) - intentID := createIntent(t, idpID) - successfulID, token, changeDate, sequence := createSuccessfulIntent(t, idpID) + idpID := Tester.AddGenericOAuthProvider(t) + intentID := Tester.CreateIntent(t, idpID) + successfulID, token, changeDate, sequence := Tester.CreateSuccessfulIntent(t, idpID, "", "id") type args struct { ctx context.Context req *user.RetrieveIdentityProviderInformationRequest diff --git a/internal/command/idp_intent.go b/internal/command/idp_intent.go index a6d64dd78..99db0323b 100644 --- a/internal/command/idp_intent.go +++ b/internal/command/idp_intent.go @@ -119,7 +119,7 @@ func (c *Commands) SucceedIDPIntent(ctx context.Context, writeModel *IDPIntentWr if err != nil { return "", err } - cmd, err := idpintent.NewSucceededEvent( + cmd := idpintent.NewSucceededEvent( ctx, &idpintent.NewAggregate(writeModel.AggregateID, writeModel.ResourceOwner).Aggregate, idpInfo, @@ -129,9 +129,6 @@ func (c *Commands) SucceedIDPIntent(ctx context.Context, writeModel *IDPIntentWr accessToken, idToken, ) - if err != nil { - return "", err - } err = c.pushAppendAndReduce(ctx, writeModel, cmd) if err != nil { return "", err diff --git a/internal/command/idp_intent_test.go b/internal/command/idp_intent_test.go index 3eb64cb59..08948a200 100644 --- a/internal/command/idp_intent_test.go +++ b/internal/command/idp_intent_test.go @@ -435,24 +435,21 @@ func TestCommands_SucceedIDPIntent(t *testing.T) { eventstore: eventstoreExpect(t, expectPush( eventPusherToEvents( - func() eventstore.Command { - event, _ := idpintent.NewSucceededEvent( - context.Background(), - &idpintent.NewAggregate("id", "ro").Aggregate, - []byte(`{"sub":"id","preferred_username":"username"}`), - "id", - "username", - "", - &crypto.CryptoValue{ - CryptoType: crypto.TypeEncryption, - Algorithm: "enc", - KeyID: "id", - Crypted: []byte("accessToken"), - }, - "idToken", - ) - return event - }(), + idpintent.NewSucceededEvent( + context.Background(), + &idpintent.NewAggregate("id", "ro").Aggregate, + []byte(`{"sub":"id","preferred_username":"username"}`), + "id", + "username", + "", + &crypto.CryptoValue{ + CryptoType: crypto.TypeEncryption, + Algorithm: "enc", + KeyID: "id", + Crypted: []byte("accessToken"), + }, + "idToken", + ), ), ), ), diff --git a/internal/command/session.go b/internal/command/session.go index 2feac20e0..71e9a6982 100644 --- a/internal/command/session.go +++ b/internal/command/session.go @@ -23,8 +23,10 @@ type SessionCommands struct { sessionWriteModel *SessionWriteModel passwordWriteModel *HumanPasswordWriteModel + intentWriteModel *IDPIntentWriteModel eventstore *eventstore.Eventstore userPasswordAlg crypto.HashAlgorithm + intentAlg crypto.EncryptionAlgorithm createToken func(sessionID string) (id string, token string, err error) now func() time.Time } @@ -35,6 +37,7 @@ func (c *Commands) NewSessionCommands(cmds []SessionCommand, session *SessionWri sessionWriteModel: session, eventstore: c.eventstore, userPasswordAlg: c.userPasswordAlg, + intentAlg: c.idpConfigEncryption, createToken: c.sessionTokenCreator, now: time.Now, } @@ -80,6 +83,42 @@ func CheckPassword(password string) SessionCommand { } } +// CheckIntent defines a check for a succeeded intent to be executed for a session update +func CheckIntent(intentID, token string) SessionCommand { + return func(ctx context.Context, cmd *SessionCommands) error { + if cmd.sessionWriteModel.UserID == "" { + return caos_errs.ThrowPreconditionFailed(nil, "COMMAND-Sfw3r", "Errors.User.UserIDMissing") + } + if err := crypto.CheckToken(cmd.intentAlg, token, intentID); err != nil { + return err + } + cmd.intentWriteModel = NewIDPIntentWriteModel(intentID, "") + err := cmd.eventstore.FilterToQueryReducer(ctx, cmd.intentWriteModel) + if err != nil { + return err + } + if cmd.intentWriteModel.State != domain.IDPIntentStateSucceeded { + return caos_errs.ThrowPreconditionFailed(nil, "COMMAND-Df4bw", "Errors.Intent.NotSucceeded") + } + if cmd.intentWriteModel.UserID != "" { + if cmd.intentWriteModel.UserID != cmd.sessionWriteModel.UserID { + return caos_errs.ThrowPreconditionFailed(nil, "COMMAND-O8xk3w", "Errors.Intent.OtherUser") + } + } else { + linkWriteModel := NewUserIDPLinkWriteModel(cmd.sessionWriteModel.UserID, cmd.intentWriteModel.IDPID, cmd.intentWriteModel.IDPUserID, cmd.intentWriteModel.ResourceOwner) + err := cmd.eventstore.FilterToQueryReducer(ctx, linkWriteModel) + if err != nil { + return err + } + if linkWriteModel.State != domain.UserIDPLinkStateActive { + return caos_errs.ThrowPreconditionFailed(nil, "COMMAND-O8xk3w", "Errors.Intent.OtherUser") + } + } + cmd.sessionWriteModel.IntentChecked(ctx, cmd.now()) + return nil + } +} + // Exec will execute the commands specified and returns an error on the first occurrence func (s *SessionCommands) Exec(ctx context.Context) error { for _, cmd := range s.cmds { diff --git a/internal/command/session_model.go b/internal/command/session_model.go index 24edbfd2e..99fd9f36e 100644 --- a/internal/command/session_model.go +++ b/internal/command/session_model.go @@ -38,6 +38,7 @@ type SessionWriteModel struct { UserID string UserCheckedAt time.Time PasswordCheckedAt time.Time + IntentCheckedAt time.Time PasskeyCheckedAt time.Time Metadata map[string][]byte State domain.SessionState @@ -68,6 +69,8 @@ func (wm *SessionWriteModel) Reduce() error { wm.reduceUserChecked(e) case *session.PasswordCheckedEvent: wm.reducePasswordChecked(e) + case *session.IntentCheckedEvent: + wm.reduceIntentChecked(e) case *session.PasskeyChallengedEvent: wm.reducePasskeyChallenged(e) case *session.PasskeyCheckedEvent: @@ -90,6 +93,7 @@ func (wm *SessionWriteModel) Query() *eventstore.SearchQueryBuilder { session.AddedType, session.UserCheckedType, session.PasswordCheckedType, + session.IntentCheckedType, session.PasskeyChallengedType, session.PasskeyCheckedType, session.TokenSetType, @@ -117,6 +121,10 @@ func (wm *SessionWriteModel) reducePasswordChecked(e *session.PasswordCheckedEve wm.PasswordCheckedAt = e.CheckedAt } +func (wm *SessionWriteModel) reduceIntentChecked(e *session.IntentCheckedEvent) { + wm.IntentCheckedAt = e.CheckedAt +} + func (wm *SessionWriteModel) reducePasskeyChallenged(e *session.PasskeyChallengedEvent) { wm.PasskeyChallenge = &PasskeyChallengeModel{ Challenge: e.Challenge, @@ -153,6 +161,10 @@ func (wm *SessionWriteModel) PasswordChecked(ctx context.Context, checkedAt time wm.commands = append(wm.commands, session.NewPasswordCheckedEvent(ctx, wm.aggregate, checkedAt)) } +func (wm *SessionWriteModel) IntentChecked(ctx context.Context, checkedAt time.Time) { + wm.commands = append(wm.commands, session.NewIntentCheckedEvent(ctx, wm.aggregate, checkedAt)) +} + func (wm *SessionWriteModel) PasskeyChallenged(ctx context.Context, challenge string, allowedCrentialIDs [][]byte, userVerification domain.UserVerificationRequirement) { wm.commands = append(wm.commands, session.NewPasskeyChallengedEvent(ctx, wm.aggregate, challenge, allowedCrentialIDs, userVerification)) } diff --git a/internal/command/session_test.go b/internal/command/session_test.go index b9e24b03e..f9287a772 100644 --- a/internal/command/session_test.go +++ b/internal/command/session_test.go @@ -18,6 +18,7 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/id" "github.com/zitadel/zitadel/internal/id/mock" + "github.com/zitadel/zitadel/internal/repository/idpintent" "github.com/zitadel/zitadel/internal/repository/session" "github.com/zitadel/zitadel/internal/repository/user" ) @@ -341,6 +342,19 @@ func TestCommands_UpdateSession(t *testing.T) { } func TestCommands_updateSession(t *testing.T) { + decryption := func(err error) crypto.EncryptionAlgorithm { + mCrypto := crypto.NewMockEncryptionAlgorithm(gomock.NewController(t)) + mCrypto.EXPECT().EncryptionKeyID().Return("id") + mCrypto.EXPECT().DecryptString(gomock.Any(), gomock.Any()).DoAndReturn( + func(code []byte, keyID string) (string, error) { + if err != nil { + return "", err + } + return string(code), nil + }) + return mCrypto + } + testNow := time.Now() type fields struct { eventstore *eventstore.Eventstore @@ -484,6 +498,194 @@ func TestCommands_updateSession(t *testing.T) { }, }, }, + { + "set user, intent not successful", + fields{ + eventstore: eventstoreExpect(t), + }, + args{ + ctx: context.Background(), + checks: &SessionCommands{ + sessionWriteModel: NewSessionWriteModel("sessionID", "org1"), + cmds: []SessionCommand{ + CheckUser("userID"), + CheckIntent("intent", "aW50ZW50"), + }, + eventstore: eventstoreExpect(t, + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + "username", "", "", "", "", language.English, domain.GenderUnspecified, "", false), + ), + ), + ), + createToken: func(sessionID string) (string, string, error) { + return "tokenID", + "token", + nil + }, + intentAlg: decryption(nil), + now: func() time.Time { + return testNow + }, + }, + metadata: map[string][]byte{ + "key": []byte("value"), + }, + }, + res{ + err: caos_errs.ThrowPreconditionFailed(nil, "COMMAND-Df4bw", "Errors.Intent.NotSucceeded"), + }, + }, + { + "set user, intent not for user", + fields{ + eventstore: eventstoreExpect(t), + }, + args{ + ctx: context.Background(), + checks: &SessionCommands{ + sessionWriteModel: NewSessionWriteModel("sessionID", "org1"), + cmds: []SessionCommand{ + CheckUser("userID"), + CheckIntent("intent", "aW50ZW50"), + }, + eventstore: eventstoreExpect(t, + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + "username", "", "", "", "", language.English, domain.GenderUnspecified, "", false), + ), + eventFromEventPusher( + idpintent.NewSucceededEvent(context.Background(), &idpintent.NewAggregate("intent", "org1").Aggregate, + nil, + "idpUserID", + "idpUserName", + "userID2", + nil, + "", + ), + ), + ), + ), + createToken: func(sessionID string) (string, string, error) { + return "tokenID", + "token", + nil + }, + intentAlg: decryption(nil), + now: func() time.Time { + return testNow + }, + }, + metadata: map[string][]byte{ + "key": []byte("value"), + }, + }, + res{ + err: caos_errs.ThrowPreconditionFailed(nil, "COMMAND-O8xk3w", "Errors.Intent.OtherUser"), + }, + }, + { + "set user, intent incorrect token", + fields{ + eventstore: eventstoreExpect(t), + }, + args{ + ctx: context.Background(), + checks: &SessionCommands{ + sessionWriteModel: NewSessionWriteModel("sessionID", "org1"), + cmds: []SessionCommand{ + CheckUser("userID"), + CheckIntent("intent2", "aW50ZW50"), + }, + eventstore: eventstoreExpect(t), + createToken: func(sessionID string) (string, string, error) { + return "tokenID", + "token", + nil + }, + intentAlg: decryption(nil), + now: func() time.Time { + return testNow + }, + }, + metadata: map[string][]byte{ + "key": []byte("value"), + }, + }, + res{ + err: caos_errs.ThrowPermissionDenied(nil, "CRYPTO-CRYPTO", "Errors.Intent.InvalidToken"), + }, + }, + { + "set user, intent, metadata and token", + fields{ + eventstore: eventstoreExpect(t, + expectPush( + eventPusherToEvents( + session.NewUserCheckedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, + "userID", testNow), + session.NewIntentCheckedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, + testNow), + session.NewMetadataSetEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, + map[string][]byte{"key": []byte("value")}), + session.NewTokenSetEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, + "tokenID"), + ), + ), + ), + }, + args{ + ctx: context.Background(), + checks: &SessionCommands{ + sessionWriteModel: NewSessionWriteModel("sessionID", "org1"), + cmds: []SessionCommand{ + CheckUser("userID"), + CheckIntent("intent", "aW50ZW50"), + }, + eventstore: eventstoreExpect(t, + expectFilter( + eventFromEventPusher( + user.NewHumanAddedEvent(context.Background(), &user.NewAggregate("userID", "org1").Aggregate, + "username", "", "", "", "", language.English, domain.GenderUnspecified, "", false), + ), + eventFromEventPusher( + idpintent.NewSucceededEvent(context.Background(), &idpintent.NewAggregate("intent", "org1").Aggregate, + nil, + "idpUserID", + "idpUsername", + "userID", + nil, + "", + ), + ), + ), + ), + createToken: func(sessionID string) (string, string, error) { + return "tokenID", + "token", + nil + }, + intentAlg: decryption(nil), + now: func() time.Time { + return testNow + }, + }, + metadata: map[string][]byte{ + "key": []byte("value"), + }, + }, + res{ + want: &SessionChanged{ + ObjectDetails: &domain.ObjectDetails{ + ResourceOwner: "org1", + }, + ID: "sessionID", + NewToken: "token", + }, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/crypto/crypto.go b/internal/crypto/crypto.go index 9799faea6..748a124b5 100644 --- a/internal/crypto/crypto.go +++ b/internal/crypto/crypto.go @@ -2,6 +2,7 @@ package crypto import ( "database/sql/driver" + "encoding/base64" "encoding/json" "github.com/zitadel/zitadel/internal/errors" @@ -132,3 +133,21 @@ func FillHash(value []byte, alg HashAlgorithm) *CryptoValue { Crypted: value, } } + +func CheckToken(alg EncryptionAlgorithm, token string, content string) error { + if token == "" { + return errors.ThrowPermissionDenied(nil, "CRYPTO-Sfefs", "Errors.Intent.InvalidToken") + } + data, err := base64.RawURLEncoding.DecodeString(token) + if err != nil { + return errors.ThrowPermissionDenied(err, "CRYPTO-Swg31", "Errors.Intent.InvalidToken") + } + decryptedToken, err := alg.DecryptString(data, alg.EncryptionKeyID()) + if err != nil { + return errors.ThrowPermissionDenied(err, "CRYPTO-Sf4gt", "Errors.Intent.InvalidToken") + } + if decryptedToken != content { + return errors.ThrowPermissionDenied(nil, "CRYPTO-CRYPTO", "Errors.Intent.InvalidToken") + } + return nil +} diff --git a/internal/integration/client.go b/internal/integration/client.go index 8f64936e0..f66db5b2a 100644 --- a/internal/integration/client.go +++ b/internal/integration/client.go @@ -3,11 +3,19 @@ package integration import ( "context" "fmt" + "testing" "time" + "github.com/stretchr/testify/require" "github.com/zitadel/logging" + "github.com/zitadel/oidc/v2/pkg/oidc" + "golang.org/x/oauth2" "google.golang.org/grpc" + "github.com/zitadel/zitadel/internal/api/authz" + "github.com/zitadel/zitadel/internal/command" + openid "github.com/zitadel/zitadel/internal/idp/providers/oidc" + "github.com/zitadel/zitadel/internal/repository/idp" "github.com/zitadel/zitadel/pkg/grpc/admin" mgmt "github.com/zitadel/zitadel/pkg/grpc/management" object "github.com/zitadel/zitadel/pkg/grpc/object/v2alpha" @@ -55,6 +63,22 @@ func (s *Tester) CreateHumanUser(ctx context.Context) *user.AddHumanUserResponse return resp } +func (s *Tester) CreateUserIDPlink(ctx context.Context, userID, externalID, idpID, username string) *user.AddIDPLinkResponse { + resp, err := s.Client.UserV2.AddIDPLink( + ctx, + &user.AddIDPLinkRequest{ + UserId: userID, + IdpLink: &user.IDPLink{ + IdpId: idpID, + UserId: externalID, + UserName: username, + }, + }, + ) + logging.OnError(err).Fatal("create human user link") + return resp +} + func (s *Tester) RegisterUserPasskey(ctx context.Context, userID string) { reg, err := s.Client.UserV2.CreatePasskeyRegistrationLink(ctx, &user.CreatePasskeyRegistrationLinkRequest{ UserId: userID, @@ -78,3 +102,58 @@ func (s *Tester) RegisterUserPasskey(ctx context.Context, userID string) { }) logging.OnError(err).Fatal("create user passkey") } + +func (s *Tester) AddGenericOAuthProvider(t *testing.T) string { + ctx := authz.WithInstance(context.Background(), s.Instance) + id, _, err := s.Commands.AddOrgGenericOAuthProvider(ctx, s.Organisation.ID, command.GenericOAuthProvider{ + Name: "idp", + ClientID: "clientID", + ClientSecret: "clientSecret", + AuthorizationEndpoint: "https://example.com/oauth/v2/authorize", + TokenEndpoint: "https://example.com/oauth/v2/token", + UserEndpoint: "https://api.example.com/user", + Scopes: []string{"openid", "profile", "email"}, + IDAttribute: "id", + IDPOptions: idp.Options{ + IsLinkingAllowed: true, + IsCreationAllowed: true, + IsAutoCreation: true, + IsAutoUpdate: true, + }, + }) + require.NoError(t, err) + return id +} + +func (s *Tester) CreateIntent(t *testing.T, idpID string) string { + ctx := authz.WithInstance(context.Background(), s.Instance) + id, _, err := s.Commands.CreateIntent(ctx, idpID, "https://example.com/success", "https://example.com/failure", s.Organisation.ID) + require.NoError(t, err) + return id +} + +func (s *Tester) CreateSuccessfulIntent(t *testing.T, idpID, userID, idpUserID string) (string, string, time.Time, uint64) { + ctx := authz.WithInstance(context.Background(), s.Instance) + intentID := s.CreateIntent(t, idpID) + writeModel, err := s.Commands.GetIntentWriteModel(ctx, intentID, s.Organisation.ID) + require.NoError(t, err) + idpUser := openid.NewUser( + &oidc.UserInfo{ + Subject: idpUserID, + UserInfoProfile: oidc.UserInfoProfile{ + PreferredUsername: "username", + }, + }, + ) + idpSession := &openid.Session{ + Tokens: &oidc.Tokens[*oidc.IDTokenClaims]{ + Token: &oauth2.Token{ + AccessToken: "accessToken", + }, + IDToken: "idToken", + }, + } + token, err := s.Commands.SucceedIDPIntent(ctx, writeModel, idpUser, idpSession, userID) + require.NoError(t, err) + return intentID, token, writeModel.ChangeDate, writeModel.ProcessedSequence +} diff --git a/internal/query/projection/session.go b/internal/query/projection/session.go index a0f65a70a..dc31fd37a 100644 --- a/internal/query/projection/session.go +++ b/internal/query/projection/session.go @@ -14,7 +14,7 @@ import ( ) const ( - SessionsProjectionTable = "projections.sessions1" + SessionsProjectionTable = "projections.sessions2" SessionColumnID = "id" SessionColumnCreationDate = "creation_date" @@ -27,6 +27,7 @@ const ( SessionColumnUserID = "user_id" SessionColumnUserCheckedAt = "user_checked_at" SessionColumnPasswordCheckedAt = "password_checked_at" + SessionColumnIntentCheckedAt = "intent_checked_at" SessionColumnPasskeyCheckedAt = "passkey_checked_at" SessionColumnMetadata = "metadata" SessionColumnTokenID = "token_id" @@ -53,6 +54,7 @@ func newSessionProjection(ctx context.Context, config crdb.StatementHandlerConfi crdb.NewColumn(SessionColumnUserID, crdb.ColumnTypeText, crdb.Nullable()), crdb.NewColumn(SessionColumnUserCheckedAt, crdb.ColumnTypeTimestamp, crdb.Nullable()), crdb.NewColumn(SessionColumnPasswordCheckedAt, crdb.ColumnTypeTimestamp, crdb.Nullable()), + crdb.NewColumn(SessionColumnIntentCheckedAt, crdb.ColumnTypeTimestamp, crdb.Nullable()), crdb.NewColumn(SessionColumnPasskeyCheckedAt, crdb.ColumnTypeTimestamp, crdb.Nullable()), crdb.NewColumn(SessionColumnMetadata, crdb.ColumnTypeJSONB, crdb.Nullable()), crdb.NewColumn(SessionColumnTokenID, crdb.ColumnTypeText, crdb.Nullable()), @@ -81,6 +83,10 @@ func (p *sessionProjection) reducers() []handler.AggregateReducer { Event: session.PasswordCheckedType, Reduce: p.reducePasswordChecked, }, + { + Event: session.IntentCheckedType, + Reduce: p.reduceIntentChecked, + }, { Event: session.PasskeyCheckedType, Reduce: p.reducePasskeyChecked, @@ -181,6 +187,26 @@ func (p *sessionProjection) reducePasswordChecked(event eventstore.Event) (*hand ), nil } +func (p *sessionProjection) reduceIntentChecked(event eventstore.Event) (*handler.Statement, error) { + e, ok := event.(*session.IntentCheckedEvent) + if !ok { + return nil, errors.ThrowInvalidArgumentf(nil, "HANDL-SDgr2", "reduce.wrong.event.type %s", session.IntentCheckedType) + } + + return crdb.NewUpdateStatement( + e, + []handler.Column{ + handler.NewCol(SessionColumnChangeDate, e.CreationDate()), + handler.NewCol(SessionColumnSequence, e.Sequence()), + handler.NewCol(SessionColumnIntentCheckedAt, e.CheckedAt), + }, + []handler.Condition{ + handler.NewCond(SessionColumnID, e.Aggregate().ID), + handler.NewCond(SessionColumnInstanceID, e.Aggregate().InstanceID), + }, + ), nil +} + func (p *sessionProjection) reducePasskeyChecked(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*session.PasskeyCheckedEvent) if !ok { diff --git a/internal/query/projection/session_test.go b/internal/query/projection/session_test.go index 2e4a7b645..976eab8b7 100644 --- a/internal/query/projection/session_test.go +++ b/internal/query/projection/session_test.go @@ -41,7 +41,7 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "INSERT INTO projections.sessions1 (id, instance_id, creation_date, change_date, resource_owner, state, sequence, creator) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)", + expectedStmt: "INSERT INTO projections.sessions2 (id, instance_id, creation_date, change_date, resource_owner, state, sequence, creator) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -77,7 +77,7 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.sessions1 SET (change_date, sequence, user_id, user_checked_at) = ($1, $2, $3, $4) WHERE (id = $5) AND (instance_id = $6)", + expectedStmt: "UPDATE projections.sessions2 SET (change_date, sequence, user_id, user_checked_at) = ($1, $2, $3, $4) WHERE (id = $5) AND (instance_id = $6)", expectedArgs: []interface{}{ anyArg{}, anyArg{}, @@ -110,7 +110,39 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.sessions1 SET (change_date, sequence, password_checked_at) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", + expectedStmt: "UPDATE projections.sessions2 SET (change_date, sequence, password_checked_at) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", + expectedArgs: []interface{}{ + anyArg{}, + anyArg{}, + time.Date(2023, time.May, 4, 0, 0, 0, 0, time.UTC), + "agg-id", + "instance-id", + }, + }, + }, + }, + }, + }, + { + name: "instance reduceIntentChecked", + args: args{ + event: getEvent(testEvent( + session.AddedType, + session.AggregateType, + []byte(`{ + "checkedAt": "2023-05-04T00:00:00Z" + }`), + ), session.IntentCheckedEventMapper), + }, + reduce: (&sessionProjection{}).reduceIntentChecked, + want: wantReduce{ + aggregateType: eventstore.AggregateType("session"), + sequence: 15, + previousSequence: 10, + executer: &testExecuter{ + executions: []execution{ + { + expectedStmt: "UPDATE projections.sessions2 SET (change_date, sequence, intent_checked_at) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", expectedArgs: []interface{}{ anyArg{}, anyArg{}, @@ -142,7 +174,7 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.sessions1 SET (change_date, sequence, token_id) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", + expectedStmt: "UPDATE projections.sessions2 SET (change_date, sequence, token_id) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", expectedArgs: []interface{}{ anyArg{}, anyArg{}, @@ -176,7 +208,7 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.sessions1 SET (change_date, sequence, metadata) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", + expectedStmt: "UPDATE projections.sessions2 SET (change_date, sequence, metadata) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", expectedArgs: []interface{}{ anyArg{}, anyArg{}, @@ -208,7 +240,7 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "DELETE FROM projections.sessions1 WHERE (id = $1) AND (instance_id = $2)", + expectedStmt: "DELETE FROM projections.sessions2 WHERE (id = $1) AND (instance_id = $2)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -235,7 +267,7 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "DELETE FROM projections.sessions1 WHERE (instance_id = $1)", + expectedStmt: "DELETE FROM projections.sessions2 WHERE (instance_id = $1)", expectedArgs: []interface{}{ "agg-id", }, @@ -266,7 +298,7 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.sessions1 SET password_checked_at = $1 WHERE (user_id = $2) AND (password_checked_at < $3)", + expectedStmt: "UPDATE projections.sessions2 SET password_checked_at = $1 WHERE (user_id = $2) AND (password_checked_at < $3)", expectedArgs: []interface{}{ nil, "agg-id", diff --git a/internal/query/session.go b/internal/query/session.go index 2dfc622a7..427fc90f2 100644 --- a/internal/query/session.go +++ b/internal/query/session.go @@ -32,6 +32,7 @@ type Session struct { Creator string UserFactor SessionUserFactor PasswordFactor SessionPasswordFactor + IntentFactor SessionIntentFactor PasskeyFactor SessionPasskeyFactor Metadata map[string][]byte } @@ -47,6 +48,10 @@ type SessionPasswordFactor struct { PasswordCheckedAt time.Time } +type SessionIntentFactor struct { + IntentCheckedAt time.Time +} + type SessionPasskeyFactor struct { PasskeyCheckedAt time.Time } @@ -113,6 +118,10 @@ var ( name: projection.SessionColumnPasswordCheckedAt, table: sessionsTable, } + SessionColumnIntentCheckedAt = Column{ + name: projection.SessionColumnIntentCheckedAt, + table: sessionsTable, + } SessionColumnPasskeyCheckedAt = Column{ name: projection.SessionColumnPasskeyCheckedAt, table: sessionsTable, @@ -207,6 +216,7 @@ func prepareSessionQuery(ctx context.Context, db prepareDatabase) (sq.SelectBuil LoginNameNameCol.identifier(), HumanDisplayNameCol.identifier(), SessionColumnPasswordCheckedAt.identifier(), + SessionColumnIntentCheckedAt.identifier(), SessionColumnPasskeyCheckedAt.identifier(), SessionColumnMetadata.identifier(), SessionColumnToken.identifier(), @@ -222,6 +232,7 @@ func prepareSessionQuery(ctx context.Context, db prepareDatabase) (sq.SelectBuil loginName sql.NullString displayName sql.NullString passwordCheckedAt sql.NullTime + intentCheckedAt sql.NullTime passkeyCheckedAt sql.NullTime metadata database.Map[[]byte] token sql.NullString @@ -240,6 +251,7 @@ func prepareSessionQuery(ctx context.Context, db prepareDatabase) (sq.SelectBuil &loginName, &displayName, &passwordCheckedAt, + &intentCheckedAt, &passkeyCheckedAt, &metadata, &token, @@ -257,6 +269,7 @@ func prepareSessionQuery(ctx context.Context, db prepareDatabase) (sq.SelectBuil session.UserFactor.LoginName = loginName.String session.UserFactor.DisplayName = displayName.String session.PasswordFactor.PasswordCheckedAt = passwordCheckedAt.Time + session.IntentFactor.IntentCheckedAt = intentCheckedAt.Time session.PasskeyFactor.PasskeyCheckedAt = passkeyCheckedAt.Time session.Metadata = metadata @@ -278,6 +291,7 @@ func prepareSessionsQuery(ctx context.Context, db prepareDatabase) (sq.SelectBui LoginNameNameCol.identifier(), HumanDisplayNameCol.identifier(), SessionColumnPasswordCheckedAt.identifier(), + SessionColumnIntentCheckedAt.identifier(), SessionColumnPasskeyCheckedAt.identifier(), SessionColumnMetadata.identifier(), countColumn.identifier(), @@ -296,6 +310,7 @@ func prepareSessionsQuery(ctx context.Context, db prepareDatabase) (sq.SelectBui loginName sql.NullString displayName sql.NullString passwordCheckedAt sql.NullTime + intentCheckedAt sql.NullTime passkeyCheckedAt sql.NullTime metadata database.Map[[]byte] ) @@ -313,6 +328,7 @@ func prepareSessionsQuery(ctx context.Context, db prepareDatabase) (sq.SelectBui &loginName, &displayName, &passwordCheckedAt, + &intentCheckedAt, &passkeyCheckedAt, &metadata, &sessions.Count, @@ -326,6 +342,7 @@ func prepareSessionsQuery(ctx context.Context, db prepareDatabase) (sq.SelectBui session.UserFactor.LoginName = loginName.String session.UserFactor.DisplayName = displayName.String session.PasswordFactor.PasswordCheckedAt = passwordCheckedAt.Time + session.IntentFactor.IntentCheckedAt = intentCheckedAt.Time session.PasskeyFactor.PasskeyCheckedAt = passkeyCheckedAt.Time session.Metadata = metadata diff --git a/internal/query/sessions_test.go b/internal/query/sessions_test.go index 03a5b2197..84990e2e1 100644 --- a/internal/query/sessions_test.go +++ b/internal/query/sessions_test.go @@ -17,43 +17,45 @@ import ( ) var ( - expectedSessionQuery = regexp.QuoteMeta(`SELECT projections.sessions1.id,` + - ` projections.sessions1.creation_date,` + - ` projections.sessions1.change_date,` + - ` projections.sessions1.sequence,` + - ` projections.sessions1.state,` + - ` projections.sessions1.resource_owner,` + - ` projections.sessions1.creator,` + - ` projections.sessions1.user_id,` + - ` projections.sessions1.user_checked_at,` + + expectedSessionQuery = regexp.QuoteMeta(`SELECT projections.sessions2.id,` + + ` projections.sessions2.creation_date,` + + ` projections.sessions2.change_date,` + + ` projections.sessions2.sequence,` + + ` projections.sessions2.state,` + + ` projections.sessions2.resource_owner,` + + ` projections.sessions2.creator,` + + ` projections.sessions2.user_id,` + + ` projections.sessions2.user_checked_at,` + ` projections.login_names2.login_name,` + ` projections.users8_humans.display_name,` + - ` projections.sessions1.password_checked_at,` + - ` projections.sessions1.passkey_checked_at,` + - ` projections.sessions1.metadata,` + - ` projections.sessions1.token_id` + - ` FROM projections.sessions1` + - ` LEFT JOIN projections.login_names2 ON projections.sessions1.user_id = projections.login_names2.user_id AND projections.sessions1.instance_id = projections.login_names2.instance_id` + - ` LEFT JOIN projections.users8_humans ON projections.sessions1.user_id = projections.users8_humans.user_id AND projections.sessions1.instance_id = projections.users8_humans.instance_id` + + ` projections.sessions2.password_checked_at,` + + ` projections.sessions2.intent_checked_at,` + + ` projections.sessions2.passkey_checked_at,` + + ` projections.sessions2.metadata,` + + ` projections.sessions2.token_id` + + ` FROM projections.sessions2` + + ` LEFT JOIN projections.login_names2 ON projections.sessions2.user_id = projections.login_names2.user_id AND projections.sessions2.instance_id = projections.login_names2.instance_id` + + ` LEFT JOIN projections.users8_humans ON projections.sessions2.user_id = projections.users8_humans.user_id AND projections.sessions2.instance_id = projections.users8_humans.instance_id` + ` AS OF SYSTEM TIME '-1 ms'`) - expectedSessionsQuery = regexp.QuoteMeta(`SELECT projections.sessions1.id,` + - ` projections.sessions1.creation_date,` + - ` projections.sessions1.change_date,` + - ` projections.sessions1.sequence,` + - ` projections.sessions1.state,` + - ` projections.sessions1.resource_owner,` + - ` projections.sessions1.creator,` + - ` projections.sessions1.user_id,` + - ` projections.sessions1.user_checked_at,` + + expectedSessionsQuery = regexp.QuoteMeta(`SELECT projections.sessions2.id,` + + ` projections.sessions2.creation_date,` + + ` projections.sessions2.change_date,` + + ` projections.sessions2.sequence,` + + ` projections.sessions2.state,` + + ` projections.sessions2.resource_owner,` + + ` projections.sessions2.creator,` + + ` projections.sessions2.user_id,` + + ` projections.sessions2.user_checked_at,` + ` projections.login_names2.login_name,` + ` projections.users8_humans.display_name,` + - ` projections.sessions1.password_checked_at,` + - ` projections.sessions1.passkey_checked_at,` + - ` projections.sessions1.metadata,` + + ` projections.sessions2.password_checked_at,` + + ` projections.sessions2.intent_checked_at,` + + ` projections.sessions2.passkey_checked_at,` + + ` projections.sessions2.metadata,` + ` COUNT(*) OVER ()` + - ` FROM projections.sessions1` + - ` LEFT JOIN projections.login_names2 ON projections.sessions1.user_id = projections.login_names2.user_id AND projections.sessions1.instance_id = projections.login_names2.instance_id` + - ` LEFT JOIN projections.users8_humans ON projections.sessions1.user_id = projections.users8_humans.user_id AND projections.sessions1.instance_id = projections.users8_humans.instance_id` + + ` FROM projections.sessions2` + + ` LEFT JOIN projections.login_names2 ON projections.sessions2.user_id = projections.login_names2.user_id AND projections.sessions2.instance_id = projections.login_names2.instance_id` + + ` LEFT JOIN projections.users8_humans ON projections.sessions2.user_id = projections.users8_humans.user_id AND projections.sessions2.instance_id = projections.users8_humans.instance_id` + ` AS OF SYSTEM TIME '-1 ms'`) sessionCols = []string{ @@ -69,6 +71,7 @@ var ( "login_name", "display_name", "password_checked_at", + "intent_checked_at", "passkey_checked_at", "metadata", "token", @@ -87,6 +90,7 @@ var ( "login_name", "display_name", "password_checked_at", + "intent_checked_at", "passkey_checked_at", "metadata", "count", @@ -138,6 +142,7 @@ func Test_SessionsPrepare(t *testing.T) { "display-name", testNow, testNow, + testNow, []byte(`{"key": "dmFsdWU="}`), }, }, @@ -165,6 +170,9 @@ func Test_SessionsPrepare(t *testing.T) { PasswordFactor: SessionPasswordFactor{ PasswordCheckedAt: testNow, }, + IntentFactor: SessionIntentFactor{ + IntentCheckedAt: testNow, + }, PasskeyFactor: SessionPasskeyFactor{ PasskeyCheckedAt: testNow, }, @@ -197,6 +205,7 @@ func Test_SessionsPrepare(t *testing.T) { "display-name", testNow, testNow, + testNow, []byte(`{"key": "dmFsdWU="}`), }, { @@ -213,6 +222,7 @@ func Test_SessionsPrepare(t *testing.T) { "display-name2", testNow, testNow, + testNow, []byte(`{"key": "dmFsdWU="}`), }, }, @@ -240,6 +250,9 @@ func Test_SessionsPrepare(t *testing.T) { PasswordFactor: SessionPasswordFactor{ PasswordCheckedAt: testNow, }, + IntentFactor: SessionIntentFactor{ + IntentCheckedAt: testNow, + }, PasskeyFactor: SessionPasskeyFactor{ PasskeyCheckedAt: testNow, }, @@ -264,6 +277,9 @@ func Test_SessionsPrepare(t *testing.T) { PasswordFactor: SessionPasswordFactor{ PasswordCheckedAt: testNow, }, + IntentFactor: SessionIntentFactor{ + IntentCheckedAt: testNow, + }, PasskeyFactor: SessionPasskeyFactor{ PasskeyCheckedAt: testNow, }, @@ -349,6 +365,7 @@ func Test_SessionPrepare(t *testing.T) { "display-name", testNow, testNow, + testNow, []byte(`{"key": "dmFsdWU="}`), "tokenID", }, @@ -371,6 +388,9 @@ func Test_SessionPrepare(t *testing.T) { PasswordFactor: SessionPasswordFactor{ PasswordCheckedAt: testNow, }, + IntentFactor: SessionIntentFactor{ + IntentCheckedAt: testNow, + }, PasskeyFactor: SessionPasskeyFactor{ PasskeyCheckedAt: testNow, }, diff --git a/internal/repository/idpintent/intent.go b/internal/repository/idpintent/intent.go index 52036b8a7..fe26c9dfa 100644 --- a/internal/repository/idpintent/intent.go +++ b/internal/repository/idpintent/intent.go @@ -85,7 +85,7 @@ func NewSucceededEvent( userID string, idpAccessToken *crypto.CryptoValue, idpIDToken string, -) (*SucceededEvent, error) { +) *SucceededEvent { return &SucceededEvent{ BaseEvent: *eventstore.NewBaseEventForPush( ctx, @@ -98,7 +98,7 @@ func NewSucceededEvent( UserID: userID, IDPAccessToken: idpAccessToken, IDPIDToken: idpIDToken, - }, nil + } } func (e *SucceededEvent) Data() interface{} { diff --git a/internal/repository/session/eventstore.go b/internal/repository/session/eventstore.go index 3253cc856..07f458586 100644 --- a/internal/repository/session/eventstore.go +++ b/internal/repository/session/eventstore.go @@ -6,6 +6,7 @@ func RegisterEventMappers(es *eventstore.Eventstore) { es.RegisterFilterEventMapper(AggregateType, AddedType, AddedEventMapper). RegisterFilterEventMapper(AggregateType, UserCheckedType, UserCheckedEventMapper). RegisterFilterEventMapper(AggregateType, PasswordCheckedType, PasswordCheckedEventMapper). + RegisterFilterEventMapper(AggregateType, IntentCheckedType, IntentCheckedEventMapper). RegisterFilterEventMapper(AggregateType, PasskeyChallengedType, eventstore.GenericEventMapper[PasskeyChallengedEvent]). RegisterFilterEventMapper(AggregateType, PasskeyCheckedType, eventstore.GenericEventMapper[PasskeyCheckedEvent]). RegisterFilterEventMapper(AggregateType, TokenSetType, TokenSetEventMapper). diff --git a/internal/repository/session/session.go b/internal/repository/session/session.go index 887f056e8..c11a6eb45 100644 --- a/internal/repository/session/session.go +++ b/internal/repository/session/session.go @@ -16,6 +16,7 @@ const ( AddedType = sessionEventPrefix + "added" UserCheckedType = sessionEventPrefix + "user.checked" PasswordCheckedType = sessionEventPrefix + "password.checked" + IntentCheckedType = sessionEventPrefix + "intent.checked" PasskeyChallengedType = sessionEventPrefix + "passkey.challenged" PasskeyCheckedType = sessionEventPrefix + "passkey.checked" TokenSetType = sessionEventPrefix + "token.set" @@ -144,6 +145,47 @@ func PasswordCheckedEventMapper(event *repository.Event) (eventstore.Event, erro return added, nil } +type IntentCheckedEvent struct { + eventstore.BaseEvent `json:"-"` + + CheckedAt time.Time `json:"checkedAt"` +} + +func (e *IntentCheckedEvent) Data() interface{} { + return e +} + +func (e *IntentCheckedEvent) UniqueConstraints() []*eventstore.EventUniqueConstraint { + return nil +} + +func NewIntentCheckedEvent( + ctx context.Context, + aggregate *eventstore.Aggregate, + checkedAt time.Time, +) *IntentCheckedEvent { + return &IntentCheckedEvent{ + BaseEvent: *eventstore.NewBaseEventForPush( + ctx, + aggregate, + IntentCheckedType, + ), + CheckedAt: checkedAt, + } +} + +func IntentCheckedEventMapper(event *repository.Event) (eventstore.Event, error) { + added := &IntentCheckedEvent{ + BaseEvent: *eventstore.BaseEventFromRepo(event), + } + err := json.Unmarshal(event.Data, added) + if err != nil { + return nil, errors.ThrowInternal(err, "SESSION-DGt90", "unable to unmarshal intent checked") + } + + return added, nil +} + type PasskeyChallengedEvent struct { eventstore.BaseEvent `json:"-"` diff --git a/internal/static/i18n/bg.yaml b/internal/static/i18n/bg.yaml index e9d9510be..695007888 100644 --- a/internal/static/i18n/bg.yaml +++ b/internal/static/i18n/bg.yaml @@ -505,6 +505,8 @@ Errors: NotSucceeded: Намерението не е успешно TokenCreationFailed: Неуспешно създаване на токен InvalidToken: Знакът за намерение е невалиден + OtherUser: Намерение, предназначено за друг потребител + AggregateTypes: action: Действие instance: Инстанция diff --git a/internal/static/i18n/de.yaml b/internal/static/i18n/de.yaml index 6d830b2de..846e09dff 100644 --- a/internal/static/i18n/de.yaml +++ b/internal/static/i18n/de.yaml @@ -487,6 +487,7 @@ Errors: NotSucceeded: Intent war nicht erfolgreich TokenCreationFailed: Tokenerstellung schlug fehl InvalidToken: Intent Token ist ungültig + OtherUser: Intent ist für anderen Benutzer gedacht AggregateTypes: action: Action diff --git a/internal/static/i18n/en.yaml b/internal/static/i18n/en.yaml index 88763384e..5986651ea 100644 --- a/internal/static/i18n/en.yaml +++ b/internal/static/i18n/en.yaml @@ -487,6 +487,7 @@ Errors: NotSucceeded: Intent has not succeeded TokenCreationFailed: Token creation failed InvalidToken: Intent Token is invalid + OtherUser: Intent meant for another user AggregateTypes: action: Action diff --git a/internal/static/i18n/es.yaml b/internal/static/i18n/es.yaml index dbfa308c8..1adb10763 100644 --- a/internal/static/i18n/es.yaml +++ b/internal/static/i18n/es.yaml @@ -487,6 +487,7 @@ Errors: NotSucceeded: Intento fallido TokenCreationFailed: Fallo en la creación del token InvalidToken: El token de la intención no es válido + OtherUser: Destinado a otro usuario AggregateTypes: action: Acción diff --git a/internal/static/i18n/fr.yaml b/internal/static/i18n/fr.yaml index 9d4c03ed6..5789a815c 100644 --- a/internal/static/i18n/fr.yaml +++ b/internal/static/i18n/fr.yaml @@ -487,6 +487,7 @@ Errors: NotSucceeded: l'intention n'a pas abouti TokenCreationFailed: La création du token a échoué InvalidToken: Le jeton d'intention n'est pas valide + OtherUser: Intention destinée à un autre utilisateur AggregateTypes: action: Action diff --git a/internal/static/i18n/it.yaml b/internal/static/i18n/it.yaml index 113e99c30..4e51b0fc3 100644 --- a/internal/static/i18n/it.yaml +++ b/internal/static/i18n/it.yaml @@ -487,6 +487,7 @@ Errors: NotSucceeded: l'intento non è andato a buon fine TokenCreationFailed: creazione del token fallita InvalidToken: Il token dell'intento non è valido + OtherUser: Intento destinato a un altro utente AggregateTypes: action: Azione diff --git a/internal/static/i18n/ja.yaml b/internal/static/i18n/ja.yaml index fd2fd5abe..ed6d070d1 100644 --- a/internal/static/i18n/ja.yaml +++ b/internal/static/i18n/ja.yaml @@ -476,6 +476,7 @@ Errors: NotSucceeded: インテントが成功しなかった TokenCreationFailed: トークンの作成に失敗しました InvalidToken: インテントのトークンが無効である + OtherUser: 他のユーザーを意図している AggregateTypes: action: アクション diff --git a/internal/static/i18n/pl.yaml b/internal/static/i18n/pl.yaml index 0c7e56ccd..9e907dcbe 100644 --- a/internal/static/i18n/pl.yaml +++ b/internal/static/i18n/pl.yaml @@ -487,6 +487,7 @@ Errors: NotSucceeded: intencja nie powiodła się TokenCreationFailed: Tworzenie tokena nie powiodło się InvalidToken: Token intencji jest nieprawidłowy + OtherUser: Intencja przeznaczona dla innego użytkownika AggregateTypes: action: Działanie diff --git a/internal/static/i18n/zh.yaml b/internal/static/i18n/zh.yaml index 3a1508e05..2a9f2400f 100644 --- a/internal/static/i18n/zh.yaml +++ b/internal/static/i18n/zh.yaml @@ -487,6 +487,7 @@ Errors: NotSucceeded: 意图不成功 TokenCreationFailed: 令牌创建失败 InvalidToken: 意图令牌是无效的 + OtherUser: 意图是为另一个用户准备的 AggregateTypes: action: 动作 diff --git a/proto/zitadel/session/v2alpha/session.proto b/proto/zitadel/session/v2alpha/session.proto index 79f203086..a73eb8a79 100644 --- a/proto/zitadel/session/v2alpha/session.proto +++ b/proto/zitadel/session/v2alpha/session.proto @@ -45,6 +45,7 @@ message Factors { UserFactor user = 1; PasswordFactor password = 2; PasskeyFactor passkey = 3; + IntentFactor intent = 4; } message UserFactor { @@ -78,6 +79,14 @@ message PasswordFactor { ]; } +message IntentFactor { + google.protobuf.Timestamp verified_at = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "\"time when an intent was last checked\""; + } + ]; +} + message PasskeyFactor { google.protobuf.Timestamp verified_at = 1 [ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { diff --git a/proto/zitadel/session/v2alpha/session_service.proto b/proto/zitadel/session/v2alpha/session_service.proto index 0ee4b05d3..6ae18fd88 100644 --- a/proto/zitadel/session/v2alpha/session_service.proto +++ b/proto/zitadel/session/v2alpha/session_service.proto @@ -341,6 +341,11 @@ message Checks { description: "\"Checks the public key credential issued by the passkey client. Requires that the user is already checked and a passkey challenge to be requested, in any previous request.\""; } ]; + optional CheckIntent intent = 4 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "\"Checks the intent. Requires that the userlink is already checked and a successful intent.\""; + } + ]; } message CheckUser { @@ -386,3 +391,24 @@ message CheckPasskey { } ]; } + +message CheckIntent { + string intent_id = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "ID of the intent, previously returned on the success response of the IDP callback" + min_length: 1; + max_length: 200; + example: "\"d654e6ba-70a3-48ef-a95d-37c8d8a7901a\""; + } + ]; + string token = 2 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "token of the intent, previously returned on the success response of the IDP callback" + min_length: 1; + max_length: 200; + example: "\"SJKL3ioIDpo342ioqw98fjp3sdf32wahb=\""; + } + ]; +} From df87907299c0a9f27ac43ee617d01504f3f77dc2 Mon Sep 17 00:00:00 2001 From: Miguel Cabrerizo <30386061+doncicuto@users.noreply.github.com> Date: Thu, 22 Jun 2023 09:24:44 +0200 Subject: [PATCH 28/37] feat(console): user table show timestamp instead of x ago (#6034) Co-authored-by: Max Peintner --- .../user-list/user-table/user-table.component.html | 4 ++-- .../localized-date-pipe/localized-date.pipe.ts | 14 +++++++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/console/src/app/pages/users/user-list/user-table/user-table.component.html b/console/src/app/pages/users/user-list/user-table/user-table.component.html index 347b738e9..d51fdf219 100644 --- a/console/src/app/pages/users/user-list/user-table/user-table.component.html +++ b/console/src/app/pages/users/user-list/user-table/user-table.component.html @@ -170,14 +170,14 @@ {{ 'USER.TABLE.CREATIONDATE' | translate }} - {{ user.details.creationDate | timestampToDate | localizedDate : 'fromNow' }} + {{ user.details.creationDate | timestampToDate | localizedDate : 'regular' }} {{ 'USER.TABLE.CHANGEDATE' | translate }} - {{ user.details.changeDate | timestampToDate | localizedDate : 'fromNow' }} + {{ user.details.changeDate | timestampToDate | localizedDate : 'regular' }} diff --git a/console/src/app/pipes/localized-date-pipe/localized-date.pipe.ts b/console/src/app/pipes/localized-date-pipe/localized-date.pipe.ts index ce4b09416..6030dc463 100644 --- a/console/src/app/pipes/localized-date-pipe/localized-date.pipe.ts +++ b/console/src/app/pipes/localized-date-pipe/localized-date.pipe.ts @@ -18,14 +18,22 @@ export class LocalizedDatePipe implements PipeTransform { if (moment().diff(date, 'days') <= 2) { return date.fromNow(); // '2 days ago' etc. } else { - const localeData = moment(value).localeData(); - const format = localeData.longDateFormat('L'); - return moment(value).format(`${format}, HH:mm`); + return this.getDateInRegularFormat(value); } + } + if (pattern && pattern === 'regular') { + moment.locale(this.translateService.currentLang ?? 'en'); + return this.getDateInRegularFormat(value); } else { const lang = supportedLanguages.includes(this.translateService.currentLang) ? this.translateService.currentLang : 'en'; const datePipe: DatePipe = new DatePipe(lang); return datePipe.transform(value, pattern ?? 'mediumDate'); } } + + private getDateInRegularFormat(value: any): string { + const localeData = moment(value).localeData(); + const format = localeData.longDateFormat('L'); + return moment(value).format(`${format}, HH:mm`); + } } From 56e33ce1a7b1f30bd8deb5f62fe5fb1937f554df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Thu, 22 Jun 2023 12:06:32 +0200 Subject: [PATCH 29/37] fix: rename OTP to TOTP in v2 alpha user api This change renames the v2 user OTP registration endpoints and objects to TOTP. Also the v2 related code paths have been renamed to TOTP. This change was discussed during the sprint review. --- internal/api/grpc/user/v2/otp.go | 38 ------------------- internal/api/grpc/user/v2/totp.go | 38 +++++++++++++++++++ ...ation_test.go => totp_integration_test.go} | 34 ++++++++--------- .../user/v2/{otp_test.go => totp_test.go} | 14 +++---- internal/command/user_human_otp.go | 8 ++-- internal/command/user_human_otp_test.go | 2 +- .../{user_v2_otp.go => user_v2_totp.go} | 8 ++-- ...er_v2_otp_test.go => user_v2_totp_test.go} | 8 ++-- internal/domain/human_otp.go | 2 +- proto/zitadel/user/v2alpha/user_service.proto | 26 ++++++------- 10 files changed, 89 insertions(+), 89 deletions(-) delete mode 100644 internal/api/grpc/user/v2/otp.go create mode 100644 internal/api/grpc/user/v2/totp.go rename internal/api/grpc/user/v2/{otp_integration_test.go => totp_integration_test.go} (75%) rename internal/api/grpc/user/v2/{otp_test.go => totp_test.go} (80%) rename internal/command/{user_v2_otp.go => user_v2_totp.go} (67%) rename internal/command/{user_v2_otp_test.go => user_v2_totp_test.go} (95%) diff --git a/internal/api/grpc/user/v2/otp.go b/internal/api/grpc/user/v2/otp.go deleted file mode 100644 index 80ea81007..000000000 --- a/internal/api/grpc/user/v2/otp.go +++ /dev/null @@ -1,38 +0,0 @@ -package user - -import ( - "context" - - "github.com/zitadel/zitadel/internal/api/authz" - "github.com/zitadel/zitadel/internal/api/grpc/object/v2" - "github.com/zitadel/zitadel/internal/domain" - user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha" -) - -func (s *Server) RegisterOTP(ctx context.Context, req *user.RegisterOTPRequest) (*user.RegisterOTPResponse, error) { - return otpDetailsToPb( - s.command.AddUserOTP(ctx, req.GetUserId(), authz.GetCtxData(ctx).ResourceOwner), - ) - -} - -func otpDetailsToPb(otp *domain.OTPv2, err error) (*user.RegisterOTPResponse, error) { - if err != nil { - return nil, err - } - return &user.RegisterOTPResponse{ - Details: object.DomainToDetailsPb(otp.ObjectDetails), - Uri: otp.URI, - Secret: otp.Secret, - }, nil -} - -func (s *Server) VerifyOTPRegistration(ctx context.Context, req *user.VerifyOTPRegistrationRequest) (*user.VerifyOTPRegistrationResponse, error) { - objectDetails, err := s.command.CheckUserOTP(ctx, req.GetUserId(), req.GetCode(), authz.GetCtxData(ctx).ResourceOwner) - if err != nil { - return nil, err - } - return &user.VerifyOTPRegistrationResponse{ - Details: object.DomainToDetailsPb(objectDetails), - }, nil -} diff --git a/internal/api/grpc/user/v2/totp.go b/internal/api/grpc/user/v2/totp.go new file mode 100644 index 000000000..494c55898 --- /dev/null +++ b/internal/api/grpc/user/v2/totp.go @@ -0,0 +1,38 @@ +package user + +import ( + "context" + + "github.com/zitadel/zitadel/internal/api/authz" + "github.com/zitadel/zitadel/internal/api/grpc/object/v2" + "github.com/zitadel/zitadel/internal/domain" + user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha" +) + +func (s *Server) RegisterTOTP(ctx context.Context, req *user.RegisterTOTPRequest) (*user.RegisterTOTPResponse, error) { + return totpDetailsToPb( + s.command.AddUserTOTP(ctx, req.GetUserId(), authz.GetCtxData(ctx).ResourceOwner), + ) + +} + +func totpDetailsToPb(totp *domain.TOTP, err error) (*user.RegisterTOTPResponse, error) { + if err != nil { + return nil, err + } + return &user.RegisterTOTPResponse{ + Details: object.DomainToDetailsPb(totp.ObjectDetails), + Uri: totp.URI, + Secret: totp.Secret, + }, nil +} + +func (s *Server) VerifyTOTPRegistration(ctx context.Context, req *user.VerifyTOTPRegistrationRequest) (*user.VerifyTOTPRegistrationResponse, error) { + objectDetails, err := s.command.CheckUserTOTP(ctx, req.GetUserId(), req.GetCode(), authz.GetCtxData(ctx).ResourceOwner) + if err != nil { + return nil, err + } + return &user.VerifyTOTPRegistrationResponse{ + Details: object.DomainToDetailsPb(objectDetails), + }, nil +} diff --git a/internal/api/grpc/user/v2/otp_integration_test.go b/internal/api/grpc/user/v2/totp_integration_test.go similarity index 75% rename from internal/api/grpc/user/v2/otp_integration_test.go rename to internal/api/grpc/user/v2/totp_integration_test.go index 9bc788e06..66d286cff 100644 --- a/internal/api/grpc/user/v2/otp_integration_test.go +++ b/internal/api/grpc/user/v2/totp_integration_test.go @@ -13,24 +13,24 @@ import ( user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha" ) -func TestServer_RegisterOTP(t *testing.T) { +func TestServer_RegisterTOTP(t *testing.T) { // userID := Tester.CreateHumanUser(CTX).GetUserId() type args struct { ctx context.Context - req *user.RegisterOTPRequest + req *user.RegisterTOTPRequest } tests := []struct { name string args args - want *user.RegisterOTPResponse + want *user.RegisterTOTPResponse wantErr bool }{ { name: "missing user id", args: args{ ctx: CTX, - req: &user.RegisterOTPRequest{}, + req: &user.RegisterTOTPRequest{}, }, wantErr: true, }, @@ -38,7 +38,7 @@ func TestServer_RegisterOTP(t *testing.T) { name: "user mismatch", args: args{ ctx: CTX, - req: &user.RegisterOTPRequest{ + req: &user.RegisterTOTPRequest{ UserId: "wrong", }, }, @@ -50,11 +50,11 @@ func TestServer_RegisterOTP(t *testing.T) { name: "human user", args: args{ ctx: CTX, - req: &user.RegisterOTPRequest{ + req: &user.RegisterTOTPRequest{ UserId: userID, }, }, - want: &user.RegisterOTPResponse{ + want: &user.RegisterTOTPResponse{ Details: &object.Details{ ResourceOwner: Tester.Organisation.ID, }, @@ -64,7 +64,7 @@ func TestServer_RegisterOTP(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := Client.RegisterOTP(tt.args.ctx, tt.args.req) + got, err := Client.RegisterTOTP(tt.args.ctx, tt.args.req) if tt.wantErr { require.Error(t, err) return @@ -78,11 +78,11 @@ func TestServer_RegisterOTP(t *testing.T) { } } -func TestServer_VerifyOTPRegistration(t *testing.T) { +func TestServer_VerifyTOTPRegistration(t *testing.T) { userID := Tester.CreateHumanUser(CTX).GetUserId() /* TODO: after we are able to obtain a Bearer token for a human user - reg, err := Client.RegisterOTP(CTX, &user.RegisterOTPRequest{ + reg, err := Client.RegisterTOTP(CTX, &user.RegisterTOTPRequest{ UserId: userID, }) require.NoError(t, err) @@ -92,19 +92,19 @@ func TestServer_VerifyOTPRegistration(t *testing.T) { type args struct { ctx context.Context - req *user.VerifyOTPRegistrationRequest + req *user.VerifyTOTPRegistrationRequest } tests := []struct { name string args args - want *user.VerifyOTPRegistrationResponse + want *user.VerifyTOTPRegistrationResponse wantErr bool }{ { name: "user mismatch", args: args{ ctx: CTX, - req: &user.VerifyOTPRegistrationRequest{ + req: &user.VerifyTOTPRegistrationRequest{ UserId: "wrong", }, }, @@ -114,7 +114,7 @@ func TestServer_VerifyOTPRegistration(t *testing.T) { name: "wrong code", args: args{ ctx: CTX, - req: &user.VerifyOTPRegistrationRequest{ + req: &user.VerifyTOTPRegistrationRequest{ UserId: userID, Code: "123", }, @@ -127,12 +127,12 @@ func TestServer_VerifyOTPRegistration(t *testing.T) { name: "success", args: args{ ctx: CTX, - req: &user.VerifyOTPRegistrationRequest{ + req: &user.VerifyTOTPRegistrationRequest{ UserId: userID, Code: code, }, }, - want: &user.VerifyOTPRegistrationResponse{ + want: &user.VerifyTOTPRegistrationResponse{ Details: &object.Details{ ResourceOwner: Tester.Organisation.ResourceOwner, }, @@ -142,7 +142,7 @@ func TestServer_VerifyOTPRegistration(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := Client.VerifyOTPRegistration(tt.args.ctx, tt.args.req) + got, err := Client.VerifyTOTPRegistration(tt.args.ctx, tt.args.req) if tt.wantErr { require.Error(t, err) return diff --git a/internal/api/grpc/user/v2/otp_test.go b/internal/api/grpc/user/v2/totp_test.go similarity index 80% rename from internal/api/grpc/user/v2/otp_test.go rename to internal/api/grpc/user/v2/totp_test.go index 29dcb5911..021717283 100644 --- a/internal/api/grpc/user/v2/otp_test.go +++ b/internal/api/grpc/user/v2/totp_test.go @@ -14,15 +14,15 @@ import ( user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha" ) -func Test_otpDetailsToPb(t *testing.T) { +func Test_totpDetailsToPb(t *testing.T) { type args struct { - otp *domain.OTPv2 + otp *domain.TOTP err error } tests := []struct { name string args args - want *user.RegisterOTPResponse + want *user.RegisterTOTPResponse wantErr error }{ { @@ -35,7 +35,7 @@ func Test_otpDetailsToPb(t *testing.T) { { name: "success", args: args{ - otp: &domain.OTPv2{ + otp: &domain.TOTP{ ObjectDetails: &domain.ObjectDetails{ Sequence: 123, EventDate: time.Unix(456, 789), @@ -45,7 +45,7 @@ func Test_otpDetailsToPb(t *testing.T) { URI: "URI", }, }, - want: &user.RegisterOTPResponse{ + want: &user.RegisterTOTPResponse{ Details: &object.Details{ Sequence: 123, ChangeDate: ×tamppb.Timestamp{ @@ -61,10 +61,10 @@ func Test_otpDetailsToPb(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := otpDetailsToPb(tt.args.otp, tt.args.err) + got, err := totpDetailsToPb(tt.args.otp, tt.args.err) require.ErrorIs(t, err, tt.wantErr) if !proto.Equal(tt.want, got) { - t.Errorf("RegisterOTPResponse =\n%v\nwant\n%v", got, tt.want) + t.Errorf("RegisterTOTPResponse =\n%v\nwant\n%v", got, tt.want) } }) } diff --git a/internal/command/user_human_otp.go b/internal/command/user_human_otp.go index 7b779e37a..8bf6f0468 100644 --- a/internal/command/user_human_otp.go +++ b/internal/command/user_human_otp.go @@ -45,7 +45,7 @@ func (c *Commands) AddHumanOTP(ctx context.Context, userID, resourceowner string if userID == "" { return nil, caos_errs.ThrowInvalidArgument(nil, "COMMAND-5M0sd", "Errors.User.UserIDMissing") } - prep, err := c.createHumanOTP(ctx, userID, resourceowner) + prep, err := c.createHumanTOTP(ctx, userID, resourceowner) if err != nil { return nil, err } @@ -62,14 +62,14 @@ func (c *Commands) AddHumanOTP(ctx context.Context, userID, resourceowner string }, nil } -type preparedOTP struct { +type preparedTOTP struct { wm *HumanOTPWriteModel userAgg *eventstore.Aggregate key *otp.Key cmds []eventstore.Command } -func (c *Commands) createHumanOTP(ctx context.Context, userID, resourceOwner string) (*preparedOTP, error) { +func (c *Commands) createHumanTOTP(ctx context.Context, userID, resourceOwner string) (*preparedTOTP, error) { human, err := c.getHuman(ctx, userID, resourceOwner) if err != nil { logging.Log("COMMAND-DAqe1").WithError(err).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Debug("unable to get human for loginname") @@ -107,7 +107,7 @@ func (c *Commands) createHumanOTP(ctx context.Context, userID, resourceOwner str if err != nil { return nil, err } - return &preparedOTP{ + return &preparedTOTP{ wm: otpWriteModel, userAgg: userAgg, key: key, diff --git a/internal/command/user_human_otp_test.go b/internal/command/user_human_otp_test.go index b04038bb3..e11f771e6 100644 --- a/internal/command/user_human_otp_test.go +++ b/internal/command/user_human_otp_test.go @@ -512,7 +512,7 @@ func TestCommands_createHumanOTP(t *testing.T) { }, }, } - got, err := c.createHumanOTP(tt.args.ctx, tt.args.userID, tt.args.resourceOwner) + got, err := c.createHumanTOTP(tt.args.ctx, tt.args.userID, tt.args.resourceOwner) require.ErrorIs(t, err, tt.wantErr) if tt.want { require.NotNil(t, got) diff --git a/internal/command/user_v2_otp.go b/internal/command/user_v2_totp.go similarity index 67% rename from internal/command/user_v2_otp.go rename to internal/command/user_v2_totp.go index 4a317c5e1..76840bac1 100644 --- a/internal/command/user_v2_otp.go +++ b/internal/command/user_v2_totp.go @@ -7,25 +7,25 @@ import ( "github.com/zitadel/zitadel/internal/domain" ) -func (c *Commands) AddUserOTP(ctx context.Context, userID, resourceowner string) (*domain.OTPv2, error) { +func (c *Commands) AddUserTOTP(ctx context.Context, userID, resourceowner string) (*domain.TOTP, error) { if err := authz.UserIDInCTX(ctx, userID); err != nil { return nil, err } - prep, err := c.createHumanOTP(ctx, userID, resourceowner) + prep, err := c.createHumanTOTP(ctx, userID, resourceowner) if err != nil { return nil, err } if err = c.pushAppendAndReduce(ctx, prep.wm, prep.cmds...); err != nil { return nil, err } - return &domain.OTPv2{ + return &domain.TOTP{ ObjectDetails: writeModelToObjectDetails(&prep.wm.WriteModel), Secret: prep.key.Secret(), URI: prep.key.URL(), }, nil } -func (c *Commands) CheckUserOTP(ctx context.Context, userID, code, resourceOwner string) (*domain.ObjectDetails, error) { +func (c *Commands) CheckUserTOTP(ctx context.Context, userID, code, resourceOwner string) (*domain.ObjectDetails, error) { if err := authz.UserIDInCTX(ctx, userID); err != nil { return nil, err } diff --git a/internal/command/user_v2_otp_test.go b/internal/command/user_v2_totp_test.go similarity index 95% rename from internal/command/user_v2_otp_test.go rename to internal/command/user_v2_totp_test.go index 43cf6813f..d7b9f8246 100644 --- a/internal/command/user_v2_otp_test.go +++ b/internal/command/user_v2_totp_test.go @@ -21,7 +21,7 @@ import ( "github.com/zitadel/zitadel/internal/repository/user" ) -func TestCommands_AddUserOTP(t *testing.T) { +func TestCommands_AddUserTOTP(t *testing.T) { ctx := authz.NewMockContext("inst1", "org1", "user1") userAgg := &user.NewAggregate("user1", "org1").Aggregate @@ -175,7 +175,7 @@ func TestCommands_AddUserOTP(t *testing.T) { }, }, } - got, err := c.AddUserOTP(ctx, tt.args.userID, tt.args.resourceowner) + got, err := c.AddUserTOTP(ctx, tt.args.userID, tt.args.resourceowner) require.ErrorIs(t, err, tt.wantErr) if tt.want { require.NotNil(t, got) @@ -187,7 +187,7 @@ func TestCommands_AddUserOTP(t *testing.T) { } } -func TestCommands_CheckUserOTP(t *testing.T) { +func TestCommands_CheckUserTOTP(t *testing.T) { ctx := authz.NewMockContext("inst1", "org1", "user1") cryptoAlg := crypto.CreateMockEncryptionAlg(gomock.NewController(t)) @@ -252,7 +252,7 @@ func TestCommands_CheckUserOTP(t *testing.T) { }, }, } - got, err := c.CheckUserOTP(ctx, tt.args.userID, tt.args.code, tt.args.resourceOwner) + got, err := c.CheckUserTOTP(ctx, tt.args.userID, tt.args.code, tt.args.resourceOwner) require.ErrorIs(t, err, tt.wantErr) if tt.want { require.NotNil(t, got) diff --git a/internal/domain/human_otp.go b/internal/domain/human_otp.go index b35d0f4d3..479814340 100644 --- a/internal/domain/human_otp.go +++ b/internal/domain/human_otp.go @@ -17,7 +17,7 @@ type OTP struct { State MFAState } -type OTPv2 struct { +type TOTP struct { *ObjectDetails Secret string diff --git a/proto/zitadel/user/v2alpha/user_service.proto b/proto/zitadel/user/v2alpha/user_service.proto index ad30412d0..5c548f917 100644 --- a/proto/zitadel/user/v2alpha/user_service.proto +++ b/proto/zitadel/user/v2alpha/user_service.proto @@ -271,9 +271,9 @@ service UserService { }; } - rpc RegisterOTP (RegisterOTPRequest) returns (RegisterOTPResponse) { + rpc RegisterTOTP (RegisterTOTPRequest) returns (RegisterTOTPResponse) { option (google.api.http) = { - post: "/v2alpha/users/{user_id}/otp" + post: "/v2alpha/users/{user_id}/totp" body: "*" }; @@ -283,8 +283,8 @@ service UserService { } }; option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { - summary: "Start the registration of an OTP generator for a user"; - description: "Start the registration of a OTP generator for a user, as a response a secret returned, which is used to initialize a TOTP app or device." + summary: "Start the registration of a TOTP generator for a user"; + description: "Start the registration of a TOTP generator for a user, as a response a secret returned, which is used to initialize a TOTP app or device." responses: { key: "200" value: { @@ -294,9 +294,9 @@ service UserService { }; } - rpc VerifyOTPRegistration (VerifyOTPRegistrationRequest) returns (VerifyOTPRegistrationResponse) { + rpc VerifyTOTPRegistration (VerifyTOTPRegistrationRequest) returns (VerifyTOTPRegistrationResponse) { option (google.api.http) = { - post: "/v2alpha/users/{user_id}/otp/_verify" // Why underscore here?? + post: "/v2alpha/users/{user_id}/totp/_verify" body: "*" }; @@ -306,8 +306,8 @@ service UserService { } }; option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { - summary: "Verify a u2f token for a user"; - description: "Verify the OTP registration with a generated code." + summary: "Verify a TOTP generator for a user"; + description: "Verify the TOTP registration with a generated code." responses: { key: "200" value: { @@ -719,7 +719,7 @@ message VerifyU2FRegistrationResponse{ zitadel.object.v2alpha.Details details = 1; } -message RegisterOTPRequest { +message RegisterTOTPRequest { string user_id = 1 [ (validate.rules).string = {min_len: 1, max_len: 200}, (google.api.field_behavior) = REQUIRED, @@ -731,7 +731,7 @@ message RegisterOTPRequest { ]; } -message RegisterOTPResponse { +message RegisterTOTPResponse { zitadel.object.v2alpha.Details details = 1; string uri = 2 [ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { @@ -745,7 +745,7 @@ message RegisterOTPResponse { ]; } -message VerifyOTPRegistrationRequest { +message VerifyTOTPRegistrationRequest { string user_id = 1 [ (validate.rules).string = {min_len: 1, max_len: 200}, (google.api.field_behavior) = REQUIRED, @@ -759,13 +759,13 @@ message VerifyOTPRegistrationRequest { (validate.rules).string = {min_len: 1, max_len: 200}, (google.api.field_behavior) = REQUIRED, (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "Code generated by OTP app or device" + description: "Code generated by TOTP app or device" example: "\"123456\""; } ]; } -message VerifyOTPRegistrationResponse { +message VerifyTOTPRegistrationResponse { zitadel.object.v2alpha.Details details = 1; } From 70f03ad01a007765598625d9842776c6c91e0d8c Mon Sep 17 00:00:00 2001 From: Dakshitha Ratnayake Date: Thu, 22 Jun 2023 19:35:47 +0530 Subject: [PATCH 30/37] docs:Update quickstart.mdx (#6071) Update quickstart.mdx --- docs/docs/guides/start/quickstart.mdx | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/docs/docs/guides/start/quickstart.mdx b/docs/docs/guides/start/quickstart.mdx index 11a9349a7..470224cc5 100644 --- a/docs/docs/guides/start/quickstart.mdx +++ b/docs/docs/guides/start/quickstart.mdx @@ -276,20 +276,10 @@ And with that, configuring ZITADEL for our application is complete. Now we can m ### 2. Prerequisites -To follow along with this tutorial, you will need to have both React and Visual Studio Code (VSCode) installed on your machine. - - React +To follow along with this tutorial, you will need to have both Node.js and Visual Studio Code (VSCode) installed on your machine. To install React, you will need to have Node.js installed on your system. You can download and install Node.js from [here](https://nodejs.org/). -Once you have Node.js installed, you can use the following command to install React: - -``` npm install -g react ``` - -This will install the latest version of React globally on your system. - - Visual Studio Code - To install Visual Studio Code, go to their [website](https://code.visualstudio.com/) and download and install the version for your operating system. From 2dd5d73f7c88bbea5e2b84d952fa70bdea8df3ac Mon Sep 17 00:00:00 2001 From: Fabi Date: Fri, 23 Jun 2023 09:28:42 +0200 Subject: [PATCH 31/37] docs: Build your own Login UI guide (#6075) * docs: add guide for implementing ui with the new user/session api * docs: add guide for implementing ui with the new user/session api * docs: add oidc flow to login ui guide --- .../guides/integrate/login-ui/_logout.mdx | 20 ++ .../integrate/login-ui/_select-account.mdx | 80 ++++++ .../integrate/login-ui/external-login.mdx | 209 ++++++++++++++++ .../docs/guides/integrate/login-ui/logout.mdx | 7 + .../integrate/login-ui/oidc-standard.mdx | 26 ++ .../integrate/login-ui/select-account.mdx | 7 + .../integrate/login-ui/username-password.mdx | 236 ++++++++++++++++++ docs/sidebars.js | 20 ++ .../guides/login-ui/external-login-flow.png | Bin 0 -> 286190 bytes docs/static/img/guides/login-ui/oidc-flow.png | Bin 0 -> 260211 bytes .../login-ui/username-password-flow.png | Bin 0 -> 276762 bytes 11 files changed, 605 insertions(+) create mode 100644 docs/docs/guides/integrate/login-ui/_logout.mdx create mode 100644 docs/docs/guides/integrate/login-ui/_select-account.mdx create mode 100644 docs/docs/guides/integrate/login-ui/external-login.mdx create mode 100644 docs/docs/guides/integrate/login-ui/logout.mdx create mode 100644 docs/docs/guides/integrate/login-ui/oidc-standard.mdx create mode 100644 docs/docs/guides/integrate/login-ui/select-account.mdx create mode 100644 docs/docs/guides/integrate/login-ui/username-password.mdx create mode 100644 docs/static/img/guides/login-ui/external-login-flow.png create mode 100644 docs/static/img/guides/login-ui/oidc-flow.png create mode 100644 docs/static/img/guides/login-ui/username-password-flow.png diff --git a/docs/docs/guides/integrate/login-ui/_logout.mdx b/docs/docs/guides/integrate/login-ui/_logout.mdx new file mode 100644 index 000000000..9ed441466 --- /dev/null +++ b/docs/docs/guides/integrate/login-ui/_logout.mdx @@ -0,0 +1,20 @@ +When your user is done using your application and clicks on the logout button, you have to send a request to the terminate session endpoint. +[Terminate Session Documentation](https://zitadel.com/docs/apis/resources/session_service/session-service-delete-session) + +Send the session token in the body of the request. + +### Request + +```bash +curl --request DELETE \ + --url https://$ZITADEL_DOMAIN/v2alpha/sessions/218480890961985793 \ + --header 'Accept: application/json' \ + --header 'Authorization: Bearer '"$TOKEN"''\ + --header 'Content-Type: application/json' \ + --data '{ + "sessionToken": "blGKerGQPKv8jN21p6E9GB1B-vl6_EyKlvTd5UALu8-aQmjucgZxHSXJx3XMFTwT9_Y3VnbOo3gC_Q" +}' +``` + +Terminating a session means to delete it. +If you try to read the session afterwards, you will get an error “Session does not exist”. diff --git a/docs/docs/guides/integrate/login-ui/_select-account.mdx b/docs/docs/guides/integrate/login-ui/_select-account.mdx new file mode 100644 index 000000000..7bf31174c --- /dev/null +++ b/docs/docs/guides/integrate/login-ui/_select-account.mdx @@ -0,0 +1,80 @@ + +If you want to build your own select account/account picker, you have to cache the session IDs. +We recommend storing a list of the session Ids with the corresponding session token in a cookie. +The list of session IDs can be sent in the “search sessions” request to get a detailed list of sessions for the account selection. + +[Search Sessions Documentation](https://zitadel.com/docs/apis/resources/session_service/session-service-list-sessions) + +### Request + +```bash +curl --request POST \ + --url https://$ZITADEL_DOMAIN/v2alpha/sessions/_search \ + --header 'Accept: application/json' \ + --header 'Authorization: Bearer '"$TOKEN"''\ + --header 'Content-Type: application/json' \ + --data '{ + "query": { + "offset": "0", + "limit": 100, + "asc": true + }, + "queries": [ + { + "idsQuery": { + "ids": [ + "218380657934467329", "218480890961985793" + ] + } + } + ] +}' +``` + +### Response + +```bash +{ + "details": { + "totalResult": "2", + "processedSequence": "582", + "timestamp": "2023-06-14T05:42:11.644220Z" + }, + "sessions": [ + { + "id": "218380657934467329", + "creationDate": "2023-06-13T12:56:56.683629Z", + "changeDate": "2023-06-13T12:56:56.724450Z", + "sequence": "574", + "factors": { + "user": { + "verifiedAt": "2023-06-13T12:56:55.440850Z", + "id": "218380659823356328", + "loginName": "minnie-mouse@fabi.zitadel.app", + "displayName": "Minnie Mouse" + }, + "password": { + "verifiedAt": "2023-06-13T12:56:56.675359Z" + } + } + }, + { + "id": "218480890961985793", + "creationDate": "2023-06-14T05:32:38.977954Z", + "changeDate": "2023-06-14T05:42:11.631901Z", + "sequence": "582", + "factors": { + "user": { + "verifiedAt": "2023-06-14T05:32:38.972712Z", + "id": "218380659823356328", + "loginName": "minnie-mouse@fabi.zitadel.app", + "displayName": "Minnie Mouse" + }, + "password": { + "verifiedAt": "2023-06-14T05:42:11.619484Z" + } + } + } + ] +} +``` \ No newline at end of file diff --git a/docs/docs/guides/integrate/login-ui/external-login.mdx b/docs/docs/guides/integrate/login-ui/external-login.mdx new file mode 100644 index 000000000..81da1dcae --- /dev/null +++ b/docs/docs/guides/integrate/login-ui/external-login.mdx @@ -0,0 +1,209 @@ +--- +title: Handle External Login +sidebar_label: External Identity Provider +--- + +## Flow + +The prerequisite for adding an external login (social and enterprise) to your user account is a registered identity provider on your ZITADEL instance or the organization of the user. +If you haven’t added a provider yet, have a look at the following guide first: [Identity Providers](https://zitadel.com/docs/guides/integrate/identity-providers) + +![Identity Provider Flow](/img/guides/login-ui/external-login-flow.png) + +## Start the Provider Flow + +ZITADEL will handle as much as possible from the authentication flow with the external provider. +This requires you to initiate the flow with your desired provider. + +Send the following two URLs in the request body: +1. SuccessURL: Page that should be shown when the login was successful +2. ErrorURL: Page that should be shown when an error happens during the authentication + +In the response, you will get an authentication URL of the provider you like. +[Start Identity Provider Flow Documentation](https://zitadel.com/docs/apis/resources/user_service/user-service-start-identity-provider-flow) + +### Request + +```bash +curl --request POST \ + --url https://$ZITADEL_DOMAIN/v2alpha/users/idps/$IDP_ID/start \ + --header 'Accept: application/json' \ + --header 'Authorization: Bearer '"$TOKEN"''\ + --header 'Content-Type: application/json' \ + --data '{ + "successUrl": "https://custom.com/login/idp/success", + "failureUrl": "https://custom.com/login/idp/fail" +}' +``` + +### Response + +```bash +{ + "details": { + "sequence": "592", + "changeDate": "2023-06-14T12:51:29.654819Z", + "resourceOwner": "163840776835432705" + }, + "authUrl": "https://accounts.google.com/o/oauth2/v2/auth?client_id=Test&prompt=select_account&redirect_uri=https%3A%2F%2F$ZITADEL_DOMAIN%2Fidps%2Fcallback&response_type=code&scope=openid+profile+email&state=218525066445455617" +} +``` + +## Call Provider + +The next step is to call the auth URL you got in the response from the previous step. +This will open up the login page of the given provider. In this guide, it is Google Login. + +```bash +https://accounts.google.com/o/oauth2/v2/auth?client_id=Test&prompt=select_account&redirect_uri=https%3A%2F%2F$ZITADEL_DOMAIN%2Fidps%2Fcallback&response_type=code&scope=openid+profile+email&state=218525066445455617 +``` + +After the user has successfully authenticated, a redirect to the ZITADEL backend /idps/callback will automatically be performed. + +## Get Provider Information + +ZITADEL will take the information of the provider. After this, a redirect will be made to either the success page in case of a successful login or to the error page in case of a failure will be performed. In the parameters, you will provide the intentID, a token, and optionally, if a user could be found, a user ID. + +To get the information of the provider, make a request to ZITADEL. +[Get Identity Provider Information Documentation](https://zitadel.com/docs/apis/resources/user_service/user-service-retrieve-identity-provider-information) + +### Request +```bash +curl --request POST \ + --url https://$ZITADEL_DOMAIN/v2alpha/users/intents/$INTENT_ID/information \ + --header 'Accept: application/json' \ + --header 'Authorization: Bearer '"$TOKEN"''\ + --header 'Content-Type: application/json' \ + --data '{ + "token": "k50WQmDaPIazQDJsyKaEPaQPwgsytxqgQ3K1ifQeQtAmeQ" +}' +``` + +### Response + +```bash +{ + "details": { + "sequence": "599", + "changeDate": "2023-06-15T06:44:26.039444Z", + "resourceOwner": "163840776835432705" + }, + "idpInformation": { + "oauth": { + "accessToken": "ya29.a0AWY7CknrOORopcJK2XX2fQXV9NQpp8JdkKYx-mQZNrR-wktWWhc3QsepT6kloSCgFPS9N0beEBlEYoY5oYUhfc7VlLHTQz5iECE386pyx5YmTueyeQ9GXk1dAw89gi8KRyjNlJApFsfLJaoiLIvKJLf23eAyXgaCgYKAUMSARESFQG1tDrpnTJ2su8BBO24zfmzgneARw0165", + "idToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg1YmE5MzEzZmQ3YTdkNGFmYTg0ODg0YWJjYzg0MDMwMDQzNjMxODAiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJhenAiOiIxODI5MDIwMjY1MDgtdW1taXQ3dHZjbHBnM2NxZmM4b2ljdGE1czI1aGtudWwuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJhdWQiOiIxODI5MDIwMjY1MDgtdW1taXQ3dHZjbHBnM2NxZmM4b2ljdGE1czI1aGtudWwuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMTEzOTI4MDU5NzU3MTU4NTY2MzciLCJoZCI6InJvb3RkLmNoIiwiZW1haWwiOiJmYWJpZW5uZUByb290ZC5jaCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJhdF9oYXNoIjoidGN5X25JTkZHNnFhRTBZTWFsQzZGdyIsIm5hbWUiOiJGYWJpZW5uZSBCw7xobGVyIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FBY0hUdGY5NzNRNk5IOEt6S1RNRVpFTFBVOWx4NDVXcFE5RlJCdXhGZFBiPXM5Ni1jIiwiZ2l2ZW5fbmFtZSI6IkZhYmllbm5lIiwiZmFtaWx5X25hbWUiOiJCw7xobGVyIiwibG9jYWxlIjoiZGUiLCJpYXQiOjE2ODY4MTE0NjUsImV4cCI6MTY4NjgxNTA2NX0.PwlAHRM44e8eYyHzdfotOrcq5GZc4D15mWvN3rGdoDmu2RRgb4T0nDgkY6AVq2vNJxPfbiB1jFtNP6dgX-OgLIxNXg_tJJhwFh-eFPA37cIiv1CEcgEC-q1zXFIa3HrwHLreeU6i7C9JkDrKpkS-AKat1krf27QXxrxHLrWehi5F2l1OZuAKFWYaYmJOd0sVTDBA2o5SDcAiQs_D4-Q-kSl5f0gh607YVHLv7zjyfHtAOs7xPEkNEUVcqGBke2Zy9kAYIgiMriNxLA2EDxFtSyWnf-bCXKnuVX2hwEY0T0lUPrOAVkz7MEOKiacE2xAOczoQvl-wECU0UofLi8XZqg" + }, + "idpId": "218528353504723201", + "rawInformation": { + "User": { + "email": "fabienne@rootd.ch", + "email_verified": true, + "family_name": "Bühler", + "given_name": "Fabienne", + "hd": "rootd.ch", + "locale": "de", + "name": "Fabienne Bühler", + "picture": "https://lh3.googleusercontent.com/a/AAcKTtf973Q6NH8KzKTMEZELPU9lx45WpQ9FRBuxFdPb=s96-c", + "sub": "111392805975715856637" + } + } + } +} +``` + +## Handle Provider Information +After successfully authenticating using your identity provider, you have three possible options. +1. Login +2. Register user +3. Add social login to existing user + +### Login + +If you did get a user ID in the parameters when calling your success page, you know that a user is already linked with the used identity provider and you are ready to perform the login. +Create a new session and include the intent ID and the token in the checks. +This check requires that the previous step ended on the successful page and didn't’t result in an error. + +#### Request +```bash +curl --request POST \ + --url https://$ZITADEL_DOMAIN/v2alpha/sessions \ + --header 'Accept: application/json' \ + --header 'Authorization: Bearer '"$TOKEN"''\ + + --header 'Content-Type: application/json' \ + --data '{ + "checks": { + "user": { + "userId": "218662596918640897" + }, + "intent": { + "intentId": "219647325729980673", + "token": "k86ihn-VLMMUGKy1q1b5i_foECspKYqei1l4mS8LT7Xzjw" + } + } +}' +``` + +### Register + +If you didn't get a user ID in the parameters of your success page, you know that there is no existing user in ZITADEL with that provider, and you can register a new user or link it to an existing account (read the next section). + +Fill the IdP links in the create user request to add a user with an external login provider. +The idpId is the ID of the provider in ZITADEL, the idpExternalId is the ID of the user in the external identity provider; usually, this is sent in the “sub”. +The display name is used to list the linkings on the users. + +[Create User API Documentation](https://zitadel.com/docs/apis/resources/user_service/user-service-add-human-user) + +#### Request +```bash +curl --request POST \ + --url https://$ZITADEL_DOMAIN/v2alpha/users/human \ + --header 'Accept: application/json' \ + --header 'Authorization: Bearer '"$TOKEN"''\ + --header 'Content-Type: application/json' \ + --data '{ + "username": "minni-mouse@mouse.com", + "profile": { + "firstName": "Minnie", + "lastName": "Mouse", + "nickName": "Mini", + "displayName": "Minnie Mouse", + "preferredLanguage": "en", + "gender": "GENDER_FEMALE" + }, + "email": { + "email": "minni-mouse@mouse.com", + "isVerified": true + }, + "idpLinks": [ + { + "idpId": "218528353504723201", + "idpExternalId": "111392805975715856637", + "displayName": "Minnie Mouse" + } + ] +}' +``` + +### Add External Login to Existing User + +If you didn't get a user ID in the parameters to your success page, you know that there is no existing user in ZITADEL with that provider and you can register a new user (read previous section), or link it to an existing account. + +If you want to link/connect to an existing account you can perform the add identity provider link request. +[Add IDP Link to existing user documentation](https://zitadel.com/docs/apis/resources/user_service/user-service-add-idp-link) + +#### Request +```bash +curl --request POST \ + --url https://$ZITADEL_DOMAIN/v2alpha/users/users/218385419895570689/links \ + --header 'Accept: application/json' \ + --header 'Authorization: Bearer '"$TOKEN"''\ + --header 'Content-Type: application/json' \ + --data '{ + "idpLink": { + "idpId": "218528353504723201", + "idpExternalId": "1113928059757158566371", + "displayName": "Minnie Mouse" + } +}' +``` \ No newline at end of file diff --git a/docs/docs/guides/integrate/login-ui/logout.mdx b/docs/docs/guides/integrate/login-ui/logout.mdx new file mode 100644 index 000000000..095f3b792 --- /dev/null +++ b/docs/docs/guides/integrate/login-ui/logout.mdx @@ -0,0 +1,7 @@ +--- +title: Logout +--- + +import Logout from './_logout.mdx'; + + \ No newline at end of file diff --git a/docs/docs/guides/integrate/login-ui/oidc-standard.mdx b/docs/docs/guides/integrate/login-ui/oidc-standard.mdx new file mode 100644 index 000000000..0a7b5093a --- /dev/null +++ b/docs/docs/guides/integrate/login-ui/oidc-standard.mdx @@ -0,0 +1,26 @@ +--- +title: OIDC Standard +--- + +:::info +Not yet implemented, but should give you a general impression of how it will work +Subscribe to the following issue: https://github.com/orgs/zitadel/projects/2/views/1?filterQuery=oidc&pane=issue&itemId=23181369 +::: + +To build your own login ui for your own application it is not necessary to have the OIDC standard included or any additional work that has to be done. +However, it might make sense, if you want to connect your login to different applications especially if they are not in your control and they rely on the standard. + +The following flow shows you the different components you need to enable OIDC for your login. +![OIDC Flow](/img/guides/login-ui/oidc-flow.png) + +1. Your application makes an authorization request to your login UI +2. The login UI takes the requests and sends them to the ZITADEL API. In the request to the ZITADEL API, a header to authenticate your client is needed. +3. The ZITADEL API parses the request and does what it needs to interpret certain parameters (e.g., organization scope, etc.) +4. Redirect to a predefined, relative URL of the login UI that includes the authrequest ID +5. Request to ZITADEL API to get all the information from the auth request +6. Create and update the session till the login flow is complete and the user is authenticated. Make sure to include the auth Request ID in the session +7. Read the callback URL from the ZITADEL API +8. Redirect to your application with the callback URL you got in the previous request +9. All OIDC-specific endpoints have to be accepted in the Login UI and should be proxied and sent to the ZITADEL API + + diff --git a/docs/docs/guides/integrate/login-ui/select-account.mdx b/docs/docs/guides/integrate/login-ui/select-account.mdx new file mode 100644 index 000000000..b7005aa23 --- /dev/null +++ b/docs/docs/guides/integrate/login-ui/select-account.mdx @@ -0,0 +1,7 @@ +--- +title: Select Account +--- + +import SelectAccount from './_select-account.mdx'; + + \ No newline at end of file diff --git a/docs/docs/guides/integrate/login-ui/username-password.mdx b/docs/docs/guides/integrate/login-ui/username-password.mdx new file mode 100644 index 000000000..393aacaf0 --- /dev/null +++ b/docs/docs/guides/integrate/login-ui/username-password.mdx @@ -0,0 +1,236 @@ +--- +title: Register and Login User with Password +sidebar_label: Username and Password +--- + +## Flow + +![Register and Login Flow](/img/guides/login-ui/username-password-flow.png) + +## Register + +First, we create a new user with a username and password. In the example below we add a user with profile data, a verified email address, and a password. +[Create User Documentation](https://zitadel.com/docs/apis/resources/user_service/user-service-add-human-user) + +### Request + +```bash +curl --request POST \ + --url https://$ZITADEL_DOMAIN/v2alpha/users/human \ + --header 'Accept: application/json' \ + --header 'Authorization: Bearer '"$TOKEN"'' \ + --header 'Content-Type: application/json' \ + --data '{ + "userId": "d654e6ba-70a3-48ef-a95d-37c8d8a7901a", + "username": "minnie-mouse", + "profile": { + "firstName": "Minnie", + "lastName": "Mouse", + "nickName": "Mini", + "displayName": "Minnie Mouse", + "preferredLanguage": "en", + "gender": "GENDER_FEMALE" + }, + "email": { + "email": "mini@mouse.com", + "isVerified": true + }, + "metadata": [ + { + "key": "my-key", + "value": "VGhpcyBpcyBteSB0ZXN0IHZhbHVl" + } + ], + "password": { + "password": "Secr3tP4ssw0rd!", + "changeRequired": false + } +}' +``` + +### Response + +```bash +{ + "userId": "d654e6ba-70a3-48ef-a95d-37c8d8a7901a", + "details": { + "sequence": "570", + "changeDate": "2023-06-13T12:44:36.967851Z", + "resourceOwner": "163840776835432705" + } +} +``` + +If you want the user to verify the email address you can either choose that ZITADEL sends a verification email to the user by adding a urlTemplate into the sendCode, or ask for a return code to send your own emails. + +Send Email by ZITADEL: + +```bash +"sendCode": { + "urlTemplate": "https://example.com/email/verify?userID={{.UserID}}&code={{.Code}}&orgID={{.OrgID}}" +}, +``` + +Return Code: +```bash +"email": { + "email": "mini@mouse.com", + "returnCode": {} +}, +``` + +To check what is allowed on your instance, call the settings service for more information. +The following requests can be useful for registration: +- [Get Login Settings](https://zitadel.com/docs/apis/resources/settings_service/settings-service-get-login-settings) To find out which authentication possibilities are enabled (password, identity provider, etc.) +- [Get Password Complexity Settings](https://zitadel.com/docs/apis/resources/settings_service/settings-service-get-password-complexity-settings) to find out how the password should look like (length, characters, etc.) + +## Create Session with User Check + +After you have created a new user, you can redirect him to your login screen. +You can either create a new empty session as soon as the first login screen is shown or update it with each piece of information you get throughout the process. +Or you can create a new session with the first credentials a user enters. +In the following example, we assume that the login flow asks for the username in the first step, and in the second for the password. +In API requests, this means creating a new session with a username and updating it with the password. +If you already have the userId from a previous register, you can send it directly to skip the username and show the password screen directly. +The create and update session endpoints will always return a session ID and an opaque session token. +If you do not rely on the OIDC standard you can directly use the token. +Send it to the Get Session Endpoint to find out how the user has authenticated. + +- [Create new session Documentation](https://zitadel.com/docs/apis/resources/session_service/session-service-create-session) +- [Update an existing session Documentation](https://zitadel.com/docs/apis/resources/session_service/session-service-set-session) +- [Get Session Documentation](https://zitadel.com/docs/apis/resources/session_service/session-service-get-session) + +### Request + +```bash +curl --request POST \ + --url https://$ZITADEL_DOMAIN/v2alpha/sessions \ + --header 'Accept: application/json' \ + --header 'Authorization: Bearer '"$TOKEN"'' \ + --header 'Content-Type: application/json' \ + --data '{ + "checks": { + "user": { + "loginName": "minnie-mouse@fabi.zitadel.app" + } + } +}' +``` + +### Response + +```bash +{ + "details": { + "sequence": "580", + "changeDate": "2023-06-14T05:32:39.007096Z", + "resourceOwner": "163840776835432705" + }, + "sessionId": "218480890961985793", + "sessionToken": "yMDi6uVPJAcphbbz0LaxC07ihWkNTe7m0Xqch8SzfM5Cz3HSIQIDZ65x1f5Qal0jxz0MEyo-_zYcUg" +} +``` + +### Session State + +If you read the newly created session, it will look like the following. +You can see the creation and change date. +In the factors, you will see all the checks that have been made. +In this case, the user has been checked. + +```bash +{ + "session": { + "id": "218480890961985793", + "creationDate": "2023-06-14T05:32:38.977954Z", + "changeDate": "2023-06-14T05:32:39.007096Z", + "sequence": "580", + "factors": { + "user": { + "verifiedAt": "2023-06-14T05:32:38.972712Z", + "id": "d654e6ba-70a3-48ef-a95d-37c8d8a7901a", + "loginName": "minnie-mouse@fabi.zitadel.app", + "displayName": "Minnie Mouse" + } + } + } +} +``` + +## Update Session with Password + +Your session already has a username check. +The next step is to check the password. +To update an existing session, add the session ID to the URL and the session token you got in the previous step to the request body. + +### Request + +```bash +curl --request PATCH \ + --url https://$ZITADEL_DOMAIN/v2alpha/sessions/$SESSION_ID \ + --header 'Accept: application/json' \ + --header 'Authorization: Bearer '"$TOKEN"''\ + --header 'Content-Type: application/json' \ + --data '{ + "sessionToken": "yMDi6uVPJAcphbbz0LaxC07ihWkNTe7m0Xqch8SzfM5Cz3HSIQIDZ65x1f5Qal0jxz0MEyo-_zYcUg", + "checks": { + "password": { + "password": "Secr3tP4ssw0rd!" + } + } +}' +``` + +### Response + +The response of the create and update session token looks the same. +Make sure to always use the session token of the last response you got, as the values may be updated. + +```bash +{ + "details": { + "sequence": "582", + "changeDate": "2023-06-14T05:42:11.631901Z", + "resourceOwner": "163840776835432705" + }, + "sessionToken": "blGKerGQPKv8jN21p6E9GB1B-vl6_EyKlvTd5UALu8-aQmjucgZxHSXJx3XMFTwT9_Y3VnbOo3gC_Q" +} +``` + +### Session State +If you read your session after the password check, you will see that the check has been added to the factors with the verification date. + +```bash +{ + "session": { + "id": "218480890961985793", + "creationDate": "2023-06-14T05:32:38.977954Z", + "changeDate": "2023-06-14T05:42:11.631901Z", + "sequence": "582", + "factors": { + "user": { + "verifiedAt": "2023-06-14T05:32:38.972712Z", + "id": "d654e6ba-70a3-48ef-a95d-37c8d8a7901a", + "loginName": "minnie-mouse@fabi.zitadel.app", + "displayName": "Minnie Mouse" + }, + "password": { + "verifiedAt": "2023-06-14T05:42:11.619484Z" + } + } + } +} + +``` + +## List the Sessions (Account Chooser) + +import SelectAccount from './_select-account.mdx'; + + + +## Logout User + +import Logout from './_logout.mdx'; + + diff --git a/docs/sidebars.js b/docs/sidebars.js index cace2f404..609836685 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -167,6 +167,26 @@ module.exports = { "guides/integrate/pat", ], }, + { + type: "category", + label: "Build your own Login-UI", + link: { + type: "generated-index", + title: "Build your own Login-UI", + slug: "/guides/integrate/identity-providers", + description: + "In the following guides you will learn how to create your own login ui with our APIs. The different scenarios like username/password, external identity provider, etc will be shown.", + + }, + collapsed: true, + items: [ + "guides/integrate/login-ui/username-password", + "guides/integrate/login-ui/external-login", + "guides/integrate/login-ui/select-account", + "guides/integrate/login-ui/logout", + "guides/integrate/login-ui/oidc-standard" + ], + }, { type: "category", label: "Configure identity providers", diff --git a/docs/static/img/guides/login-ui/external-login-flow.png b/docs/static/img/guides/login-ui/external-login-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..c8678bb2cb68875de26dbcad6c4c58d43cb1c45d GIT binary patch literal 286190 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 lqnhg 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
&86PA)Ee)9^vDDazJJ*o6^f3ArY-FzkfS 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
    ZAE4>8gb`- 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⪼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 )3NXJFU+A@@(#aAfsMHM+{-wYQGl@3h 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 literal 0 HcmV?d00001 diff --git a/docs/static/img/guides/login-ui/username-password-flow.png b/docs/static/img/guides/login-ui/username-password-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..7be7810b0ffe579991ed79baeae082defee1e2e2 GIT binary patch literal 276762 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

    2zsHnL1 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%0AUhNn`egR=U1 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 T#giL=f9GtSzAHWLllXrCKVXb$ literal 0 HcmV?d00001 From 9fa3c6233ec4890833896f27be1587bdd15b7a9d Mon Sep 17 00:00:00 2001 From: Fabi Date: Fri, 23 Jun 2023 10:16:06 +0200 Subject: [PATCH 32/37] docs: right link (#6076) --- docs/sidebars.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sidebars.js b/docs/sidebars.js index 609836685..755a57085 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -173,7 +173,7 @@ module.exports = { link: { type: "generated-index", title: "Build your own Login-UI", - slug: "/guides/integrate/identity-providers", + slug: "/guides/integrate/login-ui", description: "In the following guides you will learn how to create your own login ui with our APIs. The different scenarios like username/password, external identity provider, etc will be shown.", From 244f16ac48cf7ee28afc60661c0e6471f845a8be Mon Sep 17 00:00:00 2001 From: Max Peintner Date: Fri, 23 Jun 2023 17:01:08 +0200 Subject: [PATCH 33/37] chore(console): dependencies (#6078) * cli, core * material, cdk * deps * lock * chore(deps): bump socket.io-parser from 4.2.2 to 4.2.4 in /console (#5988) Bumps [socket.io-parser](https://github.com/socketio/socket.io-parser) from 4.2.2 to 4.2.4. - [Release notes](https://github.com/socketio/socket.io-parser/releases) - [Changelog](https://github.com/socketio/socket.io-parser/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/socket.io-parser/compare/4.2.2...4.2.4) --- updated-dependencies: - dependency-name: socket.io-parser dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- console/package-lock.json | 4793 +++++++++++++++---------------------- console/package.json | 38 +- 2 files changed, 1979 insertions(+), 2852 deletions(-) diff --git a/console/package-lock.json b/console/package-lock.json index acdadd6fd..19876cb78 100644 --- a/console/package-lock.json +++ b/console/package-lock.json @@ -8,18 +8,18 @@ "name": "console", "version": "0.0.0", "dependencies": { - "@angular/animations": "^16.0.1", - "@angular/cdk": "^16.0.1", - "@angular/common": "^16.0.1", - "@angular/compiler": "^16.0.1", - "@angular/core": "^16.0.1", - "@angular/forms": "^16.0.1", - "@angular/material": "^16.0.1", - "@angular/material-moment-adapter": "^16.0.1", - "@angular/platform-browser": "^16.0.1", - "@angular/platform-browser-dynamic": "^16.0.1", - "@angular/router": "^16.0.1", - "@angular/service-worker": "^16.0.1", + "@angular/animations": "^16.1.2", + "@angular/cdk": "^16.1.2", + "@angular/common": "^16.1.2", + "@angular/compiler": "^16.1.2", + "@angular/core": "^16.1.2", + "@angular/forms": "^16.1.2", + "@angular/material": "^16.1.2", + "@angular/material-moment-adapter": "^16.1.2", + "@angular/platform-browser": "^16.1.2", + "@angular/platform-browser-dynamic": "^16.1.2", + "@angular/router": "^16.1.2", + "@angular/service-worker": "^16.1.2", "@ctrl/ngx-codemirror": "^6.1.0", "@grpc/grpc-js": "^1.8.14", "@ngx-translate/core": "^14.0.0", @@ -37,7 +37,7 @@ "libphonenumber-js": "^1.10.30", "material-design-icons-iconfont": "^6.1.1", "moment": "^2.29.4", - "ngx-color": "^8.0.3", + "ngx-color": "^9.0.0", "rxjs": "~7.8.0", "tinycolor2": "^1.6.0", "tslib": "^2.4.1", @@ -45,25 +45,25 @@ "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.0.1", + "@angular-devkit/build-angular": "^16.1.1", "@angular-eslint/builder": "16.0.1", "@angular-eslint/eslint-plugin": "16.0.1", "@angular-eslint/eslint-plugin-template": "16.0.1", "@angular-eslint/schematics": "16.0.1", "@angular-eslint/template-parser": "16.0.1", - "@angular/cli": "^16.0.1", - "@angular/compiler-cli": "^16.0.1", - "@angular/language-service": "^16.0.1", + "@angular/cli": "^16.1.1", + "@angular/compiler-cli": "^16.1.2", + "@angular/language-service": "^16.1.2", "@bufbuild/buf": "^1.18.0-1", "@types/file-saver": "^2.0.2", "@types/google-protobuf": "^3.15.3", - "@types/jasmine": "~4.3.0", + "@types/jasmine": "~4.3.3", "@types/jasminewd2": "~2.0.10", "@types/jsonwebtoken": "^9.0.1", "@types/node": "^18.15.11", "@types/qrcode": "^1.5.0", "@types/uuid": "^9.0.1", - "@typescript-eslint/eslint-plugin": "^5.59.2", + "@typescript-eslint/eslint-plugin": "^5.59.11", "@typescript-eslint/parser": "^5.59.5", "codelyzer": "^6.0.2", "eslint": "^8.39.0", @@ -94,12 +94,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1600.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1600.1.tgz", - "integrity": "sha512-7N3Dugrp3Fyyn3Q6RsxFNJJ2m1QuqcF3GHJcX7siINL37Hp6xI/q5gKffcd9rf20H1DYZE0VIbR1Sk31G6hMWg==", + "version": "0.1601.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.1.tgz", + "integrity": "sha512-LUHaxdAZrvh++7/R+/hzVY5moEVVTjd30b25SNNYcNJsWox1Yh9idu1AvtEuZR/A8Jj+sbHnuw0176GsJ78stg==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.0.1", + "@angular-devkit/core": "16.1.1", "rxjs": "7.8.1" }, "engines": { @@ -109,40 +109,40 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.0.1.tgz", - "integrity": "sha512-VFhUViBfONOf6Ji4Lfkxlk+GN5l8Owm4Z0McqUIegrXsq3aSSStBBFdaDESpzhS6GIGqEBjjHMUQK8IlWT+EIQ==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.1.tgz", + "integrity": "sha512-k+9hQLGgGWHj7NJ7Fm6nwCDsvseKlipKE6Me9ydliNKclwJ0l+ScpXS/iZA1+Geud7IX3McGWf2QemWj1Nds9g==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1600.1", - "@angular-devkit/build-webpack": "0.1600.1", - "@angular-devkit/core": "16.0.1", - "@babel/core": "7.21.4", - "@babel/generator": "7.21.4", - "@babel/helper-annotate-as-pure": "7.18.6", - "@babel/helper-split-export-declaration": "7.18.6", + "@angular-devkit/architect": "0.1601.1", + "@angular-devkit/build-webpack": "0.1601.1", + "@angular-devkit/core": "16.1.1", + "@babel/core": "7.22.5", + "@babel/generator": "7.22.5", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.5", "@babel/plugin-proposal-async-generator-functions": "7.20.7", - "@babel/plugin-transform-async-to-generator": "7.20.7", - "@babel/plugin-transform-runtime": "7.21.4", - "@babel/preset-env": "7.21.4", - "@babel/runtime": "7.21.0", - "@babel/template": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.5", + "@babel/preset-env": "7.22.5", + "@babel/runtime": "7.22.5", + "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.0.1", + "@ngtools/webpack": "16.1.1", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", "babel-loader": "9.1.2", "babel-plugin-istanbul": "6.1.1", - "browserslist": "4.21.5", - "cacache": "17.0.6", + "browserslist": "^4.21.5", + "cacache": "17.1.3", "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.16", - "css-loader": "6.7.3", - "esbuild-wasm": "0.17.18", - "glob": "8.1.0", + "critters": "0.0.19", + "css-loader": "6.8.1", + "esbuild-wasm": "0.17.19", + "fast-glob": "3.2.12", "https-proxy-agent": "5.0.1", "inquirer": "8.2.4", "jsonc-parser": "3.2.0", @@ -152,31 +152,31 @@ "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", "magic-string": "0.30.0", - "mini-css-extract-plugin": "2.7.5", + "mini-css-extract-plugin": "2.7.6", "mrmime": "1.0.1", "open": "8.4.2", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "2.3.1", "piscina": "3.2.0", - "postcss": "8.4.23", - "postcss-loader": "7.2.4", + "postcss": "8.4.24", + "postcss-loader": "7.3.2", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.62.1", - "sass-loader": "13.2.2", - "semver": "7.4.0", + "sass": "1.63.2", + "sass-loader": "13.3.1", + "semver": "7.5.1", "source-map-loader": "4.0.1", "source-map-support": "0.5.21", - "terser": "5.17.1", + "terser": "5.17.7", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.5.0", - "vite": "4.3.1", - "webpack": "5.80.0", - "webpack-dev-middleware": "6.0.2", - "webpack-dev-server": "4.13.2", - "webpack-merge": "5.8.0", + "tslib": "2.5.3", + "vite": "4.3.9", + "webpack": "5.86.0", + "webpack-dev-middleware": "6.1.1", + "webpack-dev-server": "4.15.0", + "webpack-merge": "5.9.0", "webpack-subresource-integrity": "5.1.0" }, "engines": { @@ -185,20 +185,20 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.17.18" + "esbuild": "0.17.19" }, "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "@angular/localize": "^16.0.0", - "@angular/platform-server": "^16.0.0", - "@angular/service-worker": "^16.0.0", + "@angular/compiler-cli": "^16.1.0", + "@angular/localize": "^16.1.0", + "@angular/platform-server": "^16.1.0", + "@angular/service-worker": "^16.1.0", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", "karma": "^6.3.0", - "ng-packagr": "^16.0.0", + "ng-packagr": "^16.1.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.9.3 <5.1" + "typescript": ">=4.9.3 <5.2" }, "peerDependenciesMeta": { "@angular/localize": { @@ -230,13 +230,85 @@ } } }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1600.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1600.1.tgz", - "integrity": "sha512-yCy5A1UwGzpst3QJ/CRo2Y8HWRqTPOfwAPAVl91Lbch7gBFViRvq6E7N1XfQunPu/eXvKxbuq2mFSDqtyZ1mWw==", + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1600.1", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-webpack": { + "version": "0.1601.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.1.tgz", + "integrity": "sha512-J1O+5qiwCYNCFTKtczhWC3wycuks/3GitmbYv3GMSBz2HJU5XSTtGdlkSvkwCocLHa8ggPlnquLsQNjwcd+EQg==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1601.1", "rxjs": "7.8.1" }, "engines": { @@ -250,9 +322,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.0.1.tgz", - "integrity": "sha512-2uz98IqkKJlgnHbWQ7VeL4pb+snGAZXIama2KXi+k9GsRntdcw+udX8rL3G9SdUGUF+m6+147Y1oRBMHsO/v4w==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.1.tgz", + "integrity": "sha512-rhyY/N4iKbpfKmErmNmAfBLMrc1H8u8NlfcU6lwN6kbBbM8BfvLk9b7g4JXOfiOQfp4BnQ8CFf7xcIUy4++Tog==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -276,12 +348,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.0.1.tgz", - "integrity": "sha512-A9D0LTYmiqiBa90GKcSuWb7hUouGIbm/AHbJbjL85WLLRbQA2PwKl7P5Mpd6nS/ZC0kfG4VQY3VOaDvb3qpI9g==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.1.tgz", + "integrity": "sha512-s8LFr0m4ILEpJuQj78fCWKocnRleA3MWJU1Q5LZloCcUB8fdDvaPNCt5s0VWC2Sp+4OCxJaSN3kjjcFbCYFvTA==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.0.1", + "@angular-devkit/core": "16.1.1", "jsonc-parser": "3.2.0", "magic-string": "0.30.0", "ora": "5.4.1", @@ -392,9 +464,9 @@ } }, "node_modules/@angular/animations": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.0.1.tgz", - "integrity": "sha512-ziRq1hGJJuQqQUHqNpEMp9uy1pVutvL8oNvawblh32u4bnLsVQU5gMd6sTonn0x4sphEwMNnuEmp/q6QRIx+pA==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.2.tgz", + "integrity": "sha512-Q2hdXYKaNGCRQf1G2E1L/P0lw5thAkC0g/L2GdmB+bgyPCTTk1B7WxDN/SVUCfdz1nReZiLepL3Y24RKeQ6Blw==", "dependencies": { "tslib": "^2.3.0" }, @@ -402,13 +474,13 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.0.1" + "@angular/core": "16.1.2" } }, "node_modules/@angular/cdk": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.0.1.tgz", - "integrity": "sha512-GupYss6x84RWEoy3JTYu4Igr2SxHuV6whVKMScQG2/Gm+winOsOn7YWm0IZQuFnjSWIF2Va5B0Tp0IjFHWxTvA==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.1.2.tgz", + "integrity": "sha512-sUiaY6QgiplSuhzN7Fp5HUW3HPyz3g8ET45W0I2bSiSmSaDEATLWwVXfxSC4/ZL+YdZHoC9LkYKDSktPO2EDaA==", "dependencies": { "tslib": "^2.3.0" }, @@ -422,27 +494,27 @@ } }, "node_modules/@angular/cli": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.0.1.tgz", - "integrity": "sha512-0vIAcq/S+3NXXN4/gBQFVGaxLUQ0zhRxxHQQuiT7GGII73UySuhwvaFB1BEhYG5HVJjRrP1F0ZYbvsvrmFzfXQ==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.1.tgz", + "integrity": "sha512-QrTgMqMnamteZu2x3JhLMo6wBjI05zMr9RQfMHWq4UrUpTqBcHAMqJIKSSbvrtuRbolLrQyLorwxzlmEOfEmbQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1600.1", - "@angular-devkit/core": "16.0.1", - "@angular-devkit/schematics": "16.0.1", - "@schematics/angular": "16.0.1", + "@angular-devkit/architect": "0.1601.1", + "@angular-devkit/core": "16.1.1", + "@angular-devkit/schematics": "16.1.1", + "@schematics/angular": "16.1.1", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", - "ini": "4.0.0", + "ini": "4.1.1", "inquirer": "8.2.4", "jsonc-parser": "3.2.0", "npm-package-arg": "10.1.0", "npm-pick-manifest": "8.0.1", "open": "8.4.2", "ora": "5.4.1", - "pacote": "15.1.3", + "pacote": "15.2.0", "resolve": "1.22.2", - "semver": "7.4.0", + "semver": "7.5.1", "symbol-observable": "4.0.0", "yargs": "17.7.2" }, @@ -455,10 +527,43 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular/cli/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular/cli/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular/cli/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/@angular/common": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.0.1.tgz", - "integrity": "sha512-ic9Ri4Mepf4c0BTff7o4Oyl/a1vACNXXUzuoTwIjWnIqrH89dtwg7ncTD9Rv0N1lon7r4gXokTbn9A/Yk/0jbw==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.2.tgz", + "integrity": "sha512-MrJ1CUKg4H8fH0Jc771gLceVcawBPjIM6TSLEM7DMeX7SZ6eSU9HAOCTHXBg7Kmb7ZS19G1BQBD/tkjivszk+Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -466,14 +571,14 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.0.1", + "@angular/core": "16.1.2", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.0.1.tgz", - "integrity": "sha512-7zNo6H1qVQow3T4EUul76SaIDSMRSl0hmtyWUzPjtWkxMjrCPSduqjA4/NHaG0KX1BsUvUtQEoDJ5jv/7EHWTQ==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.2.tgz", + "integrity": "sha512-uLUyesolGL8sEb03GfwSFbtTa++XPQyabAUi53Nz5jzRhFzxCa6cO7w4DCxp7yzQM+8jiPKAuw9bQDNv1eYR7A==", "dependencies": { "tslib": "^2.3.0" }, @@ -481,7 +586,7 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.0.1" + "@angular/core": "16.1.2" }, "peerDependenciesMeta": { "@angular/core": { @@ -490,12 +595,12 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.0.1.tgz", - "integrity": "sha512-EW7Oxp8EuTz3vCNd4RAncZGB7dCUYviUkBA4PzuyPmL2copZPt12j9qx0pXXF3T6ydjoZ+99ZEgfkKOV6FeU3g==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.2.tgz", + "integrity": "sha512-7Z4qPNv6zRTF8U0CEAqJMF2kzyImilOgGwp92PqwhycZIj/MQyN7Txv8uv2rghhCr9jt9bL2vrHPJNGD2UNLxw==", "dev": true, "dependencies": { - "@babel/core": "7.19.3", + "@babel/core": "7.21.8", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", @@ -513,53 +618,14 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "16.0.1", - "typescript": ">=4.9.3 <5.1" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", - "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "@angular/compiler": "16.1.2", + "typescript": ">=4.9.3 <5.2" } }, "node_modules/@angular/core": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.0.1.tgz", - "integrity": "sha512-3s4XBbzWgyWcjI0WFlNDKRxsbm4J+OKIL4mJCM9r8gWwno9y0K/giziAm9YMIJ4VOBIvrcMbOh85o44FCk8cRA==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.2.tgz", + "integrity": "sha512-1w8DcSY/ZJT6qBaZWZGNQ50YQ5Cffm7xXSIcjIZeQwQKRAZNlZ1O/pFEer1kvxkAbVsQH3Nf6kB6t8PkNFCWMg==", "dependencies": { "tslib": "^2.3.0" }, @@ -572,9 +638,9 @@ } }, "node_modules/@angular/forms": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.0.1.tgz", - "integrity": "sha512-VbH/YnEBau0q97zI7BjSk0pu/i2S0Y/zmhvA2wgI2CCvtbqT6hCNdE/3rW6ZFBcnuCe+dFhuchXe6dX28epsvg==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.2.tgz", + "integrity": "sha512-OyAQRYE6B2NbucoE5KzmxkQqFFlcSnB8/LWS/J9KHGB1QkPdYJCuWSccypeo4YxgVjYCSvHDnO6jBiHDfwDBuQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -582,78 +648,78 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.0.1", - "@angular/core": "16.0.1", - "@angular/platform-browser": "16.0.1", + "@angular/common": "16.1.2", + "@angular/core": "16.1.2", + "@angular/platform-browser": "16.1.2", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.0.1.tgz", - "integrity": "sha512-m5+B0vi92le8EIxrlOruijNSjYG2Nny8hrAwt4yhoMr9HIym9nGeMXgYKYurMnqigI7zq/ZwJfnpmZ7QwjYkgA==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.1.2.tgz", + "integrity": "sha512-pCneNUjrr7SYUBeqqznoGA5V+RTRMljrg4WFufth3jtnKRCWE1XR+MYNDGejfOx/mQZNxBsjz4l83FTwiqjsRQ==", "dev": true, "engines": { "node": "^16.14.0 || >=18.10.0" } }, "node_modules/@angular/material": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-16.0.1.tgz", - "integrity": "sha512-J7qI60CXgixSLtepxzKzSkid9pxgruUfQDfZeTXSzg7WFb7/OgFeggUx0p/BlbC2NIdTaIFBBh71GNve/c1O9Q==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-16.1.2.tgz", + "integrity": "sha512-lG88yMnlRkPqXxWpT4Uh3YxwQY3xzaV8dP/Rr3Qtlh0yhp2CEWBmC6Cu1VcHpq0G3VLapO61PIzxSj9125CN5Q==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/auto-init": "15.0.0-canary.3b5b55e31.0", - "@material/banner": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/button": "15.0.0-canary.3b5b55e31.0", - "@material/card": "15.0.0-canary.3b5b55e31.0", - "@material/checkbox": "15.0.0-canary.3b5b55e31.0", - "@material/chips": "15.0.0-canary.3b5b55e31.0", - "@material/circular-progress": "15.0.0-canary.3b5b55e31.0", - "@material/data-table": "15.0.0-canary.3b5b55e31.0", - "@material/density": "15.0.0-canary.3b5b55e31.0", - "@material/dialog": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/drawer": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/fab": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/floating-label": "15.0.0-canary.3b5b55e31.0", - "@material/form-field": "15.0.0-canary.3b5b55e31.0", - "@material/icon-button": "15.0.0-canary.3b5b55e31.0", - "@material/image-list": "15.0.0-canary.3b5b55e31.0", - "@material/layout-grid": "15.0.0-canary.3b5b55e31.0", - "@material/line-ripple": "15.0.0-canary.3b5b55e31.0", - "@material/linear-progress": "15.0.0-canary.3b5b55e31.0", - "@material/list": "15.0.0-canary.3b5b55e31.0", - "@material/menu": "15.0.0-canary.3b5b55e31.0", - "@material/menu-surface": "15.0.0-canary.3b5b55e31.0", - "@material/notched-outline": "15.0.0-canary.3b5b55e31.0", - "@material/radio": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/segmented-button": "15.0.0-canary.3b5b55e31.0", - "@material/select": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/slider": "15.0.0-canary.3b5b55e31.0", - "@material/snackbar": "15.0.0-canary.3b5b55e31.0", - "@material/switch": "15.0.0-canary.3b5b55e31.0", - "@material/tab": "15.0.0-canary.3b5b55e31.0", - "@material/tab-bar": "15.0.0-canary.3b5b55e31.0", - "@material/tab-indicator": "15.0.0-canary.3b5b55e31.0", - "@material/tab-scroller": "15.0.0-canary.3b5b55e31.0", - "@material/textfield": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tooltip": "15.0.0-canary.3b5b55e31.0", - "@material/top-app-bar": "15.0.0-canary.3b5b55e31.0", - "@material/touch-target": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/auto-init": "15.0.0-canary.90291f2e2.0", + "@material/banner": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/button": "15.0.0-canary.90291f2e2.0", + "@material/card": "15.0.0-canary.90291f2e2.0", + "@material/checkbox": "15.0.0-canary.90291f2e2.0", + "@material/chips": "15.0.0-canary.90291f2e2.0", + "@material/circular-progress": "15.0.0-canary.90291f2e2.0", + "@material/data-table": "15.0.0-canary.90291f2e2.0", + "@material/density": "15.0.0-canary.90291f2e2.0", + "@material/dialog": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/drawer": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/fab": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/floating-label": "15.0.0-canary.90291f2e2.0", + "@material/form-field": "15.0.0-canary.90291f2e2.0", + "@material/icon-button": "15.0.0-canary.90291f2e2.0", + "@material/image-list": "15.0.0-canary.90291f2e2.0", + "@material/layout-grid": "15.0.0-canary.90291f2e2.0", + "@material/line-ripple": "15.0.0-canary.90291f2e2.0", + "@material/linear-progress": "15.0.0-canary.90291f2e2.0", + "@material/list": "15.0.0-canary.90291f2e2.0", + "@material/menu": "15.0.0-canary.90291f2e2.0", + "@material/menu-surface": "15.0.0-canary.90291f2e2.0", + "@material/notched-outline": "15.0.0-canary.90291f2e2.0", + "@material/radio": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/segmented-button": "15.0.0-canary.90291f2e2.0", + "@material/select": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/slider": "15.0.0-canary.90291f2e2.0", + "@material/snackbar": "15.0.0-canary.90291f2e2.0", + "@material/switch": "15.0.0-canary.90291f2e2.0", + "@material/tab": "15.0.0-canary.90291f2e2.0", + "@material/tab-bar": "15.0.0-canary.90291f2e2.0", + "@material/tab-indicator": "15.0.0-canary.90291f2e2.0", + "@material/tab-scroller": "15.0.0-canary.90291f2e2.0", + "@material/textfield": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tooltip": "15.0.0-canary.90291f2e2.0", + "@material/top-app-bar": "15.0.0-canary.90291f2e2.0", + "@material/touch-target": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^16.0.0 || ^17.0.0", - "@angular/cdk": "16.0.1", + "@angular/cdk": "16.1.2", "@angular/common": "^16.0.0 || ^17.0.0", "@angular/core": "^16.0.0 || ^17.0.0", "@angular/forms": "^16.0.0 || ^17.0.0", @@ -662,22 +728,22 @@ } }, "node_modules/@angular/material-moment-adapter": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-16.0.1.tgz", - "integrity": "sha512-sPSu0PhwG8qeanxpfDKw9a5WSqb1Y+LBxOCdEj5OAennPYfqwPf687BrzuP/7Y9hNwO9NAj5fLA3FJRz3lrQCw==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-16.1.2.tgz", + "integrity": "sha512-6M0Zu1U0InhNpOScDEtI0rm8FK5JojiliTKj73AOy1LWusOeE6fGzE7Y6qHk3tBJWxQH7Z+SRy7c3cqRzlhLqQ==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/core": "^16.0.0 || ^17.0.0", - "@angular/material": "16.0.1", + "@angular/material": "16.1.2", "moment": "^2.18.1" } }, "node_modules/@angular/platform-browser": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.0.1.tgz", - "integrity": "sha512-7XLIOnTnGDJLE4Q0zBz6eI9q5V3NnsTAJqIICJHc4gk6jNgVz90gtejAQ4EFbo0d83XGzwFL22hxID5Dj1WRIA==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.2.tgz", + "integrity": "sha512-jFelRYaVaD2F2ph+Z4tsQUxpw1gGiOU0t5i77srrHDtm+KXpERyYbnXQTog+6q+ScNtsB++0JNkiPQV6oOjtIw==", "dependencies": { "tslib": "^2.3.0" }, @@ -685,9 +751,9 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/animations": "16.0.1", - "@angular/common": "16.0.1", - "@angular/core": "16.0.1" + "@angular/animations": "16.1.2", + "@angular/common": "16.1.2", + "@angular/core": "16.1.2" }, "peerDependenciesMeta": { "@angular/animations": { @@ -696,9 +762,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.0.1.tgz", - "integrity": "sha512-qrGlRPqJM42WZcHCbzwTA8SiK90xrhM/VrOL/8/1okuHn82gSWbbynpqycdZnsI9XMbW+HNhpKR2n8HKV38Jug==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.2.tgz", + "integrity": "sha512-gBPvQ2tAGSUK8oCnL15rCzO9/gyzYR8pf6a7kQdDA1Vr3Aj02UCsJOZvedoMxbnGpLtw3JGWMqZ+bvp4/tCw1g==", "dependencies": { "tslib": "^2.3.0" }, @@ -706,16 +772,16 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.0.1", - "@angular/compiler": "16.0.1", - "@angular/core": "16.0.1", - "@angular/platform-browser": "16.0.1" + "@angular/common": "16.1.2", + "@angular/compiler": "16.1.2", + "@angular/core": "16.1.2", + "@angular/platform-browser": "16.1.2" } }, "node_modules/@angular/router": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.0.1.tgz", - "integrity": "sha512-4GH0SxPbuY08B/M0f3NEHf9yIFH+D3wlzWJHI75chfdqQ8gGAMG6B6PSmo3haicDxHcSnZTYNJXDLOQvaBAHcA==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.2.tgz", + "integrity": "sha512-0ZiEtJNwYUQewMXxMf2cNHl6N8ZroxC+WS7I6uq3QhPxhbiF0mThRyhRd158rfSVSLEFWKlyZbDQh1ECMSWhDQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -723,16 +789,16 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.0.1", - "@angular/core": "16.0.1", - "@angular/platform-browser": "16.0.1", + "@angular/common": "16.1.2", + "@angular/core": "16.1.2", + "@angular/platform-browser": "16.1.2", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.0.1.tgz", - "integrity": "sha512-SkpE09QPwO80RJjlmyAka9/6c1DWUBEehH/LIeT/FfQ/6fOVUHgh5vgK8ha43rlDlkLp+OdVuhxokwfzQyjtTA==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.1.2.tgz", + "integrity": "sha512-9GsaAu88fYMXS3xre0ZezpjdOPB2nhHaqwvW97xBkXBEeMx1kyxyfN7LjDkVdYIaTRM4HMP92jbSirT6CifAfA==", "dependencies": { "tslib": "^2.3.0" }, @@ -743,8 +809,8 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.0.1", - "@angular/core": "16.0.1" + "@angular/common": "16.1.2", + "@angular/core": "16.1.2" } }, "node_modules/@assemblyscript/loader": { @@ -754,42 +820,42 @@ "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.21.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", - "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", + "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", + "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.8", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -814,12 +880,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", + "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -829,37 +895,37 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "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==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", - "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", + "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", + "@babel/compat-data": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" @@ -881,19 +947,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", - "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz", + "integrity": "sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", "semver": "^6.3.0" }, "engines": { @@ -913,12 +979,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", - "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz", + "integrity": "sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", "semver": "^6.3.0" }, @@ -939,9 +1005,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz", + "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.17.7", @@ -965,113 +1031,113 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", - "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "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==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz", + "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1081,121 +1147,121 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", - "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz", + "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "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==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "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==", "dev": true, "dependencies": { - "@babel/types": "^7.20.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz", + "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -1204,9 +1270,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", - "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1216,12 +1282,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "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.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.22.5", + "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.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1231,14 +1297,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1265,214 +1331,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, "engines": { "node": ">=6.9.0" }, @@ -1560,12 +1423,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1574,6 +1437,33 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -1688,13 +1578,47 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", - "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.5.tgz", + "integrity": "sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" @@ -1704,14 +1628,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1721,12 +1645,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1736,12 +1660,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1750,20 +1674,53 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.5.tgz", + "integrity": "sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", "globals": "^11.1.0" }, "engines": { @@ -1774,13 +1731,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", - "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/template": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1790,12 +1747,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1805,13 +1762,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1821,12 +1778,28 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1836,13 +1809,29 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1852,12 +1841,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", - "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1867,14 +1856,30 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1884,12 +1889,28 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1899,12 +1920,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1914,13 +1935,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1930,14 +1951,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", - "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-simple-access": "^7.21.5" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1947,15 +1968,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1965,13 +1986,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1981,13 +2002,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "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==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1997,12 +2018,63 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2012,13 +2084,46 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.5.tgz", + "integrity": "sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2028,12 +2133,46 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -2043,12 +2182,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2058,12 +2197,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", - "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", + "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-plugin-utils": "^7.22.5", "regenerator-transform": "^0.15.1" }, "engines": { @@ -2074,12 +2213,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2089,16 +2228,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", - "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz", + "integrity": "sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", "semver": "^6.3.0" }, "engines": { @@ -2118,12 +2257,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2133,13 +2272,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2149,12 +2288,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2164,12 +2303,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2179,12 +2318,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2194,12 +2333,28 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", - "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2209,13 +2364,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2224,39 +2379,43 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", - "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.5.tgz", + "integrity": "sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@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.20.0", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@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", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -2266,44 +2425,61 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.20.7", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.20.7", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.0", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.2", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.20.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.5", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.5", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.4", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", + "core-js-compat": "^3.30.2", "semver": "^6.3.0" }, "engines": { @@ -2345,9 +2521,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" @@ -2357,33 +2533,33 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", + "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2391,29 +2567,14 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", - "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.21.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2443,22 +2604,6 @@ "@bufbuild/buf-win32-x64": "1.18.0-1" } }, - "node_modules/@bufbuild/buf-darwin-arm64": { - "version": "1.18.0-1", - "resolved": "https://registry.npmjs.org/@bufbuild/buf-darwin-arm64/-/buf-darwin-arm64-1.18.0-1.tgz", - "integrity": "sha512-4iFChDoXAiuMZQoXpJoCSvCkcT7p1fmsY2N/+wTdODQbXAwqR8vQz19FPR2Jv5ukhd44LUi43nFsyQ2dWmeZeA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@bufbuild/buf-darwin-x64": { "version": "1.18.0-1", "resolved": "https://registry.npmjs.org/@bufbuild/buf-darwin-x64/-/buf-darwin-x64-1.18.0-1.tgz", @@ -2475,70 +2620,6 @@ "node": ">=12" } }, - "node_modules/@bufbuild/buf-linux-aarch64": { - "version": "1.18.0-1", - "resolved": "https://registry.npmjs.org/@bufbuild/buf-linux-aarch64/-/buf-linux-aarch64-1.18.0-1.tgz", - "integrity": "sha512-QdYp89hlLVPPZYlaeVhE0swk5Ygncij1avVmvLQw99+lvaFlDu9zRQ0Jo7n1VjpZWdDhUd/thYWxSqSMJYLajA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@bufbuild/buf-linux-x64": { - "version": "1.18.0-1", - "resolved": "https://registry.npmjs.org/@bufbuild/buf-linux-x64/-/buf-linux-x64-1.18.0-1.tgz", - "integrity": "sha512-9a6xv+OsYjhg5f1WHDtoXJVxG2j6awFi5cx9dkCPMODvFsll7skkwfkDngxKkibNU0aY6TxLoQXdf77eQwIWtQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@bufbuild/buf-win32-arm64": { - "version": "1.18.0-1", - "resolved": "https://registry.npmjs.org/@bufbuild/buf-win32-arm64/-/buf-win32-arm64-1.18.0-1.tgz", - "integrity": "sha512-UP6KevD0cdxa4IJcDy31KC9sIIgxCWBP/K9uW+gBDLg2cNQBtVqlN8o65PJhsl9HB+p0/Y4pDi4i/jU8dXGH8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@bufbuild/buf-win32-x64": { - "version": "1.18.0-1", - "resolved": "https://registry.npmjs.org/@bufbuild/buf-win32-x64/-/buf-win32-x64-1.18.0-1.tgz", - "integrity": "sha512-4OVbTwbQ1ZHGtITJw7hXYP2HinCWn3PN1ewCU+SCvynJTQ8vXQuVNlKZ2EmGl6aTUWdF3mSL/WPsRiG3fXhxfg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -2548,30 +2629,6 @@ "node": ">=0.1.90" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@ctrl/ngx-codemirror": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@ctrl/ngx-codemirror/-/ngx-codemirror-6.1.0.tgz", @@ -2603,74 +2660,10 @@ "node": ">=10.0.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz", - "integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz", - "integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz", - "integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz", - "integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz", - "integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", "cpu": [ "x64" ], @@ -2683,278 +2676,6 @@ "node": ">=12" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz", - "integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz", - "integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz", - "integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz", - "integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz", - "integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz", - "integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz", - "integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz", - "integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz", - "integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz", - "integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz", - "integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz", - "integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz", - "integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz", - "integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz", - "integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz", - "integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", - "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -3078,12 +2799,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, "node_modules/@grpc/grpc-js": { "version": "1.8.14", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", @@ -3212,9 +2927,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" @@ -3339,761 +3054,761 @@ "dev": true }, "node_modules/@material/animation": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-4OlCKqydjF3JtdioZ5TlpAkSxQyJUjL7jIXzf/xIU6MRVOD9kTyqgUkUKNAq+m0I7rtA834NbF7MVam9lMsdkQ==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-tr1y4KYZ2Ml9lFU9b91r5jivDCbh0N3Zv6VFe0frphztlZO5Lqx7MCxsliQ7NwQjqpXg3MkD6ZusVNvnMyo+LA==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@material/auto-init": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-s/04P52RsebfLmm0ivlvbW3XcVobZGs2vZM+/HHTX312f9lR9m2gNo3oxWnJKfpLrvzY6zo4NvC9Xb6ZBqvnag==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-ZslBlje2LajaL5d7JCxUoWCKOBOsZYT33CamqPoDeY0Cjl77t3O+8B9YPHF8libytI8j9lrrDrTItQr53PHeHw==", "dependencies": { - "@material/base": "15.0.0-canary.3b5b55e31.0", + "@material/base": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/banner": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-m9zvT8heoKc0sTTJLzx6oWGnEfDkEaQW3UounjmEDwVc/PtiqmZ5qIzdXIseI+sIcFw7poJiyvTHjNrbLbPeiw==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-mVtGop9rBXRD6UYkMD7y+OJwd3MA73w7BJ/oJIKFij2q2fn/5hZba6vQ6d6YGUGv+iJPP/S/HaiMQuRE5yyoqA==", "dependencies": { - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/button": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/button": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/base": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-8DmOJMxY0srjMHPDWdpayEYgVlmpR0zNorpJwJCp/IVESNBo3/BpeZCaulb4goP58/O10yWCqDYewGs4LXfNUA==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-DNelmohDScmGvWWS/J05dkIJb/dKOVkA6s0URgPrnTFKXNSavPsmwj7hWzYB5kusz3ZrXJBYBJsE6VqkRRXl0w==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@material/button": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-O9EIe5xpGHM8NCb2FySv7jP0hXWckk6crxii1c2Y/BD9jhfac971kS6iAsWE2veXPE9b5S19g/n64iaaI6KxHg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-m3YqCh33kcPGYehCKviDy7RxQIEM2m8Exo6AswPPsxd95jSN3rAeF+pXopoXW5QTOqyKHqHymTKTRYYvwvZHYg==", "dependencies": { - "@material/density": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/focus-ring": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", - "@material/touch-target": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/density": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/focus-ring": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", + "@material/touch-target": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/card": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-i0CED1wF9mUlbE0Ck57uiwKtXaSSWaHAJ45djdT0HjlLHXay3aEvyKQTjjN4+clgHjL14UiMkrSEM3/cmPs/Wg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-8Z8KQDmEIwt5IK0n+9C9Be9p4mWLKBXILbH+c6XcMCTemmUxH6cTTax1MwuAmqBGuIq3WE3g7qDpdzjFLTC2kw==", "dependencies": { - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/checkbox": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-D9fod/+GYQVjryoWR4pSlXsLrUsosGOdCzlMwxmoJiwla1dUPPfEsgy4h6+ipPQ7hd8KsJ5fn7e1GArd3zzbPw==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-hCilHX0vLedMgeRSOskf+JjdfLIUvEg597LEkTJHnTtJkhwypvol8OwP3eqz3TyJ3qGimIi/sFPKdMBn1Uk4AQ==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/density": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/focus-ring": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/touch-target": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/density": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/focus-ring": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/touch-target": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/chips": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-1s4sK9iunD7lFDCd4jxQiDoY8mOlMywY3AeymsbRrzG6rObLv0AGsX5moyxhpsh/IwSSQFdW4xrtCESu+dRZbg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-TMtlzuadWP/YMRYg8mpqmaD9M9GzRL5ulHHgYO5F4kaZmI3L+3zvaPvUme/x5qwPkIJUO9S21NxxGAsp9X+ZJQ==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/checkbox": "15.0.0-canary.3b5b55e31.0", - "@material/density": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/focus-ring": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", - "@material/touch-target": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/checkbox": "15.0.0-canary.90291f2e2.0", + "@material/density": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/focus-ring": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", + "@material/touch-target": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "safevalues": "^0.3.4", "tslib": "^2.1.0" } }, "node_modules/@material/circular-progress": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-qDOtGRIkA1FGaPXqHVrckOUFWneoWqd1eosRarzNSENmpluIjfFY6DNzrJr6a1Grb82Iaui2Q2XcCVNN8pL9kA==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-znCz3cXC8rmC+1k1ZEeZNOhngm7O7kVG2PoANaE79NN9taDtCTyBGGeocJ4Kza3tb01vxJ2/tuQXC39GNFkHFg==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/progress-indicator": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/progress-indicator": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/data-table": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-xlxN6U7wspzzaN7zuxYhmFxpMyL5onBJfaL2LfMiCa8BwaBcDOxXj4nXIQ8CIsZYBpvCFaCRrLx5iS/eIqhQNQ==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-9YU6KkOeKs2ARPXZdg7Cv6nPwLkEyBIN331ZB92apcbQpTMJMhR3uuW8SSw4p7aXCE6CJjREsCc0KuYAnFSa2A==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/checkbox": "15.0.0-canary.3b5b55e31.0", - "@material/density": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/icon-button": "15.0.0-canary.3b5b55e31.0", - "@material/linear-progress": "15.0.0-canary.3b5b55e31.0", - "@material/list": "15.0.0-canary.3b5b55e31.0", - "@material/menu": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/select": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", - "@material/touch-target": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/checkbox": "15.0.0-canary.90291f2e2.0", + "@material/density": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/icon-button": "15.0.0-canary.90291f2e2.0", + "@material/linear-progress": "15.0.0-canary.90291f2e2.0", + "@material/list": "15.0.0-canary.90291f2e2.0", + "@material/menu": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/select": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", + "@material/touch-target": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/density": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-9qVFbTPiZzysa4lkPDhhcq+gOhvNBi4J5Agw7+vBzumgO8o3Msd2/fuIfv0JUv1aMyJPzWN7tsorow8pB9Ft1A==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-z2L49vc5tbIGe7tUHwbmzoPvOugsTNVP24WWwBwtg9PRuK4Td5HIsMGYqSzSuwFJvDWQK9Ugvl37jGZSv4vxog==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@material/dialog": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-cSFbYOwOHoz+U9oX7hU8L0CiLHjF0Kalu5Hd66hf2m3K6CJMcbPW8da0nubHckJwRp/POzlCCnc0zDzkHPYx8w==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-n0o4MELpVqJHbJDPBYeXf3xeL9a8hbzHmfXYLDI1MUhDIr4xgSkckKdCRc2IFda/g7kxjAgcUTga9EFWqns2qA==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/button": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/icon-button": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", - "@material/touch-target": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/button": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/icon-button": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", + "@material/touch-target": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/dom": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-3bZN0pJUatMNIRULlMqHOdS/Ewh9Skbe1CUojKlk0voge2n1BRgZAdW1rbArEQs4mLN5RW1oABUHhFn6nCP+xg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-90JKk/Ncnqn2dKopNxs1uruiiQZzgLTZQF3a8jxa/w3RQd3Ac9ET1KqmaJSfzXaxgebm+1RZfL9lL+ANEfLWwQ==", "dependencies": { - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/drawer": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-ZwrihhH5M+ioEmnc84st5u2E9x+9bMGPw+yyxglcchtTMA+H87VlcngQgX8qf2fwgEGp2nv6SVXnh9lQya811Q==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-7MJbjUxqpQG9J52xWGVKRhSI/0/7Uhf7l2P9VI2WFb5Fz0IeUupXlw2k1Ktb97nxSjMe9OazjtVUgzBNwOad/Q==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/list": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/list": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/elevation": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-DPmxmCc9nUMhKw4il6pSL00oYyiti3QopfHeq6Fr8qT4hevfzV7tjm0vFbUaQtr4X0/y7WV6SrRDMMWanQkHUg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-4eYbCDc6IfgfguNmRc5GT4QMCfOEwj+K3BAraABcbpuCzEQ5nCClsVrPbRLfPnhWbQrFc2/eBglB8wsrNTjVBw==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/fab": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-i4p05wgkgUj7isE3Hvlq2Q9knG75AR4GG4259qQNgmcUYJBdmV0vro7RVQL4/majo99rQbhdi0fMzgacJllZgw==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-YJuJRdqe57DnJ4qyc04flknuGeN+7Nc9ciFZE6snPn84wD6J1khscb21yRARbALDki18kbfnJNrNbzHkYaEMZg==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/focus-ring": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", - "@material/touch-target": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/focus-ring": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", + "@material/touch-target": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/feature-targeting": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-ZOlpc4s/myUYb+3qP1t+XFFZP5oPYe7R4kXU8N0roG3XXk0RkxiTI8nje2a8Z1HbLIcHHbCtwiPj+STHIYt8tA==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-mjUemPnMLXPooDcPHxxc2uhVUzm7X3NDsE0x0QJnsHDwuejakaRLghVcRDX3x1VmL/p52Eu5HrgW2FryFEiVhQ==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@material/floating-label": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-YJhfh19zXDKzj0z7RrbZOOnlF5ZIpqIikNEq81VKn78TiiQOe+5x+D2lGfep+tqYf8lJk/zxhtOv55L9755QWQ==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-dYtgNlXkO0H9Vn76oESZZg1KOa2XIOLhVxhV/qPYrhntET534i7TyajmVk54ncuSSoLPZrbrwrhhR2fUJWxZIg==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/focus-ring": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-psrOK7/VN0DtwzJP5a976pqCzqjqwFNFCPuTJxyfrEfhjblAXJhgOVWx8Mm9w7cEB4RuNxNLyhVPKp3kPuIHFw==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-U7ERDgHi33ZRmqsiO6syFaWsCUGneltX2sYVtLpQnxME7pKFzi22GdUUIslhgHOFjSMBFF9av2Y79VFbyj9BaQ==", "dependencies": { - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0" + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0" } }, "node_modules/@material/form-field": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-/ad0Q8udNtEiPhIMVT1XCf886McDxo3KscH6/v9OJrqrgfVYf052/VjJG4ltTl1DyblT9CVH+syXWh++Y1d6Dg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-KTj+EOobLcPUYy4nR+t0c2Cjvs7jCI4F1w8XuV0bbmSa6Sxh02tMKY2Xa7Lx55A/uUrsUfViMdP60OLzi7HgjQ==", "dependencies": { - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/icon-button": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-MHn/R18YjXH4UIOnZPIcDa1VKTuU/KbXIHaMoLDXDo4QfISoQLs6AbxgK77l6rmFACRi8MHKhRJ8LAdKKUF38w==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-bpqiVPkf/LJEP7iIV5VL9Th0chCIQKTeOuw0mK8HmYucuvqq+k76oPsUcE7mvxRvuKyVh6KJ9fTHAkjse0y7cg==", "dependencies": { - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/density": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/focus-ring": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/touch-target": "15.0.0-canary.3b5b55e31.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/density": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/focus-ring": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/touch-target": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/image-list": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-tqvCXRfX5d5y9lK7MgP0tbtGvKlTyS1i5BAhYl4PyFY8dFTrTkEU8b2FjcTLby+AJGKSY/EkeWZw8g4YJb0eig==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-JobM4lWsf9grgbqrLuUtJ5fr8BkG02r9c2oFMl5++dtjtLdXWnUIWbiofna8CeqDFQCKXsCk4Jw8ydSKZvj/3A==", "dependencies": { - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/layout-grid": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-m1LxCfPYBkCzBVO35/lMRqvi25HLPi8m7rYpWKRvihz8vIMRRlmBsHkvdWahtN1dbQ7eOUOCjgaqM21XFeOzIA==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-f5DSHGf1ka6vHu+8VoTvcU9NkR8fdN2wHmPnITZHQXPVvR6SKoyDzdAf2gacmiTYy69ZFmmJeMcdfNnbcPPUJw==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@material/line-ripple": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-p92jxhnw7bw9Sxx7P4uTy/mTxQ3+q7uZlRoRy+JtN6y9yEmZ2eqexEjf7IDQEvotHsLam7PKstg2h0X9CtujmA==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-cWpS7l/pFg6cUzL7Lx3ywF6RYF6ESYPkiGlDo9kFERv8lVA2/3m4NF4d9b4kC9h9OWx1b1CaUFRFGD07okgI+g==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/linear-progress": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-Ws3h1iHyHHefHFkFm6t8ORzRs3UdgjjhslLNVB1oHYLWZj2vRizDUuB4aIGbjfTG9UTil8wn6ub9MsyFuH1XQg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-nK5RYn8NFZi/+fznLYoEdY6tSzXiJqOU0tX5by7hStURhP2g/RM5SQaJwyjEmHdorfCUIStgmKsN4rB5aMnxdw==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/progress-indicator": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/progress-indicator": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/list": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-xy3PY6RQRCjnO5SuhSaLn2YO4rAU+JZDyDx9Uyx4bfZ+Pgzpst3ji/rbTOtM9sqNoixGWF6SH/e+GlqmVSm9zg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-h2c6G5aPH1bhgl2yBYAW4y86pl+yVl3YdqU0ixemQ5/2uB/t92imUbI+gKH5LzlbuJKenk3rZJ5eaV+t5zTS1A==", "dependencies": { - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/density": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/density": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/menu": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-SfA67F7rmUzOWqzpywcbQlZtaZ/UVdXkalS98z3+xWkd+f/KBWZx3HBZLHSjLeablERayZCRCl8U6cwbjtq9Ig==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-yfpBN4Hg59pHMNplh2LIe8t+/qsfyP0iRAtJoCK90SBwX43kv65u22+3vEJmYzm3Ey/m3S3YRFXTFQRQnn9cmA==", "dependencies": { - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/list": "15.0.0-canary.3b5b55e31.0", - "@material/menu-surface": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/list": "15.0.0-canary.90291f2e2.0", + "@material/menu-surface": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/menu-surface": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-GPJeWN0dbB8kDyRpD3kAeYU7DbJPVK0B4zR35K5snKRZZ1V6uTYQfdeCjzZgSU5ivfH4/jxGS9NK/7SnVykOxg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-AkRpOjFOJi2ROZPvFo1z8ik61eEyJEew8NuvlzCE4S3BX/RNFrYVh4W5ylo030S01ALCS5zhVOeekxa/4eokZA==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/notched-outline": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-rEzFUqaJJ1hX4k7TlWjGONqTeUP+IuIGiGSXnHlYdQRQQiuHTOrwI6b+l8FXgNFMmKMzg6Xzh8sr9jiV+cO5Xg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-4lpoIoFJ8cb++M1iQpZ+8iypUuTruzyBAkOvoaNjk7EftEV+aS3K6XntGNtlUZoB/fFho3mAUVjT19IHFWD03A==", "dependencies": { - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/floating-label": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/floating-label": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/progress-indicator": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-WY1y0qzVv3DMNNEuQMF/EPbHIrwKbnlpOu/RRDo86D/oa9qmZP8mHe00quopWf9ZduTna2BjTWsQBid1680jAg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-trQLSstZIA0C64adW/HycycD+PtMfg6iZCIVuTNlZr7PR2Yc1EjuGyA7ts+iXBHZ0TxVshRbDYMwcDogP0rc1w==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@material/radio": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-JUvJHfAMjTdcsWF5XFnRlvRKTfWmANfU86QouOH9rxY9NYqP9AROR9X/y/A6cE4TMhOdskt4+/ewl9wriSHUUw==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-Ypl4BZ9w1NdbiiEUV3Xw2pb97prMPGEE+5Lm719sVsaFmI4yCKgtsWNEbCbKixborh2ZDZWGCzgMyUQHf3a8xA==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/density": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/focus-ring": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/touch-target": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/density": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/focus-ring": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/touch-target": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/ripple": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-nrce9Qhinq64U2Ld8htuiCtBgSOxeDu+BIi0Red4oicmhTskSaOzC7NS8wjy5Q155YrnaBTsxPJZDjiTsG9e+g==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-8yCR/V+7SJ9om0cvAOULF/i5+gPQeT+cuPoCZJQRWq9IndfCmQPY3Zmy26reIT/zEyCebAvMG4/WtU4rc+jxyw==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/rtl": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-lSp3UbhYXuW8p3qsqvft+eLxECpKH5xNL4oXc47sH9DsdSFrhFHTCeOtHwz261cMBetAXCaXsz/0BsBOslWoBg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-HkUhD8K03BxWVw21WDViWo01Chi22cZ1rmlsdCtggkxdVjtDhTbYm/3XvRnxt4RVpr6KaYQgRXI/52T5RtBUnw==", "dependencies": { - "@material/theme": "15.0.0-canary.3b5b55e31.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/segmented-button": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-62vr5OhWvf4MzVGx3L8D+wK7IzI+a5wAvW/wkcPOvm4FldTyPiey74zC84Wj8CK82UQqzYJj5jTV5KfOk/2t0w==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-u1DF+jbysX6wCqt7dDnHgEo2XhNrwkqHq6YsMOFVCoo54PHt3gpwhD89DONqQJKspkdvZuxYHzpqRtV0GIzYDQ==", "dependencies": { - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/touch-target": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/touch-target": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/select": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-2vDCOszy5Len3XQizbEPfoaQZWSFXydc06Tbw6cNzISeHfwAU4LA3aQ9lP7vaukRBthAdy7+o7WHnrnbfVIvZQ==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-CCaftyi3eIJl2XqBfHbzj8W2jgTMBzSM2+q4WthA+7z0fYQI4JIHQVHO5YKQG5J9MR1VjYQ0Gy0GNotZLAcoOQ==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/density": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/floating-label": "15.0.0-canary.3b5b55e31.0", - "@material/line-ripple": "15.0.0-canary.3b5b55e31.0", - "@material/list": "15.0.0-canary.3b5b55e31.0", - "@material/menu": "15.0.0-canary.3b5b55e31.0", - "@material/menu-surface": "15.0.0-canary.3b5b55e31.0", - "@material/notched-outline": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/density": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/floating-label": "15.0.0-canary.90291f2e2.0", + "@material/line-ripple": "15.0.0-canary.90291f2e2.0", + "@material/list": "15.0.0-canary.90291f2e2.0", + "@material/menu": "15.0.0-canary.90291f2e2.0", + "@material/menu-surface": "15.0.0-canary.90291f2e2.0", + "@material/notched-outline": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/shape": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-7OMwJr/iWt8secMFtgtzIcMoZo8N/axgGD6yXhAc2wWbdnh0N2h6cqB+aInQeG2oPuOqO7ofEEghSC0TIh7siA==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-UEB168x8ovLvH4eoBtRnoCT9QvnxB/ZMpOKW1+C+xWisis6Wy9AX0wKT5T6wIpffYYCaBJuhI+ExX2134rAxJw==", "dependencies": { - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/slider": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-Eu/h6pWfhVxm2t/oyQlUXyzh4x0nynvZZl2XanZ4v84Bt4eEGSwjaECQdaU+Wf6pAkwZRx5Acl3LiyV6cu8vRA==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-krbdGHcROlvnZ0X7HT0d+PvJummczeShQeWeV/ZezXnQM7bQoy86qfwtX4ai1dIXYkF9qKTFlta2zZezTJyf5g==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/snackbar": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-gcrCpwYz+QaXqENzVYZhGKxu3i/oM/ZamumLiUORYzt/c5vtGJfSd8l7GoJOPpIyUtBCOSOjc+QRye4KrIbLuw==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-f1+HaSaAkALtQqEr6WMUqfwOsJr5nOUjP15GA+sTs9SD7yzwqMeWsVriBdWXVRe0zNgew6sfBM+cLjg2w4VAOQ==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/button": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/icon-button": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/button": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/icon-button": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/switch": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-G83nixwYZQ0YuV4ejH2Ef097sjyHO7r5053lzTaUMJB7wpTz9eyRbtI5TIIpDl9vQ6UA55PeYMvGJWOsL/8yxw==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-94/+Zp2VjlLVJXY7u8VHPcJMHPRVNAwHydiGrKvnJ+6LfbLxAcILNBP9RVKqqqOWQeDxB4ApUl+0TV2Lj6mOzA==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/density": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/focus-ring": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/density": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/focus-ring": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", "safevalues": "^0.3.4", "tslib": "^2.1.0" } }, "node_modules/@material/tab": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-z7R/6yD53P46LnuieANSBL04JuVSS/8P9FEDuZVqkDkEZzCPdOumTYuj6VE/c9PC5SKM6+4kAbR5deCOhzKmNA==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-zju6UP038Ddi3XAfliYy58A3OvkQ+zSlOdNOd5l82oMArLYEFi3t51QTjKVjV1wokr6ZQ3Chs4kcrgwVTElYtg==", "dependencies": { - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/focus-ring": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/tab-indicator": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/focus-ring": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/tab-indicator": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/tab-bar": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-hUOHNzH64hAhZ6WQ+HCDradmLGVZkb06/4sPC2dh6C1aMLIhgGoa+MQ+rPXrUZiKk1zupWe2Etgtq3mpCodIyA==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-dTC7oGZg6KuDK2OXO7luJWqshtNY2YgImwZbQ9a1vZZrIGMRHdu+ZtP6RVH2srFVlNIWjzcxfLgNrG+U027RdA==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/density": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/tab": "15.0.0-canary.3b5b55e31.0", - "@material/tab-indicator": "15.0.0-canary.3b5b55e31.0", - "@material/tab-scroller": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/density": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/tab": "15.0.0-canary.90291f2e2.0", + "@material/tab-indicator": "15.0.0-canary.90291f2e2.0", + "@material/tab-scroller": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/tab-indicator": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-EEx6trwtWHaD9RE1xBskmy2hSAGe3id+PhXeMRj7TNPZ3g9aFZ/G60y0n8oGs6zg0T8KyHVZ/37fMH/QqoEttg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-GXdFO6rO1crXcj+todijzZQVACW4EC72XwLAl6z69TKBgZrhwCoZ6RgzX6vIXSs+KoZ0eIyQLr+yQQx1JjDd4w==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/tab-scroller": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-5F56pIMk43c2kjcvuP3Qs98SORH+Na/q7zr/XM1rip8y/46d1231elqj4uem6TiYD5l89qjbyD+Zq6y+i2KI5g==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-R6trOZpkfk54VV0w0NjMMDcZPQgbnARxCoHLrWeSzv5KOMoiDyWji7FFpLc4fynX/F2lNg8xHpEolpugNRW/1g==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/tab": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/tab": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/textfield": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-1nYbaHeesVmSnym6owKC1CDAmoAuhCUKVQ2JKGtnr6gFarmtT5s3ZoJaO4bISgbgN3KP291uFNl4mCqaTGcyBQ==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-ipxPH8DRh9+cn4MOtAYvGsRLP5RJH/gB/BWh/BiJwjI38Djt4FK4LDHbx7fFo/C8hoj7UNs/BWaSLllyxuWKcg==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/density": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/floating-label": "15.0.0-canary.3b5b55e31.0", - "@material/line-ripple": "15.0.0-canary.3b5b55e31.0", - "@material/notched-outline": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/density": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/floating-label": "15.0.0-canary.90291f2e2.0", + "@material/line-ripple": "15.0.0-canary.90291f2e2.0", + "@material/notched-outline": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/theme": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-0v0gtYG7i3JaleFbkP2SOzzD1x4y4IOcbgJanZzi9SkWf/gsVXwbxLID1eUSFIj3+jjqRBl1h2REQ5JL1FEmPg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-rDSZ0bPoJothI8nRPQWB4Cyu7DTmc8qIuvFm3OOD4uI/2n+yIFqktS6X+6YF82LeKt4uMTZE+Ce/l51bb8UJGA==", "dependencies": { - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/tokens": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-Taj1tlo6yUjDfMXQRYKgDf9lWwDpq8/0y2qxetCddyZxilZKyW2oc5lmbzkHbCpIzYG8in//JAL6pP+JaFn0MA==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-ZTis8UeSRrm/4iQ6BujtcTf1J2bs2H+SAEnugtZSQiX8pyf90gQvylEoTuMPdUs1+YJ273cn04ipHdkq3OHaew==", "dependencies": { - "@material/elevation": "15.0.0-canary.3b5b55e31.0" + "@material/elevation": "15.0.0-canary.90291f2e2.0" } }, "node_modules/@material/tooltip": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-WxAJ8LxMdvSKgD1tC6mX8VbhLiMxijQm+uGK5XJZIbnHHJ6GNvvj+/kY0UydsaFPpAEtkDr3X4L9v70OF+hBBg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-H3XsrctgRriNwt++NN+Zy6/JhyRznWo2pXiTFnOlaYwHOiGIFCNZR0A/0vf/3Kpf0GYhTfkJEFJMosUSZidSDg==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/button": "15.0.0-canary.3b5b55e31.0", - "@material/dom": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/tokens": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/button": "15.0.0-canary.90291f2e2.0", + "@material/dom": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/tokens": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "safevalues": "^0.3.4", "tslib": "^2.1.0" } }, "node_modules/@material/top-app-bar": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-N8kJQtkZheUpDgtlr0GudAv5OnGiVhuWlk3IGgDAX06O1vvuV2negj7Il0NJ9YsKJ8t5ICKjlxsznskIbMSxmQ==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-ZiJjK4WpIsE0MZTWokP9r4C9/oDqzUhKRn3ef2WCeJEIU3Vjg4t0xBTnST2vIrcBGw1s7WP1gfaxb3DSXSxzpw==", "dependencies": { - "@material/animation": "15.0.0-canary.3b5b55e31.0", - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/elevation": "15.0.0-canary.3b5b55e31.0", - "@material/ripple": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/shape": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", - "@material/typography": "15.0.0-canary.3b5b55e31.0", + "@material/animation": "15.0.0-canary.90291f2e2.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/elevation": "15.0.0-canary.90291f2e2.0", + "@material/ripple": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/shape": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", + "@material/typography": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/touch-target": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-fY9ikQKjIXLzMyAqo2Vuc8cGzEYri5jPIYXckjWjkArXTfzqyv8Va0Du10bHBLzqmbLBANre959IRRWULvLPIg==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-IpRFf4umZ4ZNxrP+qJkRY9syh7TFZmU4c7EbAlANAJ0/8rlkEo7WJiqa9P1p4nFaT4eMo4n5g+qRI0Dkb9zW5g==", "dependencies": { - "@material/base": "15.0.0-canary.3b5b55e31.0", - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/rtl": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", + "@material/base": "15.0.0-canary.90291f2e2.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/rtl": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@material/typography": { - "version": "15.0.0-canary.3b5b55e31.0", - "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.3b5b55e31.0.tgz", - "integrity": "sha512-F52n/Mirtkj7kYOxwkP3rMs8WFsMo2qFuA+dFgcyMxvsqPoNU9oZ3AqR+0Lo3VKai3BSVrdukDm+JhvkHB/Smw==", + "version": "15.0.0-canary.90291f2e2.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.90291f2e2.0.tgz", + "integrity": "sha512-tv1HWkJYi5T0470k8vbBb+nefdPgsaIO04ocWMf7luvmfE+MZIaR13RxdupLJ4k5otrdydL3/wEaCNhQ+Ipnvw==", "dependencies": { - "@material/feature-targeting": "15.0.0-canary.3b5b55e31.0", - "@material/theme": "15.0.0-canary.3b5b55e31.0", + "@material/feature-targeting": "15.0.0-canary.90291f2e2.0", + "@material/theme": "15.0.0-canary.90291f2e2.0", "tslib": "^2.1.0" } }, "node_modules/@ngtools/webpack": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.0.1.tgz", - "integrity": "sha512-CZHFPMiJuOe241kO1VSSPOQ5Z9hWWkY7eSs3hnS50Ntgd4YzlHAydqexmEFpXD2YLOFjdbNETCyJ2BQTM4Kwtw==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.1.tgz", + "integrity": "sha512-ItW8Hhokk4bQuV8qMpPeNCj0f3LDpddJpd5DwryKb0sSNacGlVff/0nCiKjJFPoCmMSg6ivpkZfqbIyL9RGYXw==", "dev": true, "engines": { "node": "^16.14.0 || >=18.10.0", @@ -4101,8 +3816,8 @@ "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "typescript": ">=4.9.3 <5.1", + "@angular/compiler-cli": "^16.1.0", + "typescript": ">=4.9.3 <5.2", "webpack": "^5.54.0" } }, @@ -4166,9 +3881,9 @@ } }, "node_modules/@npmcli/git": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.4.tgz", - "integrity": "sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "dev": true, "dependencies": { "@npmcli/promise-spawn": "^6.0.0", @@ -4224,32 +3939,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@npmcli/node-gyp": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", @@ -4388,22 +4077,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/@nx/nx-darwin-arm64": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.0.2.tgz", - "integrity": "sha512-nAT8WJ/qKGEvUcoFLHHye1dbwCd7b8CTZJlDF+ZkyCD/UZRHt4eJxy8gvKmxgkZTFb2+PPMQt4UORCUGpZzuoA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@nx/nx-darwin-x64": { "version": "16.0.2", "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.0.2.tgz", @@ -4420,118 +4093,6 @@ "node": ">= 10" } }, - "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.0.2.tgz", - "integrity": "sha512-TfDQaGvCIDjn9sPg5U1Fr2rsSul/4PIQB59qrLBJRPiCWgpzwO71Il1qwSX68En+JH3lwXr+g5EjcDIEQ8fGYA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.0.2.tgz", - "integrity": "sha512-MICaUp7uz8WVQFXWPrmQaX1o4bdL7f3C7b3MDDf6+Zau6RcyQuw97UEKaYi9OqrV3w8yuPplqoLosFblAgb8uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-arm64-musl": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.0.2.tgz", - "integrity": "sha512-wcBURG+6A2srm+6ujj8SShjwmYWs0eHI5D8vgZr8Bni+lXbKP/IosE9JGXKtRoh27/owyR8PGHhDVzjv46tlFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-x64-gnu": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.0.2.tgz", - "integrity": "sha512-Xyml2gFdVDHUj2g67DKz2aD78x1BciN1ZaaBTCxXL4MHfwR78SZa7mtRtE+1kj5OgVIwupZP50jq7C8GuSn3Hw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-x64-musl": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.0.2.tgz", - "integrity": "sha512-j3xdN8I5DlTgW5N5eCquyBZswrrYf6EazUCvnEpeejygwh3N6XN7DlD68Bs0CB4Zmd0tWLfTjNVAtUJSP6g2mA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.0.2.tgz", - "integrity": "sha512-R2pzoW3SUFBbe9C1vifJnXuysPl6kmutQHN2yQ9lwJptzPvMxfDU1FuXmKCGRUGmEwFxk/XPhwDL/ZcbABTrzw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-win32-x64-msvc": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.0.2.tgz", - "integrity": "sha512-r4H/SsqfpIJa8QLSpnscgkMnLsnkRYXj8TcILDrf+nJazfEdJZLUvVhN9O85OB7pskv86NuGfnJmJHHXy6QVQg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@parcel/watcher": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", @@ -4615,13 +4176,13 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@schematics/angular": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.0.1.tgz", - "integrity": "sha512-MNgH/iB3WWxMLFVHJjtXCHZ8YHtfx2e3mX2Ds5P43OTgSnTk6tHabqvwxJ4wzjoyoPUyXWLhHt0diCmVtDTNeQ==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.1.tgz", + "integrity": "sha512-mJo7FxH3dekG7m4hHW5PyWbiCUaU+DSW93j+cikEksda+Qt6NaEX0hM0W3DjH7O+BnEg6dbAEd2GDSN/0XQghw==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.0.1", - "@angular-devkit/schematics": "16.0.1", + "@angular-devkit/core": "16.1.1", + "@angular-devkit/schematics": "16.1.1", "jsonc-parser": "3.2.0" }, "engines": { @@ -4639,6 +4200,20 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@sigstore/tuf": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.0.tgz", + "integrity": "sha512-bLzi9GeZgMCvjJeLUIfs8LJYCxrPRA8IXQkzUtaFKKVPTz0mucRyqFcV2U20yg9K+kYAD0YSitzGfRZCFLjdHQ==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.1.0", + "make-fetch-happen": "^11.0.1", + "tuf-js": "^1.1.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", @@ -4654,34 +4229,6 @@ "node": ">= 10" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true, - "peer": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "peer": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "peer": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "peer": true - }, "node_modules/@tufjs/canonical-json": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", @@ -4714,9 +4261,9 @@ } }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", - "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -4850,6 +4397,12 @@ "integrity": "sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==", "dev": true }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, "node_modules/@types/http-proxy": { "version": "1.17.11", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", @@ -4860,9 +4413,9 @@ } }, "node_modules/@types/jasmine": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.1.tgz", - "integrity": "sha512-Vu8l+UGcshYmV1VWwULgnV/2RDbBaO6i2Ptx7nd//oJPIZGhoI1YLST4VKagD2Pq/Bc2/7zvtvhM7F3p4SN7kQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.4.tgz", + "integrity": "sha512-DsJbnxCdjmhRP7dXwjD6JcPc+z7V/4mG3VA1cEFec/+R343TaNPnZ9eJzMkjR4T1BYkjkDIUsPDybkDC0qLrvA==", "dev": true }, "node_modules/@types/jasminewd2": { @@ -4969,11 +4522,12 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", "dev": true, "dependencies": { + "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } @@ -5002,24 +4556,24 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz", - "integrity": "sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz", + "integrity": "sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/type-utils": "5.59.5", - "@typescript-eslint/utils": "5.59.5", + "@typescript-eslint/scope-manager": "5.60.0", + "@typescript-eslint/type-utils": "5.60.0", + "@typescript-eslint/utils": "5.60.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -5044,14 +4598,31 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz", - "integrity": "sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", + "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.5", - "@typescript-eslint/utils": "5.59.5", + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz", + "integrity": "sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.60.0", + "@typescript-eslint/utils": "5.60.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -5071,18 +4642,58 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", + "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", + "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz", - "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.0.tgz", + "integrity": "sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/typescript-estree": "5.59.5", + "@typescript-eslint/scope-manager": "5.60.0", + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/typescript-estree": "5.60.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -5097,6 +4708,23 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", + "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -5688,16 +5316,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", @@ -5940,13 +5558,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "peer": true - }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -6167,13 +5778,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz", + "integrity": "sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", + "@babel/helper-define-polyfill-provider": "^0.4.0", "semver": "^6.1.1" }, "peerDependencies": { @@ -6190,25 +5801,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz", + "integrity": "sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-define-polyfill-provider": "^0.4.0", + "core-js-compat": "^3.30.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz", + "integrity": "sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -6539,9 +6150,9 @@ } }, "node_modules/cacache": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.6.tgz", - "integrity": "sha512-ixcYmEBExFa/+ajIPjcwypxL97CjJyOsH9A/W+4qgEPIpJvKlC+HmVY8nkIck6n3PwUTdgq9c489niJGwl+5Cw==", + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz", + "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==", "dev": true, "dependencies": { "@npmcli/fs": "^3.1.0", @@ -6553,7 +6164,6 @@ "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" @@ -6562,37 +6172,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.4.tgz", - "integrity": "sha512-fDboBse/sl1oXSLhIp0FcCJgzW9KmhC/q8ULTKC82zc+DL3TL7FNb8qlt5qqXN53MsKEUSIcb+7DLmEygOE5Yw==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.0", - "minipass": "^5.0.0 || ^6.0.0", - "path-scurry": "^1.7.0" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/cacache/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -6602,21 +6181,6 @@ "node": ">=12" } }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", - "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -7214,9 +6778,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", - "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.0.tgz", + "integrity": "sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw==", "dev": true, "dependencies": { "browserslist": "^4.21.5" @@ -7245,9 +6809,9 @@ } }, "node_modules/cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "dev": true, "dependencies": { "import-fresh": "^3.2.1", @@ -7262,22 +6826,6 @@ "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", - "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", - "dev": true, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=7", - "ts-node": ">=10", - "typescript": ">=3" - } - }, "node_modules/cosmiconfig/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -7296,24 +6844,18 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "peer": true - }, "node_modules/critters": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.19.tgz", + "integrity": "sha512-Fm4ZAXsG0VzWy1U30rP4qxbaWGSsqXDgSupJW1OUJGDAs0KWC+j37v7p5a2kZ9BPJvhRzWm3be+Hc9WvQOBUOw==", "dev": true, "dependencies": { "chalk": "^4.1.0", - "css-select": "^4.2.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", "pretty-bytes": "^5.3.0" } }, @@ -7375,12 +6917,6 @@ "node": ">=8" } }, - "node_modules/critters/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "node_modules/critters/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7408,15 +6944,15 @@ } }, "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.19", + "postcss": "^8.4.21", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-local-by-default": "^4.0.3", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", @@ -7434,15 +6970,15 @@ } }, "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" }, "funding": { @@ -7834,14 +7370,14 @@ } }, "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" @@ -7860,12 +7396,12 @@ ] }, "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "dependencies": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" }, "engines": { "node": ">= 4" @@ -7875,14 +7411,14 @@ } }, "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -8037,9 +7573,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", - "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -8068,10 +7604,13 @@ "dev": true }, "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "devOptional": true, + "engines": { + "node": ">=0.12" + }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -8155,9 +7694,9 @@ } }, "node_modules/esbuild": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", - "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "dev": true, "hasInstallScript": true, "bin": { @@ -8167,34 +7706,34 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.18", - "@esbuild/android-arm64": "0.17.18", - "@esbuild/android-x64": "0.17.18", - "@esbuild/darwin-arm64": "0.17.18", - "@esbuild/darwin-x64": "0.17.18", - "@esbuild/freebsd-arm64": "0.17.18", - "@esbuild/freebsd-x64": "0.17.18", - "@esbuild/linux-arm": "0.17.18", - "@esbuild/linux-arm64": "0.17.18", - "@esbuild/linux-ia32": "0.17.18", - "@esbuild/linux-loong64": "0.17.18", - "@esbuild/linux-mips64el": "0.17.18", - "@esbuild/linux-ppc64": "0.17.18", - "@esbuild/linux-riscv64": "0.17.18", - "@esbuild/linux-s390x": "0.17.18", - "@esbuild/linux-x64": "0.17.18", - "@esbuild/netbsd-x64": "0.17.18", - "@esbuild/openbsd-x64": "0.17.18", - "@esbuild/sunos-x64": "0.17.18", - "@esbuild/win32-arm64": "0.17.18", - "@esbuild/win32-ia32": "0.17.18", - "@esbuild/win32-x64": "0.17.18" + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, "node_modules/esbuild-wasm": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.18.tgz", - "integrity": "sha512-h4m5zVa+KaDuRFIbH9dokMwovvkIjTQJS7/Ry+0Z1paVuS9aIkso2vdA2GmwH9GSvGX6w71WveJ3PfkoLuWaRw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.19.tgz", + "integrity": "sha512-X9UQEMJMZXwlGCfqcBmJ1jEa+KrLfd+gCBypO/TSzo5hZvbVwFqpxj1YCuX54ptTF75wxmrgorR4RL40AKtLVg==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -8667,6 +8206,12 @@ "node": ">= 0.8.0" } }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -9232,9 +8777,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", "dev": true }, "node_modules/fs.realpath": { @@ -9354,19 +8899,22 @@ } }, "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.0.tgz", + "integrity": "sha512-AQ1/SB9HH0yCx1jXAT4vmCbTOPe5RQ+kCurjbel5xSCGhebumUv+GJZfa1rEqor3XIViqwSEmlkZCQD43RWrBg==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2", + "path-scurry": "^1.7.0" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -9400,15 +8948,18 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globals": { @@ -9732,10 +9283,20 @@ } }, "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.6.tgz", + "integrity": "sha512-9o0+dcpIw2/HxkNuYKxSJUF/MMRZQECK4GnF+oQOmJ83yCVHTWgCH5aOXxK5bozNRmM8wtgryjHD3uloPBDEGw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] }, "node_modules/html-escaper": { "version": "2.0.2", @@ -9743,6 +9304,25 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -9969,9 +9549,9 @@ } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", - "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -10051,12 +9631,6 @@ "node": ">=8" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -10074,9 +9648,9 @@ "dev": true }, "node_modules/ini": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.0.0.tgz", - "integrity": "sha512-t0ikzf5qkSFqRl1e6ejKBe+Tk2bsQd8ivEkcisyGXsku2t8NvXZ1Y3RRz5vxrDgOrTBOi13CvGsVoI5wVpd7xg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -10199,9 +9773,9 @@ "dev": true }, "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "dev": true, "engines": { "node": ">= 10" @@ -10855,9 +10429,9 @@ } }, "node_modules/jackspeak": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.0.tgz", - "integrity": "sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", + "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -11062,6 +10636,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-sdsl": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", @@ -11795,92 +11378,30 @@ "semver": "bin/semver.js" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "peer": true - }, "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "dependencies": { "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" + "ssri": "^10.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/make-fetch-happen/node_modules/lru-cache": { @@ -11892,72 +11413,6 @@ "node": ">=12" } }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/make-fetch-happen/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-fetch-happen/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/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/material-colors": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", @@ -11978,12 +11433,12 @@ } }, "node_modules/memfs": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", - "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "dependencies": { - "fs-monkey": "^1.0.3" + "fs-monkey": "^1.0.4" }, "engines": { "node": ">= 4.0.0" @@ -12075,9 +11530,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz", - "integrity": "sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", "dev": true, "dependencies": { "schema-utils": "^4.0.0" @@ -12160,40 +11615,22 @@ "dev": true }, "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", "dev": true, "dependencies": { - "minipass": "^3.1.6", + "minipass": "^5.0.0", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-fetch/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/minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -12484,17 +11921,17 @@ "dev": true }, "node_modules/ngx-color": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/ngx-color/-/ngx-color-8.0.3.tgz", - "integrity": "sha512-tuLP+uIoDEu2m0bh711kb2P1M1bh/oIrOn8mJd9mb8xGL2v+OcokcxPmVvWRn0avMG1lXL53CjSlWXGkdV4CDA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ngx-color/-/ngx-color-9.0.0.tgz", + "integrity": "sha512-zyAFux+FRI4cACZ7g8DQQsBbNMhqmFkhtUPaxhkiVHhPzWU1iqXP8MqWH6By3guNOCch5oYrYNBWlHToklbdDg==", "dependencies": { - "@ctrl/tinycolor": "^3.4.1", + "@ctrl/tinycolor": "^3.6.0", "material-colors": "^1.2.6", "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": ">=14.0.0-0", - "@angular/core": ">=14.0.0-0" + "@angular/common": ">=16.0.0-0", + "@angular/core": ">=16.0.0-0" } }, "node_modules/nice-napi": { @@ -12528,15 +11965,16 @@ } }, "node_modules/node-gyp": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", - "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", "dev": true, "dependencies": { "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", + "make-fetch-happen": "^11.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", @@ -12729,58 +12167,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -13382,9 +12768,9 @@ } }, "node_modules/pacote": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.3.tgz", - "integrity": "sha512-aRts8cZqxiJVDitmAh+3z+FxuO3tLNWEmwDRPEpDDiZJaRz06clP4XX112ynMT5uF0QNoMPajBBHnaStUEPJXA==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "dev": true, "dependencies": { "@npmcli/git": "^4.0.0", @@ -13490,33 +12876,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-html-rewriting-stream/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "node_modules/parse5-sax-parser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", @@ -13529,18 +12888,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "devOptional": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -13589,13 +12936,13 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.1.tgz", - "integrity": "sha512-UgmoiySyjFxP6tscZDgWGEAgsW5ok8W3F5CJDnnH2pozwSTGE6eH7vwTotMwATWA2r5xqdkKdxYPkwlJjAI/3g==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", + "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", "dev": true, "dependencies": { "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.0" + "minipass": "^5.0.0 || ^6.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -13605,9 +12952,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", - "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", + "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -13717,9 +13064,9 @@ } }, "node_modules/postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "dev": true, "funding": [ { @@ -13745,13 +13092,13 @@ } }, "node_modules/postcss-loader": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.2.4.tgz", - "integrity": "sha512-F88rpxxNspo5hatIc+orYwZDtHFaVFOSIVAx+fBfJC1GmhWbVmPWtmg2gXKE1OxJbneOSGn8PWdIwsZFcruS+w==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.2.tgz", + "integrity": "sha512-c7qDlXErX6n0VT+LUsW+nwefVtTu3ORtVvK8EXuUIDcxo+b/euYqpuHlJAvePb0Af5e8uMjR/13e0lTuYifaig==", "dev": true, "dependencies": { "cosmiconfig": "^8.1.3", - "cosmiconfig-typescript-loader": "^4.3.0", + "jiti": "^1.18.2", "klona": "^2.0.6", "semver": "^7.3.8" }, @@ -13764,17 +13111,7 @@ }, "peerDependencies": { "postcss": "^7.0.0 || ^8.0.1", - "ts-node": ">=10", - "typescript": ">=4", "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } } }, "node_modules/postcss-modules-extract-imports": { @@ -13790,9 +13127,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -13837,9 +13174,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", - "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -14484,9 +13821,9 @@ } }, "node_modules/read-package-json": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.3.tgz", - "integrity": "sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ==", + "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==", "dev": true, "dependencies": { "glob": "^10.2.2", @@ -14520,37 +13857,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/read-package-json/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/read-package-json/node_modules/glob": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.4.tgz", - "integrity": "sha512-fDboBse/sl1oXSLhIp0FcCJgzW9KmhC/q8ULTKC82zc+DL3TL7FNb8qlt5qqXN53MsKEUSIcb+7DLmEygOE5Yw==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.0", - "minipass": "^5.0.0 || ^6.0.0", - "path-scurry": "^1.7.0" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", @@ -14560,21 +13866,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/read-package-json/node_modules/minimatch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", - "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -15020,9 +14311,9 @@ "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" }, "node_modules/sass": { - "version": "1.62.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", - "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", + "version": "1.63.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.2.tgz", + "integrity": "sha512-u56TU0AIFqMtauKl/OJ1AeFsXqRHkgO7nCWmHaDwfxDo9GUMSqBA4NEh6GMuh1CYVM7zuROYtZrHzPc2ixK+ww==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -15037,9 +14328,9 @@ } }, "node_modules/sass-loader": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.2.tgz", - "integrity": "sha512-nrIdVAAte3B9icfBiGWvmMhT/D+eCDwnk+yA7VE/76dp/WkHX+i44Q/pfo71NYbwj0Ap+PGsn0ekOuU1WFJ2AA==", + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.1.tgz", + "integrity": "sha512-cBTxmgyVA1nXPvIK4brjJMXOMJ2v2YrQEuHqLw3LylGb3gsR6jAvdjHMcy/+JGTmmIF9SauTrLLR7bsWDMWqgg==", "dev": true, "dependencies": { "klona": "^2.0.6", @@ -15054,7 +14345,7 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" @@ -15512,12 +14803,13 @@ "dev": true }, "node_modules/sigstore": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.5.0.tgz", - "integrity": "sha512-i3nhvdobiPj8XrXNIggjeur6+A5iAQ4f+r1bR5SGitFJBbthy/6c7Fz0h+kY70Wua1FSMdDr/UEhXSVRXNpynw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.6.0.tgz", + "integrity": "sha512-QODKff/qW/TXOZI6V/Clqu74xnInAS6it05mufj4/fSewexLtfEntgLZZcBtUK44CDQyUE5TUXYy1ARYzlfG9g==", "dev": true, "dependencies": { "@sigstore/protobuf-specs": "^0.1.0", + "@sigstore/tuf": "^1.0.0", "make-fetch-happen": "^11.0.1", "tuf-js": "^1.1.3" }, @@ -15528,58 +14820,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/sigstore/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/sigstore/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sigstore/node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -15626,9 +14866,9 @@ } }, "node_modules/socket.io-parser": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", - "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", @@ -16079,9 +15319,9 @@ } }, "node_modules/tar": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", - "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -16154,13 +15394,13 @@ "dev": true }, "node_modules/terser": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", - "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", + "version": "5.17.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", + "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -16375,50 +15615,6 @@ "tree-kill": "cli.js" } }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, "node_modules/tsconfig-paths": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", @@ -16434,9 +15630,9 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" }, "node_modules/tslint": { "version": "6.1.3", @@ -16543,71 +15739,19 @@ "dev": true }, "node_modules/tuf-js": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.6.tgz", - "integrity": "sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", "dev": true, "dependencies": { "@tufjs/models": "1.0.4", "debug": "^4.3.4", - "make-fetch-happen": "^11.1.0" + "make-fetch-happen": "^11.1.1" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/tuf-js/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/tuf-js/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -16851,13 +15995,6 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "peer": true - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -16903,14 +16040,14 @@ } }, "node_modules/vite": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.1.tgz", - "integrity": "sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", "dev": true, "dependencies": { "esbuild": "^0.17.5", - "postcss": "^8.4.21", - "rollup": "^3.20.2" + "postcss": "^8.4.23", + "rollup": "^3.21.0" }, "bin": { "vite": "bin/vite.js" @@ -17139,9 +16276,9 @@ } }, "node_modules/webpack": { - "version": "5.80.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", - "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -17150,10 +16287,10 @@ "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.13.0", + "enhanced-resolve": "^5.14.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -17186,9 +16323,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.0.2.tgz", - "integrity": "sha512-iOddiJzPcQC6lwOIu60vscbGWth8PCRcWRCwoQcTQf9RMoOWBHg5EyzpGdtSmGMrSPd5vHEfFXmVErQEmkRngQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -17214,9 +16351,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz", - "integrity": "sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw==", + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", + "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -17317,9 +16454,9 @@ } }, "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -17746,16 +16883,6 @@ "node": ">=12" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/console/package.json b/console/package.json index 4e4fb35db..f1bb3aed4 100644 --- a/console/package.json +++ b/console/package.json @@ -12,18 +12,18 @@ }, "private": true, "dependencies": { - "@angular/animations": "^16.0.1", - "@angular/cdk": "^16.0.1", - "@angular/common": "^16.0.1", - "@angular/compiler": "^16.0.1", - "@angular/core": "^16.0.1", - "@angular/forms": "^16.0.1", - "@angular/material": "^16.0.1", - "@angular/material-moment-adapter": "^16.0.1", - "@angular/platform-browser": "^16.0.1", - "@angular/platform-browser-dynamic": "^16.0.1", - "@angular/router": "^16.0.1", - "@angular/service-worker": "^16.0.1", + "@angular/animations": "^16.1.2", + "@angular/cdk": "^16.1.2", + "@angular/common": "^16.1.2", + "@angular/compiler": "^16.1.2", + "@angular/core": "^16.1.2", + "@angular/forms": "^16.1.2", + "@angular/material": "^16.1.2", + "@angular/material-moment-adapter": "^16.1.2", + "@angular/platform-browser": "^16.1.2", + "@angular/platform-browser-dynamic": "^16.1.2", + "@angular/router": "^16.1.2", + "@angular/service-worker": "^16.1.2", "@ctrl/ngx-codemirror": "^6.1.0", "@grpc/grpc-js": "^1.8.14", "@ngx-translate/core": "^14.0.0", @@ -41,7 +41,7 @@ "libphonenumber-js": "^1.10.30", "material-design-icons-iconfont": "^6.1.1", "moment": "^2.29.4", - "ngx-color": "^8.0.3", + "ngx-color": "^9.0.0", "rxjs": "~7.8.0", "tinycolor2": "^1.6.0", "tslib": "^2.4.1", @@ -49,25 +49,25 @@ "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.0.1", + "@angular-devkit/build-angular": "^16.1.1", "@angular-eslint/builder": "16.0.1", "@angular-eslint/eslint-plugin": "16.0.1", "@angular-eslint/eslint-plugin-template": "16.0.1", "@angular-eslint/schematics": "16.0.1", "@angular-eslint/template-parser": "16.0.1", - "@angular/cli": "^16.0.1", - "@angular/compiler-cli": "^16.0.1", - "@angular/language-service": "^16.0.1", + "@angular/cli": "^16.1.1", + "@angular/compiler-cli": "^16.1.2", + "@angular/language-service": "^16.1.2", "@bufbuild/buf": "^1.18.0-1", "@types/file-saver": "^2.0.2", "@types/google-protobuf": "^3.15.3", - "@types/jasmine": "~4.3.0", + "@types/jasmine": "~4.3.3", "@types/jasminewd2": "~2.0.10", "@types/jsonwebtoken": "^9.0.1", "@types/node": "^18.15.11", "@types/qrcode": "^1.5.0", "@types/uuid": "^9.0.1", - "@typescript-eslint/eslint-plugin": "^5.59.2", + "@typescript-eslint/eslint-plugin": "^5.59.11", "@typescript-eslint/parser": "^5.59.5", "codelyzer": "^6.0.2", "eslint": "^8.39.0", From 37cf9f5fb2cb32c7559928b150bf611fe42e637f Mon Sep 17 00:00:00 2001 From: Miguel Cabrerizo <30386061+doncicuto@users.noreply.github.com> Date: Fri, 23 Jun 2023 17:36:11 +0200 Subject: [PATCH 34/37] feat: show font name & preview font in branding (#6026) * feat: add fontname package and draft * feat: change back delete visibility * feat: replace fontname lib with opentype.js * feat: dynamic font preview also for font name --------- Co-authored-by: Max Peintner --- console/package-lock.json | 33 +++++++++++ console/package.json | 2 + .../private-labeling-policy.component.html | 5 +- .../private-labeling-policy.component.scss | 15 ++--- .../private-labeling-policy.component.ts | 57 +++++++++++++++++++ 5 files changed, 100 insertions(+), 12 deletions(-) diff --git a/console/package-lock.json b/console/package-lock.json index 19876cb78..e4f541e63 100644 --- a/console/package-lock.json +++ b/console/package-lock.json @@ -37,6 +37,7 @@ "libphonenumber-js": "^1.10.30", "material-design-icons-iconfont": "^6.1.1", "moment": "^2.29.4", + "opentype.js": "^1.3.4", "ngx-color": "^9.0.0", "rxjs": "~7.8.0", "tinycolor2": "^1.6.0", @@ -61,6 +62,7 @@ "@types/jasminewd2": "~2.0.10", "@types/jsonwebtoken": "^9.0.1", "@types/node": "^18.15.11", + "@types/opentype.js": "^1.3.4", "@types/qrcode": "^1.5.0", "@types/uuid": "^9.0.1", "@typescript-eslint/eslint-plugin": "^5.59.11", @@ -4458,6 +4460,12 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.9.tgz", "integrity": "sha512-IeB32oIV4oGArLrd7znD2rkHQ6EDCM+2Sr76dJnrHwv9OHBTTM6nuDLK9bmikXzPa0ZlWMWtRGo/Uw4mrzQedA==" }, + "node_modules/@types/opentype.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/opentype.js/-/opentype.js-1.3.4.tgz", + "integrity": "sha512-6fbXi67I07ugNM+FExwJnfuui2hD7hraD6nqjr3UnqsbBpxSkrtmO6tBubPdNAjqRT9TVkquVkNS9IkgTtq6/w==", + "dev": true + }, "node_modules/@types/q": { "version": "0.0.32", "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", @@ -12578,6 +12586,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/opentype.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/opentype.js/-/opentype.js-1.3.4.tgz", + "integrity": "sha512-d2JE9RP/6uagpQAVtJoF0pJJA/fgai89Cc50Yp0EJHk+eLp6QQ7gBoblsnubRULNY132I0J1QKMJ+JTbMqz4sw==", + "dependencies": { + "string.prototype.codepointat": "^0.2.1", + "tiny-inflate": "^1.0.3" + }, + "bin": { + "ot": "bin/ot" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -15205,6 +15228,11 @@ "node": ">=8" } }, + "node_modules/string.prototype.codepointat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==" + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -15546,6 +15574,11 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" + }, "node_modules/tinycolor2": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", diff --git a/console/package.json b/console/package.json index f1bb3aed4..f9f1b262a 100644 --- a/console/package.json +++ b/console/package.json @@ -41,6 +41,7 @@ "libphonenumber-js": "^1.10.30", "material-design-icons-iconfont": "^6.1.1", "moment": "^2.29.4", + "opentype.js": "^1.3.4", "ngx-color": "^9.0.0", "rxjs": "~7.8.0", "tinycolor2": "^1.6.0", @@ -65,6 +66,7 @@ "@types/jasminewd2": "~2.0.10", "@types/jsonwebtoken": "^9.0.1", "@types/node": "^18.15.11", + "@types/opentype.js": "^1.3.4", "@types/qrcode": "^1.5.0", "@types/uuid": "^9.0.1", "@typescript-eslint/eslint-plugin": "^5.59.11", diff --git a/console/src/app/modules/policies/private-labeling-policy/private-labeling-policy.component.html b/console/src/app/modules/policies/private-labeling-policy/private-labeling-policy.component.html index cffa8034d..6ec47521a 100644 --- a/console/src/app/modules/policies/private-labeling-policy/private-labeling-policy.component.html +++ b/console/src/app/modules/policies/private-labeling-policy/private-labeling-policy.component.html @@ -492,7 +492,9 @@

    diff --git a/console/src/app/modules/policies/private-labeling-policy/private-labeling-policy.component.scss b/console/src/app/modules/policies/private-labeling-policy/private-labeling-policy.component.scss index 78a2f7e8d..c7d137102 100644 --- a/console/src/app/modules/policies/private-labeling-policy/private-labeling-policy.component.scss +++ b/console/src/app/modules/policies/private-labeling-policy/private-labeling-policy.component.scss @@ -243,8 +243,6 @@ } .font-preview { - height: 70px; - width: 70px; display: flex; align-items: center; justify-content: center; @@ -252,22 +250,17 @@ margin-bottom: 1rem; border: 1px solid map-get($foreground, divider); position: relative; + padding: 1rem 0.5rem 1rem 0.75rem; - .icon { - position: absolute; - top: 50%; - left: 50%; - transform: translateX(-50%) translateY(-50%); + .font-name { + margin-left: 0.5rem; + font-size: 16px; } .dl-btn { z-index: 2; - position: absolute; - right: 0; - top: 0; cursor: pointer; visibility: hidden; - transform: translateX(50%) translateY(-50%); } &:hover { diff --git a/console/src/app/modules/policies/private-labeling-policy/private-labeling-policy.component.ts b/console/src/app/modules/policies/private-labeling-policy/private-labeling-policy.component.ts index 6fb17bc86..6e579352d 100644 --- a/console/src/app/modules/policies/private-labeling-policy/private-labeling-policy.component.ts +++ b/console/src/app/modules/policies/private-labeling-policy/private-labeling-policy.component.ts @@ -31,6 +31,7 @@ import { } from 'src/app/services/theme.service'; import { ToastService } from 'src/app/services/toast.service'; +import * as opentype from 'opentype.js'; import { InfoSectionType } from '../../info-section/info-section.component'; import { WarnDialogComponent } from '../../warn-dialog/warn-dialog.component'; import { PolicyComponentServiceType } from '../policy-component-types.enum'; @@ -88,6 +89,8 @@ export class PrivateLabelingPolicyComponent implements OnInit, OnDestroy { public ColorType: any = ColorType; public AssetType: any = AssetType; + public fontName = ''; + public refreshPreview: EventEmitter = new EventEmitter(); public org!: Org.AsObject; public InfoSectionType: any = InfoSectionType; @@ -180,6 +183,10 @@ export class PrivateLabelingPolicyComponent implements OnInit, OnDestroy { if (file) { const formData = new FormData(); formData.append('file', file); + + this.getFontName(file); + this.previewNewFont(file); + switch (this.serviceType) { case PolicyComponentServiceType.MGMT: return this.handleFontUploadPromise(this.assetService.upload(AssetEndpoint.MGMTFONT, formData, this.org.id)); @@ -199,6 +206,7 @@ export class PrivateLabelingPolicyComponent implements OnInit, OnDestroy { this.getPreviewData().then((data) => { if (data.policy) { this.previewData = data.policy; + this.fontName = ''; } }); }, 1000); @@ -374,6 +382,11 @@ export class PrivateLabelingPolicyComponent implements OnInit, OnDestroy { .then((data) => { if (data.policy) { this.previewData = data.policy; + if (this.previewData?.fontUrl) { + this.fetchFontMetadataAndPreview(this.previewData.fontUrl); + } else { + this.fontName = 'Could not parse font name'; + } this.loading = false; } }) @@ -385,6 +398,11 @@ export class PrivateLabelingPolicyComponent implements OnInit, OnDestroy { .then((data) => { if (data.policy) { this.data = data.policy; + if (this.data?.fontUrl) { + this.fetchFontMetadataAndPreview(this.data?.fontUrl); + } else { + this.fontName = 'Could not parse font name'; + } this.loading = false; } }) @@ -678,6 +696,45 @@ export class PrivateLabelingPolicyComponent implements OnInit, OnDestroy { }); } + private fetchFontMetadataAndPreview(url: string): void { + fetch(url) + .then((res) => res.blob()) + .then((blob) => { + this.getFontName(blob); + this.previewNewFont(blob); + }); + } + + private getFontName(blob: Blob): void { + const reader = new FileReader(); + reader.onload = (e) => { + if (e.target && e.target.result) { + try { + const font = opentype.parse(e.target.result); + this.fontName = font.names.fullName['en']; + } catch (e) { + this.fontName = 'Could not parse font name'; + } + } + }; + reader.readAsArrayBuffer(blob); + } + + private previewNewFont(blob: Blob): void { + const reader = new FileReader(); + + reader.onload = (e) => { + if (e.target) { + let customFont = new FontFace('brandingFont', `url(${e.target.result})`); + // typescript complains that add is not found but + // indeed it is https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet/add + // @ts-ignore + document.fonts.add(customFont); + } + }; + reader.readAsDataURL(blob); + } + // /** // * defaults to false because urls are distinct anyway // */ From cef17b4a7ade76d9f895c5938716a3ceeecc15a8 Mon Sep 17 00:00:00 2001 From: mffap Date: Mon, 26 Jun 2023 14:48:12 +0200 Subject: [PATCH 35/37] docs(guides): Update metadata guide (#6072) * wip new structure * finalize * broken link --- .../guides/manage/customize/user-metadata.md | 298 ++++++++++-------- 1 file changed, 163 insertions(+), 135 deletions(-) diff --git a/docs/docs/guides/manage/customize/user-metadata.md b/docs/docs/guides/manage/customize/user-metadata.md index 0ab6cd569..23d078194 100644 --- a/docs/docs/guides/manage/customize/user-metadata.md +++ b/docs/docs/guides/manage/customize/user-metadata.md @@ -5,158 +5,57 @@ title: User Metadata import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -In this guide you will learn how to manually create the necessary requests to authenticate and request a user's metadata from ZITADEL. +This guide shows you how to request metadata from a user. +ZITADEL offers multiple methods to retrieve metadata. +Pick the one that works best for your solution. -Typical examples for user metadata include: +## Use cases for metadata + +Typical use cases for user metadata include: - Link the user to an internal identifier (eg, userId, contract number, etc.) - Save custom user data when registering a user - Route upstream traffic based on user attributes -## Prerequisites +## Before you start -### Create a new client +Before you start you need to add some metadata to an existing user. +You can do so by using [Console](../console/users) or [setting user metadata](/docs/apis/resources/mgmt/management-service-set-user-metadata) through the management API. -- Create a new [web application](../console/applications#web) -- Use Code-Flow -- In this example we will use `http://localhost` as redirect url -- Make sure to note the client secret +Most of the methods below require you to login with the correct user while setting some scopes. +Make sure you pick the right user when logging into the test application. +Use the [OIDC authentication request playground](/docs/apis/openidoauth/authrequest) or the configuration of an [example client](/docs/examples/introduction) to set the required scopes and receive a valid access token. -### Add metadata to a user - -- [Add metadata](/guides/manage/customize/user-metadata) to a user -- Make sure you will use this user to login during later steps - -## Requesting a token - -:::info -In this guide we will manually request a token from ZITADEL for demonstration purposes. You will likely use a client library for the OpenID Authentication. +:::info Getting a token +In case you want to test out different settings configure an application with code flow (PKCE). +Grab the code from the url parameter after a successful login and exchange the code for tokens by calling the [token endpoint](/docs/apis/openidoauth/endpoints#token_endpoint). +You will find more information in our guides on how to [authenticate users](/docs/guides/integrate/login-users). ::: -### Set environment variables +## Use tokens to get user metadata -We will use some information throughout this guide. Set the required environment variables as follows. Make sure to replace the values with your information. +Use one of these methods to get the metadata for the currently logged in user. -```bash -export CLIENT_SECRET=QCiMffalakI...zpT0vuOsSkVk1ne \ -export CLIENT_ID="16604...@docs-claims" \ -export REDIRECT_URI="http://localhost" \ -export ZITADEL_DOMAIN="https://...asd.zitadel.cloud" -``` - - - - -Grab zitadel-tools to create the [required string](/apis/openidoauth/authn-methods#client-secret-basic) for Basic authentication: - -```bash -git clone git@github.com:zitadel/zitadel-tools.git -cd zitadel-tools/cmd/basicauth -export BASIC_AUTH="$(go run basicauth.go -id $CLIENT_ID -secret $CLIENT_SECRET)" -``` - - - - - -```python -import base64 -import urllib.parse -import os - -clientId = os.environ.get("CLIENT_ID") -clientSecret = os.environ.get("CLIENT_SECRET") - -escaped = safe_string = urllib.parse.quote_plus(clientId) + ":" + urllib.parse.quote_plus(clientSecret) -message_bytes = escaped.encode('ascii') -base64_bytes = base64.b64encode(message_bytes) -base64_message = base64_bytes.decode('ascii') - -print(base64_message) -``` - -Export the result to the environment variable `BASIC_AUTH`. - - - - - -```javascript -esc = encodeURIComponent(process.env.CLIENT_ID) + ":" + encodeURIComponent(process.env.CLIENT_SECRET) -enc = btoa(esc) -console.log(enc) -``` - -Export the result to the environment variable `BASIC_AUTH`. - - - - - -You need to create a string as described [here](/apis/openidoauth/authn-methods#client-secret-basic). - -Use a programming language of your choice or manually create the strings with online tools (don't use these secrets for production) like: - -- https://www.urlencoder.org/ -- https://www.base64encode.org/ - -Export the result to the environment variable `BASIC_AUTH`. - - - - -### Create Auth Request - -You need to create a valid auth request, including the reserved scope `urn:zitadel:iam:user:metadata`. Please refer to our API documentation for more information about [reserved scopes](/apis/openidoauth/scopes#reserved-scopes) or try it out in our [OIDC Authrequest Playground](/apis/openidoauth/authrequest?scope=openid%20email%20profile%20urn%3Azitadel%3Aiam%3Auser%3Ametadata). - -Login with the user to which you have added the metadata. After the login you will be redirected. - -Grab the code paramter from the url (disregard the &code= parameter) and export the code as environment variable: - -```bash -export AUTH_CODE="Y6nWsgR5WB...zUtFqSp5Xw" -``` - -### Token Request - -```bash -curl --request POST \ ---url "${ZITADEL_DOMAIN}/oauth/v2/token" \ ---header "Accept: application/json" \ ---header "Authorization: Basic ${BASIC_AUTH}" \ ---header 'Content-Type: application/x-www-form-urlencoded' \ ---data grant_type=authorization_code \ ---data-urlencode "code=$AUTH_CODE" \ ---data-urlencode "redirect_uri=$REDIRECT_URI" -``` - -The result will give you something like: - -```json -{ - "access_token":"jZuRixKQTVecEjKqw...kc3G4", - "token_type":"Bearer", - "expires_in":43199, - "id_token":"ey...Ww" -} -``` - -Grab the access_token value and export as an environment variable: - -```bash -export ACCESS_TOKEN="jZuRixKQTVecEjKqw...kc3G4" -``` +In case you want to manage metadata for other users than the currently logged in user, then you must use the [management service](#manage-user-metadata-through-the-management-api). ### Request metadata from userinfo endpoint -With the access token we can make a request to the userinfo endpoint to get the user's metadata. This method is the preferred method to retrieve a user's information in combination with opaque tokens, to insure that the token is valid. +With the access token we can make a request to the [userinfo endpoint](/docs/apis/openidoauth/endpoints#introspection_endpoint) to get the user's metadata. +This method is the preferred method to retrieve a user's information in combination with opaque tokens, to insure that the token is valid. + +You must pass the [reserved scope](/docs/apis/openidoauth/scopes#reserved-scopes) `urn:zitadel:iam:user:metadata` in your authentication request. +If you don't include this scope the response will contain user data, but not the metadata object. + +Request the user information by calling the [userinfo endpoint](/docs/apis/openidoauth/endpoints#introspection_endpoint): ```bash curl --request GET \ - --url "${ZITADEL_DOMAIN}/oidc/v1/userinfo" \ + --url "https://$ZITADEL_DOMAIN/oidc/v1/userinfo" \ --header "Authorization: Bearer $ACCESS_TOKEN" ``` +Replace `$ACCESS_TOKEN` with your user's access token. + The response will look something like this ```json @@ -178,15 +77,19 @@ The response will look something like this } ``` -You can grab the metadata from the reserved claim `"urn:zitadel:iam:user:metadata"` as key-value pairs. Note that the values are base64 encoded. So the value `MTIzNA` decodes to `1234`. +You can grab the metadata from the reserved claim `"urn:zitadel:iam:user:metadata"` as key-value pairs. +Note that the values are base64 encoded. +So the value `MTIzNA` decodes to `1234`. -### Send metadata inside the ID token (optional) +### Send metadata inside the ID token -Check "User Info inside ID Token" in the configuration of your application. +You might want to include metadata directly into the ID Token. +For that you need to enable "User Info inside ID Token" in your application's settings. ![](/img/console_projects_application_token_settings.png) -Now request a new token from ZITADEL. +Now request a new token from ZITADEL by logging in with the user that has metadata attached. +Make sure you log into the correct client/application where you enabled the settings. The result will give you something like: @@ -199,4 +102,129 @@ The result will give you something like: } ``` -Grab the id_token and inspect the contents of the token at [jwt.io](https://jwt.io/). You should get the same info in the ID token as when requested from the user endpoint. \ No newline at end of file +When you decode the value of `id_token`, then the response will include the metadata claim: + +```json +{ + "amr": [ + "password", + "pwd", + "mfa", + "otp" + ], + "at_hash": "lGIblkTr8faHz2zd0oTddA", + "aud": [ + "170086824411201793@portal", + "209806276543185153@portal", + "170086774599581953" + ], + "auth_time": 1687418556, + "azp": "170086824411201793@portal", + "c_hash": "dA3wre4ytCJCn11f7cIm0A", + "client_id": "1700...1793@portal", + "email": "road.runner@zitadel.com", + "email_verified": true, + "exp": 1687422272, + "family_name": "Runner", + "given_name": "Road", + "iat": 1687418672, + "iss": "https://...-abcd.zitadel.cloud", + "locale": null, + "name": "Road Runner", + "preferred_username": "road.runner@...-abcd.zitadel.cloud", + "sub": "170848145649959169", + "updated_at": 1658329554, + //highlight-start + "urn:zitadel:iam:user:metadata": { + "ContractNumber": "MTIzNA" + } + //highlight-end +} +``` + +Note that the values are base64 encoded. +So the value `MTIzNA` decodes to `1234`. + +:::info decoding the jwt token +Use a website like [jwt.io](https://jwt.io/) to decode the token. +With jq installed you can also use `jq -R 'split(".") | .[1] | @base64d | fromjson' <<< $ID_TOKEN` +::: + +### Request metadata from authentication API + +You can use the authentication service to request and search for the user's metadata. + +The introspection endpoint and the token endpoint in the examples above do not require a special scope to access. +Yet when accessing the authentication service, you need to pass the [reserved scope](/docs/apis/openidoauth/scopes#reserved-scopes) `urn:zitadel:iam:org:project:id:zitadel:aud` along with the authentication request. +This scope allows the user to access ZITADEL's APIs, specifically the authentication API that we need for this method. +Use the [OIDC authentication request playground](/docs/apis/openidoauth/authrequest) or the configuration of an [example client](/docs/examples/introduction) to set the required scopes and receive a valid access token. + +:::note Invalid audience +If you get the error "invalid audience (APP-Zxfako)", then you need to add the reserved scope `urn:zitadel:iam:org:project:id:zitadel:aud` to your authentication request. +::: + +You can request the user's metadata with the [List My Metadata](/docs/apis/resources/auth/auth-service-list-my-metadata) method: + +```bash +curl -L -X POST "https://$ZITADEL_DOMAIN/auth/v1/users/me/metadata/_search" \ +-H 'Content-Type: application/json' \ +-H 'Accept: application/json' \ +-H "Authorization: Bearer $ACCESS_TOKEN" \ +--data-raw '{ + "query": { + "offset": "0", + "limit": 100, + "asc": true + }, + "queries": [ + { + "keyQuery": { + "key": "$METADATA_KEY", + "method": "TEXT_QUERY_METHOD_EQUALS" + } + } + ] +}' +``` + +Replace `$ACCESS_TOKEN` with your user's access token. +Replace `$ZITADEL_DOMAIN` with your ZITADEL instance's url. +Replace `$METADATA_KEY` with they key you want to search for (f.e. "ContractNumber") + +:::info Get all metadata +You can omit the queries array to retrieve all metadata key-value pairs. +::: + +An example response for your search looks like this: + +```json +{ + "details":{ + "totalResult":"1", + "processedSequence":"2935", + "viewTimestamp":"2023-06-21T16:01:52.829838Z" + }, + "result":[ + { + "details":{ + "sequence":"409", + "creationDate":"2022-08-04T09:09:06.259324Z", + "changeDate":"2022-08-04T09:09:06.259324Z", + "resourceOwner":"170086363054473473" + }, + "key":"ContractNumber", + "value":"MTIzNA" + } + ] +} +``` + +## Manage user metadata through the management API + +The previous methods allowed you to retrieve metadata only for the `sub` in the access token. +In case you want to get the metadata for another user, you need to use the management service. +The user that calls the management service must have [manager permissions](/docs/guides/manage/console/managers). +A user can be either a human user or a service user. + +You can get [metadata of a user filtered by your query](/docs/apis/resources/mgmt/management-service-list-user-metadata) or [get a metadata object from a user by a specific key](/docs/apis/resources/mgmt/management-service-get-user-metadata). +The management service allows you to set and delete metadata, see the [API documentation for users](/docs/category/apis/resources/mgmt/users). From d0cda1b47911f4b0e0ff335b730db85a1478cf7f Mon Sep 17 00:00:00 2001 From: Silvan Date: Tue, 27 Jun 2023 11:56:17 +0200 Subject: [PATCH 36/37] fix(migration): speed up step 11 (#6086) --- cmd/setup/11.go | 46 ++++++------------------------- cmd/setup/11/11_fetch_events.sql | 12 -------- cmd/setup/11/11_fill_column.sql | 1 - cmd/setup/11/11_update_events.sql | 21 ++++++++++++++ 4 files changed, 29 insertions(+), 51 deletions(-) delete mode 100644 cmd/setup/11/11_fetch_events.sql delete mode 100644 cmd/setup/11/11_fill_column.sql create mode 100644 cmd/setup/11/11_update_events.sql diff --git a/cmd/setup/11.go b/cmd/setup/11.go index 544188d12..917f479e0 100644 --- a/cmd/setup/11.go +++ b/cmd/setup/11.go @@ -4,7 +4,6 @@ import ( "context" "database/sql" "embed" - "time" "github.com/cockroachdb/cockroach-go/v2/crdb" "github.com/zitadel/logging" @@ -15,10 +14,8 @@ import ( var ( //go:embed 11/11_add_column.sql addEventCreatedAt string - //go:embed 11/11_fetch_events.sql - fetchCreatedAt string - //go:embed 11/11_fill_column.sql - fillCreatedAt string + //go:embed 11/11_update_events.sql + setCreatedAt string //go:embed 11/11_set_column.sql setCreatedAtDetails string //go:embed 11/postgres/create_index.sql @@ -55,49 +52,22 @@ func (mig *AddEventCreatedAt) Execute(ctx context.Context) error { return err } - for { - var count int + for i := 0; ; i++ { + var affected int64 err = crdb.ExecuteTx(ctx, mig.dbClient.DB, nil, func(tx *sql.Tx) error { - rows, err := tx.Query(fetchCreatedAt, mig.BulkAmount) + res, err := tx.Exec(setCreatedAt, mig.BulkAmount) if err != nil { return err } - defer rows.Close() - - data := make(map[string]time.Time, 20) - for rows.Next() { - count++ - var ( - id string - creationDate time.Time - ) - - err = rows.Scan(&id, &creationDate) - if err != nil { - return err - } - - data[id] = creationDate - - } - if err := rows.Err(); err != nil { - return err - } - - for id, creationDate := range data { - _, err = tx.Exec(fillCreatedAt, creationDate, id) - if err != nil { - return err - } - } + affected, _ = res.RowsAffected() return nil }) if err != nil { return err } - logging.WithFields("count", count).Info("creation dates set") - if count < 20 { + logging.WithFields("step", "11", "iteration", i, "affected", affected).Info("set created_at iteration done") + if affected < int64(mig.BulkAmount) { break } } diff --git a/cmd/setup/11/11_fetch_events.sql b/cmd/setup/11/11_fetch_events.sql deleted file mode 100644 index f66882675..000000000 --- a/cmd/setup/11/11_fetch_events.sql +++ /dev/null @@ -1,12 +0,0 @@ -SELECT - id - , creation_date -FROM - eventstore.events -WHERE - created_at IS NULL -ORDER BY - event_sequence DESC - , instance_id -LIMIT $1 -FOR UPDATE \ No newline at end of file diff --git a/cmd/setup/11/11_fill_column.sql b/cmd/setup/11/11_fill_column.sql deleted file mode 100644 index 0a16913db..000000000 --- a/cmd/setup/11/11_fill_column.sql +++ /dev/null @@ -1 +0,0 @@ -UPDATE eventstore.events SET created_at = $1 WHERE id = $2 \ No newline at end of file diff --git a/cmd/setup/11/11_update_events.sql b/cmd/setup/11/11_update_events.sql new file mode 100644 index 000000000..15a3df8a0 --- /dev/null +++ b/cmd/setup/11/11_update_events.sql @@ -0,0 +1,21 @@ +UPDATE eventstore.events SET + created_at = creation_date +FROM ( + SELECT + e.event_sequence as seq + , e.instance_id as i_id + , e.creation_date as cd + FROM + eventstore.events e + WHERE + created_at IS NULL + ORDER BY + event_sequence ASC + , instance_id + LIMIT $1 +) AS e +WHERE + e.seq = eventstore.events.event_sequence + AND e.i_id = eventstore.events.instance_id + AND e.cd = eventstore.events.creation_date +; \ No newline at end of file From bd5defa96a734365116456b63ae55422a472a45f Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Tue, 27 Jun 2023 14:36:07 +0200 Subject: [PATCH 37/37] fix: provide domain in session, passkey and u2f (#6097) This fix provides a possibility to pass a domain on the session, which will be used (as rpID) to create a passkey / u2f assertion and attestation. This is useful in cases where the login UI is served under a different domain / origin than the ZITADEL API. --- internal/api/grpc/session/v2/session.go | 3 +- .../session/v2/session_integration_test.go | 20 ++++- internal/api/grpc/user/v2/passkey.go | 4 +- internal/api/grpc/user/v2/u2f.go | 2 +- internal/command/session.go | 4 +- internal/command/session_model.go | 11 ++- internal/command/session_passkey.go | 2 +- internal/command/session_passkeys_test.go | 3 +- internal/command/session_test.go | 50 ++++++++++-- internal/command/user_converter.go | 1 + internal/command/user_human_webauthn.go | 18 ++--- internal/command/user_human_webauthn_model.go | 2 + internal/command/user_v2_passkey.go | 18 ++--- internal/command/user_v2_passkey_test.go | 16 ++-- internal/command/user_v2_u2f.go | 14 ++-- internal/command/user_v2_u2f_test.go | 11 +-- internal/domain/human_web_auth_n.go | 2 + internal/integration/client.go | 1 + internal/query/projection/session.go | 5 +- internal/query/projection/session_test.go | 23 +++--- internal/query/session.go | 13 ++++ internal/query/sessions_test.go | 78 +++++++++++-------- internal/repository/session/session.go | 4 + .../repository/user/human_mfa_passwordless.go | 2 + internal/repository/user/human_mfa_u2f.go | 2 + .../repository/user/human_mfa_web_auth_n.go | 3 + internal/webauthn/converter.go | 4 +- internal/webauthn/webauthn.go | 51 ++++++++---- internal/webauthn/webauthn_test.go | 23 ++++-- proto/zitadel/session/v2alpha/session.proto | 5 ++ .../session/v2alpha/session_service.proto | 5 ++ proto/zitadel/user/v2alpha/user_service.proto | 10 +++ 32 files changed, 287 insertions(+), 123 deletions(-) diff --git a/internal/api/grpc/session/v2/session.go b/internal/api/grpc/session/v2/session.go index 6c31fbeab..8ac29a488 100644 --- a/internal/api/grpc/session/v2/session.go +++ b/internal/api/grpc/session/v2/session.go @@ -47,7 +47,7 @@ func (s *Server) CreateSession(ctx context.Context, req *session.CreateSessionRe } challengeResponse, cmds := s.challengesToCommand(req.GetChallenges(), checks) - set, err := s.command.CreateSession(ctx, cmds, metadata) + set, err := s.command.CreateSession(ctx, cmds, req.GetDomain(), metadata) if err != nil { return nil, err } @@ -107,6 +107,7 @@ func sessionToPb(s *query.Session) *session.Session { Sequence: s.Sequence, Factors: factorsToPb(s), Metadata: s.Metadata, + Domain: s.Domain, } } diff --git a/internal/api/grpc/session/v2/session_integration_test.go b/internal/api/grpc/session/v2/session_integration_test.go index 097bba7be..6c3c2720d 100644 --- a/internal/api/grpc/session/v2/session_integration_test.go +++ b/internal/api/grpc/session/v2/session_integration_test.go @@ -141,6 +141,7 @@ func TestServer_CreateSession(t *testing.T) { }, }, Metadata: map[string][]byte{"foo": []byte("bar")}, + Domain: "domain", }, want: &session.CreateSessionResponse{ Details: &object.Details{ @@ -169,6 +170,22 @@ func TestServer_CreateSession(t *testing.T) { }, wantErr: true, }, + { + name: "passkey without domain (not registered) error", + req: &session.CreateSessionRequest{ + Checks: &session.Checks{ + User: &session.CheckUser{ + Search: &session.CheckUser_UserId{ + UserId: User.GetUserId(), + }, + }, + }, + Challenges: []session.ChallengeKind{ + session.ChallengeKind_CHALLENGE_KIND_PASSKEY, + }, + }, + wantErr: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -198,6 +215,7 @@ func TestServer_CreateSession_passkey(t *testing.T) { Challenges: []session.ChallengeKind{ session.ChallengeKind_CHALLENGE_KIND_PASSKEY, }, + Domain: Tester.Config.ExternalDomain, }) require.NoError(t, err) verifyCurrentSession(t, createResp.GetSessionId(), createResp.GetSessionToken(), createResp.GetDetails().GetSequence(), time.Minute, nil) @@ -325,7 +343,7 @@ func TestServer_SetSession_flow(t *testing.T) { var wantFactors []wantFactor // create new, empty session - createResp, err := Client.CreateSession(CTX, &session.CreateSessionRequest{}) + createResp, err := Client.CreateSession(CTX, &session.CreateSessionRequest{Domain: Tester.Config.ExternalDomain}) require.NoError(t, err) verifyCurrentSession(t, createResp.GetSessionId(), createResp.GetSessionToken(), createResp.GetDetails().GetSequence(), time.Minute, nil, wantFactors...) sessionToken := createResp.GetSessionToken() diff --git a/internal/api/grpc/user/v2/passkey.go b/internal/api/grpc/user/v2/passkey.go index 6f62be3de..1b4414474 100644 --- a/internal/api/grpc/user/v2/passkey.go +++ b/internal/api/grpc/user/v2/passkey.go @@ -20,11 +20,11 @@ func (s *Server) RegisterPasskey(ctx context.Context, req *user.RegisterPasskeyR ) if code := req.GetCode(); code != nil { return passkeyRegistrationDetailsToPb( - s.command.RegisterUserPasskeyWithCode(ctx, req.GetUserId(), resourceOwner, authenticator, code.Id, code.Code, s.userCodeAlg), + s.command.RegisterUserPasskeyWithCode(ctx, req.GetUserId(), resourceOwner, authenticator, code.Id, code.Code, req.GetDomain(), s.userCodeAlg), ) } return passkeyRegistrationDetailsToPb( - s.command.RegisterUserPasskey(ctx, req.GetUserId(), resourceOwner, authenticator), + s.command.RegisterUserPasskey(ctx, req.GetUserId(), resourceOwner, req.GetDomain(), authenticator), ) } diff --git a/internal/api/grpc/user/v2/u2f.go b/internal/api/grpc/user/v2/u2f.go index ae1daf844..5178125f7 100644 --- a/internal/api/grpc/user/v2/u2f.go +++ b/internal/api/grpc/user/v2/u2f.go @@ -12,7 +12,7 @@ import ( func (s *Server) RegisterU2F(ctx context.Context, req *user.RegisterU2FRequest) (*user.RegisterU2FResponse, error) { return u2fRegistrationDetailsToPb( - s.command.RegisterUserU2F(ctx, req.GetUserId(), authz.GetCtxData(ctx).ResourceOwner), + s.command.RegisterUserU2F(ctx, req.GetUserId(), authz.GetCtxData(ctx).ResourceOwner, req.GetDomain()), ) } diff --git a/internal/command/session.go b/internal/command/session.go index 71e9a6982..fb1dd42d0 100644 --- a/internal/command/session.go +++ b/internal/command/session.go @@ -157,7 +157,7 @@ func (s *SessionCommands) commands(ctx context.Context) (string, []eventstore.Co return token, s.sessionWriteModel.commands, nil } -func (c *Commands) CreateSession(ctx context.Context, cmds []SessionCommand, metadata map[string][]byte) (set *SessionChanged, err error) { +func (c *Commands) CreateSession(ctx context.Context, cmds []SessionCommand, sessionDomain string, metadata map[string][]byte) (set *SessionChanged, err error) { sessionID, err := c.idGenerator.Next() if err != nil { return nil, err @@ -167,8 +167,8 @@ func (c *Commands) CreateSession(ctx context.Context, cmds []SessionCommand, met if err != nil { return nil, err } + sessionWriteModel.Start(ctx, sessionDomain) cmd := c.NewSessionCommands(cmds, sessionWriteModel) - cmd.sessionWriteModel.Start(ctx) return c.updateSession(ctx, cmd, metadata) } diff --git a/internal/command/session_model.go b/internal/command/session_model.go index 99fd9f36e..aed542697 100644 --- a/internal/command/session_model.go +++ b/internal/command/session_model.go @@ -16,6 +16,7 @@ type PasskeyChallengeModel struct { Challenge string AllowedCrentialIDs [][]byte UserVerification domain.UserVerificationRequirement + RPID string } func (p *PasskeyChallengeModel) WebAuthNLogin(human *domain.Human, credentialAssertionData []byte) (*domain.WebAuthNLogin, error) { @@ -28,6 +29,7 @@ func (p *PasskeyChallengeModel) WebAuthNLogin(human *domain.Human, credentialAss Challenge: p.Challenge, AllowedCredentialIDs: p.AllowedCrentialIDs, UserVerification: p.UserVerification, + RPID: p.RPID, }, nil } @@ -41,6 +43,7 @@ type SessionWriteModel struct { IntentCheckedAt time.Time PasskeyCheckedAt time.Time Metadata map[string][]byte + Domain string State domain.SessionState PasskeyChallenge *PasskeyChallengeModel @@ -109,6 +112,7 @@ func (wm *SessionWriteModel) Query() *eventstore.SearchQueryBuilder { } func (wm *SessionWriteModel) reduceAdded(e *session.AddedEvent) { + wm.Domain = e.Domain wm.State = domain.SessionStateActive } @@ -130,6 +134,7 @@ func (wm *SessionWriteModel) reducePasskeyChallenged(e *session.PasskeyChallenge Challenge: e.Challenge, AllowedCrentialIDs: e.AllowedCrentialIDs, UserVerification: e.UserVerification, + RPID: wm.Domain, } } @@ -146,8 +151,10 @@ func (wm *SessionWriteModel) reduceTerminate() { wm.State = domain.SessionStateTerminated } -func (wm *SessionWriteModel) Start(ctx context.Context) { - wm.commands = append(wm.commands, session.NewAddedEvent(ctx, wm.aggregate)) +func (wm *SessionWriteModel) Start(ctx context.Context, domain string) { + wm.commands = append(wm.commands, session.NewAddedEvent(ctx, wm.aggregate, domain)) + // set the domain so checks can use it + wm.Domain = domain } func (wm *SessionWriteModel) UserChecked(ctx context.Context, userID string, checkedAt time.Time) error { diff --git a/internal/command/session_passkey.go b/internal/command/session_passkey.go index d4664ca2f..6de850b23 100644 --- a/internal/command/session_passkey.go +++ b/internal/command/session_passkey.go @@ -43,7 +43,7 @@ func (c *Commands) CreatePasskeyChallenge(userVerification domain.UserVerificati if err != nil { return err } - webAuthNLogin, err := c.webauthnConfig.BeginLogin(ctx, humanPasskeys.human, userVerification, humanPasskeys.tokens...) + webAuthNLogin, err := c.webauthnConfig.BeginLogin(ctx, humanPasskeys.human, userVerification, cmd.sessionWriteModel.Domain, humanPasskeys.tokens...) if err != nil { return err } diff --git a/internal/command/session_passkeys_test.go b/internal/command/session_passkeys_test.go index fdc324537..a934c83d7 100644 --- a/internal/command/session_passkeys_test.go +++ b/internal/command/session_passkeys_test.go @@ -84,7 +84,7 @@ func TestSessionCommands_getHumanPasskeys(t *testing.T) { expectFilter(eventFromEventPusher( user.NewHumanWebAuthNAddedEvent(eventstore.NewBaseEventForPush( context.Background(), &org.NewAggregate("org1").Aggregate, user.HumanPasswordlessTokenAddedType, - ), "111", "challenge"), + ), "111", "challenge", "rpID"), )), ), sessionWriteModel: &SessionWriteModel{ @@ -112,6 +112,7 @@ func TestSessionCommands_getHumanPasskeys(t *testing.T) { WebAuthNTokenID: "111", State: domain.MFAStateNotReady, Challenge: "challenge", + RPID: "rpID", }}, }, err: nil, diff --git a/internal/command/session_test.go b/internal/command/session_test.go index f9287a772..92d19ac24 100644 --- a/internal/command/session_test.go +++ b/internal/command/session_test.go @@ -147,6 +147,7 @@ func TestCommands_CreateSession(t *testing.T) { type args struct { ctx context.Context checks []SessionCommand + domain string metadata map[string][]byte } type res struct { @@ -194,7 +195,7 @@ func TestCommands_CreateSession(t *testing.T) { expectFilter(), expectPush( eventPusherToEvents( - session.NewAddedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate), + session.NewAddedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, ""), session.NewTokenSetEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, "tokenID", ), @@ -218,6 +219,39 @@ func TestCommands_CreateSession(t *testing.T) { }, }, }, + { + "empty session with domain", + fields{ + idGenerator: mock.NewIDGeneratorExpectIDs(t, "sessionID"), + eventstore: eventstoreExpect(t, + expectFilter(), + expectPush( + eventPusherToEvents( + session.NewAddedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, "domain.tld"), + session.NewTokenSetEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, + "tokenID", + ), + ), + ), + ), + tokenCreator: func(sessionID string) (string, string, error) { + return "tokenID", + "token", + nil + }, + }, + args{ + ctx: authz.NewMockContext("", "org1", ""), + domain: "domain.tld", + }, + res{ + want: &SessionChanged{ + ObjectDetails: &domain.ObjectDetails{ResourceOwner: "org1"}, + ID: "sessionID", + NewToken: "token", + }, + }, + }, // the rest is tested in the Test_updateSession } for _, tt := range tests { @@ -227,7 +261,7 @@ func TestCommands_CreateSession(t *testing.T) { idGenerator: tt.fields.idGenerator, sessionTokenCreator: tt.fields.tokenCreator, } - got, err := c.CreateSession(tt.args.ctx, tt.args.checks, tt.args.metadata) + got, err := c.CreateSession(tt.args.ctx, tt.args.checks, tt.args.domain, tt.args.metadata) require.ErrorIs(t, err, tt.res.err) assert.Equal(t, tt.res.want, got) }) @@ -276,7 +310,7 @@ func TestCommands_UpdateSession(t *testing.T) { eventstore: eventstoreExpect(t, expectFilter( eventFromEventPusher( - session.NewAddedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate)), + session.NewAddedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, "domain.tld")), eventFromEventPusher( session.NewTokenSetEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, "tokenID")), @@ -301,7 +335,7 @@ func TestCommands_UpdateSession(t *testing.T) { eventstore: eventstoreExpect(t, expectFilter( eventFromEventPusher( - session.NewAddedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate)), + session.NewAddedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, "domain.tld")), eventFromEventPusher( session.NewTokenSetEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, "tokenID")), @@ -739,7 +773,7 @@ func TestCommands_TerminateSession(t *testing.T) { eventstore: eventstoreExpect(t, expectFilter( eventFromEventPusher( - session.NewAddedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate)), + session.NewAddedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, "domain.tld")), eventFromEventPusher( session.NewTokenSetEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, "tokenID")), @@ -764,7 +798,7 @@ func TestCommands_TerminateSession(t *testing.T) { eventstore: eventstoreExpect(t, expectFilter( eventFromEventPusher( - session.NewAddedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate)), + session.NewAddedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, "domain.tld")), eventFromEventPusher( session.NewTokenSetEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, "tokenID")), @@ -793,7 +827,7 @@ func TestCommands_TerminateSession(t *testing.T) { eventstore: eventstoreExpect(t, expectFilter( eventFromEventPusher( - session.NewAddedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate)), + session.NewAddedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, "domain.tld")), eventFromEventPusher( session.NewTokenSetEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, "tokenID"), @@ -824,7 +858,7 @@ func TestCommands_TerminateSession(t *testing.T) { eventstore: eventstoreExpect(t, expectFilter( eventFromEventPusher( - session.NewAddedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate)), + session.NewAddedEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, "domain.tld")), eventFromEventPusher( session.NewTokenSetEvent(context.Background(), &session.NewAggregate("sessionID", "org1").Aggregate, "tokenID"), diff --git a/internal/command/user_converter.go b/internal/command/user_converter.go index 599671e1f..62cee0bed 100644 --- a/internal/command/user_converter.go +++ b/internal/command/user_converter.go @@ -140,6 +140,7 @@ func writeModelToWebAuthN(wm *HumanWebAuthNWriteModel) *domain.WebAuthNToken { SignCount: wm.SignCount, WebAuthNTokenName: wm.WebAuthNTokenName, State: wm.State, + RPID: wm.RPID, } } diff --git a/internal/command/user_human_webauthn.go b/internal/command/user_human_webauthn.go index 5156b5f8f..c5e03bf3d 100644 --- a/internal/command/user_human_webauthn.go +++ b/internal/command/user_human_webauthn.go @@ -27,8 +27,8 @@ func (c *Commands) getHumanU2FTokens(ctx context.Context, userID, resourceowner return readModelToU2FTokens(tokenReadModel), nil } -func (c *Commands) getHumanPasswordlessTokens(ctx context.Context, userID, resourceowner string) ([]*domain.WebAuthNToken, error) { - tokenReadModel := NewHumanPasswordlessTokensReadModel(userID, resourceowner) +func (c *Commands) getHumanPasswordlessTokens(ctx context.Context, userID, resourceOwner string) ([]*domain.WebAuthNToken, error) { + tokenReadModel := NewHumanPasswordlessTokensReadModel(userID, resourceOwner) err := c.eventstore.FilterToQueryReducer(ctx, tokenReadModel) if err != nil { return nil, err @@ -82,12 +82,12 @@ func (c *Commands) HumanAddU2FSetup(ctx context.Context, userID, resourceowner s if err != nil { return nil, err } - addWebAuthN, userAgg, webAuthN, err := c.addHumanWebAuthN(ctx, userID, resourceowner, isLoginUI, u2fTokens, domain.AuthenticatorAttachmentUnspecified, domain.UserVerificationRequirementDiscouraged) + addWebAuthN, userAgg, webAuthN, err := c.addHumanWebAuthN(ctx, userID, resourceowner, "", u2fTokens, domain.AuthenticatorAttachmentUnspecified, domain.UserVerificationRequirementDiscouraged) if err != nil { return nil, err } - events, err := c.eventstore.Push(ctx, usr_repo.NewHumanU2FAddedEvent(ctx, userAgg, addWebAuthN.WebauthNTokenID, webAuthN.Challenge)) + events, err := c.eventstore.Push(ctx, usr_repo.NewHumanU2FAddedEvent(ctx, userAgg, addWebAuthN.WebauthNTokenID, webAuthN.Challenge, "")) if err != nil { return nil, err } @@ -108,12 +108,12 @@ func (c *Commands) HumanAddPasswordlessSetup(ctx context.Context, userID, resour if err != nil { return nil, err } - addWebAuthN, userAgg, webAuthN, err := c.addHumanWebAuthN(ctx, userID, resourceowner, isLoginUI, passwordlessTokens, authenticatorPlatform, domain.UserVerificationRequirementRequired) + addWebAuthN, userAgg, webAuthN, err := c.addHumanWebAuthN(ctx, userID, resourceowner, "", passwordlessTokens, authenticatorPlatform, domain.UserVerificationRequirementRequired) if err != nil { return nil, err } - events, err := c.eventstore.Push(ctx, usr_repo.NewHumanPasswordlessAddedEvent(ctx, userAgg, addWebAuthN.WebauthNTokenID, webAuthN.Challenge)) + events, err := c.eventstore.Push(ctx, usr_repo.NewHumanPasswordlessAddedEvent(ctx, userAgg, addWebAuthN.WebauthNTokenID, webAuthN.Challenge, "")) if err != nil { return nil, err } @@ -137,7 +137,7 @@ func (c *Commands) HumanAddPasswordlessSetupInitCode(ctx context.Context, userID return c.HumanAddPasswordlessSetup(ctx, userID, resourceowner, true, preferredPlatformType) } -func (c *Commands) addHumanWebAuthN(ctx context.Context, userID, resourceowner string, isLoginUI bool, tokens []*domain.WebAuthNToken, authenticatorPlatform domain.AuthenticatorAttachment, userVerification domain.UserVerificationRequirement) (*HumanWebAuthNWriteModel, *eventstore.Aggregate, *domain.WebAuthNToken, error) { +func (c *Commands) addHumanWebAuthN(ctx context.Context, userID, resourceowner, rpID string, tokens []*domain.WebAuthNToken, authenticatorPlatform domain.AuthenticatorAttachment, userVerification domain.UserVerificationRequirement) (*HumanWebAuthNWriteModel, *eventstore.Aggregate, *domain.WebAuthNToken, error) { if userID == "" { return nil, nil, nil, caos_errs.ThrowPreconditionFailed(nil, "COMMAND-3M0od", "Errors.IDMissing") } @@ -157,7 +157,7 @@ func (c *Commands) addHumanWebAuthN(ctx context.Context, userID, resourceowner s if accountName == "" { accountName = string(user.EmailAddress) } - webAuthN, err := c.webauthnConfig.BeginRegistration(ctx, user, accountName, authenticatorPlatform, userVerification, isLoginUI, tokens...) + webAuthN, err := c.webauthnConfig.BeginRegistration(ctx, user, accountName, authenticatorPlatform, userVerification, rpID, tokens...) if err != nil { return nil, nil, nil, err } @@ -343,7 +343,7 @@ func (c *Commands) beginWebAuthNLogin(ctx context.Context, userID, resourceOwner if err != nil { return nil, nil, err } - webAuthNLogin, err := c.webauthnConfig.BeginLogin(ctx, human, userVerification, tokens...) + webAuthNLogin, err := c.webauthnConfig.BeginLogin(ctx, human, userVerification, "", tokens...) if err != nil { return nil, nil, err } diff --git a/internal/command/user_human_webauthn_model.go b/internal/command/user_human_webauthn_model.go index b92e35dbd..daf9e880d 100644 --- a/internal/command/user_human_webauthn_model.go +++ b/internal/command/user_human_webauthn_model.go @@ -21,6 +21,7 @@ type HumanWebAuthNWriteModel struct { AAGUID []byte SignCount uint32 WebAuthNTokenName string + RPID string State domain.MFAState } @@ -113,6 +114,7 @@ func (wm *HumanWebAuthNWriteModel) Reduce() error { func (wm *HumanWebAuthNWriteModel) appendAddedEvent(e *user.HumanWebAuthNAddedEvent) { wm.WebauthNTokenID = e.WebAuthNTokenID wm.Challenge = e.Challenge + wm.RPID = e.RPID wm.State = domain.MFAStateNotReady } diff --git a/internal/command/user_v2_passkey.go b/internal/command/user_v2_passkey.go index 19b06d97f..f08a0632c 100644 --- a/internal/command/user_v2_passkey.go +++ b/internal/command/user_v2_passkey.go @@ -16,22 +16,22 @@ import ( // RegisterUserPasskey creates a passkey registration for the current authenticated user. // UserID, usually taken from the request is compared against the user ID in the context. -func (c *Commands) RegisterUserPasskey(ctx context.Context, userID, resourceOwner string, authenticator domain.AuthenticatorAttachment) (*domain.WebAuthNRegistrationDetails, error) { +func (c *Commands) RegisterUserPasskey(ctx context.Context, userID, resourceOwner, rpID string, authenticator domain.AuthenticatorAttachment) (*domain.WebAuthNRegistrationDetails, error) { if err := authz.UserIDInCTX(ctx, userID); err != nil { return nil, err } - return c.registerUserPasskey(ctx, userID, resourceOwner, authenticator) + return c.registerUserPasskey(ctx, userID, resourceOwner, rpID, authenticator) } // RegisterUserPasskeyWithCode registers a new passkey for a unauthenticated user id. // The resource is protected by the code, identified by the codeID. -func (c *Commands) RegisterUserPasskeyWithCode(ctx context.Context, userID, resourceOwner string, authenticator domain.AuthenticatorAttachment, codeID, code string, alg crypto.EncryptionAlgorithm) (*domain.WebAuthNRegistrationDetails, error) { +func (c *Commands) RegisterUserPasskeyWithCode(ctx context.Context, userID, resourceOwner string, authenticator domain.AuthenticatorAttachment, codeID, code, rpID string, alg crypto.EncryptionAlgorithm) (*domain.WebAuthNRegistrationDetails, error) { event, err := c.verifyUserPasskeyCode(ctx, userID, resourceOwner, codeID, code, alg) if err != nil { return nil, err } - return c.registerUserPasskey(ctx, userID, resourceOwner, authenticator, event) + return c.registerUserPasskey(ctx, userID, resourceOwner, rpID, authenticator, event) } type eventCallback func(context.Context, *eventstore.Aggregate) eventstore.Command @@ -63,25 +63,25 @@ func (c *Commands) verifyUserPasskeyCodeFailed(ctx context.Context, wm *HumanPas logging.WithFields("userID", userAgg.ID).OnError(err).Error("RegisterUserPasskeyWithCode push failed") } -func (c *Commands) registerUserPasskey(ctx context.Context, userID, resourceOwner string, authenticator domain.AuthenticatorAttachment, events ...eventCallback) (*domain.WebAuthNRegistrationDetails, error) { - wm, userAgg, webAuthN, err := c.createUserPasskey(ctx, userID, resourceOwner, authenticator) +func (c *Commands) registerUserPasskey(ctx context.Context, userID, resourceOwner, rpID string, authenticator domain.AuthenticatorAttachment, events ...eventCallback) (*domain.WebAuthNRegistrationDetails, error) { + wm, userAgg, webAuthN, err := c.createUserPasskey(ctx, userID, resourceOwner, rpID, authenticator) if err != nil { return nil, err } return c.pushUserPasskey(ctx, wm, userAgg, webAuthN, events...) } -func (c *Commands) createUserPasskey(ctx context.Context, userID, resourceOwner string, authenticator domain.AuthenticatorAttachment) (*HumanWebAuthNWriteModel, *eventstore.Aggregate, *domain.WebAuthNToken, error) { +func (c *Commands) createUserPasskey(ctx context.Context, userID, resourceOwner, rpID string, authenticator domain.AuthenticatorAttachment) (*HumanWebAuthNWriteModel, *eventstore.Aggregate, *domain.WebAuthNToken, error) { passwordlessTokens, err := c.getHumanPasswordlessTokens(ctx, userID, resourceOwner) if err != nil { return nil, nil, nil, err } - return c.addHumanWebAuthN(ctx, userID, resourceOwner, false, passwordlessTokens, authenticator, domain.UserVerificationRequirementRequired) + return c.addHumanWebAuthN(ctx, userID, resourceOwner, rpID, passwordlessTokens, authenticator, domain.UserVerificationRequirementRequired) } func (c *Commands) pushUserPasskey(ctx context.Context, wm *HumanWebAuthNWriteModel, userAgg *eventstore.Aggregate, webAuthN *domain.WebAuthNToken, events ...eventCallback) (*domain.WebAuthNRegistrationDetails, error) { cmds := make([]eventstore.Command, len(events)+1) - cmds[0] = user.NewHumanPasswordlessAddedEvent(ctx, userAgg, wm.WebauthNTokenID, webAuthN.Challenge) + cmds[0] = user.NewHumanPasswordlessAddedEvent(ctx, userAgg, wm.WebauthNTokenID, webAuthN.Challenge, webAuthN.RPID) for i, event := range events { cmds[i+1] = event(ctx, userAgg) } diff --git a/internal/command/user_v2_passkey_test.go b/internal/command/user_v2_passkey_test.go index d8b0d0a18..1885f6ab2 100644 --- a/internal/command/user_v2_passkey_test.go +++ b/internal/command/user_v2_passkey_test.go @@ -40,6 +40,7 @@ func TestCommands_RegisterUserPasskey(t *testing.T) { type args struct { userID string resourceOwner string + rpID string authenticator domain.AuthenticatorAttachment } tests := []struct { @@ -121,7 +122,7 @@ func TestCommands_RegisterUserPasskey(t *testing.T) { idGenerator: tt.fields.idGenerator, webauthnConfig: webauthnConfig, } - _, err := c.RegisterUserPasskey(ctx, tt.args.userID, tt.args.resourceOwner, tt.args.authenticator) + _, err := c.RegisterUserPasskey(ctx, tt.args.userID, tt.args.resourceOwner, tt.args.rpID, tt.args.authenticator) require.ErrorIs(t, err, tt.wantErr) // successful case can't be tested due to random challenge. }) @@ -148,6 +149,7 @@ func TestCommands_RegisterUserPasskeyWithCode(t *testing.T) { type args struct { userID string resourceOwner string + rpID string authenticator domain.AuthenticatorAttachment codeID string code string @@ -222,7 +224,7 @@ func TestCommands_RegisterUserPasskeyWithCode(t *testing.T) { idGenerator: tt.fields.idGenerator, webauthnConfig: webauthnConfig, } - _, err := c.RegisterUserPasskeyWithCode(ctx, tt.args.userID, tt.args.resourceOwner, tt.args.authenticator, tt.args.codeID, tt.args.code, alg) + _, err := c.RegisterUserPasskeyWithCode(ctx, tt.args.userID, tt.args.resourceOwner, tt.args.authenticator, tt.args.codeID, tt.args.code, tt.args.rpID, alg) require.ErrorIs(t, err, tt.wantErr) // successful case can't be tested due to random challenge. }) @@ -376,7 +378,7 @@ func TestCommands_pushUserPasskey(t *testing.T) { expectFilter(eventFromEventPusher( user.NewHumanWebAuthNAddedEvent(eventstore.NewBaseEventForPush( ctx, &org.NewAggregate("org1").Aggregate, user.HumanPasswordlessTokenAddedType, - ), "111", "challenge"), + ), "111", "challenge", "rpID"), )), } @@ -394,7 +396,7 @@ func TestCommands_pushUserPasskey(t *testing.T) { expectPush: func(challenge string) expect { return expectPushFailed(io.ErrClosedPipe, []*repository.Event{eventFromEventPusher( user.NewHumanPasswordlessAddedEvent(ctx, - userAgg, "123", challenge, + userAgg, "123", challenge, "rpID", ), )}) }, @@ -406,7 +408,7 @@ func TestCommands_pushUserPasskey(t *testing.T) { expectPush: func(challenge string) expect { return expectPush([]*repository.Event{eventFromEventPusher( user.NewHumanPasswordlessAddedEvent(ctx, - userAgg, "123", challenge, + userAgg, "123", challenge, "rpID", ), )}) }, @@ -418,7 +420,7 @@ func TestCommands_pushUserPasskey(t *testing.T) { return expectPush([]*repository.Event{ eventFromEventPusher( user.NewHumanPasswordlessAddedEvent(ctx, - userAgg, "123", challenge, + userAgg, "123", challenge, "rpID", ), ), eventFromEventPusher( @@ -440,7 +442,7 @@ func TestCommands_pushUserPasskey(t *testing.T) { webauthnConfig: webauthnConfig, idGenerator: id_mock.NewIDGeneratorExpectIDs(t, "123"), } - wm, userAgg, webAuthN, err := c.createUserPasskey(ctx, "user1", "org1", domain.AuthenticatorAttachmentCrossPlattform) + wm, userAgg, webAuthN, err := c.createUserPasskey(ctx, "user1", "org1", "rpID", domain.AuthenticatorAttachmentCrossPlattform) require.NoError(t, err) c.eventstore = eventstoreExpect(t, tt.expectPush(webAuthN.Challenge)) diff --git a/internal/command/user_v2_u2f.go b/internal/command/user_v2_u2f.go index fcda1de6b..50c16aa30 100644 --- a/internal/command/user_v2_u2f.go +++ b/internal/command/user_v2_u2f.go @@ -9,31 +9,31 @@ import ( "github.com/zitadel/zitadel/internal/repository/user" ) -func (c *Commands) RegisterUserU2F(ctx context.Context, userID, resourceOwner string) (*domain.WebAuthNRegistrationDetails, error) { +func (c *Commands) RegisterUserU2F(ctx context.Context, userID, resourceOwner, rpID string) (*domain.WebAuthNRegistrationDetails, error) { if err := authz.UserIDInCTX(ctx, userID); err != nil { return nil, err } - return c.registerUserU2F(ctx, userID, resourceOwner) + return c.registerUserU2F(ctx, userID, resourceOwner, rpID) } -func (c *Commands) registerUserU2F(ctx context.Context, userID, resourceOwner string) (*domain.WebAuthNRegistrationDetails, error) { - wm, userAgg, webAuthN, err := c.createUserU2F(ctx, userID, resourceOwner) +func (c *Commands) registerUserU2F(ctx context.Context, userID, resourceOwner, rpID string) (*domain.WebAuthNRegistrationDetails, error) { + wm, userAgg, webAuthN, err := c.createUserU2F(ctx, userID, resourceOwner, rpID) if err != nil { return nil, err } return c.pushUserU2F(ctx, wm, userAgg, webAuthN) } -func (c *Commands) createUserU2F(ctx context.Context, userID, resourceOwner string) (*HumanWebAuthNWriteModel, *eventstore.Aggregate, *domain.WebAuthNToken, error) { +func (c *Commands) createUserU2F(ctx context.Context, userID, resourceOwner, rpID string) (*HumanWebAuthNWriteModel, *eventstore.Aggregate, *domain.WebAuthNToken, error) { tokens, err := c.getHumanU2FTokens(ctx, userID, resourceOwner) if err != nil { return nil, nil, nil, err } - return c.addHumanWebAuthN(ctx, userID, resourceOwner, false, tokens, domain.AuthenticatorAttachmentUnspecified, domain.UserVerificationRequirementRequired) + return c.addHumanWebAuthN(ctx, userID, resourceOwner, rpID, tokens, domain.AuthenticatorAttachmentUnspecified, domain.UserVerificationRequirementRequired) } func (c *Commands) pushUserU2F(ctx context.Context, wm *HumanWebAuthNWriteModel, userAgg *eventstore.Aggregate, webAuthN *domain.WebAuthNToken) (*domain.WebAuthNRegistrationDetails, error) { - cmd := user.NewHumanU2FAddedEvent(ctx, userAgg, wm.WebauthNTokenID, webAuthN.Challenge) + cmd := user.NewHumanU2FAddedEvent(ctx, userAgg, wm.WebauthNTokenID, webAuthN.Challenge, webAuthN.RPID) err := c.pushAppendAndReduce(ctx, wm, cmd) if err != nil { return nil, err diff --git a/internal/command/user_v2_u2f_test.go b/internal/command/user_v2_u2f_test.go index aecb0ad79..ebab0a4ce 100644 --- a/internal/command/user_v2_u2f_test.go +++ b/internal/command/user_v2_u2f_test.go @@ -37,6 +37,7 @@ func TestCommands_RegisterUserU2F(t *testing.T) { type args struct { userID string resourceOwner string + rpID string } tests := []struct { name string @@ -114,7 +115,7 @@ func TestCommands_RegisterUserU2F(t *testing.T) { idGenerator: tt.fields.idGenerator, webauthnConfig: webauthnConfig, } - _, err := c.RegisterUserU2F(ctx, tt.args.userID, tt.args.resourceOwner) + _, err := c.RegisterUserU2F(ctx, tt.args.userID, tt.args.resourceOwner, tt.args.rpID) require.ErrorIs(t, err, tt.wantErr) // successful case can't be tested due to random challenge. }) @@ -160,7 +161,7 @@ func TestCommands_pushUserU2F(t *testing.T) { expectFilter(eventFromEventPusher( user.NewHumanWebAuthNAddedEvent(eventstore.NewBaseEventForPush( ctx, &org.NewAggregate("org1").Aggregate, user.HumanPasswordlessTokenAddedType, - ), "111", "challenge"), + ), "111", "challenge", "rpID"), )), } @@ -174,7 +175,7 @@ func TestCommands_pushUserU2F(t *testing.T) { expectPush: func(challenge string) expect { return expectPushFailed(io.ErrClosedPipe, []*repository.Event{eventFromEventPusher( user.NewHumanU2FAddedEvent(ctx, - userAgg, "123", challenge, + userAgg, "123", challenge, "rpID", ), )}) }, @@ -185,7 +186,7 @@ func TestCommands_pushUserU2F(t *testing.T) { expectPush: func(challenge string) expect { return expectPush([]*repository.Event{eventFromEventPusher( user.NewHumanU2FAddedEvent(ctx, - userAgg, "123", challenge, + userAgg, "123", challenge, "rpID", ), )}) }, @@ -198,7 +199,7 @@ func TestCommands_pushUserU2F(t *testing.T) { webauthnConfig: webauthnConfig, idGenerator: id_mock.NewIDGeneratorExpectIDs(t, "123"), } - wm, userAgg, webAuthN, err := c.createUserPasskey(ctx, "user1", "org1", domain.AuthenticatorAttachmentCrossPlattform) + wm, userAgg, webAuthN, err := c.createUserPasskey(ctx, "user1", "org1", "rpID", domain.AuthenticatorAttachmentCrossPlattform) require.NoError(t, err) c.eventstore = eventstoreExpect(t, tt.expectPush(webAuthN.Challenge)) diff --git a/internal/domain/human_web_auth_n.go b/internal/domain/human_web_auth_n.go index 8b1a7134b..16590d43c 100644 --- a/internal/domain/human_web_auth_n.go +++ b/internal/domain/human_web_auth_n.go @@ -23,6 +23,7 @@ type WebAuthNToken struct { AAGUID []byte SignCount uint32 WebAuthNTokenName string + RPID string } type WebAuthNLogin struct { @@ -32,6 +33,7 @@ type WebAuthNLogin struct { Challenge string AllowedCredentialIDs [][]byte UserVerification UserVerificationRequirement + RPID string } type UserVerificationRequirement int32 diff --git a/internal/integration/client.go b/internal/integration/client.go index f66db5b2a..86b78bb87 100644 --- a/internal/integration/client.go +++ b/internal/integration/client.go @@ -89,6 +89,7 @@ func (s *Tester) RegisterUserPasskey(ctx context.Context, userID string) { pkr, err := s.Client.UserV2.RegisterPasskey(ctx, &user.RegisterPasskeyRequest{ UserId: userID, Code: reg.GetCode(), + Domain: s.Config.ExternalDomain, }) logging.OnError(err).Fatal("create user passkey") attestationResponse, err := s.WebAuthN.CreateAttestationResponse(pkr.GetPublicKeyCredentialCreationOptions()) diff --git a/internal/query/projection/session.go b/internal/query/projection/session.go index dc31fd37a..2fceb2243 100644 --- a/internal/query/projection/session.go +++ b/internal/query/projection/session.go @@ -14,7 +14,7 @@ import ( ) const ( - SessionsProjectionTable = "projections.sessions2" + SessionsProjectionTable = "projections.sessions3" SessionColumnID = "id" SessionColumnCreationDate = "creation_date" @@ -22,6 +22,7 @@ const ( SessionColumnSequence = "sequence" SessionColumnState = "state" SessionColumnResourceOwner = "resource_owner" + SessionColumnDomain = "domain" SessionColumnInstanceID = "instance_id" SessionColumnCreator = "creator" SessionColumnUserID = "user_id" @@ -49,6 +50,7 @@ func newSessionProjection(ctx context.Context, config crdb.StatementHandlerConfi crdb.NewColumn(SessionColumnSequence, crdb.ColumnTypeInt64), crdb.NewColumn(SessionColumnState, crdb.ColumnTypeEnum), crdb.NewColumn(SessionColumnResourceOwner, crdb.ColumnTypeText), + crdb.NewColumn(SessionColumnDomain, crdb.ColumnTypeText), crdb.NewColumn(SessionColumnInstanceID, crdb.ColumnTypeText), crdb.NewColumn(SessionColumnCreator, crdb.ColumnTypeText), crdb.NewColumn(SessionColumnUserID, crdb.ColumnTypeText, crdb.Nullable()), @@ -140,6 +142,7 @@ func (p *sessionProjection) reduceSessionAdded(event eventstore.Event) (*handler handler.NewCol(SessionColumnCreationDate, e.CreationDate()), handler.NewCol(SessionColumnChangeDate, e.CreationDate()), handler.NewCol(SessionColumnResourceOwner, e.Aggregate().ResourceOwner), + handler.NewCol(SessionColumnDomain, e.Domain), handler.NewCol(SessionColumnState, domain.SessionStateActive), handler.NewCol(SessionColumnSequence, e.Sequence()), handler.NewCol(SessionColumnCreator, e.User), diff --git a/internal/query/projection/session_test.go b/internal/query/projection/session_test.go index 976eab8b7..ae19e247e 100644 --- a/internal/query/projection/session_test.go +++ b/internal/query/projection/session_test.go @@ -30,7 +30,9 @@ func TestSessionProjection_reduces(t *testing.T) { event: getEvent(testEvent( session.AddedType, session.AggregateType, - []byte(`{}`), + []byte(`{ + "domain": "domain" + }`), ), session.AddedEventMapper), }, reduce: (&sessionProjection{}).reduceSessionAdded, @@ -41,13 +43,14 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "INSERT INTO projections.sessions2 (id, instance_id, creation_date, change_date, resource_owner, state, sequence, creator) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)", + expectedStmt: "INSERT INTO projections.sessions3 (id, instance_id, creation_date, change_date, resource_owner, domain, state, sequence, creator) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", expectedArgs: []interface{}{ "agg-id", "instance-id", anyArg{}, anyArg{}, "ro-id", + "domain", domain.SessionStateActive, uint64(15), "editor-user", @@ -77,7 +80,7 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.sessions2 SET (change_date, sequence, user_id, user_checked_at) = ($1, $2, $3, $4) WHERE (id = $5) AND (instance_id = $6)", + expectedStmt: "UPDATE projections.sessions3 SET (change_date, sequence, user_id, user_checked_at) = ($1, $2, $3, $4) WHERE (id = $5) AND (instance_id = $6)", expectedArgs: []interface{}{ anyArg{}, anyArg{}, @@ -110,7 +113,7 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.sessions2 SET (change_date, sequence, password_checked_at) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", + expectedStmt: "UPDATE projections.sessions3 SET (change_date, sequence, password_checked_at) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", expectedArgs: []interface{}{ anyArg{}, anyArg{}, @@ -142,7 +145,7 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.sessions2 SET (change_date, sequence, intent_checked_at) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", + expectedStmt: "UPDATE projections.sessions3 SET (change_date, sequence, intent_checked_at) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", expectedArgs: []interface{}{ anyArg{}, anyArg{}, @@ -174,7 +177,7 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.sessions2 SET (change_date, sequence, token_id) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", + expectedStmt: "UPDATE projections.sessions3 SET (change_date, sequence, token_id) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", expectedArgs: []interface{}{ anyArg{}, anyArg{}, @@ -208,7 +211,7 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.sessions2 SET (change_date, sequence, metadata) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", + expectedStmt: "UPDATE projections.sessions3 SET (change_date, sequence, metadata) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", expectedArgs: []interface{}{ anyArg{}, anyArg{}, @@ -240,7 +243,7 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "DELETE FROM projections.sessions2 WHERE (id = $1) AND (instance_id = $2)", + expectedStmt: "DELETE FROM projections.sessions3 WHERE (id = $1) AND (instance_id = $2)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -267,7 +270,7 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "DELETE FROM projections.sessions2 WHERE (instance_id = $1)", + expectedStmt: "DELETE FROM projections.sessions3 WHERE (instance_id = $1)", expectedArgs: []interface{}{ "agg-id", }, @@ -298,7 +301,7 @@ func TestSessionProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.sessions2 SET password_checked_at = $1 WHERE (user_id = $2) AND (password_checked_at < $3)", + expectedStmt: "UPDATE projections.sessions3 SET password_checked_at = $1 WHERE (user_id = $2) AND (password_checked_at < $3)", expectedArgs: []interface{}{ nil, "agg-id", diff --git a/internal/query/session.go b/internal/query/session.go index 427fc90f2..e9706410a 100644 --- a/internal/query/session.go +++ b/internal/query/session.go @@ -29,6 +29,7 @@ type Session struct { Sequence uint64 State domain.SessionState ResourceOwner string + Domain string Creator string UserFactor SessionUserFactor PasswordFactor SessionPasswordFactor @@ -98,6 +99,10 @@ var ( name: projection.SessionColumnResourceOwner, table: sessionsTable, } + SessionColumnDomain = Column{ + name: projection.SessionColumnDomain, + table: sessionsTable, + } SessionColumnInstanceID = Column{ name: projection.SessionColumnInstanceID, table: sessionsTable, @@ -211,6 +216,7 @@ func prepareSessionQuery(ctx context.Context, db prepareDatabase) (sq.SelectBuil SessionColumnState.identifier(), SessionColumnResourceOwner.identifier(), SessionColumnCreator.identifier(), + SessionColumnDomain.identifier(), SessionColumnUserID.identifier(), SessionColumnUserCheckedAt.identifier(), LoginNameNameCol.identifier(), @@ -236,6 +242,7 @@ func prepareSessionQuery(ctx context.Context, db prepareDatabase) (sq.SelectBuil passkeyCheckedAt sql.NullTime metadata database.Map[[]byte] token sql.NullString + sessionDomain sql.NullString ) err := row.Scan( @@ -246,6 +253,7 @@ func prepareSessionQuery(ctx context.Context, db prepareDatabase) (sq.SelectBuil &session.State, &session.ResourceOwner, &session.Creator, + &sessionDomain, &userID, &userCheckedAt, &loginName, @@ -264,6 +272,7 @@ func prepareSessionQuery(ctx context.Context, db prepareDatabase) (sq.SelectBuil return nil, "", errors.ThrowInternal(err, "QUERY-SAder", "Errors.Internal") } + session.Domain = sessionDomain.String session.UserFactor.UserID = userID.String session.UserFactor.UserCheckedAt = userCheckedAt.Time session.UserFactor.LoginName = loginName.String @@ -286,6 +295,7 @@ func prepareSessionsQuery(ctx context.Context, db prepareDatabase) (sq.SelectBui SessionColumnState.identifier(), SessionColumnResourceOwner.identifier(), SessionColumnCreator.identifier(), + SessionColumnDomain.identifier(), SessionColumnUserID.identifier(), SessionColumnUserCheckedAt.identifier(), LoginNameNameCol.identifier(), @@ -313,6 +323,7 @@ func prepareSessionsQuery(ctx context.Context, db prepareDatabase) (sq.SelectBui intentCheckedAt sql.NullTime passkeyCheckedAt sql.NullTime metadata database.Map[[]byte] + sessionDomain sql.NullString ) err := rows.Scan( @@ -323,6 +334,7 @@ func prepareSessionsQuery(ctx context.Context, db prepareDatabase) (sq.SelectBui &session.State, &session.ResourceOwner, &session.Creator, + &sessionDomain, &userID, &userCheckedAt, &loginName, @@ -337,6 +349,7 @@ func prepareSessionsQuery(ctx context.Context, db prepareDatabase) (sq.SelectBui if err != nil { return nil, errors.ThrowInternal(err, "QUERY-SAfeg", "Errors.Internal") } + session.Domain = sessionDomain.String session.UserFactor.UserID = userID.String session.UserFactor.UserCheckedAt = userCheckedAt.Time session.UserFactor.LoginName = loginName.String diff --git a/internal/query/sessions_test.go b/internal/query/sessions_test.go index 84990e2e1..38662ead7 100644 --- a/internal/query/sessions_test.go +++ b/internal/query/sessions_test.go @@ -17,45 +17,47 @@ import ( ) var ( - expectedSessionQuery = regexp.QuoteMeta(`SELECT projections.sessions2.id,` + - ` projections.sessions2.creation_date,` + - ` projections.sessions2.change_date,` + - ` projections.sessions2.sequence,` + - ` projections.sessions2.state,` + - ` projections.sessions2.resource_owner,` + - ` projections.sessions2.creator,` + - ` projections.sessions2.user_id,` + - ` projections.sessions2.user_checked_at,` + + expectedSessionQuery = regexp.QuoteMeta(`SELECT projections.sessions3.id,` + + ` projections.sessions3.creation_date,` + + ` projections.sessions3.change_date,` + + ` projections.sessions3.sequence,` + + ` projections.sessions3.state,` + + ` projections.sessions3.resource_owner,` + + ` projections.sessions3.creator,` + + ` projections.sessions3.domain,` + + ` projections.sessions3.user_id,` + + ` projections.sessions3.user_checked_at,` + ` projections.login_names2.login_name,` + ` projections.users8_humans.display_name,` + - ` projections.sessions2.password_checked_at,` + - ` projections.sessions2.intent_checked_at,` + - ` projections.sessions2.passkey_checked_at,` + - ` projections.sessions2.metadata,` + - ` projections.sessions2.token_id` + - ` FROM projections.sessions2` + - ` LEFT JOIN projections.login_names2 ON projections.sessions2.user_id = projections.login_names2.user_id AND projections.sessions2.instance_id = projections.login_names2.instance_id` + - ` LEFT JOIN projections.users8_humans ON projections.sessions2.user_id = projections.users8_humans.user_id AND projections.sessions2.instance_id = projections.users8_humans.instance_id` + + ` projections.sessions3.password_checked_at,` + + ` projections.sessions3.intent_checked_at,` + + ` projections.sessions3.passkey_checked_at,` + + ` projections.sessions3.metadata,` + + ` projections.sessions3.token_id` + + ` FROM projections.sessions3` + + ` LEFT JOIN projections.login_names2 ON projections.sessions3.user_id = projections.login_names2.user_id AND projections.sessions3.instance_id = projections.login_names2.instance_id` + + ` LEFT JOIN projections.users8_humans ON projections.sessions3.user_id = projections.users8_humans.user_id AND projections.sessions3.instance_id = projections.users8_humans.instance_id` + ` AS OF SYSTEM TIME '-1 ms'`) - expectedSessionsQuery = regexp.QuoteMeta(`SELECT projections.sessions2.id,` + - ` projections.sessions2.creation_date,` + - ` projections.sessions2.change_date,` + - ` projections.sessions2.sequence,` + - ` projections.sessions2.state,` + - ` projections.sessions2.resource_owner,` + - ` projections.sessions2.creator,` + - ` projections.sessions2.user_id,` + - ` projections.sessions2.user_checked_at,` + + expectedSessionsQuery = regexp.QuoteMeta(`SELECT projections.sessions3.id,` + + ` projections.sessions3.creation_date,` + + ` projections.sessions3.change_date,` + + ` projections.sessions3.sequence,` + + ` projections.sessions3.state,` + + ` projections.sessions3.resource_owner,` + + ` projections.sessions3.creator,` + + ` projections.sessions3.domain,` + + ` projections.sessions3.user_id,` + + ` projections.sessions3.user_checked_at,` + ` projections.login_names2.login_name,` + ` projections.users8_humans.display_name,` + - ` projections.sessions2.password_checked_at,` + - ` projections.sessions2.intent_checked_at,` + - ` projections.sessions2.passkey_checked_at,` + - ` projections.sessions2.metadata,` + + ` projections.sessions3.password_checked_at,` + + ` projections.sessions3.intent_checked_at,` + + ` projections.sessions3.passkey_checked_at,` + + ` projections.sessions3.metadata,` + ` COUNT(*) OVER ()` + - ` FROM projections.sessions2` + - ` LEFT JOIN projections.login_names2 ON projections.sessions2.user_id = projections.login_names2.user_id AND projections.sessions2.instance_id = projections.login_names2.instance_id` + - ` LEFT JOIN projections.users8_humans ON projections.sessions2.user_id = projections.users8_humans.user_id AND projections.sessions2.instance_id = projections.users8_humans.instance_id` + + ` FROM projections.sessions3` + + ` LEFT JOIN projections.login_names2 ON projections.sessions3.user_id = projections.login_names2.user_id AND projections.sessions3.instance_id = projections.login_names2.instance_id` + + ` LEFT JOIN projections.users8_humans ON projections.sessions3.user_id = projections.users8_humans.user_id AND projections.sessions3.instance_id = projections.users8_humans.instance_id` + ` AS OF SYSTEM TIME '-1 ms'`) sessionCols = []string{ @@ -66,6 +68,7 @@ var ( "state", "resource_owner", "creator", + "domain", "user_id", "user_checked_at", "login_name", @@ -85,6 +88,7 @@ var ( "state", "resource_owner", "creator", + "domain", "user_id", "user_checked_at", "login_name", @@ -136,6 +140,7 @@ func Test_SessionsPrepare(t *testing.T) { domain.SessionStateActive, "ro", "creator", + "domain", "user-id", testNow, "login-name", @@ -161,6 +166,7 @@ func Test_SessionsPrepare(t *testing.T) { State: domain.SessionStateActive, ResourceOwner: "ro", Creator: "creator", + Domain: "domain", UserFactor: SessionUserFactor{ UserID: "user-id", UserCheckedAt: testNow, @@ -199,6 +205,7 @@ func Test_SessionsPrepare(t *testing.T) { domain.SessionStateActive, "ro", "creator", + "domain", "user-id", testNow, "login-name", @@ -216,6 +223,7 @@ func Test_SessionsPrepare(t *testing.T) { domain.SessionStateActive, "ro", "creator2", + "domain", "user-id2", testNow, "login-name2", @@ -241,6 +249,7 @@ func Test_SessionsPrepare(t *testing.T) { State: domain.SessionStateActive, ResourceOwner: "ro", Creator: "creator", + Domain: "domain", UserFactor: SessionUserFactor{ UserID: "user-id", UserCheckedAt: testNow, @@ -268,6 +277,7 @@ func Test_SessionsPrepare(t *testing.T) { State: domain.SessionStateActive, ResourceOwner: "ro", Creator: "creator2", + Domain: "domain", UserFactor: SessionUserFactor{ UserID: "user-id2", UserCheckedAt: testNow, @@ -359,6 +369,7 @@ func Test_SessionPrepare(t *testing.T) { domain.SessionStateActive, "ro", "creator", + "domain", "user-id", testNow, "login-name", @@ -379,6 +390,7 @@ func Test_SessionPrepare(t *testing.T) { State: domain.SessionStateActive, ResourceOwner: "ro", Creator: "creator", + Domain: "domain", UserFactor: SessionUserFactor{ UserID: "user-id", UserCheckedAt: testNow, diff --git a/internal/repository/session/session.go b/internal/repository/session/session.go index c11a6eb45..9b48543ec 100644 --- a/internal/repository/session/session.go +++ b/internal/repository/session/session.go @@ -26,6 +26,8 @@ const ( type AddedEvent struct { eventstore.BaseEvent `json:"-"` + + Domain string `json:"domain,omitempty"` } func (e *AddedEvent) Data() interface{} { @@ -38,6 +40,7 @@ func (e *AddedEvent) UniqueConstraints() []*eventstore.EventUniqueConstraint { func NewAddedEvent(ctx context.Context, aggregate *eventstore.Aggregate, + domain string, ) *AddedEvent { return &AddedEvent{ BaseEvent: *eventstore.NewBaseEventForPush( @@ -45,6 +48,7 @@ func NewAddedEvent(ctx context.Context, aggregate, AddedType, ), + Domain: domain, } } diff --git a/internal/repository/user/human_mfa_passwordless.go b/internal/repository/user/human_mfa_passwordless.go index f5e68b639..1ffa14af3 100644 --- a/internal/repository/user/human_mfa_passwordless.go +++ b/internal/repository/user/human_mfa_passwordless.go @@ -39,6 +39,7 @@ func NewHumanPasswordlessAddedEvent( aggregate *eventstore.Aggregate, webAuthNTokenID, challenge string, + rpID string, ) *HumanPasswordlessAddedEvent { return &HumanPasswordlessAddedEvent{ HumanWebAuthNAddedEvent: *NewHumanWebAuthNAddedEvent( @@ -49,6 +50,7 @@ func NewHumanPasswordlessAddedEvent( ), webAuthNTokenID, challenge, + rpID, ), } } diff --git a/internal/repository/user/human_mfa_u2f.go b/internal/repository/user/human_mfa_u2f.go index 27fe6be3f..096026b87 100644 --- a/internal/repository/user/human_mfa_u2f.go +++ b/internal/repository/user/human_mfa_u2f.go @@ -28,6 +28,7 @@ func NewHumanU2FAddedEvent( aggregate *eventstore.Aggregate, webAuthNTokenID, challenge string, + rpID string, ) *HumanU2FAddedEvent { return &HumanU2FAddedEvent{ HumanWebAuthNAddedEvent: *NewHumanWebAuthNAddedEvent( @@ -38,6 +39,7 @@ func NewHumanU2FAddedEvent( ), webAuthNTokenID, challenge, + rpID, ), } } diff --git a/internal/repository/user/human_mfa_web_auth_n.go b/internal/repository/user/human_mfa_web_auth_n.go index faeb3124c..77f27fb64 100644 --- a/internal/repository/user/human_mfa_web_auth_n.go +++ b/internal/repository/user/human_mfa_web_auth_n.go @@ -14,6 +14,7 @@ type HumanWebAuthNAddedEvent struct { WebAuthNTokenID string `json:"webAuthNTokenId"` Challenge string `json:"challenge"` + RPID string `json:"rpID,omitempty"` } func (e *HumanWebAuthNAddedEvent) Data() interface{} { @@ -28,11 +29,13 @@ func NewHumanWebAuthNAddedEvent( base *eventstore.BaseEvent, webAuthNTokenID, challenge string, + rpID string, ) *HumanWebAuthNAddedEvent { return &HumanWebAuthNAddedEvent{ BaseEvent: *base, WebAuthNTokenID: webAuthNTokenID, Challenge: challenge, + RPID: rpID, } } diff --git a/internal/webauthn/converter.go b/internal/webauthn/converter.go index 9b49ec016..36799ee3d 100644 --- a/internal/webauthn/converter.go +++ b/internal/webauthn/converter.go @@ -7,10 +7,10 @@ import ( "github.com/zitadel/zitadel/internal/domain" ) -func WebAuthNsToCredentials(webAuthNs []*domain.WebAuthNToken) []webauthn.Credential { +func WebAuthNsToCredentials(webAuthNs []*domain.WebAuthNToken, rpID string) []webauthn.Credential { creds := make([]webauthn.Credential, 0) for _, webAuthN := range webAuthNs { - if webAuthN.State == domain.MFAStateReady { + if webAuthN.State == domain.MFAStateReady && webAuthN.RPID == rpID { creds = append(creds, webauthn.Credential{ ID: webAuthN.KeyID, PublicKey: webAuthN.PublicKey, diff --git a/internal/webauthn/webauthn.go b/internal/webauthn/webauthn.go index 5d2517bc4..bced4f220 100644 --- a/internal/webauthn/webauthn.go +++ b/internal/webauthn/webauthn.go @@ -52,12 +52,12 @@ func (u *webUser) WebAuthnCredentials() []webauthn.Credential { return u.credentials } -func (w *Config) BeginRegistration(ctx context.Context, user *domain.Human, accountName string, authType domain.AuthenticatorAttachment, userVerification domain.UserVerificationRequirement, isLoginUI bool, webAuthNs ...*domain.WebAuthNToken) (*domain.WebAuthNToken, error) { - webAuthNServer, err := w.serverFromContext(ctx) +func (w *Config) BeginRegistration(ctx context.Context, user *domain.Human, accountName string, authType domain.AuthenticatorAttachment, userVerification domain.UserVerificationRequirement, rpID string, webAuthNs ...*domain.WebAuthNToken) (*domain.WebAuthNToken, error) { + webAuthNServer, err := w.serverFromContext(ctx, rpID, "") if err != nil { return nil, err } - creds := WebAuthNsToCredentials(webAuthNs) + creds := WebAuthNsToCredentials(webAuthNs, rpID) existing := make([]protocol.CredentialDescriptor, len(creds)) for i, cred := range creds { existing[i] = protocol.CredentialDescriptor{ @@ -90,6 +90,7 @@ func (w *Config) BeginRegistration(ctx context.Context, user *domain.Human, acco CredentialCreationData: cred, AllowedCredentialIDs: sessionData.AllowedCredentialIDs, UserVerification: UserVerificationToDomain(sessionData.UserVerification), + RPID: webAuthNServer.Config.RPID, }, nil } @@ -104,7 +105,7 @@ func (w *Config) FinishRegistration(ctx context.Context, user *domain.Human, web return nil, caos_errs.ThrowInternal(err, "WEBAU-sEr8c", "Errors.User.WebAuthN.ErrorOnParseCredential") } sessionData := WebAuthNToSessionData(webAuthN) - webAuthNServer, err := w.serverFromContext(ctx) + webAuthNServer, err := w.serverFromContext(ctx, webAuthN.RPID, credentialData.Response.CollectedClientData.Origin) if err != nil { return nil, err } @@ -124,17 +125,18 @@ func (w *Config) FinishRegistration(ctx context.Context, user *domain.Human, web webAuthN.AAGUID = credential.Authenticator.AAGUID webAuthN.SignCount = credential.Authenticator.SignCount webAuthN.WebAuthNTokenName = tokenName + webAuthN.RPID = webAuthNServer.Config.RPID return webAuthN, nil } -func (w *Config) BeginLogin(ctx context.Context, user *domain.Human, userVerification domain.UserVerificationRequirement, webAuthNs ...*domain.WebAuthNToken) (*domain.WebAuthNLogin, error) { - webAuthNServer, err := w.serverFromContext(ctx) +func (w *Config) BeginLogin(ctx context.Context, user *domain.Human, userVerification domain.UserVerificationRequirement, rpID string, webAuthNs ...*domain.WebAuthNToken) (*domain.WebAuthNLogin, error) { + webAuthNServer, err := w.serverFromContext(ctx, rpID, "") if err != nil { return nil, err } assertion, sessionData, err := webAuthNServer.BeginLogin(&webUser{ Human: user, - credentials: WebAuthNsToCredentials(webAuthNs), + credentials: WebAuthNsToCredentials(webAuthNs, rpID), }, webauthn.WithUserVerification(UserVerificationFromDomain(userVerification))) if err != nil { return nil, caos_errs.ThrowInternal(err, "WEBAU-4G8sw", "Errors.User.WebAuthN.BeginLoginFailed") @@ -148,6 +150,7 @@ func (w *Config) BeginLogin(ctx context.Context, user *domain.Human, userVerific CredentialAssertionData: cred, AllowedCredentialIDs: sessionData.AllowedCredentialIDs, UserVerification: userVerification, + RPID: webAuthNServer.Config.RPID, }, nil } @@ -158,9 +161,9 @@ func (w *Config) FinishLogin(ctx context.Context, user *domain.Human, webAuthN * } webUser := &webUser{ Human: user, - credentials: WebAuthNsToCredentials(webAuthNs), + credentials: WebAuthNsToCredentials(webAuthNs, webAuthN.RPID), } - webAuthNServer, err := w.serverFromContext(ctx) + webAuthNServer, err := w.serverFromContext(ctx, webAuthN.RPID, assertionData.Response.CollectedClientData.Origin) if err != nil { return nil, 0, err } @@ -175,15 +178,31 @@ func (w *Config) FinishLogin(ctx context.Context, user *domain.Human, webAuthN * return credential.ID, credential.Authenticator.SignCount, nil } -func (w *Config) serverFromContext(ctx context.Context) (*webauthn.WebAuthn, error) { - instance := authz.GetInstance(ctx) - webAuthn, err := webauthn.New(&webauthn.Config{ - RPDisplayName: w.DisplayName, - RPID: instance.RequestedDomain(), - RPOrigins: []string{http.BuildOrigin(instance.RequestedHost(), w.ExternalSecure)}, - }) +func (w *Config) serverFromContext(ctx context.Context, id, origin string) (*webauthn.WebAuthn, error) { + config := w.config(id, origin) + if id == "" { + config = w.configFromContext(ctx) + } + webAuthn, err := webauthn.New(config) if err != nil { return nil, caos_errs.ThrowInternal(err, "WEBAU-UX9ta", "Errors.User.WebAuthN.ServerConfig") } return webAuthn, nil } + +func (w *Config) configFromContext(ctx context.Context) *webauthn.Config { + instance := authz.GetInstance(ctx) + return &webauthn.Config{ + RPDisplayName: w.DisplayName, + RPID: instance.RequestedDomain(), + RPOrigins: []string{http.BuildOrigin(instance.RequestedHost(), w.ExternalSecure)}, + } +} + +func (w *Config) config(id, origin string) *webauthn.Config { + return &webauthn.Config{ + RPDisplayName: w.DisplayName, + RPID: id, + RPOrigins: []string{origin}, + } +} diff --git a/internal/webauthn/webauthn_test.go b/internal/webauthn/webauthn_test.go index df05d34e9..7d8052048 100644 --- a/internal/webauthn/webauthn_test.go +++ b/internal/webauthn/webauthn_test.go @@ -14,7 +14,9 @@ import ( func TestConfig_serverFromContext(t *testing.T) { type args struct { - ctx context.Context + ctx context.Context + id string + origin string } tests := []struct { name string @@ -24,12 +26,12 @@ func TestConfig_serverFromContext(t *testing.T) { }{ { name: "webauthn error", - args: args{context.Background()}, + args: args{context.Background(), "", ""}, wantErr: caos_errs.ThrowInternal(nil, "WEBAU-UX9ta", "Errors.User.WebAuthN.ServerConfig"), }, { - name: "success", - args: args{authz.WithRequestedDomain(context.Background(), "example.com")}, + name: "success from ctx", + args: args{authz.WithRequestedDomain(context.Background(), "example.com"), "", ""}, want: &webauthn.WebAuthn{ Config: &webauthn.Config{ RPDisplayName: "DisplayName", @@ -38,6 +40,17 @@ func TestConfig_serverFromContext(t *testing.T) { }, }, }, + { + name: "success from id", + args: args{authz.WithRequestedDomain(context.Background(), "example.com"), "external.com", "https://external.com"}, + want: &webauthn.WebAuthn{ + Config: &webauthn.Config{ + RPDisplayName: "DisplayName", + RPID: "external.com", + RPOrigins: []string{"https://external.com"}, + }, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -45,7 +58,7 @@ func TestConfig_serverFromContext(t *testing.T) { DisplayName: "DisplayName", ExternalSecure: true, } - got, err := w.serverFromContext(tt.args.ctx) + got, err := w.serverFromContext(tt.args.ctx, tt.args.id, tt.args.origin) require.ErrorIs(t, err, tt.wantErr) if tt.want != nil { require.NotNil(t, got) diff --git a/proto/zitadel/session/v2alpha/session.proto b/proto/zitadel/session/v2alpha/session.proto index a73eb8a79..b3e11a443 100644 --- a/proto/zitadel/session/v2alpha/session.proto +++ b/proto/zitadel/session/v2alpha/session.proto @@ -39,6 +39,11 @@ message Session { description: "\"custom key value list\""; } ]; + string domain = 7 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "\"domain on which the session was created\""; + } + ]; } message Factors { diff --git a/proto/zitadel/session/v2alpha/session_service.proto b/proto/zitadel/session/v2alpha/session_service.proto index 6ae18fd88..270317626 100644 --- a/proto/zitadel/session/v2alpha/session_service.proto +++ b/proto/zitadel/session/v2alpha/session_service.proto @@ -245,6 +245,11 @@ message CreateSessionRequest{ } ]; repeated ChallengeKind challenges = 3; + string domain = 4 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "\"Domain on which the session was created. Will be used for Passkey and U2F challenges.\""; + } + ]; } message CreateSessionResponse{ diff --git a/proto/zitadel/user/v2alpha/user_service.proto b/proto/zitadel/user/v2alpha/user_service.proto index 5c548f917..1534a4d74 100644 --- a/proto/zitadel/user/v2alpha/user_service.proto +++ b/proto/zitadel/user/v2alpha/user_service.proto @@ -587,6 +587,11 @@ message RegisterPasskeyRequest{ description: "\"Optionally specify the authenticator type of the passkey device (platform or cross-platform). If none is provided, both values are allowed.\""; } ]; + string domain = 4 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "\"Domain on which the user is authenticated.\""; + } + ]; } message RegisterPasskeyResponse{ @@ -658,6 +663,11 @@ message RegisterU2FRequest{ example: "\"d654e6ba-70a3-48ef-a95d-37c8d8a7901a\""; } ]; + string domain = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "\"Domain on which the user is authenticated.\""; + } + ]; } message RegisterU2FResponse{