@contember/engine-tenant-api 2.2.0-alpha.1 → 2.2.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +60 -7
- package/dist/development/index.cjs +69 -0
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +71 -2
- package/dist/development/index.js.map +1 -1
- package/dist/development/src/TenantContainer.cjs +39 -10
- package/dist/development/src/TenantContainer.cjs.map +1 -1
- package/dist/development/src/TenantContainer.js +39 -10
- package/dist/development/src/TenantContainer.js.map +1 -1
- package/dist/development/src/bridges/system/IdentityFetcher.cjs +9 -7
- package/dist/development/src/bridges/system/IdentityFetcher.cjs.map +1 -1
- package/dist/development/src/bridges/system/IdentityFetcher.js +9 -7
- package/dist/development/src/bridges/system/IdentityFetcher.js.map +1 -1
- package/dist/development/src/migrations/2026-06-18-120000-idp-claim-mapping.cjs +10 -0
- package/dist/development/src/migrations/2026-06-18-120000-idp-claim-mapping.cjs.map +1 -0
- package/dist/development/src/migrations/2026-06-18-120000-idp-claim-mapping.js +11 -0
- package/dist/development/src/migrations/2026-06-18-120000-idp-claim-mapping.js.map +1 -0
- package/dist/development/src/migrations/2026-08-03-120000-person-enable-auth-log.cjs +9 -0
- package/dist/development/src/migrations/2026-08-03-120000-person-enable-auth-log.cjs.map +1 -0
- package/dist/development/src/migrations/2026-08-03-120000-person-enable-auth-log.js +10 -0
- package/dist/development/src/migrations/2026-08-03-120000-person-enable-auth-log.js.map +1 -0
- package/dist/development/src/migrations/2026-08-04-120000-config-panel.cjs +11 -0
- package/dist/development/src/migrations/2026-08-04-120000-config-panel.cjs.map +1 -0
- package/dist/development/src/migrations/2026-08-04-120000-config-panel.js +12 -0
- package/dist/development/src/migrations/2026-08-04-120000-config-panel.js.map +1 -0
- package/dist/development/src/migrations/2026-09-04-120000-idp-disable-local-authentication.cjs +18 -0
- package/dist/development/src/migrations/2026-09-04-120000-idp-disable-local-authentication.cjs.map +1 -0
- package/dist/development/src/migrations/2026-09-04-120000-idp-disable-local-authentication.js +19 -0
- package/dist/development/src/migrations/2026-09-04-120000-idp-disable-local-authentication.js.map +1 -0
- package/dist/development/src/migrations/2026-09-11-120000-custom-role.cjs +18 -0
- package/dist/development/src/migrations/2026-09-11-120000-custom-role.cjs.map +1 -0
- package/dist/development/src/migrations/2026-09-11-120000-custom-role.js +19 -0
- package/dist/development/src/migrations/2026-09-11-120000-custom-role.js.map +1 -0
- package/dist/development/src/migrations/runner.cjs +17 -5
- package/dist/development/src/migrations/runner.cjs.map +1 -1
- package/dist/development/src/migrations/runner.js +17 -5
- package/dist/development/src/migrations/runner.js.map +1 -1
- package/dist/development/src/migrations/snapshot.cjs +22 -2
- package/dist/development/src/migrations/snapshot.cjs.map +1 -1
- package/dist/development/src/migrations/snapshot.js +22 -2
- package/dist/development/src/migrations/snapshot.js.map +1 -1
- package/dist/development/src/model/authorization/CustomRoleAuthorizator.cjs +65 -0
- package/dist/development/src/model/authorization/CustomRoleAuthorizator.cjs.map +1 -0
- package/dist/development/src/model/authorization/CustomRoleAuthorizator.js +65 -0
- package/dist/development/src/model/authorization/CustomRoleAuthorizator.js.map +1 -0
- package/dist/development/src/model/authorization/CustomRolePermissions.cjs +404 -0
- package/dist/development/src/model/authorization/CustomRolePermissions.cjs.map +1 -0
- package/dist/development/src/model/authorization/CustomRolePermissions.js +387 -0
- package/dist/development/src/model/authorization/CustomRolePermissions.js.map +1 -0
- package/dist/development/src/model/authorization/PermissionActions.cjs +19 -16
- package/dist/development/src/model/authorization/PermissionActions.cjs.map +1 -1
- package/dist/development/src/model/authorization/PermissionActions.js +19 -16
- package/dist/development/src/model/authorization/PermissionActions.js.map +1 -1
- package/dist/development/src/model/authorization/PermissionContextFactory.cjs +20 -2
- package/dist/development/src/model/authorization/PermissionContextFactory.cjs.map +1 -1
- package/dist/development/src/model/authorization/PermissionContextFactory.js +20 -2
- package/dist/development/src/model/authorization/PermissionContextFactory.js.map +1 -1
- package/dist/development/src/model/authorization/PermissionsFactory.cjs +32 -24
- package/dist/development/src/model/authorization/PermissionsFactory.cjs.map +1 -1
- package/dist/development/src/model/authorization/PermissionsFactory.js +33 -25
- package/dist/development/src/model/authorization/PermissionsFactory.js.map +1 -1
- package/dist/development/src/model/authorization/Roles.cjs +8 -0
- package/dist/development/src/model/authorization/Roles.cjs.map +1 -1
- package/dist/development/src/model/authorization/Roles.js +8 -0
- package/dist/development/src/model/authorization/Roles.js.map +1 -1
- package/dist/development/src/model/authorization/TargetIdentityPermission.cjs +35 -0
- package/dist/development/src/model/authorization/TargetIdentityPermission.cjs.map +1 -0
- package/dist/development/src/model/authorization/TargetIdentityPermission.js +35 -0
- package/dist/development/src/model/authorization/TargetIdentityPermission.js.map +1 -0
- package/dist/development/src/model/commands/apiKey/ApiKeyHelper.cjs +19 -0
- package/dist/development/src/model/commands/apiKey/ApiKeyHelper.cjs.map +1 -1
- package/dist/development/src/model/commands/apiKey/ApiKeyHelper.js +19 -0
- package/dist/development/src/model/commands/apiKey/ApiKeyHelper.js.map +1 -1
- package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.cjs +4 -2
- package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.js +5 -3
- package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.js.map +1 -1
- package/dist/development/src/model/commands/apiKey/ProlongApiKeyCommand.cjs +9 -10
- package/dist/development/src/model/commands/apiKey/ProlongApiKeyCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/apiKey/ProlongApiKeyCommand.js +10 -11
- package/dist/development/src/model/commands/apiKey/ProlongApiKeyCommand.js.map +1 -1
- package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.js.map +1 -1
- package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.cjs +5 -3
- package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.js +5 -3
- package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.js.map +1 -1
- package/dist/development/src/model/commands/customRole/CreateCustomRoleCommand.cjs +23 -0
- package/dist/development/src/model/commands/customRole/CreateCustomRoleCommand.cjs.map +1 -0
- package/dist/development/src/model/commands/customRole/CreateCustomRoleCommand.js +23 -0
- package/dist/development/src/model/commands/customRole/CreateCustomRoleCommand.js.map +1 -0
- package/dist/development/src/model/commands/customRole/DeleteCustomRoleCommand.cjs +14 -0
- package/dist/development/src/model/commands/customRole/DeleteCustomRoleCommand.cjs.map +1 -0
- package/dist/development/src/model/commands/customRole/DeleteCustomRoleCommand.js +14 -0
- package/dist/development/src/model/commands/customRole/DeleteCustomRoleCommand.js.map +1 -0
- package/dist/development/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.cjs +16 -0
- package/dist/development/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.cjs.map +1 -0
- package/dist/development/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.js +16 -0
- package/dist/development/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.js.map +1 -0
- package/dist/development/src/model/commands/customRole/UpdateCustomRoleCommand.cjs +19 -0
- package/dist/development/src/model/commands/customRole/UpdateCustomRoleCommand.cjs.map +1 -0
- package/dist/development/src/model/commands/customRole/UpdateCustomRoleCommand.js +19 -0
- package/dist/development/src/model/commands/customRole/UpdateCustomRoleCommand.js.map +1 -0
- package/dist/development/src/model/commands/identity/PatchIdentityGlobalRoles.cjs +1 -1
- package/dist/development/src/model/commands/identity/PatchIdentityGlobalRoles.cjs.map +1 -1
- package/dist/development/src/model/commands/identity/PatchIdentityGlobalRoles.js +1 -1
- package/dist/development/src/model/commands/identity/PatchIdentityGlobalRoles.js.map +1 -1
- package/dist/development/src/model/commands/idp/ClaimIdpRevalidationCommand.cjs +3 -7
- package/dist/development/src/model/commands/idp/ClaimIdpRevalidationCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/idp/ClaimIdpRevalidationCommand.js +3 -7
- package/dist/development/src/model/commands/idp/ClaimIdpRevalidationCommand.js.map +1 -1
- package/dist/development/src/model/commands/idp/CreateIdpCommand.cjs +8 -2
- package/dist/development/src/model/commands/idp/CreateIdpCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/idp/CreateIdpCommand.js +8 -2
- package/dist/development/src/model/commands/idp/CreateIdpCommand.js.map +1 -1
- package/dist/development/src/model/commands/idp/CreateIdpSessionCommand.cjs +4 -1
- package/dist/development/src/model/commands/idp/CreateIdpSessionCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/idp/CreateIdpSessionCommand.js +5 -2
- package/dist/development/src/model/commands/idp/CreateIdpSessionCommand.js.map +1 -1
- package/dist/development/src/model/commands/idp/UpdateIdpCommand.cjs +6 -2
- package/dist/development/src/model/commands/idp/UpdateIdpCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/idp/UpdateIdpCommand.js +6 -2
- package/dist/development/src/model/commands/idp/UpdateIdpCommand.js.map +1 -1
- package/dist/development/src/model/commands/idp/UpdateIdpSessionCommand.cjs +2 -1
- package/dist/development/src/model/commands/idp/UpdateIdpSessionCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/idp/UpdateIdpSessionCommand.js +3 -2
- package/dist/development/src/model/commands/idp/UpdateIdpSessionCommand.js.map +1 -1
- package/dist/development/src/model/commands/membership/{RemoveProjectMembershipsCommand.cjs → RemoveProjectMembershipCommand.cjs} +1 -1
- package/dist/development/src/model/commands/membership/RemoveProjectMembershipCommand.cjs.map +1 -0
- package/dist/development/src/model/commands/membership/{RemoveProjectMembershipsCommand.js → RemoveProjectMembershipCommand.js} +1 -1
- package/dist/development/src/model/commands/membership/RemoveProjectMembershipCommand.js.map +1 -0
- package/dist/development/src/model/commands/membership/UpdateProjectMemberCommand.cjs +2 -2
- package/dist/development/src/model/commands/membership/UpdateProjectMemberCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/membership/UpdateProjectMemberCommand.js +1 -1
- package/dist/development/src/model/commands/membership/UpdateProjectMemberCommand.js.map +1 -1
- package/dist/development/src/model/commands/person/CreatePersonCommand.cjs +1 -0
- package/dist/development/src/model/commands/person/CreatePersonCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/person/CreatePersonCommand.js +1 -0
- package/dist/development/src/model/commands/person/CreatePersonCommand.js.map +1 -1
- package/dist/development/src/model/commands/person/EnablePersonCommand.cjs +17 -0
- package/dist/development/src/model/commands/person/EnablePersonCommand.cjs.map +1 -0
- package/dist/development/src/model/commands/person/EnablePersonCommand.js +17 -0
- package/dist/development/src/model/commands/person/EnablePersonCommand.js.map +1 -0
- package/dist/development/src/model/commands/person/SetMfaGraceUntilCommand.cjs +3 -3
- package/dist/development/src/model/commands/person/SetMfaGraceUntilCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/person/SetMfaGraceUntilCommand.js +4 -4
- package/dist/development/src/model/commands/person/SetMfaGraceUntilCommand.js.map +1 -1
- package/dist/development/src/model/commands/personToken/ResetPasswordCommand.cjs +2 -3
- package/dist/development/src/model/commands/personToken/ResetPasswordCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/personToken/ResetPasswordCommand.js +2 -3
- package/dist/development/src/model/commands/personToken/ResetPasswordCommand.js.map +1 -1
- package/dist/development/src/model/commands/personToken/SaveEmailOtpTokenCommand.cjs +3 -3
- package/dist/development/src/model/commands/personToken/SaveEmailOtpTokenCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/personToken/SaveEmailOtpTokenCommand.js +4 -4
- package/dist/development/src/model/commands/personToken/SaveEmailOtpTokenCommand.js.map +1 -1
- package/dist/development/src/model/commands/personToken/SavePersonTokenCommand.cjs +12 -6
- package/dist/development/src/model/commands/personToken/SavePersonTokenCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/personToken/SavePersonTokenCommand.js +13 -7
- package/dist/development/src/model/commands/personToken/SavePersonTokenCommand.js.map +1 -1
- package/dist/development/src/model/commands/rateLimit/RecordRateLimitEventCommand.cjs +1 -2
- package/dist/development/src/model/commands/rateLimit/RecordRateLimitEventCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/rateLimit/RecordRateLimitEventCommand.js +1 -2
- package/dist/development/src/model/commands/rateLimit/RecordRateLimitEventCommand.js.map +1 -1
- package/dist/development/src/model/mailing/UserMailer.cjs +2 -1
- package/dist/development/src/model/mailing/UserMailer.cjs.map +1 -1
- package/dist/development/src/model/mailing/UserMailer.js +2 -1
- package/dist/development/src/model/mailing/UserMailer.js.map +1 -1
- package/dist/development/src/model/queries/apiKey/ApiKeyQuery.cjs +8 -1
- package/dist/development/src/model/queries/apiKey/ApiKeyQuery.cjs.map +1 -1
- package/dist/development/src/model/queries/apiKey/ApiKeyQuery.js +9 -2
- package/dist/development/src/model/queries/apiKey/ApiKeyQuery.js.map +1 -1
- package/dist/development/src/model/queries/apiKey/ApiKeySessionsQuery.cjs +2 -3
- package/dist/development/src/model/queries/apiKey/ApiKeySessionsQuery.cjs.map +1 -1
- package/dist/development/src/model/queries/apiKey/ApiKeySessionsQuery.js +2 -3
- package/dist/development/src/model/queries/apiKey/ApiKeySessionsQuery.js.map +1 -1
- package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.cjs +12 -10
- package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.cjs.map +1 -1
- package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.js +12 -10
- package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.js.map +1 -1
- package/dist/development/src/model/queries/authLog/NextMailAttemptQuery.cjs +10 -8
- package/dist/development/src/model/queries/authLog/NextMailAttemptQuery.cjs.map +1 -1
- package/dist/development/src/model/queries/authLog/NextMailAttemptQuery.js +10 -8
- package/dist/development/src/model/queries/authLog/NextMailAttemptQuery.js.map +1 -1
- package/dist/development/src/model/queries/configuration/ConfigurationQuery.cjs +4 -0
- package/dist/development/src/model/queries/configuration/ConfigurationQuery.cjs.map +1 -1
- package/dist/development/src/model/queries/configuration/ConfigurationQuery.js +4 -0
- package/dist/development/src/model/queries/configuration/ConfigurationQuery.js.map +1 -1
- package/dist/development/src/model/queries/customRole/CustomRolesQuery.cjs +23 -0
- package/dist/development/src/model/queries/customRole/CustomRolesQuery.cjs.map +1 -0
- package/dist/development/src/model/queries/customRole/CustomRolesQuery.js +23 -0
- package/dist/development/src/model/queries/customRole/CustomRolesQuery.js.map +1 -0
- package/dist/development/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.cjs +15 -0
- package/dist/development/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.cjs.map +1 -0
- package/dist/development/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.js +15 -0
- package/dist/development/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.js.map +1 -0
- package/dist/development/src/model/queries/identity/IdentityQuery.cjs +7 -2
- package/dist/development/src/model/queries/identity/IdentityQuery.cjs.map +1 -1
- package/dist/development/src/model/queries/identity/IdentityQuery.js +7 -2
- package/dist/development/src/model/queries/identity/IdentityQuery.js.map +1 -1
- package/dist/development/src/model/queries/idp/LocalAuthDisablingIdpsQuery.cjs +21 -0
- package/dist/development/src/model/queries/idp/LocalAuthDisablingIdpsQuery.cjs.map +1 -0
- package/dist/development/src/model/queries/idp/LocalAuthDisablingIdpsQuery.js +21 -0
- package/dist/development/src/model/queries/idp/LocalAuthDisablingIdpsQuery.js.map +1 -0
- package/dist/development/src/model/queries/idp/PersonIdentityProvidersQuery.cjs +1 -1
- package/dist/development/src/model/queries/idp/PersonIdentityProvidersQuery.cjs.map +1 -1
- package/dist/development/src/model/queries/idp/PersonIdentityProvidersQuery.js +1 -1
- package/dist/development/src/model/queries/idp/PersonIdentityProvidersQuery.js.map +1 -1
- package/dist/development/src/model/queries/idp/helpers.cjs +3 -3
- package/dist/development/src/model/queries/idp/helpers.cjs.map +1 -1
- package/dist/development/src/model/queries/idp/helpers.js +3 -3
- package/dist/development/src/model/queries/idp/helpers.js.map +1 -1
- package/dist/development/src/model/queries/membership/IdentityHasProjectMembershipsQuery.cjs +15 -0
- package/dist/development/src/model/queries/membership/IdentityHasProjectMembershipsQuery.cjs.map +1 -0
- package/dist/development/src/model/queries/membership/IdentityHasProjectMembershipsQuery.js +15 -0
- package/dist/development/src/model/queries/membership/IdentityHasProjectMembershipsQuery.js.map +1 -0
- package/dist/development/src/model/queries/membership/ProjectMembersQuery.cjs +1 -1
- package/dist/development/src/model/queries/membership/ProjectMembersQuery.cjs.map +1 -1
- package/dist/development/src/model/queries/membership/ProjectMembersQuery.js +1 -1
- package/dist/development/src/model/queries/membership/ProjectMembersQuery.js.map +1 -1
- package/dist/development/src/model/queries/person/PersonQueryBuilderFactory.cjs +2 -2
- package/dist/development/src/model/queries/person/PersonQueryBuilderFactory.cjs.map +1 -1
- package/dist/development/src/model/queries/person/PersonQueryBuilderFactory.js +2 -2
- package/dist/development/src/model/queries/person/PersonQueryBuilderFactory.js.map +1 -1
- package/dist/development/src/model/queries/personToken/PersonTokenQuery.cjs +1 -1
- package/dist/development/src/model/queries/personToken/PersonTokenQuery.cjs.map +1 -1
- package/dist/development/src/model/queries/personToken/PersonTokenQuery.js +1 -1
- package/dist/development/src/model/queries/personToken/PersonTokenQuery.js.map +1 -1
- package/dist/development/src/model/queries/project/ProjectsByIdentityQuery.cjs +4 -1
- package/dist/development/src/model/queries/project/ProjectsByIdentityQuery.cjs.map +1 -1
- package/dist/development/src/model/queries/project/ProjectsByIdentityQuery.js +4 -1
- package/dist/development/src/model/queries/project/ProjectsByIdentityQuery.js.map +1 -1
- package/dist/development/src/model/queries/rateLimit/RateLimitCountQuery.cjs +3 -3
- package/dist/development/src/model/queries/rateLimit/RateLimitCountQuery.cjs.map +1 -1
- package/dist/development/src/model/queries/rateLimit/RateLimitCountQuery.js +3 -3
- package/dist/development/src/model/queries/rateLimit/RateLimitCountQuery.js.map +1 -1
- package/dist/development/src/model/service/AuthLogService.cjs +8 -2
- package/dist/development/src/model/service/AuthLogService.cjs.map +1 -1
- package/dist/development/src/model/service/AuthLogService.js +8 -2
- package/dist/development/src/model/service/AuthLogService.js.map +1 -1
- package/dist/development/src/model/service/AuthPolicyManager.cjs +2 -1
- package/dist/development/src/model/service/AuthPolicyManager.cjs.map +1 -1
- package/dist/development/src/model/service/AuthPolicyManager.js +2 -1
- package/dist/development/src/model/service/AuthPolicyManager.js.map +1 -1
- package/dist/development/src/model/service/AuthPolicyResolver.cjs +2 -1
- package/dist/development/src/model/service/AuthPolicyResolver.cjs.map +1 -1
- package/dist/development/src/model/service/AuthPolicyResolver.js +2 -1
- package/dist/development/src/model/service/AuthPolicyResolver.js.map +1 -1
- package/dist/development/src/model/service/CustomRoleManager.cjs +170 -0
- package/dist/development/src/model/service/CustomRoleManager.cjs.map +1 -0
- package/dist/development/src/model/service/CustomRoleManager.js +170 -0
- package/dist/development/src/model/service/CustomRoleManager.js.map +1 -0
- package/dist/development/src/model/service/EmailChangeManager.cjs +5 -4
- package/dist/development/src/model/service/EmailChangeManager.cjs.map +1 -1
- package/dist/development/src/model/service/EmailChangeManager.js +5 -4
- package/dist/development/src/model/service/EmailChangeManager.js.map +1 -1
- package/dist/development/src/model/service/EmailOtpManager.cjs +0 -1
- package/dist/development/src/model/service/EmailOtpManager.cjs.map +1 -1
- package/dist/development/src/model/service/EmailOtpManager.js +0 -1
- package/dist/development/src/model/service/EmailOtpManager.js.map +1 -1
- package/dist/development/src/model/service/EmailValidator.cjs +2 -1
- package/dist/development/src/model/service/EmailValidator.cjs.map +1 -1
- package/dist/development/src/model/service/EmailValidator.js +2 -1
- package/dist/development/src/model/service/EmailValidator.js.map +1 -1
- package/dist/development/src/model/service/EmailVerificationManager.cjs +5 -4
- package/dist/development/src/model/service/EmailVerificationManager.cjs.map +1 -1
- package/dist/development/src/model/service/EmailVerificationManager.js +5 -4
- package/dist/development/src/model/service/EmailVerificationManager.js.map +1 -1
- package/dist/development/src/model/service/GlobalRoleValidator.cjs +35 -0
- package/dist/development/src/model/service/GlobalRoleValidator.cjs.map +1 -0
- package/dist/development/src/model/service/GlobalRoleValidator.js +35 -0
- package/dist/development/src/model/service/GlobalRoleValidator.js.map +1 -0
- package/dist/development/src/model/service/IDPSignInManager.cjs +52 -16
- package/dist/development/src/model/service/IDPSignInManager.cjs.map +1 -1
- package/dist/development/src/model/service/IDPSignInManager.js +52 -16
- package/dist/development/src/model/service/IDPSignInManager.js.map +1 -1
- package/dist/development/src/model/service/InviteManager.cjs +2 -1
- package/dist/development/src/model/service/InviteManager.cjs.map +1 -1
- package/dist/development/src/model/service/InviteManager.js +2 -1
- package/dist/development/src/model/service/InviteManager.js.map +1 -1
- package/dist/development/src/model/service/PanelAccessResolver.cjs +32 -0
- package/dist/development/src/model/service/PanelAccessResolver.cjs.map +1 -0
- package/dist/development/src/model/service/PanelAccessResolver.js +32 -0
- package/dist/development/src/model/service/PanelAccessResolver.js.map +1 -0
- package/dist/development/src/model/service/PasswordChangeManager.cjs +2 -1
- package/dist/development/src/model/service/PasswordChangeManager.cjs.map +1 -1
- package/dist/development/src/model/service/PasswordChangeManager.js +2 -1
- package/dist/development/src/model/service/PasswordChangeManager.js.map +1 -1
- package/dist/development/src/model/service/PasswordResetManager.cjs +9 -3
- package/dist/development/src/model/service/PasswordResetManager.cjs.map +1 -1
- package/dist/development/src/model/service/PasswordResetManager.js +9 -3
- package/dist/development/src/model/service/PasswordResetManager.js.map +1 -1
- package/dist/development/src/model/service/PasswordlessSignInManager.cjs +24 -6
- package/dist/development/src/model/service/PasswordlessSignInManager.cjs.map +1 -1
- package/dist/development/src/model/service/PasswordlessSignInManager.js +24 -6
- package/dist/development/src/model/service/PasswordlessSignInManager.js.map +1 -1
- package/dist/development/src/model/service/PersonAccessManager.cjs +10 -2
- package/dist/development/src/model/service/PersonAccessManager.cjs.map +1 -1
- package/dist/development/src/model/service/PersonAccessManager.js +10 -2
- package/dist/development/src/model/service/PersonAccessManager.js.map +1 -1
- package/dist/development/src/model/service/PersonManager.cjs +2 -1
- package/dist/development/src/model/service/PersonManager.cjs.map +1 -1
- package/dist/development/src/model/service/PersonManager.js +2 -1
- package/dist/development/src/model/service/PersonManager.js.map +1 -1
- package/dist/development/src/model/service/ProjectMemberManager.cjs +2 -1
- package/dist/development/src/model/service/ProjectMemberManager.cjs.map +1 -1
- package/dist/development/src/model/service/ProjectMemberManager.js +2 -1
- package/dist/development/src/model/service/ProjectMemberManager.js.map +1 -1
- package/dist/development/src/model/service/RateLimiter.cjs +1 -2
- package/dist/development/src/model/service/RateLimiter.cjs.map +1 -1
- package/dist/development/src/model/service/RateLimiter.js +1 -2
- package/dist/development/src/model/service/RateLimiter.js.map +1 -1
- package/dist/development/src/model/service/RolesManager.cjs +17 -18
- package/dist/development/src/model/service/RolesManager.cjs.map +1 -1
- package/dist/development/src/model/service/RolesManager.js +18 -19
- package/dist/development/src/model/service/RolesManager.js.map +1 -1
- package/dist/development/src/model/service/SecretsManager.cjs +2 -1
- package/dist/development/src/model/service/SecretsManager.cjs.map +1 -1
- package/dist/development/src/model/service/SecretsManager.js +2 -1
- package/dist/development/src/model/service/SecretsManager.js.map +1 -1
- package/dist/development/src/model/service/SignInManager.cjs +9 -5
- package/dist/development/src/model/service/SignInManager.cjs.map +1 -1
- package/dist/development/src/model/service/SignInManager.js +9 -5
- package/dist/development/src/model/service/SignInManager.js.map +1 -1
- package/dist/development/src/model/service/SignOutManager.cjs +2 -1
- package/dist/development/src/model/service/SignOutManager.cjs.map +1 -1
- package/dist/development/src/model/service/SignOutManager.js +2 -1
- package/dist/development/src/model/service/SignOutManager.js.map +1 -1
- package/dist/development/src/model/service/SignUpManager.cjs +15 -7
- package/dist/development/src/model/service/SignUpManager.cjs.map +1 -1
- package/dist/development/src/model/service/SignUpManager.js +15 -7
- package/dist/development/src/model/service/SignUpManager.js.map +1 -1
- package/dist/development/src/model/service/apiKey/ApiKeyManager.cjs +56 -40
- package/dist/development/src/model/service/apiKey/ApiKeyManager.cjs.map +1 -1
- package/dist/development/src/model/service/apiKey/ApiKeyManager.js +57 -41
- package/dist/development/src/model/service/apiKey/ApiKeyManager.js.map +1 -1
- package/dist/development/src/model/service/apiKey/ApiKeyService.cjs.map +1 -1
- package/dist/development/src/model/service/apiKey/ApiKeyService.js.map +1 -1
- package/dist/development/src/model/service/apiKey/UnpersistedApiKeyManager.cjs +10 -1
- package/dist/development/src/model/service/apiKey/UnpersistedApiKeyManager.cjs.map +1 -1
- package/dist/development/src/model/service/apiKey/UnpersistedApiKeyManager.js +11 -2
- package/dist/development/src/model/service/apiKey/UnpersistedApiKeyManager.js.map +1 -1
- package/dist/development/src/model/service/idp/ClaimMapping.cjs +187 -0
- package/dist/development/src/model/service/idp/ClaimMapping.cjs.map +1 -0
- package/dist/development/src/model/service/idp/ClaimMapping.js +170 -0
- package/dist/development/src/model/service/idp/ClaimMapping.js.map +1 -0
- package/dist/development/src/model/service/idp/ClaimMappingEvaluator.cjs +155 -0
- package/dist/development/src/model/service/idp/ClaimMappingEvaluator.cjs.map +1 -0
- package/dist/development/src/model/service/idp/ClaimMappingEvaluator.js +155 -0
- package/dist/development/src/model/service/idp/ClaimMappingEvaluator.js.map +1 -0
- package/dist/development/src/model/service/idp/ClaimMappingValidation.cjs +83 -0
- package/dist/development/src/model/service/idp/ClaimMappingValidation.cjs.map +1 -0
- package/dist/development/src/model/service/idp/ClaimMappingValidation.js +83 -0
- package/dist/development/src/model/service/idp/ClaimMappingValidation.js.map +1 -0
- package/dist/development/src/model/service/idp/IDPClaimSyncService.cjs +261 -0
- package/dist/development/src/model/service/idp/IDPClaimSyncService.cjs.map +1 -0
- package/dist/development/src/model/service/idp/IDPClaimSyncService.js +261 -0
- package/dist/development/src/model/service/idp/IDPClaimSyncService.js.map +1 -0
- package/dist/development/src/model/service/idp/IDPManager.cjs +98 -21
- package/dist/development/src/model/service/idp/IDPManager.cjs.map +1 -1
- package/dist/development/src/model/service/idp/IDPManager.js +98 -21
- package/dist/development/src/model/service/idp/IDPManager.js.map +1 -1
- package/dist/development/src/model/service/idp/IdpSessionRevalidator.cjs +93 -28
- package/dist/development/src/model/service/idp/IdpSessionRevalidator.cjs.map +1 -1
- package/dist/development/src/model/service/idp/IdpSessionRevalidator.js +93 -28
- package/dist/development/src/model/service/idp/IdpSessionRevalidator.js.map +1 -1
- package/dist/development/src/model/service/idp/PersonIdentityProviderManager.cjs +8 -1
- package/dist/development/src/model/service/idp/PersonIdentityProviderManager.cjs.map +1 -1
- package/dist/development/src/model/service/idp/PersonIdentityProviderManager.js +8 -1
- package/dist/development/src/model/service/idp/PersonIdentityProviderManager.js.map +1 -1
- package/dist/development/src/model/service/idp/providers/OIDCHelpers.cjs +69 -33
- package/dist/development/src/model/service/idp/providers/OIDCHelpers.cjs.map +1 -1
- package/dist/development/src/model/service/idp/providers/OIDCHelpers.js +69 -33
- package/dist/development/src/model/service/idp/providers/OIDCHelpers.js.map +1 -1
- package/dist/development/src/model/service/idp/providers/OIDCProvider.cjs +4 -1
- package/dist/development/src/model/service/idp/providers/OIDCProvider.cjs.map +1 -1
- package/dist/development/src/model/service/idp/providers/OIDCProvider.js +4 -1
- package/dist/development/src/model/service/idp/providers/OIDCProvider.js.map +1 -1
- package/dist/development/src/model/utils/DatabaseContext.cjs +10 -3
- package/dist/development/src/model/utils/DatabaseContext.cjs.map +1 -1
- package/dist/development/src/model/utils/DatabaseContext.js +11 -4
- package/dist/development/src/model/utils/DatabaseContext.js.map +1 -1
- package/dist/development/src/model/utils/token.cjs +2 -2
- package/dist/development/src/model/utils/token.cjs.map +1 -1
- package/dist/development/src/model/utils/token.js +2 -2
- package/dist/development/src/model/utils/token.js.map +1 -1
- package/dist/development/src/resolvers/ResolverFactory.cjs +12 -3
- package/dist/development/src/resolvers/ResolverFactory.cjs.map +1 -1
- package/dist/development/src/resolvers/ResolverFactory.js +12 -3
- package/dist/development/src/resolvers/ResolverFactory.js.map +1 -1
- package/dist/development/src/resolvers/TenantResolverContextFactory.cjs +4 -4
- package/dist/development/src/resolvers/TenantResolverContextFactory.cjs.map +1 -1
- package/dist/development/src/resolvers/TenantResolverContextFactory.js +4 -4
- package/dist/development/src/resolvers/TenantResolverContextFactory.js.map +1 -1
- package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs +19 -9
- package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js +20 -10
- package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs +7 -5
- package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js +7 -5
- package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.cjs +7 -5
- package/dist/development/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.js +7 -5
- package/dist/development/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs +7 -5
- package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js +7 -5
- package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/customRole/CustomRoleMutationResolver.cjs +124 -0
- package/dist/development/src/resolvers/mutation/customRole/CustomRoleMutationResolver.cjs.map +1 -0
- package/dist/development/src/resolvers/mutation/customRole/CustomRoleMutationResolver.js +124 -0
- package/dist/development/src/resolvers/mutation/customRole/CustomRoleMutationResolver.js.map +1 -0
- package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs +35 -11
- package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js +35 -11
- package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs +10 -7
- package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.js +10 -7
- package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs +7 -5
- package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.js +7 -5
- package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.cjs +8 -6
- package/dist/development/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.js +8 -6
- package/dist/development/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs +7 -5
- package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.js +7 -5
- package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs +10 -7
- package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js +10 -7
- package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/audit.cjs +1 -0
- package/dist/development/src/resolvers/mutation/idp/audit.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/audit.js +1 -0
- package/dist/development/src/resolvers/mutation/idp/audit.js.map +1 -1
- package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs +38 -18
- package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js +38 -18
- package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs +10 -8
- package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.js +10 -8
- package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs +17 -11
- package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.js +17 -11
- package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs +10 -8
- package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.js +10 -8
- package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/EmailOtpMutationResolver.cjs +10 -8
- package/dist/development/src/resolvers/mutation/person/EmailOtpMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/EmailOtpMutationResolver.js +10 -8
- package/dist/development/src/resolvers/mutation/person/EmailOtpMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/EmailVerificationMutationResolver.cjs +10 -8
- package/dist/development/src/resolvers/mutation/person/EmailVerificationMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/EmailVerificationMutationResolver.js +10 -8
- package/dist/development/src/resolvers/mutation/person/EmailVerificationMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/EnablePersonMutationResolver.cjs +61 -0
- package/dist/development/src/resolvers/mutation/person/EnablePersonMutationResolver.cjs.map +1 -0
- package/dist/development/src/resolvers/mutation/person/EnablePersonMutationResolver.js +61 -0
- package/dist/development/src/resolvers/mutation/person/EnablePersonMutationResolver.js.map +1 -0
- package/dist/development/src/resolvers/mutation/person/ForceSignOutMutationResolver.cjs +8 -6
- package/dist/development/src/resolvers/mutation/person/ForceSignOutMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/ForceSignOutMutationResolver.js +8 -6
- package/dist/development/src/resolvers/mutation/person/ForceSignOutMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.cjs +32 -5
- package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.js +32 -5
- package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.cjs +7 -5
- package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.js +7 -5
- package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.cjs +9 -7
- package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.js +9 -7
- package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs +12 -6
- package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.js +12 -6
- package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.cjs +9 -7
- package/dist/development/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.js +9 -7
- package/dist/development/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs +10 -8
- package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.js +10 -8
- package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.cjs +8 -6
- package/dist/development/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.js +8 -6
- package/dist/development/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/RevokeSessionMutationResolver.cjs +8 -6
- package/dist/development/src/resolvers/mutation/person/RevokeSessionMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/RevokeSessionMutationResolver.js +8 -6
- package/dist/development/src/resolvers/mutation/person/RevokeSessionMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.cjs +22 -14
- package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.js +22 -14
- package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.cjs +7 -5
- package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.js +7 -5
- package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.cjs +10 -8
- package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.js +10 -8
- package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs +9 -7
- package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js +9 -7
- package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs +7 -5
- package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.js +7 -5
- package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs +7 -5
- package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js +7 -5
- package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs +7 -5
- package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.js +7 -5
- package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs +7 -5
- package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js +7 -5
- package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs +8 -6
- package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js +8 -6
- package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs +8 -6
- package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js +8 -6
- package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/projectMember/audit.cjs +2 -1
- package/dist/development/src/resolvers/mutation/projectMember/audit.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/projectMember/audit.js +2 -1
- package/dist/development/src/resolvers/mutation/projectMember/audit.js.map +1 -1
- package/dist/development/src/resolvers/query/ApiKeyQueryResolver.cjs +8 -6
- package/dist/development/src/resolvers/query/ApiKeyQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/ApiKeyQueryResolver.js +8 -6
- package/dist/development/src/resolvers/query/ApiKeyQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/AuthLogQueryResolver.cjs +7 -5
- package/dist/development/src/resolvers/query/AuthLogQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/AuthLogQueryResolver.js +7 -5
- package/dist/development/src/resolvers/query/AuthLogQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/AuthPolicyQueryResolver.cjs +8 -6
- package/dist/development/src/resolvers/query/AuthPolicyQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/AuthPolicyQueryResolver.js +8 -6
- package/dist/development/src/resolvers/query/AuthPolicyQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/ConfigurationQueryResolver.cjs +8 -6
- package/dist/development/src/resolvers/query/ConfigurationQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/ConfigurationQueryResolver.js +8 -6
- package/dist/development/src/resolvers/query/ConfigurationQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/CustomRoleQueryResolver.cjs +55 -0
- package/dist/development/src/resolvers/query/CustomRoleQueryResolver.cjs.map +1 -0
- package/dist/development/src/resolvers/query/CustomRoleQueryResolver.js +55 -0
- package/dist/development/src/resolvers/query/CustomRoleQueryResolver.js.map +1 -0
- package/dist/development/src/resolvers/query/IDPQueryResolver.cjs +7 -5
- package/dist/development/src/resolvers/query/IDPQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/IDPQueryResolver.js +7 -5
- package/dist/development/src/resolvers/query/IDPQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/MailTemplateQueryResolver.cjs +21 -14
- package/dist/development/src/resolvers/query/MailTemplateQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/MailTemplateQueryResolver.js +21 -14
- package/dist/development/src/resolvers/query/MailTemplateQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/PersonQueryResolver.cjs +7 -5
- package/dist/development/src/resolvers/query/PersonQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/PersonQueryResolver.js +7 -5
- package/dist/development/src/resolvers/query/PersonQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.cjs +7 -5
- package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.js +7 -5
- package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/ProjectQueryResolver.cjs +10 -7
- package/dist/development/src/resolvers/query/ProjectQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/ProjectQueryResolver.js +10 -7
- package/dist/development/src/resolvers/query/ProjectQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/responseHelpers/ApiKeyResponseFactory.cjs +7 -5
- package/dist/development/src/resolvers/responseHelpers/ApiKeyResponseFactory.cjs.map +1 -1
- package/dist/development/src/resolvers/responseHelpers/ApiKeyResponseFactory.js +7 -5
- package/dist/development/src/resolvers/responseHelpers/ApiKeyResponseFactory.js.map +1 -1
- package/dist/development/src/resolvers/responseHelpers/PersonResponseFactory.cjs +5 -0
- package/dist/development/src/resolvers/responseHelpers/PersonResponseFactory.cjs.map +1 -1
- package/dist/development/src/resolvers/responseHelpers/PersonResponseFactory.js +5 -0
- package/dist/development/src/resolvers/responseHelpers/PersonResponseFactory.js.map +1 -1
- package/dist/development/src/resolvers/responseHelpers/ProjectResponseFactory.cjs +23 -0
- package/dist/development/src/resolvers/responseHelpers/ProjectResponseFactory.cjs.map +1 -0
- package/dist/development/src/resolvers/responseHelpers/ProjectResponseFactory.js +23 -0
- package/dist/development/src/resolvers/responseHelpers/ProjectResponseFactory.js.map +1 -0
- package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.cjs +8 -6
- package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.cjs.map +1 -1
- package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.js +8 -6
- package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.js.map +1 -1
- package/dist/development/src/resolvers/types/IdentityTypeResolver.cjs +50 -18
- package/dist/development/src/resolvers/types/IdentityTypeResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/types/IdentityTypeResolver.js +50 -18
- package/dist/development/src/resolvers/types/IdentityTypeResolver.js.map +1 -1
- package/dist/development/src/resolvers/types/PersonTypeResolver.cjs +38 -8
- package/dist/development/src/resolvers/types/PersonTypeResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/types/PersonTypeResolver.js +38 -8
- package/dist/development/src/resolvers/types/PersonTypeResolver.js.map +1 -1
- package/dist/development/src/resolvers/types/ProjectTypeResolver.cjs +31 -6
- package/dist/development/src/resolvers/types/ProjectTypeResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/types/ProjectTypeResolver.js +31 -6
- package/dist/development/src/resolvers/types/ProjectTypeResolver.js.map +1 -1
- package/dist/development/src/schema/tenant.graphql.cjs +275 -15
- package/dist/development/src/schema/tenant.graphql.cjs.map +1 -1
- package/dist/development/src/schema/tenant.graphql.js +275 -15
- package/dist/development/src/schema/tenant.graphql.js.map +1 -1
- package/dist/production/index.cjs +69 -0
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +71 -2
- package/dist/production/index.js.map +1 -1
- package/dist/production/src/TenantContainer.cjs +39 -10
- package/dist/production/src/TenantContainer.cjs.map +1 -1
- package/dist/production/src/TenantContainer.js +39 -10
- package/dist/production/src/TenantContainer.js.map +1 -1
- package/dist/production/src/bridges/system/IdentityFetcher.cjs +9 -7
- package/dist/production/src/bridges/system/IdentityFetcher.cjs.map +1 -1
- package/dist/production/src/bridges/system/IdentityFetcher.js +9 -7
- package/dist/production/src/bridges/system/IdentityFetcher.js.map +1 -1
- package/dist/production/src/migrations/2026-06-18-120000-idp-claim-mapping.cjs +10 -0
- package/dist/production/src/migrations/2026-06-18-120000-idp-claim-mapping.cjs.map +1 -0
- package/dist/production/src/migrations/2026-06-18-120000-idp-claim-mapping.js +11 -0
- package/dist/production/src/migrations/2026-06-18-120000-idp-claim-mapping.js.map +1 -0
- package/dist/production/src/migrations/2026-08-03-120000-person-enable-auth-log.cjs +9 -0
- package/dist/production/src/migrations/2026-08-03-120000-person-enable-auth-log.cjs.map +1 -0
- package/dist/production/src/migrations/2026-08-03-120000-person-enable-auth-log.js +10 -0
- package/dist/production/src/migrations/2026-08-03-120000-person-enable-auth-log.js.map +1 -0
- package/dist/production/src/migrations/2026-08-04-120000-config-panel.cjs +11 -0
- package/dist/production/src/migrations/2026-08-04-120000-config-panel.cjs.map +1 -0
- package/dist/production/src/migrations/2026-08-04-120000-config-panel.js +12 -0
- package/dist/production/src/migrations/2026-08-04-120000-config-panel.js.map +1 -0
- package/dist/production/src/migrations/2026-09-04-120000-idp-disable-local-authentication.cjs +18 -0
- package/dist/production/src/migrations/2026-09-04-120000-idp-disable-local-authentication.cjs.map +1 -0
- package/dist/production/src/migrations/2026-09-04-120000-idp-disable-local-authentication.js +19 -0
- package/dist/production/src/migrations/2026-09-04-120000-idp-disable-local-authentication.js.map +1 -0
- package/dist/production/src/migrations/2026-09-11-120000-custom-role.cjs +18 -0
- package/dist/production/src/migrations/2026-09-11-120000-custom-role.cjs.map +1 -0
- package/dist/production/src/migrations/2026-09-11-120000-custom-role.js +19 -0
- package/dist/production/src/migrations/2026-09-11-120000-custom-role.js.map +1 -0
- package/dist/production/src/migrations/runner.cjs +17 -5
- package/dist/production/src/migrations/runner.cjs.map +1 -1
- package/dist/production/src/migrations/runner.js +17 -5
- package/dist/production/src/migrations/runner.js.map +1 -1
- package/dist/production/src/migrations/snapshot.cjs +22 -2
- package/dist/production/src/migrations/snapshot.cjs.map +1 -1
- package/dist/production/src/migrations/snapshot.js +22 -2
- package/dist/production/src/migrations/snapshot.js.map +1 -1
- package/dist/production/src/model/authorization/CustomRoleAuthorizator.cjs +65 -0
- package/dist/production/src/model/authorization/CustomRoleAuthorizator.cjs.map +1 -0
- package/dist/production/src/model/authorization/CustomRoleAuthorizator.js +65 -0
- package/dist/production/src/model/authorization/CustomRoleAuthorizator.js.map +1 -0
- package/dist/production/src/model/authorization/CustomRolePermissions.cjs +404 -0
- package/dist/production/src/model/authorization/CustomRolePermissions.cjs.map +1 -0
- package/dist/production/src/model/authorization/CustomRolePermissions.js +387 -0
- package/dist/production/src/model/authorization/CustomRolePermissions.js.map +1 -0
- package/dist/production/src/model/authorization/PermissionActions.cjs +19 -16
- package/dist/production/src/model/authorization/PermissionActions.cjs.map +1 -1
- package/dist/production/src/model/authorization/PermissionActions.js +19 -16
- package/dist/production/src/model/authorization/PermissionActions.js.map +1 -1
- package/dist/production/src/model/authorization/PermissionContextFactory.cjs +20 -2
- package/dist/production/src/model/authorization/PermissionContextFactory.cjs.map +1 -1
- package/dist/production/src/model/authorization/PermissionContextFactory.js +20 -2
- package/dist/production/src/model/authorization/PermissionContextFactory.js.map +1 -1
- package/dist/production/src/model/authorization/PermissionsFactory.cjs +32 -24
- package/dist/production/src/model/authorization/PermissionsFactory.cjs.map +1 -1
- package/dist/production/src/model/authorization/PermissionsFactory.js +33 -25
- package/dist/production/src/model/authorization/PermissionsFactory.js.map +1 -1
- package/dist/production/src/model/authorization/Roles.cjs +8 -0
- package/dist/production/src/model/authorization/Roles.cjs.map +1 -1
- package/dist/production/src/model/authorization/Roles.js +8 -0
- package/dist/production/src/model/authorization/Roles.js.map +1 -1
- package/dist/production/src/model/authorization/TargetIdentityPermission.cjs +35 -0
- package/dist/production/src/model/authorization/TargetIdentityPermission.cjs.map +1 -0
- package/dist/production/src/model/authorization/TargetIdentityPermission.js +35 -0
- package/dist/production/src/model/authorization/TargetIdentityPermission.js.map +1 -0
- package/dist/production/src/model/commands/apiKey/ApiKeyHelper.cjs +19 -0
- package/dist/production/src/model/commands/apiKey/ApiKeyHelper.cjs.map +1 -1
- package/dist/production/src/model/commands/apiKey/ApiKeyHelper.js +19 -0
- package/dist/production/src/model/commands/apiKey/ApiKeyHelper.js.map +1 -1
- package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.cjs +4 -2
- package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.js +5 -3
- package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.js.map +1 -1
- package/dist/production/src/model/commands/apiKey/ProlongApiKeyCommand.cjs +9 -10
- package/dist/production/src/model/commands/apiKey/ProlongApiKeyCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/apiKey/ProlongApiKeyCommand.js +10 -11
- package/dist/production/src/model/commands/apiKey/ProlongApiKeyCommand.js.map +1 -1
- package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.js.map +1 -1
- package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.cjs +5 -3
- package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.js +5 -3
- package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.js.map +1 -1
- package/dist/production/src/model/commands/customRole/CreateCustomRoleCommand.cjs +23 -0
- package/dist/production/src/model/commands/customRole/CreateCustomRoleCommand.cjs.map +1 -0
- package/dist/production/src/model/commands/customRole/CreateCustomRoleCommand.js +23 -0
- package/dist/production/src/model/commands/customRole/CreateCustomRoleCommand.js.map +1 -0
- package/dist/production/src/model/commands/customRole/DeleteCustomRoleCommand.cjs +14 -0
- package/dist/production/src/model/commands/customRole/DeleteCustomRoleCommand.cjs.map +1 -0
- package/dist/production/src/model/commands/customRole/DeleteCustomRoleCommand.js +14 -0
- package/dist/production/src/model/commands/customRole/DeleteCustomRoleCommand.js.map +1 -0
- package/dist/production/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.cjs +16 -0
- package/dist/production/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.cjs.map +1 -0
- package/dist/production/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.js +16 -0
- package/dist/production/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.js.map +1 -0
- package/dist/production/src/model/commands/customRole/UpdateCustomRoleCommand.cjs +19 -0
- package/dist/production/src/model/commands/customRole/UpdateCustomRoleCommand.cjs.map +1 -0
- package/dist/production/src/model/commands/customRole/UpdateCustomRoleCommand.js +19 -0
- package/dist/production/src/model/commands/customRole/UpdateCustomRoleCommand.js.map +1 -0
- package/dist/production/src/model/commands/identity/PatchIdentityGlobalRoles.cjs +1 -1
- package/dist/production/src/model/commands/identity/PatchIdentityGlobalRoles.cjs.map +1 -1
- package/dist/production/src/model/commands/identity/PatchIdentityGlobalRoles.js +1 -1
- package/dist/production/src/model/commands/identity/PatchIdentityGlobalRoles.js.map +1 -1
- package/dist/production/src/model/commands/idp/ClaimIdpRevalidationCommand.cjs +3 -7
- package/dist/production/src/model/commands/idp/ClaimIdpRevalidationCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/idp/ClaimIdpRevalidationCommand.js +3 -7
- package/dist/production/src/model/commands/idp/ClaimIdpRevalidationCommand.js.map +1 -1
- package/dist/production/src/model/commands/idp/CreateIdpCommand.cjs +8 -2
- package/dist/production/src/model/commands/idp/CreateIdpCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/idp/CreateIdpCommand.js +8 -2
- package/dist/production/src/model/commands/idp/CreateIdpCommand.js.map +1 -1
- package/dist/production/src/model/commands/idp/CreateIdpSessionCommand.cjs +4 -1
- package/dist/production/src/model/commands/idp/CreateIdpSessionCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/idp/CreateIdpSessionCommand.js +5 -2
- package/dist/production/src/model/commands/idp/CreateIdpSessionCommand.js.map +1 -1
- package/dist/production/src/model/commands/idp/UpdateIdpCommand.cjs +6 -2
- package/dist/production/src/model/commands/idp/UpdateIdpCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/idp/UpdateIdpCommand.js +6 -2
- package/dist/production/src/model/commands/idp/UpdateIdpCommand.js.map +1 -1
- package/dist/production/src/model/commands/idp/UpdateIdpSessionCommand.cjs +2 -1
- package/dist/production/src/model/commands/idp/UpdateIdpSessionCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/idp/UpdateIdpSessionCommand.js +3 -2
- package/dist/production/src/model/commands/idp/UpdateIdpSessionCommand.js.map +1 -1
- package/dist/production/src/model/commands/membership/{RemoveProjectMembershipsCommand.cjs → RemoveProjectMembershipCommand.cjs} +1 -1
- package/dist/production/src/model/commands/membership/RemoveProjectMembershipCommand.cjs.map +1 -0
- package/dist/production/src/model/commands/membership/{RemoveProjectMembershipsCommand.js → RemoveProjectMembershipCommand.js} +1 -1
- package/dist/production/src/model/commands/membership/RemoveProjectMembershipCommand.js.map +1 -0
- package/dist/production/src/model/commands/membership/UpdateProjectMemberCommand.cjs +2 -2
- package/dist/production/src/model/commands/membership/UpdateProjectMemberCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/membership/UpdateProjectMemberCommand.js +1 -1
- package/dist/production/src/model/commands/membership/UpdateProjectMemberCommand.js.map +1 -1
- package/dist/production/src/model/commands/person/CreatePersonCommand.cjs +1 -0
- package/dist/production/src/model/commands/person/CreatePersonCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/person/CreatePersonCommand.js +1 -0
- package/dist/production/src/model/commands/person/CreatePersonCommand.js.map +1 -1
- package/dist/production/src/model/commands/person/EnablePersonCommand.cjs +17 -0
- package/dist/production/src/model/commands/person/EnablePersonCommand.cjs.map +1 -0
- package/dist/production/src/model/commands/person/EnablePersonCommand.js +17 -0
- package/dist/production/src/model/commands/person/EnablePersonCommand.js.map +1 -0
- package/dist/production/src/model/commands/person/SetMfaGraceUntilCommand.cjs +3 -3
- package/dist/production/src/model/commands/person/SetMfaGraceUntilCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/person/SetMfaGraceUntilCommand.js +4 -4
- package/dist/production/src/model/commands/person/SetMfaGraceUntilCommand.js.map +1 -1
- package/dist/production/src/model/commands/personToken/ResetPasswordCommand.cjs +2 -3
- package/dist/production/src/model/commands/personToken/ResetPasswordCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/personToken/ResetPasswordCommand.js +2 -3
- package/dist/production/src/model/commands/personToken/ResetPasswordCommand.js.map +1 -1
- package/dist/production/src/model/commands/personToken/SaveEmailOtpTokenCommand.cjs +3 -3
- package/dist/production/src/model/commands/personToken/SaveEmailOtpTokenCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/personToken/SaveEmailOtpTokenCommand.js +4 -4
- package/dist/production/src/model/commands/personToken/SaveEmailOtpTokenCommand.js.map +1 -1
- package/dist/production/src/model/commands/personToken/SavePersonTokenCommand.cjs +12 -6
- package/dist/production/src/model/commands/personToken/SavePersonTokenCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/personToken/SavePersonTokenCommand.js +13 -7
- package/dist/production/src/model/commands/personToken/SavePersonTokenCommand.js.map +1 -1
- package/dist/production/src/model/commands/rateLimit/RecordRateLimitEventCommand.cjs +1 -2
- package/dist/production/src/model/commands/rateLimit/RecordRateLimitEventCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/rateLimit/RecordRateLimitEventCommand.js +1 -2
- package/dist/production/src/model/commands/rateLimit/RecordRateLimitEventCommand.js.map +1 -1
- package/dist/production/src/model/mailing/UserMailer.cjs +2 -1
- package/dist/production/src/model/mailing/UserMailer.cjs.map +1 -1
- package/dist/production/src/model/mailing/UserMailer.js +2 -1
- package/dist/production/src/model/mailing/UserMailer.js.map +1 -1
- package/dist/production/src/model/queries/apiKey/ApiKeyQuery.cjs +8 -1
- package/dist/production/src/model/queries/apiKey/ApiKeyQuery.cjs.map +1 -1
- package/dist/production/src/model/queries/apiKey/ApiKeyQuery.js +9 -2
- package/dist/production/src/model/queries/apiKey/ApiKeyQuery.js.map +1 -1
- package/dist/production/src/model/queries/apiKey/ApiKeySessionsQuery.cjs +2 -3
- package/dist/production/src/model/queries/apiKey/ApiKeySessionsQuery.cjs.map +1 -1
- package/dist/production/src/model/queries/apiKey/ApiKeySessionsQuery.js +2 -3
- package/dist/production/src/model/queries/apiKey/ApiKeySessionsQuery.js.map +1 -1
- package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.cjs +12 -10
- package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.cjs.map +1 -1
- package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.js +12 -10
- package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.js.map +1 -1
- package/dist/production/src/model/queries/authLog/NextMailAttemptQuery.cjs +10 -8
- package/dist/production/src/model/queries/authLog/NextMailAttemptQuery.cjs.map +1 -1
- package/dist/production/src/model/queries/authLog/NextMailAttemptQuery.js +10 -8
- package/dist/production/src/model/queries/authLog/NextMailAttemptQuery.js.map +1 -1
- package/dist/production/src/model/queries/configuration/ConfigurationQuery.cjs +4 -0
- package/dist/production/src/model/queries/configuration/ConfigurationQuery.cjs.map +1 -1
- package/dist/production/src/model/queries/configuration/ConfigurationQuery.js +4 -0
- package/dist/production/src/model/queries/configuration/ConfigurationQuery.js.map +1 -1
- package/dist/production/src/model/queries/customRole/CustomRolesQuery.cjs +23 -0
- package/dist/production/src/model/queries/customRole/CustomRolesQuery.cjs.map +1 -0
- package/dist/production/src/model/queries/customRole/CustomRolesQuery.js +23 -0
- package/dist/production/src/model/queries/customRole/CustomRolesQuery.js.map +1 -0
- package/dist/production/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.cjs +15 -0
- package/dist/production/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.cjs.map +1 -0
- package/dist/production/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.js +15 -0
- package/dist/production/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.js.map +1 -0
- package/dist/production/src/model/queries/identity/IdentityQuery.cjs +7 -2
- package/dist/production/src/model/queries/identity/IdentityQuery.cjs.map +1 -1
- package/dist/production/src/model/queries/identity/IdentityQuery.js +7 -2
- package/dist/production/src/model/queries/identity/IdentityQuery.js.map +1 -1
- package/dist/production/src/model/queries/idp/LocalAuthDisablingIdpsQuery.cjs +21 -0
- package/dist/production/src/model/queries/idp/LocalAuthDisablingIdpsQuery.cjs.map +1 -0
- package/dist/production/src/model/queries/idp/LocalAuthDisablingIdpsQuery.js +21 -0
- package/dist/production/src/model/queries/idp/LocalAuthDisablingIdpsQuery.js.map +1 -0
- package/dist/production/src/model/queries/idp/PersonIdentityProvidersQuery.cjs +1 -1
- package/dist/production/src/model/queries/idp/PersonIdentityProvidersQuery.cjs.map +1 -1
- package/dist/production/src/model/queries/idp/PersonIdentityProvidersQuery.js +1 -1
- package/dist/production/src/model/queries/idp/PersonIdentityProvidersQuery.js.map +1 -1
- package/dist/production/src/model/queries/idp/helpers.cjs +3 -3
- package/dist/production/src/model/queries/idp/helpers.cjs.map +1 -1
- package/dist/production/src/model/queries/idp/helpers.js +3 -3
- package/dist/production/src/model/queries/idp/helpers.js.map +1 -1
- package/dist/production/src/model/queries/membership/IdentityHasProjectMembershipsQuery.cjs +15 -0
- package/dist/production/src/model/queries/membership/IdentityHasProjectMembershipsQuery.cjs.map +1 -0
- package/dist/production/src/model/queries/membership/IdentityHasProjectMembershipsQuery.js +15 -0
- package/dist/production/src/model/queries/membership/IdentityHasProjectMembershipsQuery.js.map +1 -0
- package/dist/production/src/model/queries/membership/ProjectMembersQuery.cjs +1 -1
- package/dist/production/src/model/queries/membership/ProjectMembersQuery.cjs.map +1 -1
- package/dist/production/src/model/queries/membership/ProjectMembersQuery.js +1 -1
- package/dist/production/src/model/queries/membership/ProjectMembersQuery.js.map +1 -1
- package/dist/production/src/model/queries/person/PersonQueryBuilderFactory.cjs +2 -2
- package/dist/production/src/model/queries/person/PersonQueryBuilderFactory.cjs.map +1 -1
- package/dist/production/src/model/queries/person/PersonQueryBuilderFactory.js +2 -2
- package/dist/production/src/model/queries/person/PersonQueryBuilderFactory.js.map +1 -1
- package/dist/production/src/model/queries/personToken/PersonTokenQuery.cjs +1 -1
- package/dist/production/src/model/queries/personToken/PersonTokenQuery.cjs.map +1 -1
- package/dist/production/src/model/queries/personToken/PersonTokenQuery.js +1 -1
- package/dist/production/src/model/queries/personToken/PersonTokenQuery.js.map +1 -1
- package/dist/production/src/model/queries/project/ProjectsByIdentityQuery.cjs +4 -1
- package/dist/production/src/model/queries/project/ProjectsByIdentityQuery.cjs.map +1 -1
- package/dist/production/src/model/queries/project/ProjectsByIdentityQuery.js +4 -1
- package/dist/production/src/model/queries/project/ProjectsByIdentityQuery.js.map +1 -1
- package/dist/production/src/model/queries/rateLimit/RateLimitCountQuery.cjs +3 -3
- package/dist/production/src/model/queries/rateLimit/RateLimitCountQuery.cjs.map +1 -1
- package/dist/production/src/model/queries/rateLimit/RateLimitCountQuery.js +3 -3
- package/dist/production/src/model/queries/rateLimit/RateLimitCountQuery.js.map +1 -1
- package/dist/production/src/model/service/AuthLogService.cjs +8 -2
- package/dist/production/src/model/service/AuthLogService.cjs.map +1 -1
- package/dist/production/src/model/service/AuthLogService.js +8 -2
- package/dist/production/src/model/service/AuthLogService.js.map +1 -1
- package/dist/production/src/model/service/AuthPolicyManager.cjs +2 -1
- package/dist/production/src/model/service/AuthPolicyManager.cjs.map +1 -1
- package/dist/production/src/model/service/AuthPolicyManager.js +2 -1
- package/dist/production/src/model/service/AuthPolicyManager.js.map +1 -1
- package/dist/production/src/model/service/AuthPolicyResolver.cjs +2 -1
- package/dist/production/src/model/service/AuthPolicyResolver.cjs.map +1 -1
- package/dist/production/src/model/service/AuthPolicyResolver.js +2 -1
- package/dist/production/src/model/service/AuthPolicyResolver.js.map +1 -1
- package/dist/production/src/model/service/CustomRoleManager.cjs +170 -0
- package/dist/production/src/model/service/CustomRoleManager.cjs.map +1 -0
- package/dist/production/src/model/service/CustomRoleManager.js +170 -0
- package/dist/production/src/model/service/CustomRoleManager.js.map +1 -0
- package/dist/production/src/model/service/EmailChangeManager.cjs +5 -4
- package/dist/production/src/model/service/EmailChangeManager.cjs.map +1 -1
- package/dist/production/src/model/service/EmailChangeManager.js +5 -4
- package/dist/production/src/model/service/EmailChangeManager.js.map +1 -1
- package/dist/production/src/model/service/EmailOtpManager.cjs +0 -1
- package/dist/production/src/model/service/EmailOtpManager.cjs.map +1 -1
- package/dist/production/src/model/service/EmailOtpManager.js +0 -1
- package/dist/production/src/model/service/EmailOtpManager.js.map +1 -1
- package/dist/production/src/model/service/EmailValidator.cjs +2 -1
- package/dist/production/src/model/service/EmailValidator.cjs.map +1 -1
- package/dist/production/src/model/service/EmailValidator.js +2 -1
- package/dist/production/src/model/service/EmailValidator.js.map +1 -1
- package/dist/production/src/model/service/EmailVerificationManager.cjs +5 -4
- package/dist/production/src/model/service/EmailVerificationManager.cjs.map +1 -1
- package/dist/production/src/model/service/EmailVerificationManager.js +5 -4
- package/dist/production/src/model/service/EmailVerificationManager.js.map +1 -1
- package/dist/production/src/model/service/GlobalRoleValidator.cjs +35 -0
- package/dist/production/src/model/service/GlobalRoleValidator.cjs.map +1 -0
- package/dist/production/src/model/service/GlobalRoleValidator.js +35 -0
- package/dist/production/src/model/service/GlobalRoleValidator.js.map +1 -0
- package/dist/production/src/model/service/IDPSignInManager.cjs +52 -16
- package/dist/production/src/model/service/IDPSignInManager.cjs.map +1 -1
- package/dist/production/src/model/service/IDPSignInManager.js +52 -16
- package/dist/production/src/model/service/IDPSignInManager.js.map +1 -1
- package/dist/production/src/model/service/InviteManager.cjs +2 -1
- package/dist/production/src/model/service/InviteManager.cjs.map +1 -1
- package/dist/production/src/model/service/InviteManager.js +2 -1
- package/dist/production/src/model/service/InviteManager.js.map +1 -1
- package/dist/production/src/model/service/PanelAccessResolver.cjs +32 -0
- package/dist/production/src/model/service/PanelAccessResolver.cjs.map +1 -0
- package/dist/production/src/model/service/PanelAccessResolver.js +32 -0
- package/dist/production/src/model/service/PanelAccessResolver.js.map +1 -0
- package/dist/production/src/model/service/PasswordChangeManager.cjs +2 -1
- package/dist/production/src/model/service/PasswordChangeManager.cjs.map +1 -1
- package/dist/production/src/model/service/PasswordChangeManager.js +2 -1
- package/dist/production/src/model/service/PasswordChangeManager.js.map +1 -1
- package/dist/production/src/model/service/PasswordResetManager.cjs +9 -3
- package/dist/production/src/model/service/PasswordResetManager.cjs.map +1 -1
- package/dist/production/src/model/service/PasswordResetManager.js +9 -3
- package/dist/production/src/model/service/PasswordResetManager.js.map +1 -1
- package/dist/production/src/model/service/PasswordlessSignInManager.cjs +24 -6
- package/dist/production/src/model/service/PasswordlessSignInManager.cjs.map +1 -1
- package/dist/production/src/model/service/PasswordlessSignInManager.js +24 -6
- package/dist/production/src/model/service/PasswordlessSignInManager.js.map +1 -1
- package/dist/production/src/model/service/PersonAccessManager.cjs +10 -2
- package/dist/production/src/model/service/PersonAccessManager.cjs.map +1 -1
- package/dist/production/src/model/service/PersonAccessManager.js +10 -2
- package/dist/production/src/model/service/PersonAccessManager.js.map +1 -1
- package/dist/production/src/model/service/PersonManager.cjs +2 -1
- package/dist/production/src/model/service/PersonManager.cjs.map +1 -1
- package/dist/production/src/model/service/PersonManager.js +2 -1
- package/dist/production/src/model/service/PersonManager.js.map +1 -1
- package/dist/production/src/model/service/ProjectMemberManager.cjs +2 -1
- package/dist/production/src/model/service/ProjectMemberManager.cjs.map +1 -1
- package/dist/production/src/model/service/ProjectMemberManager.js +2 -1
- package/dist/production/src/model/service/ProjectMemberManager.js.map +1 -1
- package/dist/production/src/model/service/RateLimiter.cjs +1 -2
- package/dist/production/src/model/service/RateLimiter.cjs.map +1 -1
- package/dist/production/src/model/service/RateLimiter.js +1 -2
- package/dist/production/src/model/service/RateLimiter.js.map +1 -1
- package/dist/production/src/model/service/RolesManager.cjs +17 -18
- package/dist/production/src/model/service/RolesManager.cjs.map +1 -1
- package/dist/production/src/model/service/RolesManager.js +18 -19
- package/dist/production/src/model/service/RolesManager.js.map +1 -1
- package/dist/production/src/model/service/SecretsManager.cjs +2 -1
- package/dist/production/src/model/service/SecretsManager.cjs.map +1 -1
- package/dist/production/src/model/service/SecretsManager.js +2 -1
- package/dist/production/src/model/service/SecretsManager.js.map +1 -1
- package/dist/production/src/model/service/SignInManager.cjs +9 -5
- package/dist/production/src/model/service/SignInManager.cjs.map +1 -1
- package/dist/production/src/model/service/SignInManager.js +9 -5
- package/dist/production/src/model/service/SignInManager.js.map +1 -1
- package/dist/production/src/model/service/SignOutManager.cjs +2 -1
- package/dist/production/src/model/service/SignOutManager.cjs.map +1 -1
- package/dist/production/src/model/service/SignOutManager.js +2 -1
- package/dist/production/src/model/service/SignOutManager.js.map +1 -1
- package/dist/production/src/model/service/SignUpManager.cjs +15 -7
- package/dist/production/src/model/service/SignUpManager.cjs.map +1 -1
- package/dist/production/src/model/service/SignUpManager.js +15 -7
- package/dist/production/src/model/service/SignUpManager.js.map +1 -1
- package/dist/production/src/model/service/apiKey/ApiKeyManager.cjs +56 -40
- package/dist/production/src/model/service/apiKey/ApiKeyManager.cjs.map +1 -1
- package/dist/production/src/model/service/apiKey/ApiKeyManager.js +57 -41
- package/dist/production/src/model/service/apiKey/ApiKeyManager.js.map +1 -1
- package/dist/production/src/model/service/apiKey/ApiKeyService.cjs.map +1 -1
- package/dist/production/src/model/service/apiKey/ApiKeyService.js.map +1 -1
- package/dist/production/src/model/service/apiKey/UnpersistedApiKeyManager.cjs +10 -1
- package/dist/production/src/model/service/apiKey/UnpersistedApiKeyManager.cjs.map +1 -1
- package/dist/production/src/model/service/apiKey/UnpersistedApiKeyManager.js +11 -2
- package/dist/production/src/model/service/apiKey/UnpersistedApiKeyManager.js.map +1 -1
- package/dist/production/src/model/service/idp/ClaimMapping.cjs +187 -0
- package/dist/production/src/model/service/idp/ClaimMapping.cjs.map +1 -0
- package/dist/production/src/model/service/idp/ClaimMapping.js +170 -0
- package/dist/production/src/model/service/idp/ClaimMapping.js.map +1 -0
- package/dist/production/src/model/service/idp/ClaimMappingEvaluator.cjs +155 -0
- package/dist/production/src/model/service/idp/ClaimMappingEvaluator.cjs.map +1 -0
- package/dist/production/src/model/service/idp/ClaimMappingEvaluator.js +155 -0
- package/dist/production/src/model/service/idp/ClaimMappingEvaluator.js.map +1 -0
- package/dist/production/src/model/service/idp/ClaimMappingValidation.cjs +83 -0
- package/dist/production/src/model/service/idp/ClaimMappingValidation.cjs.map +1 -0
- package/dist/production/src/model/service/idp/ClaimMappingValidation.js +83 -0
- package/dist/production/src/model/service/idp/ClaimMappingValidation.js.map +1 -0
- package/dist/production/src/model/service/idp/IDPClaimSyncService.cjs +261 -0
- package/dist/production/src/model/service/idp/IDPClaimSyncService.cjs.map +1 -0
- package/dist/production/src/model/service/idp/IDPClaimSyncService.js +261 -0
- package/dist/production/src/model/service/idp/IDPClaimSyncService.js.map +1 -0
- package/dist/production/src/model/service/idp/IDPManager.cjs +98 -21
- package/dist/production/src/model/service/idp/IDPManager.cjs.map +1 -1
- package/dist/production/src/model/service/idp/IDPManager.js +98 -21
- package/dist/production/src/model/service/idp/IDPManager.js.map +1 -1
- package/dist/production/src/model/service/idp/IdpSessionRevalidator.cjs +93 -28
- package/dist/production/src/model/service/idp/IdpSessionRevalidator.cjs.map +1 -1
- package/dist/production/src/model/service/idp/IdpSessionRevalidator.js +93 -28
- package/dist/production/src/model/service/idp/IdpSessionRevalidator.js.map +1 -1
- package/dist/production/src/model/service/idp/PersonIdentityProviderManager.cjs +8 -1
- package/dist/production/src/model/service/idp/PersonIdentityProviderManager.cjs.map +1 -1
- package/dist/production/src/model/service/idp/PersonIdentityProviderManager.js +8 -1
- package/dist/production/src/model/service/idp/PersonIdentityProviderManager.js.map +1 -1
- package/dist/production/src/model/service/idp/providers/OIDCHelpers.cjs +69 -33
- package/dist/production/src/model/service/idp/providers/OIDCHelpers.cjs.map +1 -1
- package/dist/production/src/model/service/idp/providers/OIDCHelpers.js +69 -33
- package/dist/production/src/model/service/idp/providers/OIDCHelpers.js.map +1 -1
- package/dist/production/src/model/service/idp/providers/OIDCProvider.cjs +4 -1
- package/dist/production/src/model/service/idp/providers/OIDCProvider.cjs.map +1 -1
- package/dist/production/src/model/service/idp/providers/OIDCProvider.js +4 -1
- package/dist/production/src/model/service/idp/providers/OIDCProvider.js.map +1 -1
- package/dist/production/src/model/utils/DatabaseContext.cjs +10 -3
- package/dist/production/src/model/utils/DatabaseContext.cjs.map +1 -1
- package/dist/production/src/model/utils/DatabaseContext.js +11 -4
- package/dist/production/src/model/utils/DatabaseContext.js.map +1 -1
- package/dist/production/src/model/utils/token.cjs +2 -2
- package/dist/production/src/model/utils/token.cjs.map +1 -1
- package/dist/production/src/model/utils/token.js +2 -2
- package/dist/production/src/model/utils/token.js.map +1 -1
- package/dist/production/src/resolvers/ResolverFactory.cjs +12 -3
- package/dist/production/src/resolvers/ResolverFactory.cjs.map +1 -1
- package/dist/production/src/resolvers/ResolverFactory.js +12 -3
- package/dist/production/src/resolvers/ResolverFactory.js.map +1 -1
- package/dist/production/src/resolvers/TenantResolverContextFactory.cjs +4 -4
- package/dist/production/src/resolvers/TenantResolverContextFactory.cjs.map +1 -1
- package/dist/production/src/resolvers/TenantResolverContextFactory.js +4 -4
- package/dist/production/src/resolvers/TenantResolverContextFactory.js.map +1 -1
- package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs +19 -9
- package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js +20 -10
- package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs +7 -5
- package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js +7 -5
- package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.cjs +7 -5
- package/dist/production/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.js +7 -5
- package/dist/production/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs +7 -5
- package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js +7 -5
- package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/customRole/CustomRoleMutationResolver.cjs +124 -0
- package/dist/production/src/resolvers/mutation/customRole/CustomRoleMutationResolver.cjs.map +1 -0
- package/dist/production/src/resolvers/mutation/customRole/CustomRoleMutationResolver.js +124 -0
- package/dist/production/src/resolvers/mutation/customRole/CustomRoleMutationResolver.js.map +1 -0
- package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs +35 -11
- package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js +35 -11
- package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs +10 -7
- package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.js +10 -7
- package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs +7 -5
- package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.js +7 -5
- package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.cjs +8 -6
- package/dist/production/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.js +8 -6
- package/dist/production/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs +7 -5
- package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.js +7 -5
- package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs +10 -7
- package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js +10 -7
- package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/audit.cjs +1 -0
- package/dist/production/src/resolvers/mutation/idp/audit.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/audit.js +1 -0
- package/dist/production/src/resolvers/mutation/idp/audit.js.map +1 -1
- package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs +38 -18
- package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js +38 -18
- package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs +10 -8
- package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.js +10 -8
- package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs +17 -11
- package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.js +17 -11
- package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs +10 -8
- package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.js +10 -8
- package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/EmailOtpMutationResolver.cjs +10 -8
- package/dist/production/src/resolvers/mutation/person/EmailOtpMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/EmailOtpMutationResolver.js +10 -8
- package/dist/production/src/resolvers/mutation/person/EmailOtpMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/EmailVerificationMutationResolver.cjs +10 -8
- package/dist/production/src/resolvers/mutation/person/EmailVerificationMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/EmailVerificationMutationResolver.js +10 -8
- package/dist/production/src/resolvers/mutation/person/EmailVerificationMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/EnablePersonMutationResolver.cjs +61 -0
- package/dist/production/src/resolvers/mutation/person/EnablePersonMutationResolver.cjs.map +1 -0
- package/dist/production/src/resolvers/mutation/person/EnablePersonMutationResolver.js +61 -0
- package/dist/production/src/resolvers/mutation/person/EnablePersonMutationResolver.js.map +1 -0
- package/dist/production/src/resolvers/mutation/person/ForceSignOutMutationResolver.cjs +8 -6
- package/dist/production/src/resolvers/mutation/person/ForceSignOutMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/ForceSignOutMutationResolver.js +8 -6
- package/dist/production/src/resolvers/mutation/person/ForceSignOutMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.cjs +32 -5
- package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.js +32 -5
- package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.cjs +7 -5
- package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.js +7 -5
- package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.cjs +9 -7
- package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.js +9 -7
- package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs +12 -6
- package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.js +12 -6
- package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.cjs +9 -7
- package/dist/production/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.js +9 -7
- package/dist/production/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs +10 -8
- package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.js +10 -8
- package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.cjs +8 -6
- package/dist/production/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.js +8 -6
- package/dist/production/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/RevokeSessionMutationResolver.cjs +8 -6
- package/dist/production/src/resolvers/mutation/person/RevokeSessionMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/RevokeSessionMutationResolver.js +8 -6
- package/dist/production/src/resolvers/mutation/person/RevokeSessionMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.cjs +22 -14
- package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.js +22 -14
- package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.cjs +7 -5
- package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.js +7 -5
- package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.cjs +10 -8
- package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.js +10 -8
- package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs +9 -7
- package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js +9 -7
- package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs +7 -5
- package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.js +7 -5
- package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs +7 -5
- package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js +7 -5
- package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs +7 -5
- package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.js +7 -5
- package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs +7 -5
- package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js +7 -5
- package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs +8 -6
- package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js +8 -6
- package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs +8 -6
- package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js +8 -6
- package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/projectMember/audit.cjs +2 -1
- package/dist/production/src/resolvers/mutation/projectMember/audit.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/projectMember/audit.js +2 -1
- package/dist/production/src/resolvers/mutation/projectMember/audit.js.map +1 -1
- package/dist/production/src/resolvers/query/ApiKeyQueryResolver.cjs +8 -6
- package/dist/production/src/resolvers/query/ApiKeyQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/ApiKeyQueryResolver.js +8 -6
- package/dist/production/src/resolvers/query/ApiKeyQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/AuthLogQueryResolver.cjs +7 -5
- package/dist/production/src/resolvers/query/AuthLogQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/AuthLogQueryResolver.js +7 -5
- package/dist/production/src/resolvers/query/AuthLogQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/AuthPolicyQueryResolver.cjs +8 -6
- package/dist/production/src/resolvers/query/AuthPolicyQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/AuthPolicyQueryResolver.js +8 -6
- package/dist/production/src/resolvers/query/AuthPolicyQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/ConfigurationQueryResolver.cjs +8 -6
- package/dist/production/src/resolvers/query/ConfigurationQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/ConfigurationQueryResolver.js +8 -6
- package/dist/production/src/resolvers/query/ConfigurationQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/CustomRoleQueryResolver.cjs +55 -0
- package/dist/production/src/resolvers/query/CustomRoleQueryResolver.cjs.map +1 -0
- package/dist/production/src/resolvers/query/CustomRoleQueryResolver.js +55 -0
- package/dist/production/src/resolvers/query/CustomRoleQueryResolver.js.map +1 -0
- package/dist/production/src/resolvers/query/IDPQueryResolver.cjs +7 -5
- package/dist/production/src/resolvers/query/IDPQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/IDPQueryResolver.js +7 -5
- package/dist/production/src/resolvers/query/IDPQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/MailTemplateQueryResolver.cjs +21 -14
- package/dist/production/src/resolvers/query/MailTemplateQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/MailTemplateQueryResolver.js +21 -14
- package/dist/production/src/resolvers/query/MailTemplateQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/PersonQueryResolver.cjs +7 -5
- package/dist/production/src/resolvers/query/PersonQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/PersonQueryResolver.js +7 -5
- package/dist/production/src/resolvers/query/PersonQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.cjs +7 -5
- package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.js +7 -5
- package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/ProjectQueryResolver.cjs +10 -7
- package/dist/production/src/resolvers/query/ProjectQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/ProjectQueryResolver.js +10 -7
- package/dist/production/src/resolvers/query/ProjectQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/responseHelpers/ApiKeyResponseFactory.cjs +7 -5
- package/dist/production/src/resolvers/responseHelpers/ApiKeyResponseFactory.cjs.map +1 -1
- package/dist/production/src/resolvers/responseHelpers/ApiKeyResponseFactory.js +7 -5
- package/dist/production/src/resolvers/responseHelpers/ApiKeyResponseFactory.js.map +1 -1
- package/dist/production/src/resolvers/responseHelpers/PersonResponseFactory.cjs +5 -0
- package/dist/production/src/resolvers/responseHelpers/PersonResponseFactory.cjs.map +1 -1
- package/dist/production/src/resolvers/responseHelpers/PersonResponseFactory.js +5 -0
- package/dist/production/src/resolvers/responseHelpers/PersonResponseFactory.js.map +1 -1
- package/dist/production/src/resolvers/responseHelpers/ProjectResponseFactory.cjs +23 -0
- package/dist/production/src/resolvers/responseHelpers/ProjectResponseFactory.cjs.map +1 -0
- package/dist/production/src/resolvers/responseHelpers/ProjectResponseFactory.js +23 -0
- package/dist/production/src/resolvers/responseHelpers/ProjectResponseFactory.js.map +1 -0
- package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.cjs +8 -6
- package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.cjs.map +1 -1
- package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.js +8 -6
- package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.js.map +1 -1
- package/dist/production/src/resolvers/types/IdentityTypeResolver.cjs +50 -18
- package/dist/production/src/resolvers/types/IdentityTypeResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/types/IdentityTypeResolver.js +50 -18
- package/dist/production/src/resolvers/types/IdentityTypeResolver.js.map +1 -1
- package/dist/production/src/resolvers/types/PersonTypeResolver.cjs +38 -8
- package/dist/production/src/resolvers/types/PersonTypeResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/types/PersonTypeResolver.js +38 -8
- package/dist/production/src/resolvers/types/PersonTypeResolver.js.map +1 -1
- package/dist/production/src/resolvers/types/ProjectTypeResolver.cjs +31 -6
- package/dist/production/src/resolvers/types/ProjectTypeResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/types/ProjectTypeResolver.js +31 -6
- package/dist/production/src/resolvers/types/ProjectTypeResolver.js.map +1 -1
- package/dist/production/src/schema/tenant.graphql.cjs +275 -15
- package/dist/production/src/schema/tenant.graphql.cjs.map +1 -1
- package/dist/production/src/schema/tenant.graphql.js +275 -15
- package/dist/production/src/schema/tenant.graphql.js.map +1 -1
- package/dist/tests/cases/integration/database/dbClock.test.d.ts +2 -0
- package/dist/tests/cases/integration/database/dbClock.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/configurationPanel.test.d.ts +2 -0
- package/dist/tests/cases/integration/mocked/configurationPanel.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/customRoleCrud.test.d.ts +2 -0
- package/dist/tests/cases/integration/mocked/customRoleCrud.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/disablePersonMutation.test.d.ts +2 -0
- package/dist/tests/cases/integration/mocked/disablePersonMutation.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/enablePersonMutation.test.d.ts +2 -0
- package/dist/tests/cases/integration/mocked/enablePersonMutation.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/gql/addProjectMember.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/changeMyPassword.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/changeMyProfile.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/changePassword.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/changeProfile.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/confirmOtp.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/createApiKey.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/createResetPasswordRequest.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/createSessionToken.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/emailOtp.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/emailVerification.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/invite.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/myIdentityProviders.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/passwordless.d.ts +4 -1
- package/dist/tests/cases/integration/mocked/gql/passwordless.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/prepareOtp.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/resetPassword.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/signIn.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/signInIdp.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/signUp.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/unmanagedInvite.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/gql/updateProjectMember.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/idpClaimMappingConfig.test.d.ts +2 -0
- package/dist/tests/cases/integration/mocked/idpClaimMappingConfig.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/localAuthenticationDisabled.test.d.ts +2 -0
- package/dist/tests/cases/integration/mocked/localAuthenticationDisabled.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/mailTemplateScope.test.d.ts +2 -0
- package/dist/tests/cases/integration/mocked/mailTemplateScope.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/permissionsQuery.test.d.ts +2 -0
- package/dist/tests/cases/integration/mocked/permissionsQuery.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/signInIdpClaimMapping.test.d.ts +2 -0
- package/dist/tests/cases/integration/mocked/signInIdpClaimMapping.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/signInIdpClaimMappingFixes.test.d.ts +2 -0
- package/dist/tests/cases/integration/mocked/signInIdpClaimMappingFixes.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/signInIdpClaimMappingSafety.test.d.ts +2 -0
- package/dist/tests/cases/integration/mocked/signInIdpClaimMappingSafety.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/sql/authLogSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/authPolicySql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/consumeBackupCodeSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/createApiKeySql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/createIdentitySql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/createMembershipSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/createMembershipVariableSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/createPersonSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/createPersonTokenSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/createSessionKeySql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/disableApiKeySql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/disableOneOffKeySql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/emailOtpSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/generateBackupCodesSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getApiKeySql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getConfigSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getCustomRolesSql.d.ts +18 -0
- package/dist/tests/cases/integration/mocked/sql/getCustomRolesSql.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/sql/getIdentityByIdSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getIdentityProjectMembershipPresenceSql.d.ts +3 -0
- package/dist/tests/cases/integration/mocked/sql/getIdentityProjectMembershipPresenceSql.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/sql/getIdentityProjectsSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getIdpBySlugSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getIdpSessionByApiKeySql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getMailTemplateSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getNextLoginAttemptSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getNextMailAttemptSql.d.ts +1 -1
- package/dist/tests/cases/integration/mocked/sql/getNextMailAttemptSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getPersonByEmailSql.d.ts +1 -0
- package/dist/tests/cases/integration/mocked/sql/getPersonByEmailSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getPersonByIdSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getPersonByIdentity.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getPersonByIdpSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getPersonsByIdentitySql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getProjectBySlugSql.d.ts +1 -1
- package/dist/tests/cases/integration/mocked/sql/getProjectBySlugSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/getProjectMembershipSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/listApiKeysSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/listPersonsSql.d.ts +2 -0
- package/dist/tests/cases/integration/mocked/sql/listPersonsSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/listProjectSecretsSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/listSessionsSql.d.ts +1 -1
- package/dist/tests/cases/integration/mocked/sql/listSessionsSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/localAuthDisablingIdpsSql.d.ts +10 -0
- package/dist/tests/cases/integration/mocked/sql/localAuthDisablingIdpsSql.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/sql/loginHistorySql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/patchVariablesSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/personIdentityProvidersSql.d.ts +1 -0
- package/dist/tests/cases/integration/mocked/sql/personIdentityProvidersSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/removeMembershipSql.d.ts +8 -0
- package/dist/tests/cases/integration/mocked/sql/removeMembershipSql.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/sql/selectMembershipsSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/setEmailOtpEnabledSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/sqlTransaction.d.ts +6 -0
- package/dist/tests/cases/integration/mocked/sql/sqlTransaction.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/updatePesonNameSql.d.ts.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/updatePesonPasswordSql.d.ts.map +1 -1
- package/dist/tests/cases/unit/apiKey/verifyAndProlongReplica.test.d.ts +2 -0
- package/dist/tests/cases/unit/apiKey/verifyAndProlongReplica.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/customRoleAuthorizator.test.d.ts +2 -0
- package/dist/tests/cases/unit/customRoleAuthorizator.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/customRolePermissions.test.d.ts +2 -0
- package/dist/tests/cases/unit/customRolePermissions.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/databaseContextRetry.test.d.ts +2 -0
- package/dist/tests/cases/unit/databaseContextRetry.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/idp/claimIdpRevalidation.test.d.ts +2 -0
- package/dist/tests/cases/unit/idp/claimIdpRevalidation.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/idp/claimMappingEvaluator.test.d.ts +2 -0
- package/dist/tests/cases/unit/idp/claimMappingEvaluator.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/idp/claimMappingValidation.test.d.ts +2 -0
- package/dist/tests/cases/unit/idp/claimMappingValidation.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/idp/idpManagerConfigMerge.test.d.ts +2 -0
- package/dist/tests/cases/unit/idp/idpManagerConfigMerge.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/idp/idpManagerUnknownConfigKeys.test.d.ts +2 -0
- package/dist/tests/cases/unit/idp/idpManagerUnknownConfigKeys.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/idp/oidcClaims.test.d.ts +2 -0
- package/dist/tests/cases/unit/idp/oidcClaims.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/panelAccessResolver.test.d.ts +2 -0
- package/dist/tests/cases/unit/panelAccessResolver.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/savePersonTokenCommand.test.d.ts +2 -0
- package/dist/tests/cases/unit/savePersonTokenCommand.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/updateConfigurationCommand.test.d.ts +2 -0
- package/dist/tests/cases/unit/updateConfigurationCommand.test.d.ts.map +1 -0
- package/dist/tests/src/IdPMock.d.ts.map +1 -1
- package/dist/tests/src/dbUtils.d.ts.map +1 -1
- package/dist/tests/src/tags.d.ts.map +1 -1
- package/dist/tests/src/testGraphql.d.ts.map +1 -1
- package/dist/tests/src/testTenant.d.ts +16 -4
- package/dist/tests/src/testTenant.d.ts.map +1 -1
- package/dist/tests/src/testUuid.d.ts.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/TenantContainer.d.ts +36 -13
- package/dist/types/TenantContainer.d.ts.map +1 -1
- package/dist/types/bridges/system/IdentityFetcher.d.ts +2 -2
- package/dist/types/bridges/system/IdentityFetcher.d.ts.map +1 -1
- package/dist/types/exceptions.d.ts.map +1 -1
- package/dist/types/migrations/2026-06-18-120000-idp-claim-mapping.d.ts +3 -0
- package/dist/types/migrations/2026-06-18-120000-idp-claim-mapping.d.ts.map +1 -0
- package/dist/types/migrations/2026-08-03-120000-person-enable-auth-log.d.ts +3 -0
- package/dist/types/migrations/2026-08-03-120000-person-enable-auth-log.d.ts.map +1 -0
- package/dist/types/migrations/2026-08-04-120000-config-panel.d.ts +3 -0
- package/dist/types/migrations/2026-08-04-120000-config-panel.d.ts.map +1 -0
- package/dist/types/migrations/2026-09-04-120000-idp-disable-local-authentication.d.ts +3 -0
- package/dist/types/migrations/2026-09-04-120000-idp-disable-local-authentication.d.ts.map +1 -0
- package/dist/types/migrations/2026-09-11-120000-custom-role.d.ts +3 -0
- package/dist/types/migrations/2026-09-11-120000-custom-role.d.ts.map +1 -0
- package/dist/types/migrations/runner.d.ts.map +1 -1
- package/dist/types/migrations/snapshot-factory.d.ts.map +1 -1
- package/dist/types/migrations/snapshot.d.ts.map +1 -1
- package/dist/types/migrations/tenantCredentials.d.ts.map +1 -1
- package/dist/types/model/authorization/AclSchemaAccessNodeFactory.d.ts.map +1 -1
- package/dist/types/model/authorization/CustomRoleAuthorizator.d.ts +29 -0
- package/dist/types/model/authorization/CustomRoleAuthorizator.d.ts.map +1 -0
- package/dist/types/model/authorization/CustomRolePermissions.d.ts +45 -0
- package/dist/types/model/authorization/CustomRolePermissions.d.ts.map +1 -0
- package/dist/types/model/authorization/DirectPermissionsAccessNode.d.ts.map +1 -1
- package/dist/types/model/authorization/Identity.d.ts.map +1 -1
- package/dist/types/model/authorization/IdentityFactory.d.ts.map +1 -1
- package/dist/types/model/authorization/IdentityScope.d.ts.map +1 -1
- package/dist/types/model/authorization/MembershipMatcher.d.ts.map +1 -1
- package/dist/types/model/authorization/PermissionActions.d.ts +104 -37
- package/dist/types/model/authorization/PermissionActions.d.ts.map +1 -1
- package/dist/types/model/authorization/PermissionContext.d.ts.map +1 -1
- package/dist/types/model/authorization/PermissionContextFactory.d.ts +13 -2
- package/dist/types/model/authorization/PermissionContextFactory.d.ts.map +1 -1
- package/dist/types/model/authorization/PermissionsFactory.d.ts.map +1 -1
- package/dist/types/model/authorization/ProjectScope.d.ts.map +1 -1
- package/dist/types/model/authorization/ProjectScopeFactory.d.ts.map +1 -1
- package/dist/types/model/authorization/Roles.d.ts +8 -0
- package/dist/types/model/authorization/Roles.d.ts.map +1 -1
- package/dist/types/model/authorization/TargetIdentityPermission.d.ts +15 -0
- package/dist/types/model/authorization/TargetIdentityPermission.d.ts.map +1 -0
- package/dist/types/model/authorization/index.d.ts +3 -0
- package/dist/types/model/authorization/index.d.ts.map +1 -1
- package/dist/types/model/commands/CommandBus.d.ts.map +1 -1
- package/dist/types/model/commands/apiKey/ApiKeyHelper.d.ts +15 -0
- package/dist/types/model/commands/apiKey/ApiKeyHelper.d.ts.map +1 -1
- package/dist/types/model/commands/apiKey/CreateApiKeyCommand.d.ts +5 -1
- package/dist/types/model/commands/apiKey/CreateApiKeyCommand.d.ts.map +1 -1
- package/dist/types/model/commands/apiKey/DisableApiKeyCommand.d.ts.map +1 -1
- package/dist/types/model/commands/apiKey/DisableIdentityApiKeysCommand.d.ts.map +1 -1
- package/dist/types/model/commands/apiKey/DisableOneOffApiKeyCommand.d.ts.map +1 -1
- package/dist/types/model/commands/apiKey/ProlongApiKeyCommand.d.ts +6 -4
- package/dist/types/model/commands/apiKey/ProlongApiKeyCommand.d.ts.map +1 -1
- package/dist/types/model/commands/authLog/CreateAuthLogEntryCommand.d.ts +1 -0
- package/dist/types/model/commands/authLog/CreateAuthLogEntryCommand.d.ts.map +1 -1
- package/dist/types/model/commands/authPolicy/CreateAuthPolicyCommand.d.ts.map +1 -1
- package/dist/types/model/commands/authPolicy/DeleteAuthPolicyCommand.d.ts.map +1 -1
- package/dist/types/model/commands/authPolicy/UpdateAuthPolicyCommand.d.ts.map +1 -1
- package/dist/types/model/commands/backupCode/ConsumeBackupCodeCommand.d.ts.map +1 -1
- package/dist/types/model/commands/backupCode/CreateBackupCodeCommand.d.ts.map +1 -1
- package/dist/types/model/commands/backupCode/DeleteBackupCodesCommand.d.ts.map +1 -1
- package/dist/types/model/commands/configuration/UpdateConfigurationCommand.d.ts.map +1 -1
- package/dist/types/model/commands/customRole/CreateCustomRoleCommand.d.ts +12 -0
- package/dist/types/model/commands/customRole/CreateCustomRoleCommand.d.ts.map +1 -0
- package/dist/types/model/commands/customRole/DeleteCustomRoleCommand.d.ts +13 -0
- package/dist/types/model/commands/customRole/DeleteCustomRoleCommand.d.ts.map +1 -0
- package/dist/types/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.d.ts +8 -0
- package/dist/types/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.d.ts.map +1 -0
- package/dist/types/model/commands/customRole/UpdateCustomRoleCommand.d.ts +16 -0
- package/dist/types/model/commands/customRole/UpdateCustomRoleCommand.d.ts.map +1 -0
- package/dist/types/model/commands/customRole/index.d.ts +5 -0
- package/dist/types/model/commands/customRole/index.d.ts.map +1 -0
- package/dist/types/model/commands/identity/CreateIdentityCommand.d.ts.map +1 -1
- package/dist/types/model/commands/identity/PatchIdentityGlobalRoles.d.ts.map +1 -1
- package/dist/types/model/commands/idp/ClaimIdpRevalidationCommand.d.ts.map +1 -1
- package/dist/types/model/commands/idp/CreateIdpCommand.d.ts.map +1 -1
- package/dist/types/model/commands/idp/CreateIdpSessionCommand.d.ts.map +1 -1
- package/dist/types/model/commands/idp/DisableIdpCommand.d.ts.map +1 -1
- package/dist/types/model/commands/idp/DisconnectPersonIdentityProviderCommand.d.ts.map +1 -1
- package/dist/types/model/commands/idp/EnableIdpCommand.d.ts.map +1 -1
- package/dist/types/model/commands/idp/UpdateIdpCommand.d.ts.map +1 -1
- package/dist/types/model/commands/idp/UpdateIdpSessionCommand.d.ts.map +1 -1
- package/dist/types/model/commands/index.d.ts +1 -0
- package/dist/types/model/commands/index.d.ts.map +1 -1
- package/dist/types/model/commands/mailTemplate/AddMailTemplateCommand.d.ts.map +1 -1
- package/dist/types/model/commands/mailTemplate/RemoveMailTemplateCommand.d.ts.map +1 -1
- package/dist/types/model/commands/membership/AddProjectMemberCommand.d.ts.map +1 -1
- package/dist/types/model/commands/membership/CreateOrUpdateProjectMembershipCommand.d.ts.map +1 -1
- package/dist/types/model/commands/membership/RemoveProjectMemberCommand.d.ts.map +1 -1
- package/dist/types/model/commands/membership/{RemoveProjectMembershipsCommand.d.ts → RemoveProjectMembershipCommand.d.ts} +1 -1
- package/dist/types/model/commands/membership/RemoveProjectMembershipCommand.d.ts.map +1 -0
- package/dist/types/model/commands/membership/UpdateProjectMemberCommand.d.ts.map +1 -1
- package/dist/types/model/commands/membership/index.d.ts +2 -1
- package/dist/types/model/commands/membership/index.d.ts.map +1 -1
- package/dist/types/model/commands/membership/variables/PatchProjectMembershipVariableValuesCommand.d.ts.map +1 -1
- package/dist/types/model/commands/membership/variables/PatchProjectMembershipVariablesCommand.d.ts.map +1 -1
- package/dist/types/model/commands/membership/variables/SetProjectMembershipVariableValuesCommand.d.ts.map +1 -1
- package/dist/types/model/commands/membership/variables/index.d.ts +1 -0
- package/dist/types/model/commands/membership/variables/index.d.ts.map +1 -1
- package/dist/types/model/commands/otp/ConfirmOtpCommand.d.ts.map +1 -1
- package/dist/types/model/commands/otp/DisableOtpCommand.d.ts.map +1 -1
- package/dist/types/model/commands/otp/PrepareOtpCommand.d.ts.map +1 -1
- package/dist/types/model/commands/otp/ReEncryptOtpSecretCommand.d.ts.map +1 -1
- package/dist/types/model/commands/otp/SetEmailOtpEnabledCommand.d.ts.map +1 -1
- package/dist/types/model/commands/person/ChangePasswordCommand.d.ts.map +1 -1
- package/dist/types/model/commands/person/ChangeProfileCommand.d.ts.map +1 -1
- package/dist/types/model/commands/person/CreatePersonCommand.d.ts.map +1 -1
- package/dist/types/model/commands/person/CreatePersonIdentityProviderIdentifierCommand.d.ts.map +1 -1
- package/dist/types/model/commands/person/DisablePersonCommand.d.ts.map +1 -1
- package/dist/types/model/commands/person/EnablePersonCommand.d.ts +7 -0
- package/dist/types/model/commands/person/EnablePersonCommand.d.ts.map +1 -0
- package/dist/types/model/commands/person/MarkEmailVerifiedCommand.d.ts.map +1 -1
- package/dist/types/model/commands/person/ResetPersonMfaCommand.d.ts.map +1 -1
- package/dist/types/model/commands/person/SetMfaGraceUntilCommand.d.ts +8 -3
- package/dist/types/model/commands/person/SetMfaGraceUntilCommand.d.ts.map +1 -1
- package/dist/types/model/commands/person/TogglePersonPasswordlessCommand.d.ts.map +1 -1
- package/dist/types/model/commands/personToken/ActivateOtpCommand.d.ts.map +1 -1
- package/dist/types/model/commands/personToken/ClaimOtpAttemptCommand.d.ts.map +1 -1
- package/dist/types/model/commands/personToken/CreatePersonTokenCommand.d.ts.map +1 -1
- package/dist/types/model/commands/personToken/IncreaseOtpAttemptCommand.d.ts.map +1 -1
- package/dist/types/model/commands/personToken/InvalidateEmailOtpTokensCommand.d.ts.map +1 -1
- package/dist/types/model/commands/personToken/InvalidateTokenCommand.d.ts.map +1 -1
- package/dist/types/model/commands/personToken/ResetPasswordCommand.d.ts +1 -1
- package/dist/types/model/commands/personToken/ResetPasswordCommand.d.ts.map +1 -1
- package/dist/types/model/commands/personToken/SaveEmailOtpTokenCommand.d.ts.map +1 -1
- package/dist/types/model/commands/personToken/SavePersonTokenCommand.d.ts.map +1 -1
- package/dist/types/model/commands/project/CreateProjectCommand.d.ts.map +1 -1
- package/dist/types/model/commands/project/SetProjectSecretCommand.d.ts.map +1 -1
- package/dist/types/model/commands/project/UpdateProjectCommand.d.ts.map +1 -1
- package/dist/types/model/commands/rateLimit/RecordRateLimitEventCommand.d.ts.map +1 -1
- package/dist/types/model/dtos/Password.d.ts.map +1 -1
- package/dist/types/model/mailing/UserMailer.d.ts.map +1 -1
- package/dist/types/model/mailing/templates/BackupCodesExhausted.mustache.d.ts.map +1 -1
- package/dist/types/model/mailing/templates/EmailChangeNotify.mustache.d.ts.map +1 -1
- package/dist/types/model/mailing/templates/EmailChangeVerify.mustache.d.ts.map +1 -1
- package/dist/types/model/mailing/templates/EmailOtp.mustache.d.ts.map +1 -1
- package/dist/types/model/mailing/templates/EmailVerification.mustache.d.ts.map +1 -1
- package/dist/types/model/mailing/templates/ExistingUserInvited.mustache.d.ts.map +1 -1
- package/dist/types/model/mailing/templates/ForcedSignOut.mustache.d.ts.map +1 -1
- package/dist/types/model/mailing/templates/Layout.mustache.d.ts.map +1 -1
- package/dist/types/model/mailing/templates/NewUserInvited.mustache.d.ts.map +1 -1
- package/dist/types/model/mailing/templates/PasswordReset.mustache.d.ts.map +1 -1
- package/dist/types/model/mailing/templates/PasswordlessSignIn.mustache.d.ts.map +1 -1
- package/dist/types/model/mailing/templates/UnusualLogin.mustache.d.ts.map +1 -1
- package/dist/types/model/mailing/type.d.ts.map +1 -1
- package/dist/types/model/queries/apiKey/ApiKeyListQuery.d.ts.map +1 -1
- package/dist/types/model/queries/apiKey/ApiKeyQuery.d.ts +4 -0
- package/dist/types/model/queries/apiKey/ApiKeyQuery.d.ts.map +1 -1
- package/dist/types/model/queries/apiKey/ApiKeySessionsQuery.d.ts +1 -4
- package/dist/types/model/queries/apiKey/ApiKeySessionsQuery.d.ts.map +1 -1
- package/dist/types/model/queries/authLog/AuthLogQuery.d.ts.map +1 -1
- package/dist/types/model/queries/authLog/NextLoginAttemptQuery.d.ts +2 -2
- package/dist/types/model/queries/authLog/NextLoginAttemptQuery.d.ts.map +1 -1
- package/dist/types/model/queries/authLog/NextMailAttemptQuery.d.ts +2 -2
- package/dist/types/model/queries/authLog/NextMailAttemptQuery.d.ts.map +1 -1
- package/dist/types/model/queries/authPolicy/AuthPoliciesQuery.d.ts.map +1 -1
- package/dist/types/model/queries/configuration/ConfigurationQuery.d.ts.map +1 -1
- package/dist/types/model/queries/customRole/CustomRolesQuery.d.ts +12 -0
- package/dist/types/model/queries/customRole/CustomRolesQuery.d.ts.map +1 -0
- package/dist/types/model/queries/customRole/index.d.ts +2 -0
- package/dist/types/model/queries/customRole/index.d.ts.map +1 -0
- package/dist/types/model/queries/identity/IdentitiesHoldingRoleCountQuery.d.ts +8 -0
- package/dist/types/model/queries/identity/IdentitiesHoldingRoleCountQuery.d.ts.map +1 -0
- package/dist/types/model/queries/identity/IdentityQuery.d.ts +3 -2
- package/dist/types/model/queries/identity/IdentityQuery.d.ts.map +1 -1
- package/dist/types/model/queries/identity/index.d.ts +1 -0
- package/dist/types/model/queries/identity/index.d.ts.map +1 -1
- package/dist/types/model/queries/idp/IdentityProviderBySlugQuery.d.ts.map +1 -1
- package/dist/types/model/queries/idp/IdentityProvidersQuery.d.ts.map +1 -1
- package/dist/types/model/queries/idp/IdpSessionByApiKeyQuery.d.ts.map +1 -1
- package/dist/types/model/queries/idp/IdpSessionsBySidQuery.d.ts.map +1 -1
- package/dist/types/model/queries/idp/IdpSessionsBySubQuery.d.ts.map +1 -1
- package/dist/types/model/queries/idp/LocalAuthDisablingIdpsQuery.d.ts +18 -0
- package/dist/types/model/queries/idp/LocalAuthDisablingIdpsQuery.d.ts.map +1 -0
- package/dist/types/model/queries/idp/PersonIdentityProvidersQuery.d.ts +1 -0
- package/dist/types/model/queries/idp/PersonIdentityProvidersQuery.d.ts.map +1 -1
- package/dist/types/model/queries/idp/helpers.d.ts +1 -1
- package/dist/types/model/queries/idp/helpers.d.ts.map +1 -1
- package/dist/types/model/queries/idp/index.d.ts +1 -0
- package/dist/types/model/queries/idp/index.d.ts.map +1 -1
- package/dist/types/model/queries/idp/types.d.ts +1 -0
- package/dist/types/model/queries/idp/types.d.ts.map +1 -1
- package/dist/types/model/queries/index.d.ts +1 -0
- package/dist/types/model/queries/index.d.ts.map +1 -1
- package/dist/types/model/queries/mailTemplate/MailTemplateListQuery.d.ts.map +1 -1
- package/dist/types/model/queries/mailTemplate/MailTemplateQuery.d.ts.map +1 -1
- package/dist/types/model/queries/membership/AllProjectRolesByIdentityQuery.d.ts.map +1 -1
- package/dist/types/model/queries/membership/IdentityHasProjectMembershipsQuery.d.ts +7 -0
- package/dist/types/model/queries/membership/IdentityHasProjectMembershipsQuery.d.ts.map +1 -0
- package/dist/types/model/queries/membership/ProjectMembersQuery.d.ts.map +1 -1
- package/dist/types/model/queries/membership/ProjectMembershipByIdentityQuery.d.ts.map +1 -1
- package/dist/types/model/queries/membership/ProjectRolesByIdentityQuery.d.ts.map +1 -1
- package/dist/types/model/queries/membership/ProjectSlugSpecification.d.ts.map +1 -1
- package/dist/types/model/queries/membership/index.d.ts +1 -0
- package/dist/types/model/queries/membership/index.d.ts.map +1 -1
- package/dist/types/model/queries/person/PersonByIdPQuery.d.ts.map +1 -1
- package/dist/types/model/queries/person/PersonByIdentityBatchQuery.d.ts.map +1 -1
- package/dist/types/model/queries/person/PersonQuery.d.ts.map +1 -1
- package/dist/types/model/queries/person/PersonQueryBuilderFactory.d.ts.map +1 -1
- package/dist/types/model/queries/person/PersonsQuery.d.ts.map +1 -1
- package/dist/types/model/queries/person/types.d.ts +3 -0
- package/dist/types/model/queries/person/types.d.ts.map +1 -1
- package/dist/types/model/queries/personToken/PersonTokenQuery.d.ts.map +1 -1
- package/dist/types/model/queries/project/ProjectBySlugQuery.d.ts.map +1 -1
- package/dist/types/model/queries/project/ProjectSecretKeysQuery.d.ts.map +1 -1
- package/dist/types/model/queries/project/ProjectSecretsQuery.d.ts.map +1 -1
- package/dist/types/model/queries/project/ProjectUpdateTimestampQuery.d.ts.map +1 -1
- package/dist/types/model/queries/project/ProjectsByIdentityQuery.d.ts.map +1 -1
- package/dist/types/model/queries/project/ProjectsQuery.d.ts.map +1 -1
- package/dist/types/model/queries/rateLimit/RateLimitCountQuery.d.ts +2 -2
- package/dist/types/model/queries/rateLimit/RateLimitCountQuery.d.ts.map +1 -1
- package/dist/types/model/service/AuthLogService.d.ts.map +1 -1
- package/dist/types/model/service/AuthPolicyManager.d.ts.map +1 -1
- package/dist/types/model/service/AuthPolicyResolver.d.ts.map +1 -1
- package/dist/types/model/service/BackupCodeManager.d.ts.map +1 -1
- package/dist/types/model/service/ConfigurationManager.d.ts.map +1 -1
- package/dist/types/model/service/CustomRoleManager.d.ts +46 -0
- package/dist/types/model/service/CustomRoleManager.d.ts.map +1 -0
- package/dist/types/model/service/EmailChangeManager.d.ts.map +1 -1
- package/dist/types/model/service/EmailOtpManager.d.ts.map +1 -1
- package/dist/types/model/service/EmailValidator.d.ts.map +1 -1
- package/dist/types/model/service/EmailVerificationManager.d.ts.map +1 -1
- package/dist/types/model/service/GlobalRoleValidator.d.ts +5 -0
- package/dist/types/model/service/GlobalRoleValidator.d.ts.map +1 -0
- package/dist/types/model/service/HibpChecker.d.ts.map +1 -1
- package/dist/types/model/service/IDPSignInManager.d.ts +13 -1
- package/dist/types/model/service/IDPSignInManager.d.ts.map +1 -1
- package/dist/types/model/service/InviteManager.d.ts.map +1 -1
- package/dist/types/model/service/LoginRiskAnalyzer.d.ts +1 -1
- package/dist/types/model/service/LoginRiskAnalyzer.d.ts.map +1 -1
- package/dist/types/model/service/MailTemplateManager.d.ts.map +1 -1
- package/dist/types/model/service/MembershipValidator.d.ts.map +1 -1
- package/dist/types/model/service/OtpAuthenticator.d.ts.map +1 -1
- package/dist/types/model/service/OtpManager.d.ts.map +1 -1
- package/dist/types/model/service/PanelAccessResolver.d.ts +19 -0
- package/dist/types/model/service/PanelAccessResolver.d.ts.map +1 -0
- package/dist/types/model/service/PasswordChangeManager.d.ts.map +1 -1
- package/dist/types/model/service/PasswordResetManager.d.ts.map +1 -1
- package/dist/types/model/service/PasswordStrengthValidator.d.ts.map +1 -1
- package/dist/types/model/service/PasswordlessSignInManager.d.ts.map +1 -1
- package/dist/types/model/service/PersonAccessManager.d.ts +5 -2
- package/dist/types/model/service/PersonAccessManager.d.ts.map +1 -1
- package/dist/types/model/service/PersonManager.d.ts.map +1 -1
- package/dist/types/model/service/ProjectManager.d.ts.map +1 -1
- package/dist/types/model/service/ProjectMemberManager.d.ts.map +1 -1
- package/dist/types/model/service/RateLimiter.d.ts +1 -1
- package/dist/types/model/service/RateLimiter.d.ts.map +1 -1
- package/dist/types/model/service/RolesManager.d.ts +6 -1
- package/dist/types/model/service/RolesManager.d.ts.map +1 -1
- package/dist/types/model/service/SecretsManager.d.ts.map +1 -1
- package/dist/types/model/service/SignInManager.d.ts.map +1 -1
- package/dist/types/model/service/SignOutManager.d.ts.map +1 -1
- package/dist/types/model/service/SignUpManager.d.ts +3 -1
- package/dist/types/model/service/SignUpManager.d.ts.map +1 -1
- package/dist/types/model/service/apiKey/ApiKeyManager.d.ts +4 -1
- package/dist/types/model/service/apiKey/ApiKeyManager.d.ts.map +1 -1
- package/dist/types/model/service/apiKey/ApiKeyService.d.ts +2 -2
- package/dist/types/model/service/apiKey/ApiKeyService.d.ts.map +1 -1
- package/dist/types/model/service/apiKey/UnpersistedApiKeyManager.d.ts +18 -0
- package/dist/types/model/service/apiKey/UnpersistedApiKeyManager.d.ts.map +1 -1
- package/dist/types/model/service/captcha/CaptchaValidator.d.ts.map +1 -1
- package/dist/types/model/service/captcha/HCaptchaProvider.d.ts.map +1 -1
- package/dist/types/model/service/captcha/RecaptchaV3Provider.d.ts.map +1 -1
- package/dist/types/model/service/captcha/TurnstileProvider.d.ts.map +1 -1
- package/dist/types/model/service/helpers/getPreferredProject.d.ts.map +1 -1
- package/dist/types/model/service/helpers/isPasswordlessEnabled.d.ts.map +1 -1
- package/dist/types/model/service/idp/BackchannelLogoutManager.d.ts.map +1 -1
- package/dist/types/model/service/idp/ClaimMapping.d.ts +330 -0
- package/dist/types/model/service/idp/ClaimMapping.d.ts.map +1 -0
- package/dist/types/model/service/idp/ClaimMappingEvaluator.d.ts +30 -0
- package/dist/types/model/service/idp/ClaimMappingEvaluator.d.ts.map +1 -0
- package/dist/types/model/service/idp/ClaimMappingValidation.d.ts +55 -0
- package/dist/types/model/service/idp/ClaimMappingValidation.d.ts.map +1 -0
- package/dist/types/model/service/idp/IDPClaimSyncService.d.ts +113 -0
- package/dist/types/model/service/idp/IDPClaimSyncService.d.ts.map +1 -0
- package/dist/types/model/service/idp/IDPHandlerRegistry.d.ts.map +1 -1
- package/dist/types/model/service/idp/IDPManager.d.ts +31 -1
- package/dist/types/model/service/idp/IDPManager.d.ts.map +1 -1
- package/dist/types/model/service/idp/IdentityProviderHandler.d.ts +7 -0
- package/dist/types/model/service/idp/IdentityProviderHandler.d.ts.map +1 -1
- package/dist/types/model/service/idp/IdpSessionRevalidator.d.ts +15 -1
- package/dist/types/model/service/idp/IdpSessionRevalidator.d.ts.map +1 -1
- package/dist/types/model/service/idp/PersonIdentityProviderManager.d.ts.map +1 -1
- package/dist/types/model/service/idp/index.d.ts +4 -0
- package/dist/types/model/service/idp/index.d.ts.map +1 -1
- package/dist/types/model/service/idp/providers/AppleProvider.d.ts +2 -2
- package/dist/types/model/service/idp/providers/AppleProvider.d.ts.map +1 -1
- package/dist/types/model/service/idp/providers/FacebookProvider.d.ts +2 -2
- package/dist/types/model/service/idp/providers/FacebookProvider.d.ts.map +1 -1
- package/dist/types/model/service/idp/providers/OIDCHelpers.d.ts +13 -1
- package/dist/types/model/service/idp/providers/OIDCHelpers.d.ts.map +1 -1
- package/dist/types/model/service/idp/providers/OIDCProvider.d.ts +1 -1
- package/dist/types/model/service/idp/providers/OIDCProvider.d.ts.map +1 -1
- package/dist/types/model/service/idp/providers/OIDCTypes.d.ts +5 -5
- package/dist/types/model/service/idp/providers/helpers.d.ts.map +1 -1
- package/dist/types/model/service/index.d.ts +3 -0
- package/dist/types/model/service/index.d.ts.map +1 -1
- package/dist/types/model/service/membershipUtils.d.ts.map +1 -1
- package/dist/types/model/type/AuthLog.d.ts +1 -1
- package/dist/types/model/type/AuthLog.d.ts.map +1 -1
- package/dist/types/model/type/Config.d.ts +2 -0
- package/dist/types/model/type/Config.d.ts.map +1 -1
- package/dist/types/model/type/CustomRole.d.ts +9 -0
- package/dist/types/model/type/CustomRole.d.ts.map +1 -0
- package/dist/types/model/type/IdentityProvider.d.ts +2 -0
- package/dist/types/model/type/IdentityProvider.d.ts.map +1 -1
- package/dist/types/model/type/PersonToken.d.ts +2 -0
- package/dist/types/model/type/PersonToken.d.ts.map +1 -1
- package/dist/types/model/type/RateLimit.d.ts +6 -6
- package/dist/types/model/type/RateLimit.d.ts.map +1 -1
- package/dist/types/model/type/index.d.ts +1 -0
- package/dist/types/model/type/index.d.ts.map +1 -1
- package/dist/types/model/utils/DatabaseContext.d.ts +15 -1
- package/dist/types/model/utils/DatabaseContext.d.ts.map +1 -1
- package/dist/types/model/utils/Response.d.ts.map +1 -1
- package/dist/types/model/utils/email.d.ts.map +1 -1
- package/dist/types/model/utils/hex.d.ts.map +1 -1
- package/dist/types/model/utils/interval.d.ts.map +1 -1
- package/dist/types/model/utils/time.d.ts.map +1 -1
- package/dist/types/model/utils/token.d.ts +1 -2
- package/dist/types/model/utils/token.d.ts.map +1 -1
- package/dist/types/resolvers/ResolverFactory.d.ts +6 -0
- package/dist/types/resolvers/ResolverFactory.d.ts.map +1 -1
- package/dist/types/resolvers/TenantResolverContext.d.ts +1 -1
- package/dist/types/resolvers/TenantResolverContext.d.ts.map +1 -1
- package/dist/types/resolvers/TenantResolverContextFactory.d.ts +1 -1
- package/dist/types/resolvers/TenantResolverContextFactory.d.ts.map +1 -1
- package/dist/types/resolvers/errorUtils.d.ts.map +1 -1
- package/dist/types/resolvers/membershipUtils.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/configuration/AuthPolicyMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/configuration/ConfigurationMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/customRole/CustomRoleMutationResolver.d.ts +16 -0
- package/dist/types/resolvers/mutation/customRole/CustomRoleMutationResolver.d.ts.map +1 -0
- package/dist/types/resolvers/mutation/identity/GlobalRolesMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/idp/AddIDPMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/idp/DisableIDPMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/idp/EnableIDPMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/idp/UpdateIDPMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/idp/audit.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.d.ts +2 -0
- package/dist/types/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/ChangePasswordMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/ChangeProfileMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/DisablePersonMutationResolver.d.ts +1 -1
- package/dist/types/resolvers/mutation/person/DisablePersonMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/EmailOtpMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/EmailVerificationMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/EnablePersonMutationResolver.d.ts +11 -0
- package/dist/types/resolvers/mutation/person/EnablePersonMutationResolver.d.ts.map +1 -0
- package/dist/types/resolvers/mutation/person/ForceSignOutMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/IDPMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/InviteMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/OtpMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/PasswordlessMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/ResetPasswordMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/ResetPersonMfaMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/RevokeSessionMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/SignInMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/SignOutMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/SignUpMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/TogglePasswordlessMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/project/CreateProjectMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/project/SetProjectSecretMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/project/UpdateProjectMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/projectMember/audit.d.ts +1 -1
- package/dist/types/resolvers/mutation/projectMember/audit.d.ts.map +1 -1
- package/dist/types/resolvers/query/ApiKeyQueryResolver.d.ts.map +1 -1
- package/dist/types/resolvers/query/AuthLogQueryResolver.d.ts.map +1 -1
- package/dist/types/resolvers/query/AuthPolicyQueryResolver.d.ts.map +1 -1
- package/dist/types/resolvers/query/ConfigurationQueryResolver.d.ts.map +1 -1
- package/dist/types/resolvers/query/CustomRoleQueryResolver.d.ts +11 -0
- package/dist/types/resolvers/query/CustomRoleQueryResolver.d.ts.map +1 -0
- package/dist/types/resolvers/query/IDPQueryResolver.d.ts.map +1 -1
- package/dist/types/resolvers/query/MailTemplateQueryResolver.d.ts +1 -0
- package/dist/types/resolvers/query/MailTemplateQueryResolver.d.ts.map +1 -1
- package/dist/types/resolvers/query/MeQueryResolver.d.ts.map +1 -1
- package/dist/types/resolvers/query/PersonQueryResolver.d.ts.map +1 -1
- package/dist/types/resolvers/query/ProjectMembersQueryResolver.d.ts.map +1 -1
- package/dist/types/resolvers/query/ProjectQueryResolver.d.ts.map +1 -1
- package/dist/types/resolvers/responseHelpers/ApiKeyResponseFactory.d.ts.map +1 -1
- package/dist/types/resolvers/responseHelpers/PersonResponseFactory.d.ts.map +1 -1
- package/dist/types/resolvers/responseHelpers/ProjectResponseFactory.d.ts +10 -0
- package/dist/types/resolvers/responseHelpers/ProjectResponseFactory.d.ts.map +1 -0
- package/dist/types/resolvers/responseHelpers/SignInResponseFactory.d.ts.map +1 -1
- package/dist/types/resolvers/types/IdentityTypeResolver.d.ts.map +1 -1
- package/dist/types/resolvers/types/PersonTypeResolver.d.ts +15 -1
- package/dist/types/resolvers/types/PersonTypeResolver.d.ts.map +1 -1
- package/dist/types/resolvers/types/ProjectTypeResolver.d.ts +15 -6
- package/dist/types/resolvers/types/ProjectTypeResolver.d.ts.map +1 -1
- package/dist/types/schema/index.d.ts +381 -21
- package/dist/types/schema/index.d.ts.map +1 -1
- package/dist/types/schema/tenant.graphql.d.ts.map +1 -1
- package/dist/types/schema/types.d.ts +2 -2
- package/dist/types/schema/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/types/utils/Mailer.d.ts.map +1 -1
- package/dist/types/utils/TemplateRenderer.d.ts.map +1 -1
- package/dist/types/utils/array.d.ts.map +1 -1
- package/dist/types/utils/batchQuery.d.ts.map +1 -1
- package/package.json +12 -12
- package/readme.md +56 -0
- package/src/TenantContainer.ts +46 -8
- package/src/migrations/2026-06-18-120000-idp-claim-mapping.ts +15 -0
- package/src/migrations/2026-08-03-120000-person-enable-auth-log.ts +12 -0
- package/src/migrations/2026-08-04-120000-config-panel.ts +13 -0
- package/src/migrations/2026-09-04-120000-idp-disable-local-authentication.ts +18 -0
- package/src/migrations/2026-09-11-120000-custom-role.ts +19 -0
- package/src/migrations/runner.ts +10 -0
- package/src/migrations/snapshot.ts +22 -2
- package/src/model/authorization/CustomRoleAuthorizator.ts +72 -0
- package/src/model/authorization/CustomRolePermissions.ts +558 -0
- package/src/model/authorization/PermissionActions.ts +74 -17
- package/src/model/authorization/PermissionContextFactory.ts +39 -3
- package/src/model/authorization/PermissionsFactory.ts +65 -31
- package/src/model/authorization/Roles.ts +13 -0
- package/src/model/authorization/TargetIdentityPermission.ts +37 -0
- package/src/model/authorization/index.ts +3 -0
- package/src/model/commands/apiKey/ApiKeyHelper.ts +23 -0
- package/src/model/commands/apiKey/CreateApiKeyCommand.ts +12 -5
- package/src/model/commands/apiKey/ProlongApiKeyCommand.ts +22 -14
- package/src/model/commands/authLog/CreateAuthLogEntryCommand.ts +1 -0
- package/src/model/commands/configuration/UpdateConfigurationCommand.ts +5 -4
- package/src/model/commands/customRole/CreateCustomRoleCommand.ts +30 -0
- package/src/model/commands/customRole/DeleteCustomRoleCommand.ts +20 -0
- package/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.ts +20 -0
- package/src/model/commands/customRole/UpdateCustomRoleCommand.ts +30 -0
- package/src/model/commands/customRole/index.ts +4 -0
- package/src/model/commands/identity/PatchIdentityGlobalRoles.ts +1 -1
- package/src/model/commands/idp/ClaimIdpRevalidationCommand.ts +8 -7
- package/src/model/commands/idp/CreateIdpCommand.ts +7 -1
- package/src/model/commands/idp/CreateIdpSessionCommand.ts +5 -2
- package/src/model/commands/idp/UpdateIdpCommand.ts +5 -1
- package/src/model/commands/idp/UpdateIdpSessionCommand.ts +3 -2
- package/src/model/commands/index.ts +1 -0
- package/src/model/commands/membership/UpdateProjectMemberCommand.ts +1 -1
- package/src/model/commands/membership/index.ts +2 -1
- package/src/model/commands/membership/variables/index.ts +1 -0
- package/src/model/commands/person/CreatePersonCommand.ts +1 -0
- package/src/model/commands/person/EnablePersonCommand.ts +18 -0
- package/src/model/commands/person/SetMfaGraceUntilCommand.ts +9 -4
- package/src/model/commands/personToken/ResetPasswordCommand.ts +2 -3
- package/src/model/commands/personToken/SaveEmailOtpTokenCommand.ts +5 -4
- package/src/model/commands/personToken/SavePersonTokenCommand.ts +13 -7
- package/src/model/commands/rateLimit/RecordRateLimitEventCommand.ts +3 -1
- package/src/model/queries/apiKey/ApiKeyQuery.ts +17 -1
- package/src/model/queries/apiKey/ApiKeySessionsQuery.ts +2 -2
- package/src/model/queries/authLog/NextLoginAttemptQuery.ts +14 -12
- package/src/model/queries/authLog/NextMailAttemptQuery.ts +12 -10
- package/src/model/queries/configuration/ConfigurationQuery.ts +4 -0
- package/src/model/queries/customRole/CustomRolesQuery.ts +30 -0
- package/src/model/queries/customRole/index.ts +1 -0
- package/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.ts +17 -0
- package/src/model/queries/identity/IdentityQuery.ts +10 -4
- package/src/model/queries/identity/index.ts +1 -0
- package/src/model/queries/idp/LocalAuthDisablingIdpsQuery.ts +41 -0
- package/src/model/queries/idp/PersonIdentityProvidersQuery.ts +2 -0
- package/src/model/queries/idp/helpers.ts +3 -2
- package/src/model/queries/idp/index.ts +1 -0
- package/src/model/queries/idp/types.ts +1 -0
- package/src/model/queries/index.ts +1 -0
- package/src/model/queries/membership/IdentityHasProjectMembershipsQuery.ts +17 -0
- package/src/model/queries/membership/ProjectMembersQuery.ts +1 -0
- package/src/model/queries/membership/index.ts +1 -0
- package/src/model/queries/person/PersonQueryBuilderFactory.ts +4 -0
- package/src/model/queries/person/types.ts +3 -0
- package/src/model/queries/personToken/PersonTokenQuery.ts +4 -0
- package/src/model/queries/rateLimit/RateLimitCountQuery.ts +5 -2
- package/src/model/service/AuthLogService.ts +18 -2
- package/src/model/service/CustomRoleManager.ts +221 -0
- package/src/model/service/EmailChangeManager.ts +3 -3
- package/src/model/service/EmailOtpManager.ts +0 -1
- package/src/model/service/EmailVerificationManager.ts +3 -3
- package/src/model/service/GlobalRoleValidator.ts +30 -0
- package/src/model/service/IDPSignInManager.ts +74 -14
- package/src/model/service/PanelAccessResolver.ts +32 -0
- package/src/model/service/PasswordResetManager.ts +11 -3
- package/src/model/service/PasswordlessSignInManager.ts +26 -6
- package/src/model/service/PersonAccessManager.ts +19 -3
- package/src/model/service/RateLimiter.ts +2 -3
- package/src/model/service/RolesManager.ts +28 -14
- package/src/model/service/SignInManager.ts +16 -8
- package/src/model/service/SignUpManager.ts +12 -4
- package/src/model/service/apiKey/ApiKeyManager.ts +75 -53
- package/src/model/service/apiKey/ApiKeyService.ts +2 -2
- package/src/model/service/apiKey/UnpersistedApiKeyManager.ts +24 -0
- package/src/model/service/idp/ClaimMapping.ts +283 -0
- package/src/model/service/idp/ClaimMappingEvaluator.ts +226 -0
- package/src/model/service/idp/ClaimMappingValidation.ts +158 -0
- package/src/model/service/idp/IDPClaimSyncService.ts +401 -0
- package/src/model/service/idp/IDPManager.ts +126 -21
- package/src/model/service/idp/IdentityProviderHandler.ts +7 -0
- package/src/model/service/idp/IdpSessionRevalidator.ts +130 -25
- package/src/model/service/idp/PersonIdentityProviderManager.ts +8 -0
- package/src/model/service/idp/index.ts +4 -0
- package/src/model/service/idp/providers/OIDCHelpers.ts +161 -53
- package/src/model/service/idp/providers/OIDCProvider.ts +4 -1
- package/src/model/service/index.ts +3 -0
- package/src/model/type/AuthLog.ts +4 -0
- package/src/model/type/Config.ts +3 -0
- package/src/model/type/CustomRole.ts +8 -0
- package/src/model/type/IdentityProvider.ts +2 -0
- package/src/model/type/PersonToken.ts +2 -0
- package/src/model/type/index.ts +1 -0
- package/src/model/utils/DatabaseContext.ts +30 -6
- package/src/model/utils/token.ts +2 -3
- package/src/resolvers/ResolverFactory.ts +17 -0
- package/src/resolvers/TenantResolverContext.ts +1 -1
- package/src/resolvers/TenantResolverContextFactory.ts +5 -5
- package/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.ts +13 -5
- package/src/resolvers/mutation/customRole/CustomRoleMutationResolver.ts +125 -0
- package/src/resolvers/mutation/identity/GlobalRolesMutationResolver.ts +30 -7
- package/src/resolvers/mutation/idp/AddIDPMutationResolver.ts +1 -0
- package/src/resolvers/mutation/idp/UpdateIDPMutationResolver.ts +1 -0
- package/src/resolvers/mutation/idp/audit.ts +1 -0
- package/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.ts +48 -14
- package/src/resolvers/mutation/person/ChangePasswordMutationResolver.ts +2 -2
- package/src/resolvers/mutation/person/ChangeProfileMutationResolver.ts +9 -3
- package/src/resolvers/mutation/person/DisablePersonMutationResolver.ts +5 -5
- package/src/resolvers/mutation/person/EmailVerificationMutationResolver.ts +1 -1
- package/src/resolvers/mutation/person/EnablePersonMutationResolver.ts +50 -0
- package/src/resolvers/mutation/person/ForceSignOutMutationResolver.ts +2 -2
- package/src/resolvers/mutation/person/IDPMutationResolver.ts +31 -0
- package/src/resolvers/mutation/person/PasswordlessMutationResolver.ts +7 -0
- package/src/resolvers/mutation/person/ResetPasswordMutationResolver.ts +1 -1
- package/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.ts +2 -2
- package/src/resolvers/mutation/person/SignInMutationResolver.ts +22 -9
- package/src/resolvers/mutation/person/SignUpMutationResolver.ts +1 -1
- package/src/resolvers/query/CustomRoleQueryResolver.ts +41 -0
- package/src/resolvers/query/MailTemplateQueryResolver.ts +13 -8
- package/src/resolvers/query/PersonQueryResolver.ts +3 -1
- package/src/resolvers/query/ProjectQueryResolver.ts +3 -2
- package/src/resolvers/responseHelpers/PersonResponseFactory.ts +5 -0
- package/src/resolvers/responseHelpers/ProjectResponseFactory.ts +24 -0
- package/src/resolvers/responseHelpers/SignInResponseFactory.ts +1 -1
- package/src/resolvers/types/IdentityTypeResolver.ts +50 -14
- package/src/resolvers/types/PersonTypeResolver.ts +45 -4
- package/src/resolvers/types/ProjectTypeResolver.ts +33 -1
- package/src/schema/index.ts +483 -15
- package/src/schema/tenant.graphql.ts +275 -15
- package/tests/cases/integration/database/dbClock.test.ts +171 -0
- package/tests/cases/integration/mocked/antiAbuseSignUp.test.ts +2 -2
- package/tests/cases/integration/mocked/changeMyProfileEmailVerificationMutation.test.ts +10 -11
- package/tests/cases/integration/mocked/changePasswordMutation.test.ts +43 -0
- package/tests/cases/integration/mocked/changeProfileMutation.test.ts +2 -0
- package/tests/cases/integration/mocked/configurationPanel.test.ts +105 -0
- package/tests/cases/integration/mocked/confirmEmailChangeMutation.test.ts +4 -2
- package/tests/cases/integration/mocked/createSessionKeyMutation.test.ts +33 -0
- package/tests/cases/integration/mocked/customRoleCrud.test.ts +442 -0
- package/tests/cases/integration/mocked/disablePersonMutation.test.ts +92 -0
- package/tests/cases/integration/mocked/enablePersonMutation.test.ts +137 -0
- package/tests/cases/integration/mocked/forceSignOutPersonMutation.test.ts +3 -1
- package/tests/cases/integration/mocked/globalIdentityRolesMutation.test.ts +169 -3
- package/tests/cases/integration/mocked/gql/passwordless.ts +10 -0
- package/tests/cases/integration/mocked/idpClaimMappingConfig.test.ts +332 -0
- package/tests/cases/integration/mocked/listProjectMembersQuery.test.ts +8 -3
- package/tests/cases/integration/mocked/localAuthenticationDisabled.test.ts +182 -0
- package/tests/cases/integration/mocked/mailTemplateScope.test.ts +95 -0
- package/tests/cases/integration/mocked/permissionsQuery.test.ts +153 -0
- package/tests/cases/integration/mocked/personByIdQuery.test.ts +59 -1
- package/tests/cases/integration/mocked/personIdentityProviders.test.ts +67 -0
- package/tests/cases/integration/mocked/personsQuery.test.ts +38 -5
- package/tests/cases/integration/mocked/requestEmailVerificationMutation.test.ts +15 -6
- package/tests/cases/integration/mocked/resetPersonMfaMutation.test.ts +5 -3
- package/tests/cases/integration/mocked/signInAnomalyDetection.test.ts +13 -2
- package/tests/cases/integration/mocked/signInIdpClaimMapping.test.ts +1258 -0
- package/tests/cases/integration/mocked/signInIdpClaimMappingFixes.test.ts +344 -0
- package/tests/cases/integration/mocked/signInIdpClaimMappingSafety.test.ts +531 -0
- package/tests/cases/integration/mocked/signInIdpMutation.test.ts +105 -1
- package/tests/cases/integration/mocked/signInMfaEnforcement.test.ts +20 -5
- package/tests/cases/integration/mocked/signInMutation.test.ts +14 -0
- package/tests/cases/integration/mocked/signInPasswordlessMutation.test.ts +38 -1
- package/tests/cases/integration/mocked/signUpMutation.test.ts +62 -3
- package/tests/cases/integration/mocked/sql/createPersonTokenSql.ts +4 -3
- package/tests/cases/integration/mocked/sql/createSessionKeySql.ts +2 -2
- package/tests/cases/integration/mocked/sql/emailOtpSql.ts +10 -8
- package/tests/cases/integration/mocked/sql/getApiKeySql.ts +2 -2
- package/tests/cases/integration/mocked/sql/getConfigSql.ts +3 -0
- package/tests/cases/integration/mocked/sql/getCustomRolesSql.ts +25 -0
- package/tests/cases/integration/mocked/sql/getIdentityProjectMembershipPresenceSql.ts +11 -0
- package/tests/cases/integration/mocked/sql/getIdpBySlugSql.ts +1 -1
- package/tests/cases/integration/mocked/sql/getNextLoginAttemptSql.ts +15 -11
- package/tests/cases/integration/mocked/sql/getNextMailAttemptSql.ts +12 -13
- package/tests/cases/integration/mocked/sql/getPersonByEmailSql.ts +5 -2
- package/tests/cases/integration/mocked/sql/getPersonByIdSql.ts +1 -1
- package/tests/cases/integration/mocked/sql/getPersonByIdentity.ts +1 -1
- package/tests/cases/integration/mocked/sql/getPersonByIdpSql.ts +1 -1
- package/tests/cases/integration/mocked/sql/getPersonsByIdentitySql.ts +1 -1
- package/tests/cases/integration/mocked/sql/getProjectBySlugSql.ts +1 -1
- package/tests/cases/integration/mocked/sql/listPersonsSql.ts +5 -2
- package/tests/cases/integration/mocked/sql/listSessionsSql.ts +3 -3
- package/tests/cases/integration/mocked/sql/localAuthDisablingIdpsSql.ts +21 -0
- package/tests/cases/integration/mocked/sql/personIdentityProvidersSql.ts +4 -2
- package/tests/cases/integration/mocked/sql/removeMembershipSql.ts +14 -0
- package/tests/cases/integration/mocked/sql/sqlTransaction.ts +28 -0
- package/tests/cases/integration/mocked/trustForwardedClientInfo.test.ts +60 -3
- package/tests/cases/integration/mocked/verifyEmailMutation.test.ts +9 -5
- package/tests/cases/unit/apiKey/createSessionApiKeyPolicy.test.ts +9 -6
- package/tests/cases/unit/apiKey/prolongApiKeyCommand.test.ts +29 -19
- package/tests/cases/unit/apiKey/unpersistedApiKeyManager.test.ts +4 -5
- package/tests/cases/unit/apiKey/verifyAndProlongIdle.test.ts +16 -6
- package/tests/cases/unit/apiKey/verifyAndProlongReplica.test.ts +173 -0
- package/tests/cases/unit/authLogBaselineWrite.test.ts +26 -3
- package/tests/cases/unit/backupCodeManager.test.ts +1 -0
- package/tests/cases/unit/customRoleAuthorizator.test.ts +149 -0
- package/tests/cases/unit/customRolePermissions.test.ts +583 -0
- package/tests/cases/unit/databaseContextRetry.test.ts +81 -0
- package/tests/cases/unit/emailOtpManager.test.ts +10 -8
- package/tests/cases/unit/idp/claimIdpRevalidation.test.ts +50 -0
- package/tests/cases/unit/idp/claimMappingEvaluator.test.ts +554 -0
- package/tests/cases/unit/idp/claimMappingValidation.test.ts +134 -0
- package/tests/cases/unit/idp/idpManagerConfigMerge.test.ts +97 -0
- package/tests/cases/unit/idp/idpManagerUnknownConfigKeys.test.ts +108 -0
- package/tests/cases/unit/idp/idpSessionRevalidator.test.ts +261 -26
- package/tests/cases/unit/idp/oidcClaims.test.ts +29 -0
- package/tests/cases/unit/idp/oidcResponse.test.ts +54 -0
- package/tests/cases/unit/idp/oidcRevalidate.test.ts +94 -2
- package/tests/cases/unit/otpManager.test.ts +1 -0
- package/tests/cases/unit/panelAccessResolver.test.ts +57 -0
- package/tests/cases/unit/rateLimiter.test.ts +7 -7
- package/tests/cases/unit/savePersonTokenCommand.test.ts +40 -0
- package/tests/cases/unit/updateConfigurationCommand.test.ts +63 -0
- package/tests/src/IdPMock.ts +6 -0
- package/tests/src/testTenant.ts +60 -12
- package/dist/development/src/model/commands/membership/RemoveProjectMembershipsCommand.cjs.map +0 -1
- package/dist/development/src/model/commands/membership/RemoveProjectMembershipsCommand.js.map +0 -1
- package/dist/production/src/model/commands/membership/RemoveProjectMembershipsCommand.cjs.map +0 -1
- package/dist/production/src/model/commands/membership/RemoveProjectMembershipsCommand.js.map +0 -1
- package/dist/types/model/commands/membership/RemoveProjectMembershipsCommand.d.ts.map +0 -1
- /package/src/model/commands/membership/{RemoveProjectMembershipsCommand.ts → RemoveProjectMembershipCommand.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthPolicyResolver.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/AuthPolicyResolver.ts"],"sourcesContent":["import { DatabaseContext } from '../utils/index.js'\nimport { AllProjectRolesByIdentityQuery, AuthPoliciesQuery } from '../queries/index.js'\nimport { AuthPolicyRow, EffectivePolicy } from '../type/index.js'\nimport { IPostgresInterval } from 'postgres-interval'\nimport { intervalToSeconds } from '../utils/interval.js'\n\n/**\n * Resolves the effective auth policy for an identity by aggregating all matching\n * `auth_policy` rows across the identity's entire role set (global roles + every\n * project-membership role across all projects).\n *\n * Shared by A06 (consumes `mfaRequired`) and A19 (consumes the session fields).\n *\n * Aggregation:\n * - `mfaRequired` = OR of every matched row's `mfa_required` (NULL = no opinion).\n * - session fields = strictest wins: the shortest `tokenExpiration` / `idleTimeout`\n * and the logical AND of `rememberMeAllowed` (any matched `false` wins).\n *\n * When nothing matches, the result is the inert baseline\n * (`mfaRequired=false`, session fields null) — i.e. today's behavior.\n */\nexport class AuthPolicyResolver {\n\tasync resolveForIdentity(db: DatabaseContext, identityId: string, globalRoles: readonly string[]): Promise<EffectivePolicy> {\n\t\tconst policies = await db.queryHandler.fetch(new AuthPoliciesQuery())\n\t\t// Fast path: with no policies configured, enforcement is inert and we skip\n\t\t// the cross-project role query entirely (preserves today's query shape).\n\t\tif (policies.length === 0) {\n\t\t\treturn { mfaRequired: false, tokenExpiration: null, idleTimeout: null, graceDuration: null, rememberMeAllowed: null }\n\t\t}\n\t\tconst projectRoles = await db.queryHandler.fetch(new AllProjectRolesByIdentityQuery(identityId))\n\n\t\t// Map of project_id -> set of roles held in that project.\n\t\tconst rolesByProject = new Map<string, Set<string>>()\n\t\tfor (const { projectId, role } of projectRoles) {\n\t\t\tlet set = rolesByProject.get(projectId)\n\t\t\tif (!set) {\n\t\t\t\tset = new Set<string>()\n\t\t\t\trolesByProject.set(projectId, set)\n\t\t\t}\n\t\t\tset.add(role)\n\t\t}\n\n\t\tconst globalRoleSet = new Set(globalRoles)\n\n\t\tconst matched = policies.filter(policy => this.matches(policy, globalRoleSet, rolesByProject))\n\n\t\treturn this.aggregate(matched)\n\t}\n\n\tprivate matches(policy: AuthPolicyRow, globalRoles: Set<string>, rolesByProject: Map<string, Set<string>>): boolean {\n\t\tif (policy.scope === 'global') {\n\t\t\treturn policy.roles.some(role => globalRoles.has(role))\n\t\t}\n\t\tif (policy.scope === 'project') {\n\t\t\tif (policy.project_id === null) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst projectRoles = rolesByProject.get(policy.project_id)\n\t\t\tif (!projectRoles) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn policy.roles.some(role => projectRoles.has(role))\n\t\t}\n\t\treturn false\n\t}\n\n\tprivate aggregate(policies: readonly AuthPolicyRow[]): EffectivePolicy {\n\t\tlet mfaRequired = false\n\t\tlet tokenExpiration: IPostgresInterval | null = null\n\t\tlet idleTimeout: IPostgresInterval | null = null\n\t\tlet graceDuration: IPostgresInterval | null = null\n\t\tlet rememberMeAllowed: boolean | null = null\n\n\t\tfor (const policy of policies) {\n\t\t\tif (policy.mfa_required === true) {\n\t\t\t\tmfaRequired = true\n\t\t\t}\n\t\t\ttokenExpiration = this.shortest(tokenExpiration, policy.token_expiration)\n\t\t\tidleTimeout = this.shortest(idleTimeout, policy.idle_timeout)\n\t\t\tgraceDuration = this.shortest(graceDuration, policy.grace_duration)\n\t\t\tif (policy.remember_me_allowed === false) {\n\t\t\t\trememberMeAllowed = false\n\t\t\t} else if (policy.remember_me_allowed === true && rememberMeAllowed === null) {\n\t\t\t\trememberMeAllowed = true\n\t\t\t}\n\t\t}\n\n\t\treturn { mfaRequired, tokenExpiration, idleTimeout, graceDuration, rememberMeAllowed }\n\t}\n\n\t/** Strictest wins: returns the shorter of two intervals (NULL = unconstrained). */\n\tprivate shortest(current: IPostgresInterval | null, candidate: IPostgresInterval | null): IPostgresInterval | null {\n\t\tif (candidate === null) {\n\t\t\treturn current\n\t\t}\n\t\tif (current === null) {\n\t\t\treturn candidate\n\t\t}\n\t\treturn intervalToSeconds(candidate) < intervalToSeconds(current) ? candidate : current\n\t}\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AuthPolicyResolver.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/AuthPolicyResolver.ts"],"sourcesContent":["import { DatabaseContext } from '../utils/index.js'\nimport { AllProjectRolesByIdentityQuery, AuthPoliciesQuery } from '../queries/index.js'\nimport { AuthPolicyRow, EffectivePolicy } from '../type/index.js'\nimport { IPostgresInterval } from 'postgres-interval'\nimport { intervalToSeconds } from '../utils/interval.js'\n\n/**\n * Resolves the effective auth policy for an identity by aggregating all matching\n * `auth_policy` rows across the identity's entire role set (global roles + every\n * project-membership role across all projects).\n *\n * Shared by A06 (consumes `mfaRequired`) and A19 (consumes the session fields).\n *\n * Aggregation:\n * - `mfaRequired` = OR of every matched row's `mfa_required` (NULL = no opinion).\n * - session fields = strictest wins: the shortest `tokenExpiration` / `idleTimeout`\n * and the logical AND of `rememberMeAllowed` (any matched `false` wins).\n *\n * When nothing matches, the result is the inert baseline\n * (`mfaRequired=false`, session fields null) — i.e. today's behavior.\n */\nexport class AuthPolicyResolver {\n\tasync resolveForIdentity(db: DatabaseContext, identityId: string, globalRoles: readonly string[]): Promise<EffectivePolicy> {\n\t\tconst policies = await db.queryHandler.fetch(new AuthPoliciesQuery())\n\t\t// Fast path: with no policies configured, enforcement is inert and we skip\n\t\t// the cross-project role query entirely (preserves today's query shape).\n\t\tif (policies.length === 0) {\n\t\t\treturn { mfaRequired: false, tokenExpiration: null, idleTimeout: null, graceDuration: null, rememberMeAllowed: null }\n\t\t}\n\t\tconst projectRoles = await db.queryHandler.fetch(new AllProjectRolesByIdentityQuery(identityId))\n\n\t\t// Map of project_id -> set of roles held in that project.\n\t\tconst rolesByProject = new Map<string, Set<string>>()\n\t\tfor (const { projectId, role } of projectRoles) {\n\t\t\tlet set = rolesByProject.get(projectId)\n\t\t\tif (!set) {\n\t\t\t\tset = new Set<string>()\n\t\t\t\trolesByProject.set(projectId, set)\n\t\t\t}\n\t\t\tset.add(role)\n\t\t}\n\n\t\tconst globalRoleSet = new Set(globalRoles)\n\n\t\tconst matched = policies.filter(policy => this.matches(policy, globalRoleSet, rolesByProject))\n\n\t\treturn this.aggregate(matched)\n\t}\n\n\tprivate matches(policy: AuthPolicyRow, globalRoles: Set<string>, rolesByProject: Map<string, Set<string>>): boolean {\n\t\tif (policy.scope === 'global') {\n\t\t\treturn policy.roles.some(role => globalRoles.has(role))\n\t\t}\n\t\tif (policy.scope === 'project') {\n\t\t\tif (policy.project_id === null) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst projectRoles = rolesByProject.get(policy.project_id)\n\t\t\tif (!projectRoles) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn policy.roles.some(role => projectRoles.has(role))\n\t\t}\n\t\treturn false\n\t}\n\n\tprivate aggregate(policies: readonly AuthPolicyRow[]): EffectivePolicy {\n\t\tlet mfaRequired = false\n\t\tlet tokenExpiration: IPostgresInterval | null = null\n\t\tlet idleTimeout: IPostgresInterval | null = null\n\t\tlet graceDuration: IPostgresInterval | null = null\n\t\tlet rememberMeAllowed: boolean | null = null\n\n\t\tfor (const policy of policies) {\n\t\t\tif (policy.mfa_required === true) {\n\t\t\t\tmfaRequired = true\n\t\t\t}\n\t\t\ttokenExpiration = this.shortest(tokenExpiration, policy.token_expiration)\n\t\t\tidleTimeout = this.shortest(idleTimeout, policy.idle_timeout)\n\t\t\tgraceDuration = this.shortest(graceDuration, policy.grace_duration)\n\t\t\tif (policy.remember_me_allowed === false) {\n\t\t\t\trememberMeAllowed = false\n\t\t\t} else if (policy.remember_me_allowed === true && rememberMeAllowed === null) {\n\t\t\t\trememberMeAllowed = true\n\t\t\t}\n\t\t}\n\n\t\treturn { mfaRequired, tokenExpiration, idleTimeout, graceDuration, rememberMeAllowed }\n\t}\n\n\t/** Strictest wins: returns the shorter of two intervals (NULL = unconstrained). */\n\tprivate shortest(current: IPostgresInterval | null, candidate: IPostgresInterval | null): IPostgresInterval | null {\n\t\tif (candidate === null) {\n\t\t\treturn current\n\t\t}\n\t\tif (current === null) {\n\t\t\treturn candidate\n\t\t}\n\t\treturn intervalToSeconds(candidate) < intervalToSeconds(current) ? candidate : current\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAqBO,MAAM,mBAAmB;AAAA,EAC/B,MAAM,mBAAmB,IAAqB,YAAoB,aAA0D;AAC3H,UAAM,WAAW,MAAM,GAAG,aAAa,MAAM,IAAI,mBAAmB;AAGpE,QAAI,SAAS,WAAW,GAAG;AAC1B,aAAO,EAAE,aAAa,OAAO,iBAAiB,MAAM,aAAa,MAAM,eAAe,MAAM,mBAAmB,KAAA;AAAA,IAChH;AACA,UAAM,eAAe,MAAM,GAAG,aAAa,MAAM,IAAI,+BAA+B,UAAU,CAAC;AAG/F,UAAM,qCAAqB,IAAA;AAC3B,eAAW,EAAE,WAAW,KAAA,KAAU,cAAc;AAC/C,UAAI,MAAM,eAAe,IAAI,SAAS;AACtC,UAAI,CAAC,KAAK;AACT,kCAAU,IAAA;AACV,uBAAe,IAAI,WAAW,GAAG;AAAA,MAClC;AACA,UAAI,IAAI,IAAI;AAAA,IACb;AAEA,UAAM,gBAAgB,IAAI,IAAI,WAAW;AAEzC,UAAM,UAAU,SAAS,OAAO,CAAA,WAAU,KAAK,QAAQ,QAAQ,eAAe,cAAc,CAAC;AAE7F,WAAO,KAAK,UAAU,OAAO;AAAA,EAC9B;AAAA,EAEQ,QAAQ,QAAuB,aAA0B,gBAAmD;AACnH,QAAI,OAAO,UAAU,UAAU;AAC9B,aAAO,OAAO,MAAM,KAAK,UAAQ,YAAY,IAAI,IAAI,CAAC;AAAA,IACvD;AACA,QAAI,OAAO,UAAU,WAAW;AAC/B,UAAI,OAAO,eAAe,MAAM;AAC/B,eAAO;AAAA,MACR;AACA,YAAM,eAAe,eAAe,IAAI,OAAO,UAAU;AACzD,UAAI,CAAC,cAAc;AAClB,eAAO;AAAA,MACR;AACA,aAAO,OAAO,MAAM,KAAK,UAAQ,aAAa,IAAI,IAAI,CAAC;AAAA,IACxD;AACA,WAAO;AAAA,EACR;AAAA,EAEQ,UAAU,UAAqD;AACtE,QAAI,cAAc;AAClB,QAAI,kBAA4C;AAChD,QAAI,cAAwC;AAC5C,QAAI,gBAA0C;AAC9C,QAAI,oBAAoC;AAExC,eAAW,UAAU,UAAU;AAC9B,UAAI,OAAO,iBAAiB,MAAM;AACjC,sBAAc;AAAA,MACf;AACA,wBAAkB,KAAK,SAAS,iBAAiB,OAAO,gBAAgB;AACxE,oBAAc,KAAK,SAAS,aAAa,OAAO,YAAY;AAC5D,sBAAgB,KAAK,SAAS,eAAe,OAAO,cAAc;AAClE,UAAI,OAAO,wBAAwB,OAAO;AACzC,4BAAoB;AAAA,MACrB,WAAW,OAAO,wBAAwB,QAAQ,sBAAsB,MAAM;AAC7E,4BAAoB;AAAA,MACrB;AAAA,IACD;AAEA,WAAO,EAAE,aAAa,iBAAiB,aAAa,eAAe,kBAAA;AAAA,EACpE;AAAA;AAAA,EAGQ,SAAS,SAAmC,WAA+D;AAClH,QAAI,cAAc,MAAM;AACvB,aAAO;AAAA,IACR;AACA,QAAI,YAAY,MAAM;AACrB,aAAO;AAAA,IACR;AACA,WAAO,kBAAkB,SAAS,IAAI,kBAAkB,OAAO,IAAI,YAAY;AAAA,EAChF;AACD;"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const Database = require("@contember/database");
|
|
4
|
+
const Response = require("../utils/Response.cjs");
|
|
5
|
+
require("../queries/apiKey/ApiKeyQuery.cjs");
|
|
6
|
+
require("../type/ApiKey.cjs");
|
|
7
|
+
const CustomRolesQuery = require("../queries/customRole/CustomRolesQuery.cjs");
|
|
8
|
+
const IdentitiesHoldingRoleCountQuery = require("../queries/identity/IdentitiesHoldingRoleCountQuery.cjs");
|
|
9
|
+
const ProjectsQuery = require("../queries/project/ProjectsQuery.cjs");
|
|
10
|
+
require("../authorization/PermissionActions.cjs");
|
|
11
|
+
require("@contember/authorization");
|
|
12
|
+
const Roles = require("../authorization/Roles.cjs");
|
|
13
|
+
const CustomRolePermissions = require("../authorization/CustomRolePermissions.cjs");
|
|
14
|
+
require("../authorization/PermissionContext.cjs");
|
|
15
|
+
require("../authorization/TargetIdentityPermission.cjs");
|
|
16
|
+
require("@contember/schema");
|
|
17
|
+
require("node:crypto");
|
|
18
|
+
const CreateCustomRoleCommand = require("../commands/customRole/CreateCustomRoleCommand.cjs");
|
|
19
|
+
const DeleteCustomRoleCommand = require("../commands/customRole/DeleteCustomRoleCommand.cjs");
|
|
20
|
+
const RemoveCustomRoleAssignmentsCommand = require("../commands/customRole/RemoveCustomRoleAssignmentsCommand.cjs");
|
|
21
|
+
const UpdateCustomRoleCommand = require("../commands/customRole/UpdateCustomRoleCommand.cjs");
|
|
22
|
+
const GlobalRoleValidator = require("./GlobalRoleValidator.cjs");
|
|
23
|
+
const SLUG_MAX_LENGTH = 64;
|
|
24
|
+
class CustomRoleManager {
|
|
25
|
+
constructor(globalRoleValidator = new GlobalRoleValidator.GlobalRoleValidator()) {
|
|
26
|
+
this.globalRoleValidator = globalRoleValidator;
|
|
27
|
+
}
|
|
28
|
+
async listRoles(db) {
|
|
29
|
+
const rows = await db.queryHandler.fetch(new CustomRolesQuery.CustomRolesQuery());
|
|
30
|
+
return rows.map((row) => this.toState(row));
|
|
31
|
+
}
|
|
32
|
+
async createRole(db, input) {
|
|
33
|
+
if (!Roles.ROLE_SLUG_PATTERN.test(input.slug) || input.slug.length > SLUG_MAX_LENGTH) {
|
|
34
|
+
return new Response.ResponseError("INVALID_SLUG", `Slug must match ${Roles.ROLE_SLUG_PATTERN} and be at most ${SLUG_MAX_LENGTH} characters long`);
|
|
35
|
+
}
|
|
36
|
+
if (CustomRolePermissions.BUILTIN_TENANT_ROLES.has(input.slug)) {
|
|
37
|
+
return new Response.ResponseError("INVALID_SLUG", `Slug ${input.slug} collides with a built-in role`);
|
|
38
|
+
}
|
|
39
|
+
const parsed = this.parseGrants(input.grants);
|
|
40
|
+
if (parsed instanceof Response.ResponseError) {
|
|
41
|
+
return parsed;
|
|
42
|
+
}
|
|
43
|
+
const referenceError = await this.validateReferences(db, parsed.referencedRoles, parsed.referencedProjects, /* @__PURE__ */ new Set([input.slug]));
|
|
44
|
+
if (referenceError !== null) {
|
|
45
|
+
return referenceError;
|
|
46
|
+
}
|
|
47
|
+
const existing = await db.queryHandler.fetch(new CustomRolesQuery.CustomRolesQuery({ slugs: [input.slug] }));
|
|
48
|
+
if (existing.length > 0) {
|
|
49
|
+
return new Response.ResponseError("SLUG_ALREADY_EXISTS", `Custom role ${input.slug} already exists`);
|
|
50
|
+
}
|
|
51
|
+
const holders = await db.queryHandler.fetch(new IdentitiesHoldingRoleCountQuery.IdentitiesHoldingRoleCountQuery(input.slug));
|
|
52
|
+
if (holders > 0) {
|
|
53
|
+
return new Response.ResponseError(
|
|
54
|
+
"SLUG_ALREADY_ASSIGNED",
|
|
55
|
+
`Role string ${input.slug} is already held by ${holders} identities; remove it from them before defining the role`
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
const id = await db.commandBus.execute(
|
|
59
|
+
new CreateCustomRoleCommand.CreateCustomRoleCommand({
|
|
60
|
+
slug: input.slug,
|
|
61
|
+
description: input.description,
|
|
62
|
+
grants: parsed.grants
|
|
63
|
+
})
|
|
64
|
+
);
|
|
65
|
+
return new Response.ResponseOk({
|
|
66
|
+
id,
|
|
67
|
+
role: {
|
|
68
|
+
slug: input.slug,
|
|
69
|
+
description: input.description,
|
|
70
|
+
grants: parsed.grants
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/** Maps the racing-insert failure the transaction could not report itself. */
|
|
75
|
+
static isSlugConflict(error) {
|
|
76
|
+
return error instanceof Database.UniqueViolationError;
|
|
77
|
+
}
|
|
78
|
+
async updateRole(db, slug, input) {
|
|
79
|
+
const [current] = await db.queryHandler.fetch(new CustomRolesQuery.CustomRolesQuery({ slugs: [slug], lock: Database.LockType.forUpdate }));
|
|
80
|
+
if (current === void 0) {
|
|
81
|
+
return new Response.ResponseError("NOT_FOUND", `Custom role ${slug} not found`);
|
|
82
|
+
}
|
|
83
|
+
let canonicalGrants;
|
|
84
|
+
if (input.grants !== void 0) {
|
|
85
|
+
const parsed = this.parseGrants(input.grants);
|
|
86
|
+
if (parsed instanceof Response.ResponseError) {
|
|
87
|
+
return parsed;
|
|
88
|
+
}
|
|
89
|
+
const referenceError = await this.validateReferences(db, parsed.referencedRoles, parsed.referencedProjects, /* @__PURE__ */ new Set([slug]));
|
|
90
|
+
if (referenceError !== null) {
|
|
91
|
+
return referenceError;
|
|
92
|
+
}
|
|
93
|
+
canonicalGrants = parsed.grants;
|
|
94
|
+
}
|
|
95
|
+
const before = this.toState(current);
|
|
96
|
+
const updated = await db.commandBus.execute(
|
|
97
|
+
new UpdateCustomRoleCommand.UpdateCustomRoleCommand(slug, {
|
|
98
|
+
description: input.description,
|
|
99
|
+
grants: canonicalGrants
|
|
100
|
+
})
|
|
101
|
+
);
|
|
102
|
+
if (!updated) {
|
|
103
|
+
return new Response.ResponseError("NOT_FOUND", `Custom role ${slug} not found`);
|
|
104
|
+
}
|
|
105
|
+
return new Response.ResponseOk({
|
|
106
|
+
before,
|
|
107
|
+
after: {
|
|
108
|
+
slug,
|
|
109
|
+
description: input.description === void 0 ? before.description : input.description,
|
|
110
|
+
grants: canonicalGrants ?? before.grants
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
async deleteRole(db, slug) {
|
|
115
|
+
const [current] = await db.queryHandler.fetch(new CustomRolesQuery.CustomRolesQuery({ slugs: [slug], lock: Database.LockType.forUpdate }));
|
|
116
|
+
if (current === void 0) {
|
|
117
|
+
return new Response.ResponseError("NOT_FOUND", `Custom role ${slug} not found`);
|
|
118
|
+
}
|
|
119
|
+
const referencedBy = (await db.queryHandler.fetch(new CustomRolesQuery.CustomRolesQuery())).filter((row) => row.slug !== slug && CustomRolePermissions.parsePersistedCustomRoleReferences(row.grants).includes(slug)).map((row) => row.slug);
|
|
120
|
+
if (referencedBy.length > 0) {
|
|
121
|
+
return new Response.ResponseError(
|
|
122
|
+
"ROLE_IN_USE",
|
|
123
|
+
`Custom role ${slug} is referenced by the grant configuration of ${referencedBy.join(", ")}`
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
const deleted = await db.commandBus.execute(new DeleteCustomRoleCommand.DeleteCustomRoleCommand(slug));
|
|
127
|
+
if (!deleted) {
|
|
128
|
+
return new Response.ResponseError("NOT_FOUND", `Custom role ${slug} not found`);
|
|
129
|
+
}
|
|
130
|
+
const removedAssignmentIdentityIds = await db.commandBus.execute(new RemoveCustomRoleAssignmentsCommand.RemoveCustomRoleAssignmentsCommand(slug));
|
|
131
|
+
return new Response.ResponseOk({
|
|
132
|
+
before: this.toState(current),
|
|
133
|
+
removedAssignments: removedAssignmentIdentityIds.length,
|
|
134
|
+
removedAssignmentIdentityIds
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
parseGrants(grants) {
|
|
138
|
+
try {
|
|
139
|
+
return CustomRolePermissions.parseCustomRoleGrants(grants);
|
|
140
|
+
} catch (error) {
|
|
141
|
+
if (error instanceof CustomRolePermissions.CustomRoleGrantValidationError) {
|
|
142
|
+
return new Response.ResponseError(error.code, error.message);
|
|
143
|
+
}
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async validateReferences(db, roles, projects, additionallyActiveRoles) {
|
|
148
|
+
const invalidRole = await this.globalRoleValidator.findInvalidRole(db, roles, additionallyActiveRoles);
|
|
149
|
+
if (invalidRole !== null) {
|
|
150
|
+
return new Response.ResponseError("INVALID_PERMISSION_CONFIGURATION", `Referenced role ${invalidRole} does not exist or is not globally assignable`);
|
|
151
|
+
}
|
|
152
|
+
if (projects.length > 0) {
|
|
153
|
+
const existingProjects = new Set((await db.queryHandler.fetch(new ProjectsQuery.ProjectsQuery())).map((project) => project.slug));
|
|
154
|
+
const missingProject = projects.find((project) => !existingProjects.has(project));
|
|
155
|
+
if (missingProject !== void 0) {
|
|
156
|
+
return new Response.ResponseError("INVALID_PERMISSION_CONFIGURATION", `Referenced project ${missingProject} does not exist`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
toState(row) {
|
|
162
|
+
return {
|
|
163
|
+
slug: row.slug,
|
|
164
|
+
description: row.description,
|
|
165
|
+
grants: CustomRolePermissions.parsePersistedCustomRoleGrants(row.grants)
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.CustomRoleManager = CustomRoleManager;
|
|
170
|
+
//# sourceMappingURL=CustomRoleManager.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomRoleManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/CustomRoleManager.ts"],"sourcesContent":["import { LockType, UniqueViolationError } from '@contember/database'\nimport { DatabaseContext } from '../utils/index.js'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response.js'\nimport { CustomRolesQuery, IdentitiesHoldingRoleCountQuery, ProjectsQuery } from '../queries/index.js'\nimport { CreateCustomRoleCommand, DeleteCustomRoleCommand, RemoveCustomRoleAssignmentsCommand, UpdateCustomRoleCommand } from '../commands/index.js'\nimport { CustomRoleRow } from '../type/index.js'\nimport {\n\tBUILTIN_TENANT_ROLES,\n\tCanonicalCustomRoleGrant,\n\tCustomRoleGrantValidationError,\n\tparseCustomRoleGrants,\n\tparsePersistedCustomRoleGrants,\n\tparsePersistedCustomRoleReferences,\n} from '../authorization/CustomRolePermissions.js'\nimport { ROLE_SLUG_PATTERN } from '../authorization/Roles.js'\nimport { CreateCustomRoleErrorCode, DeleteCustomRoleErrorCode, UpdateCustomRoleErrorCode } from '../../schema/index.js'\nimport { GlobalRoleValidator } from './GlobalRoleValidator.js'\n\nconst SLUG_MAX_LENGTH = 64\n\nexport type CustomRoleState = {\n\treadonly slug: string\n\treadonly description: string | null\n\treadonly grants: readonly CanonicalCustomRoleGrant[]\n}\n\ntype CreateResult = {\n\treadonly id: string\n\treadonly role: CustomRoleState\n}\n\ntype UpdateResult = {\n\treadonly before: CustomRoleState\n\treadonly after: CustomRoleState\n}\n\ntype DeleteResult = {\n\treadonly before: CustomRoleState\n\treadonly removedAssignments: number\n\t/** Which identities lost the role — a count alone cannot answer \"who lost what\" after the fact. */\n\treadonly removedAssignmentIdentityIds: readonly string[]\n}\n\nexport class CustomRoleManager {\n\tconstructor(\n\t\tprivate readonly globalRoleValidator: GlobalRoleValidator = new GlobalRoleValidator(),\n\t) {\n\t}\n\n\tasync listRoles(db: DatabaseContext): Promise<CustomRoleState[]> {\n\t\tconst rows = await db.queryHandler.fetch(new CustomRolesQuery())\n\t\treturn rows.map(row => this.toState(row))\n\t}\n\n\tasync createRole(\n\t\tdb: DatabaseContext,\n\t\tinput: { slug: string; description: string | null; grants: unknown },\n\t): Promise<Response<CreateResult, CreateCustomRoleErrorCode>> {\n\t\tif (!ROLE_SLUG_PATTERN.test(input.slug) || input.slug.length > SLUG_MAX_LENGTH) {\n\t\t\treturn new ResponseError('INVALID_SLUG', `Slug must match ${ROLE_SLUG_PATTERN} and be at most ${SLUG_MAX_LENGTH} characters long`)\n\t\t}\n\t\tif (BUILTIN_TENANT_ROLES.has(input.slug)) {\n\t\t\treturn new ResponseError('INVALID_SLUG', `Slug ${input.slug} collides with a built-in role`)\n\t\t}\n\t\tconst parsed = this.parseGrants(input.grants)\n\t\tif (parsed instanceof ResponseError) {\n\t\t\treturn parsed\n\t\t}\n\t\tconst referenceError = await this.validateReferences(db, parsed.referencedRoles, parsed.referencedProjects, new Set([input.slug]))\n\t\tif (referenceError !== null) {\n\t\t\treturn referenceError\n\t\t}\n\t\tconst existing = await db.queryHandler.fetch(new CustomRolesQuery({ slugs: [input.slug] }))\n\t\tif (existing.length > 0) {\n\t\t\treturn new ResponseError('SLUG_ALREADY_EXISTS', `Custom role ${input.slug} already exists`)\n\t\t}\n\t\t// Only legacy rows can match: every assignment path rejects a slug with no custom_role row,\n\t\t// so no concurrent writer can add one before this insert commits.\n\t\tconst holders = await db.queryHandler.fetch(new IdentitiesHoldingRoleCountQuery(input.slug))\n\t\tif (holders > 0) {\n\t\t\treturn new ResponseError(\n\t\t\t\t'SLUG_ALREADY_ASSIGNED',\n\t\t\t\t`Role string ${input.slug} is already held by ${holders} identities; remove it from them before defining the role`,\n\t\t\t)\n\t\t}\n\t\t// A racing INSERT aborts the transaction, so UniqueViolationError cannot be mapped\n\t\t// here — the caller catches it outside, once the transaction has rolled back.\n\t\tconst id = await db.commandBus.execute(\n\t\t\tnew CreateCustomRoleCommand({\n\t\t\t\tslug: input.slug,\n\t\t\t\tdescription: input.description,\n\t\t\t\tgrants: parsed.grants,\n\t\t\t}),\n\t\t)\n\t\treturn new ResponseOk({\n\t\t\tid,\n\t\t\trole: {\n\t\t\t\tslug: input.slug,\n\t\t\t\tdescription: input.description,\n\t\t\t\tgrants: parsed.grants,\n\t\t\t},\n\t\t})\n\t}\n\n\t/** Maps the racing-insert failure the transaction could not report itself. */\n\tstatic isSlugConflict(error: unknown): boolean {\n\t\treturn error instanceof UniqueViolationError\n\t}\n\n\tasync updateRole(\n\t\tdb: DatabaseContext,\n\t\tslug: string,\n\t\tinput: { description?: string | null; grants?: unknown },\n\t): Promise<Response<UpdateResult, UpdateCustomRoleErrorCode>> {\n\t\tconst [current] = await db.queryHandler.fetch(new CustomRolesQuery({ slugs: [slug], lock: LockType.forUpdate }))\n\t\tif (current === undefined) {\n\t\t\treturn new ResponseError('NOT_FOUND', `Custom role ${slug} not found`)\n\t\t}\n\t\tlet canonicalGrants: readonly CanonicalCustomRoleGrant[] | undefined\n\t\tif (input.grants !== undefined) {\n\t\t\tconst parsed = this.parseGrants(input.grants)\n\t\t\tif (parsed instanceof ResponseError) {\n\t\t\t\treturn parsed\n\t\t\t}\n\t\t\tconst referenceError = await this.validateReferences(db, parsed.referencedRoles, parsed.referencedProjects, new Set([slug]))\n\t\t\tif (referenceError !== null) {\n\t\t\t\treturn referenceError\n\t\t\t}\n\t\t\tcanonicalGrants = parsed.grants\n\t\t}\n\t\tconst before = this.toState(current)\n\t\tconst updated = await db.commandBus.execute(\n\t\t\tnew UpdateCustomRoleCommand(slug, {\n\t\t\t\tdescription: input.description,\n\t\t\t\tgrants: canonicalGrants,\n\t\t\t}),\n\t\t)\n\t\tif (!updated) {\n\t\t\treturn new ResponseError('NOT_FOUND', `Custom role ${slug} not found`)\n\t\t}\n\t\treturn new ResponseOk({\n\t\t\tbefore,\n\t\t\tafter: {\n\t\t\t\tslug,\n\t\t\t\tdescription: input.description === undefined ? before.description : input.description,\n\t\t\t\tgrants: canonicalGrants ?? before.grants,\n\t\t\t},\n\t\t})\n\t}\n\n\tasync deleteRole(db: DatabaseContext, slug: string): Promise<Response<DeleteResult, DeleteCustomRoleErrorCode>> {\n\t\tconst [current] = await db.queryHandler.fetch(new CustomRolesQuery({ slugs: [slug], lock: LockType.forUpdate }))\n\t\tif (current === undefined) {\n\t\t\treturn new ResponseError('NOT_FOUND', `Custom role ${slug} not found`)\n\t\t}\n\t\t// References live inside an opaque jsonb blob — no FK can catch this. Read the other rows\n\t\t// unlocked: a concurrent create/update naming this slug holds FOR SHARE on the row we\n\t\t// already hold FOR UPDATE, so the two serialize without a second lock (and without the\n\t\t// deadlock a reversed acquisition order would invite).\n\t\tconst referencedBy = (await db.queryHandler.fetch(new CustomRolesQuery()))\n\t\t\t.filter(row => row.slug !== slug && parsePersistedCustomRoleReferences(row.grants).includes(slug))\n\t\t\t.map(row => row.slug)\n\t\tif (referencedBy.length > 0) {\n\t\t\treturn new ResponseError(\n\t\t\t\t'ROLE_IN_USE',\n\t\t\t\t`Custom role ${slug} is referenced by the grant configuration of ${referencedBy.join(', ')}`,\n\t\t\t)\n\t\t}\n\t\tconst deleted = await db.commandBus.execute(new DeleteCustomRoleCommand(slug))\n\t\tif (!deleted) {\n\t\t\treturn new ResponseError('NOT_FOUND', `Custom role ${slug} not found`)\n\t\t}\n\t\tconst removedAssignmentIdentityIds = await db.commandBus.execute(new RemoveCustomRoleAssignmentsCommand(slug))\n\t\treturn new ResponseOk({\n\t\t\tbefore: this.toState(current),\n\t\t\tremovedAssignments: removedAssignmentIdentityIds.length,\n\t\t\tremovedAssignmentIdentityIds,\n\t\t})\n\t}\n\n\tprivate parseGrants(\n\t\tgrants: unknown,\n\t): ReturnType<typeof parseCustomRoleGrants> | ResponseError<'UNKNOWN_PERMISSION' | 'DUPLICATE_PERMISSION' | 'INVALID_PERMISSION_CONFIGURATION'> {\n\t\ttry {\n\t\t\treturn parseCustomRoleGrants(grants)\n\t\t} catch (error) {\n\t\t\tif (error instanceof CustomRoleGrantValidationError) {\n\t\t\t\treturn new ResponseError(error.code, error.message)\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tprivate async validateReferences(\n\t\tdb: DatabaseContext,\n\t\troles: readonly string[],\n\t\tprojects: readonly string[],\n\t\tadditionallyActiveRoles: ReadonlySet<string>,\n\t): Promise<ResponseError<'INVALID_PERMISSION_CONFIGURATION'> | null> {\n\t\tconst invalidRole = await this.globalRoleValidator.findInvalidRole(db, roles, additionallyActiveRoles)\n\t\tif (invalidRole !== null) {\n\t\t\treturn new ResponseError('INVALID_PERMISSION_CONFIGURATION', `Referenced role ${invalidRole} does not exist or is not globally assignable`)\n\t\t}\n\t\tif (projects.length > 0) {\n\t\t\tconst existingProjects = new Set((await db.queryHandler.fetch(new ProjectsQuery())).map(project => project.slug))\n\t\t\tconst missingProject = projects.find(project => !existingProjects.has(project))\n\t\t\tif (missingProject !== undefined) {\n\t\t\t\treturn new ResponseError('INVALID_PERMISSION_CONFIGURATION', `Referenced project ${missingProject} does not exist`)\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate toState(row: CustomRoleRow): CustomRoleState {\n\t\treturn {\n\t\t\tslug: row.slug,\n\t\t\tdescription: row.description,\n\t\t\tgrants: parsePersistedCustomRoleGrants(row.grants),\n\t\t}\n\t}\n}\n"],"names":["GlobalRoleValidator","CustomRolesQuery","ROLE_SLUG_PATTERN","ResponseError","BUILTIN_TENANT_ROLES","IdentitiesHoldingRoleCountQuery","CreateCustomRoleCommand","ResponseOk","UniqueViolationError","LockType","UpdateCustomRoleCommand","parsePersistedCustomRoleReferences","DeleteCustomRoleCommand","RemoveCustomRoleAssignmentsCommand","parseCustomRoleGrants","CustomRoleGrantValidationError","ProjectsQuery","parsePersistedCustomRoleGrants"],"mappings":"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"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { UniqueViolationError, LockType } from "@contember/database";
|
|
2
|
+
import { ResponseError, ResponseOk } from "../utils/Response.js";
|
|
3
|
+
import "../queries/apiKey/ApiKeyQuery.js";
|
|
4
|
+
import "../type/ApiKey.js";
|
|
5
|
+
import { CustomRolesQuery } from "../queries/customRole/CustomRolesQuery.js";
|
|
6
|
+
import { IdentitiesHoldingRoleCountQuery } from "../queries/identity/IdentitiesHoldingRoleCountQuery.js";
|
|
7
|
+
import { ProjectsQuery } from "../queries/project/ProjectsQuery.js";
|
|
8
|
+
import "../authorization/PermissionActions.js";
|
|
9
|
+
import "@contember/authorization";
|
|
10
|
+
import { ROLE_SLUG_PATTERN } from "../authorization/Roles.js";
|
|
11
|
+
import { BUILTIN_TENANT_ROLES, parsePersistedCustomRoleReferences, parseCustomRoleGrants, CustomRoleGrantValidationError, parsePersistedCustomRoleGrants } from "../authorization/CustomRolePermissions.js";
|
|
12
|
+
import "../authorization/PermissionContext.js";
|
|
13
|
+
import "../authorization/TargetIdentityPermission.js";
|
|
14
|
+
import "@contember/schema";
|
|
15
|
+
import "node:crypto";
|
|
16
|
+
import { CreateCustomRoleCommand } from "../commands/customRole/CreateCustomRoleCommand.js";
|
|
17
|
+
import { DeleteCustomRoleCommand } from "../commands/customRole/DeleteCustomRoleCommand.js";
|
|
18
|
+
import { RemoveCustomRoleAssignmentsCommand } from "../commands/customRole/RemoveCustomRoleAssignmentsCommand.js";
|
|
19
|
+
import { UpdateCustomRoleCommand } from "../commands/customRole/UpdateCustomRoleCommand.js";
|
|
20
|
+
import { GlobalRoleValidator } from "./GlobalRoleValidator.js";
|
|
21
|
+
const SLUG_MAX_LENGTH = 64;
|
|
22
|
+
class CustomRoleManager {
|
|
23
|
+
constructor(globalRoleValidator = new GlobalRoleValidator()) {
|
|
24
|
+
this.globalRoleValidator = globalRoleValidator;
|
|
25
|
+
}
|
|
26
|
+
async listRoles(db) {
|
|
27
|
+
const rows = await db.queryHandler.fetch(new CustomRolesQuery());
|
|
28
|
+
return rows.map((row) => this.toState(row));
|
|
29
|
+
}
|
|
30
|
+
async createRole(db, input) {
|
|
31
|
+
if (!ROLE_SLUG_PATTERN.test(input.slug) || input.slug.length > SLUG_MAX_LENGTH) {
|
|
32
|
+
return new ResponseError("INVALID_SLUG", `Slug must match ${ROLE_SLUG_PATTERN} and be at most ${SLUG_MAX_LENGTH} characters long`);
|
|
33
|
+
}
|
|
34
|
+
if (BUILTIN_TENANT_ROLES.has(input.slug)) {
|
|
35
|
+
return new ResponseError("INVALID_SLUG", `Slug ${input.slug} collides with a built-in role`);
|
|
36
|
+
}
|
|
37
|
+
const parsed = this.parseGrants(input.grants);
|
|
38
|
+
if (parsed instanceof ResponseError) {
|
|
39
|
+
return parsed;
|
|
40
|
+
}
|
|
41
|
+
const referenceError = await this.validateReferences(db, parsed.referencedRoles, parsed.referencedProjects, /* @__PURE__ */ new Set([input.slug]));
|
|
42
|
+
if (referenceError !== null) {
|
|
43
|
+
return referenceError;
|
|
44
|
+
}
|
|
45
|
+
const existing = await db.queryHandler.fetch(new CustomRolesQuery({ slugs: [input.slug] }));
|
|
46
|
+
if (existing.length > 0) {
|
|
47
|
+
return new ResponseError("SLUG_ALREADY_EXISTS", `Custom role ${input.slug} already exists`);
|
|
48
|
+
}
|
|
49
|
+
const holders = await db.queryHandler.fetch(new IdentitiesHoldingRoleCountQuery(input.slug));
|
|
50
|
+
if (holders > 0) {
|
|
51
|
+
return new ResponseError(
|
|
52
|
+
"SLUG_ALREADY_ASSIGNED",
|
|
53
|
+
`Role string ${input.slug} is already held by ${holders} identities; remove it from them before defining the role`
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
const id = await db.commandBus.execute(
|
|
57
|
+
new CreateCustomRoleCommand({
|
|
58
|
+
slug: input.slug,
|
|
59
|
+
description: input.description,
|
|
60
|
+
grants: parsed.grants
|
|
61
|
+
})
|
|
62
|
+
);
|
|
63
|
+
return new ResponseOk({
|
|
64
|
+
id,
|
|
65
|
+
role: {
|
|
66
|
+
slug: input.slug,
|
|
67
|
+
description: input.description,
|
|
68
|
+
grants: parsed.grants
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/** Maps the racing-insert failure the transaction could not report itself. */
|
|
73
|
+
static isSlugConflict(error) {
|
|
74
|
+
return error instanceof UniqueViolationError;
|
|
75
|
+
}
|
|
76
|
+
async updateRole(db, slug, input) {
|
|
77
|
+
const [current] = await db.queryHandler.fetch(new CustomRolesQuery({ slugs: [slug], lock: LockType.forUpdate }));
|
|
78
|
+
if (current === void 0) {
|
|
79
|
+
return new ResponseError("NOT_FOUND", `Custom role ${slug} not found`);
|
|
80
|
+
}
|
|
81
|
+
let canonicalGrants;
|
|
82
|
+
if (input.grants !== void 0) {
|
|
83
|
+
const parsed = this.parseGrants(input.grants);
|
|
84
|
+
if (parsed instanceof ResponseError) {
|
|
85
|
+
return parsed;
|
|
86
|
+
}
|
|
87
|
+
const referenceError = await this.validateReferences(db, parsed.referencedRoles, parsed.referencedProjects, /* @__PURE__ */ new Set([slug]));
|
|
88
|
+
if (referenceError !== null) {
|
|
89
|
+
return referenceError;
|
|
90
|
+
}
|
|
91
|
+
canonicalGrants = parsed.grants;
|
|
92
|
+
}
|
|
93
|
+
const before = this.toState(current);
|
|
94
|
+
const updated = await db.commandBus.execute(
|
|
95
|
+
new UpdateCustomRoleCommand(slug, {
|
|
96
|
+
description: input.description,
|
|
97
|
+
grants: canonicalGrants
|
|
98
|
+
})
|
|
99
|
+
);
|
|
100
|
+
if (!updated) {
|
|
101
|
+
return new ResponseError("NOT_FOUND", `Custom role ${slug} not found`);
|
|
102
|
+
}
|
|
103
|
+
return new ResponseOk({
|
|
104
|
+
before,
|
|
105
|
+
after: {
|
|
106
|
+
slug,
|
|
107
|
+
description: input.description === void 0 ? before.description : input.description,
|
|
108
|
+
grants: canonicalGrants ?? before.grants
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
async deleteRole(db, slug) {
|
|
113
|
+
const [current] = await db.queryHandler.fetch(new CustomRolesQuery({ slugs: [slug], lock: LockType.forUpdate }));
|
|
114
|
+
if (current === void 0) {
|
|
115
|
+
return new ResponseError("NOT_FOUND", `Custom role ${slug} not found`);
|
|
116
|
+
}
|
|
117
|
+
const referencedBy = (await db.queryHandler.fetch(new CustomRolesQuery())).filter((row) => row.slug !== slug && parsePersistedCustomRoleReferences(row.grants).includes(slug)).map((row) => row.slug);
|
|
118
|
+
if (referencedBy.length > 0) {
|
|
119
|
+
return new ResponseError(
|
|
120
|
+
"ROLE_IN_USE",
|
|
121
|
+
`Custom role ${slug} is referenced by the grant configuration of ${referencedBy.join(", ")}`
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
const deleted = await db.commandBus.execute(new DeleteCustomRoleCommand(slug));
|
|
125
|
+
if (!deleted) {
|
|
126
|
+
return new ResponseError("NOT_FOUND", `Custom role ${slug} not found`);
|
|
127
|
+
}
|
|
128
|
+
const removedAssignmentIdentityIds = await db.commandBus.execute(new RemoveCustomRoleAssignmentsCommand(slug));
|
|
129
|
+
return new ResponseOk({
|
|
130
|
+
before: this.toState(current),
|
|
131
|
+
removedAssignments: removedAssignmentIdentityIds.length,
|
|
132
|
+
removedAssignmentIdentityIds
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
parseGrants(grants) {
|
|
136
|
+
try {
|
|
137
|
+
return parseCustomRoleGrants(grants);
|
|
138
|
+
} catch (error) {
|
|
139
|
+
if (error instanceof CustomRoleGrantValidationError) {
|
|
140
|
+
return new ResponseError(error.code, error.message);
|
|
141
|
+
}
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async validateReferences(db, roles, projects, additionallyActiveRoles) {
|
|
146
|
+
const invalidRole = await this.globalRoleValidator.findInvalidRole(db, roles, additionallyActiveRoles);
|
|
147
|
+
if (invalidRole !== null) {
|
|
148
|
+
return new ResponseError("INVALID_PERMISSION_CONFIGURATION", `Referenced role ${invalidRole} does not exist or is not globally assignable`);
|
|
149
|
+
}
|
|
150
|
+
if (projects.length > 0) {
|
|
151
|
+
const existingProjects = new Set((await db.queryHandler.fetch(new ProjectsQuery())).map((project) => project.slug));
|
|
152
|
+
const missingProject = projects.find((project) => !existingProjects.has(project));
|
|
153
|
+
if (missingProject !== void 0) {
|
|
154
|
+
return new ResponseError("INVALID_PERMISSION_CONFIGURATION", `Referenced project ${missingProject} does not exist`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
toState(row) {
|
|
160
|
+
return {
|
|
161
|
+
slug: row.slug,
|
|
162
|
+
description: row.description,
|
|
163
|
+
grants: parsePersistedCustomRoleGrants(row.grants)
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
export {
|
|
168
|
+
CustomRoleManager
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=CustomRoleManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomRoleManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/CustomRoleManager.ts"],"sourcesContent":["import { LockType, UniqueViolationError } from '@contember/database'\nimport { DatabaseContext } from '../utils/index.js'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response.js'\nimport { CustomRolesQuery, IdentitiesHoldingRoleCountQuery, ProjectsQuery } from '../queries/index.js'\nimport { CreateCustomRoleCommand, DeleteCustomRoleCommand, RemoveCustomRoleAssignmentsCommand, UpdateCustomRoleCommand } from '../commands/index.js'\nimport { CustomRoleRow } from '../type/index.js'\nimport {\n\tBUILTIN_TENANT_ROLES,\n\tCanonicalCustomRoleGrant,\n\tCustomRoleGrantValidationError,\n\tparseCustomRoleGrants,\n\tparsePersistedCustomRoleGrants,\n\tparsePersistedCustomRoleReferences,\n} from '../authorization/CustomRolePermissions.js'\nimport { ROLE_SLUG_PATTERN } from '../authorization/Roles.js'\nimport { CreateCustomRoleErrorCode, DeleteCustomRoleErrorCode, UpdateCustomRoleErrorCode } from '../../schema/index.js'\nimport { GlobalRoleValidator } from './GlobalRoleValidator.js'\n\nconst SLUG_MAX_LENGTH = 64\n\nexport type CustomRoleState = {\n\treadonly slug: string\n\treadonly description: string | null\n\treadonly grants: readonly CanonicalCustomRoleGrant[]\n}\n\ntype CreateResult = {\n\treadonly id: string\n\treadonly role: CustomRoleState\n}\n\ntype UpdateResult = {\n\treadonly before: CustomRoleState\n\treadonly after: CustomRoleState\n}\n\ntype DeleteResult = {\n\treadonly before: CustomRoleState\n\treadonly removedAssignments: number\n\t/** Which identities lost the role — a count alone cannot answer \"who lost what\" after the fact. */\n\treadonly removedAssignmentIdentityIds: readonly string[]\n}\n\nexport class CustomRoleManager {\n\tconstructor(\n\t\tprivate readonly globalRoleValidator: GlobalRoleValidator = new GlobalRoleValidator(),\n\t) {\n\t}\n\n\tasync listRoles(db: DatabaseContext): Promise<CustomRoleState[]> {\n\t\tconst rows = await db.queryHandler.fetch(new CustomRolesQuery())\n\t\treturn rows.map(row => this.toState(row))\n\t}\n\n\tasync createRole(\n\t\tdb: DatabaseContext,\n\t\tinput: { slug: string; description: string | null; grants: unknown },\n\t): Promise<Response<CreateResult, CreateCustomRoleErrorCode>> {\n\t\tif (!ROLE_SLUG_PATTERN.test(input.slug) || input.slug.length > SLUG_MAX_LENGTH) {\n\t\t\treturn new ResponseError('INVALID_SLUG', `Slug must match ${ROLE_SLUG_PATTERN} and be at most ${SLUG_MAX_LENGTH} characters long`)\n\t\t}\n\t\tif (BUILTIN_TENANT_ROLES.has(input.slug)) {\n\t\t\treturn new ResponseError('INVALID_SLUG', `Slug ${input.slug} collides with a built-in role`)\n\t\t}\n\t\tconst parsed = this.parseGrants(input.grants)\n\t\tif (parsed instanceof ResponseError) {\n\t\t\treturn parsed\n\t\t}\n\t\tconst referenceError = await this.validateReferences(db, parsed.referencedRoles, parsed.referencedProjects, new Set([input.slug]))\n\t\tif (referenceError !== null) {\n\t\t\treturn referenceError\n\t\t}\n\t\tconst existing = await db.queryHandler.fetch(new CustomRolesQuery({ slugs: [input.slug] }))\n\t\tif (existing.length > 0) {\n\t\t\treturn new ResponseError('SLUG_ALREADY_EXISTS', `Custom role ${input.slug} already exists`)\n\t\t}\n\t\t// Only legacy rows can match: every assignment path rejects a slug with no custom_role row,\n\t\t// so no concurrent writer can add one before this insert commits.\n\t\tconst holders = await db.queryHandler.fetch(new IdentitiesHoldingRoleCountQuery(input.slug))\n\t\tif (holders > 0) {\n\t\t\treturn new ResponseError(\n\t\t\t\t'SLUG_ALREADY_ASSIGNED',\n\t\t\t\t`Role string ${input.slug} is already held by ${holders} identities; remove it from them before defining the role`,\n\t\t\t)\n\t\t}\n\t\t// A racing INSERT aborts the transaction, so UniqueViolationError cannot be mapped\n\t\t// here — the caller catches it outside, once the transaction has rolled back.\n\t\tconst id = await db.commandBus.execute(\n\t\t\tnew CreateCustomRoleCommand({\n\t\t\t\tslug: input.slug,\n\t\t\t\tdescription: input.description,\n\t\t\t\tgrants: parsed.grants,\n\t\t\t}),\n\t\t)\n\t\treturn new ResponseOk({\n\t\t\tid,\n\t\t\trole: {\n\t\t\t\tslug: input.slug,\n\t\t\t\tdescription: input.description,\n\t\t\t\tgrants: parsed.grants,\n\t\t\t},\n\t\t})\n\t}\n\n\t/** Maps the racing-insert failure the transaction could not report itself. */\n\tstatic isSlugConflict(error: unknown): boolean {\n\t\treturn error instanceof UniqueViolationError\n\t}\n\n\tasync updateRole(\n\t\tdb: DatabaseContext,\n\t\tslug: string,\n\t\tinput: { description?: string | null; grants?: unknown },\n\t): Promise<Response<UpdateResult, UpdateCustomRoleErrorCode>> {\n\t\tconst [current] = await db.queryHandler.fetch(new CustomRolesQuery({ slugs: [slug], lock: LockType.forUpdate }))\n\t\tif (current === undefined) {\n\t\t\treturn new ResponseError('NOT_FOUND', `Custom role ${slug} not found`)\n\t\t}\n\t\tlet canonicalGrants: readonly CanonicalCustomRoleGrant[] | undefined\n\t\tif (input.grants !== undefined) {\n\t\t\tconst parsed = this.parseGrants(input.grants)\n\t\t\tif (parsed instanceof ResponseError) {\n\t\t\t\treturn parsed\n\t\t\t}\n\t\t\tconst referenceError = await this.validateReferences(db, parsed.referencedRoles, parsed.referencedProjects, new Set([slug]))\n\t\t\tif (referenceError !== null) {\n\t\t\t\treturn referenceError\n\t\t\t}\n\t\t\tcanonicalGrants = parsed.grants\n\t\t}\n\t\tconst before = this.toState(current)\n\t\tconst updated = await db.commandBus.execute(\n\t\t\tnew UpdateCustomRoleCommand(slug, {\n\t\t\t\tdescription: input.description,\n\t\t\t\tgrants: canonicalGrants,\n\t\t\t}),\n\t\t)\n\t\tif (!updated) {\n\t\t\treturn new ResponseError('NOT_FOUND', `Custom role ${slug} not found`)\n\t\t}\n\t\treturn new ResponseOk({\n\t\t\tbefore,\n\t\t\tafter: {\n\t\t\t\tslug,\n\t\t\t\tdescription: input.description === undefined ? before.description : input.description,\n\t\t\t\tgrants: canonicalGrants ?? before.grants,\n\t\t\t},\n\t\t})\n\t}\n\n\tasync deleteRole(db: DatabaseContext, slug: string): Promise<Response<DeleteResult, DeleteCustomRoleErrorCode>> {\n\t\tconst [current] = await db.queryHandler.fetch(new CustomRolesQuery({ slugs: [slug], lock: LockType.forUpdate }))\n\t\tif (current === undefined) {\n\t\t\treturn new ResponseError('NOT_FOUND', `Custom role ${slug} not found`)\n\t\t}\n\t\t// References live inside an opaque jsonb blob — no FK can catch this. Read the other rows\n\t\t// unlocked: a concurrent create/update naming this slug holds FOR SHARE on the row we\n\t\t// already hold FOR UPDATE, so the two serialize without a second lock (and without the\n\t\t// deadlock a reversed acquisition order would invite).\n\t\tconst referencedBy = (await db.queryHandler.fetch(new CustomRolesQuery()))\n\t\t\t.filter(row => row.slug !== slug && parsePersistedCustomRoleReferences(row.grants).includes(slug))\n\t\t\t.map(row => row.slug)\n\t\tif (referencedBy.length > 0) {\n\t\t\treturn new ResponseError(\n\t\t\t\t'ROLE_IN_USE',\n\t\t\t\t`Custom role ${slug} is referenced by the grant configuration of ${referencedBy.join(', ')}`,\n\t\t\t)\n\t\t}\n\t\tconst deleted = await db.commandBus.execute(new DeleteCustomRoleCommand(slug))\n\t\tif (!deleted) {\n\t\t\treturn new ResponseError('NOT_FOUND', `Custom role ${slug} not found`)\n\t\t}\n\t\tconst removedAssignmentIdentityIds = await db.commandBus.execute(new RemoveCustomRoleAssignmentsCommand(slug))\n\t\treturn new ResponseOk({\n\t\t\tbefore: this.toState(current),\n\t\t\tremovedAssignments: removedAssignmentIdentityIds.length,\n\t\t\tremovedAssignmentIdentityIds,\n\t\t})\n\t}\n\n\tprivate parseGrants(\n\t\tgrants: unknown,\n\t): ReturnType<typeof parseCustomRoleGrants> | ResponseError<'UNKNOWN_PERMISSION' | 'DUPLICATE_PERMISSION' | 'INVALID_PERMISSION_CONFIGURATION'> {\n\t\ttry {\n\t\t\treturn parseCustomRoleGrants(grants)\n\t\t} catch (error) {\n\t\t\tif (error instanceof CustomRoleGrantValidationError) {\n\t\t\t\treturn new ResponseError(error.code, error.message)\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tprivate async validateReferences(\n\t\tdb: DatabaseContext,\n\t\troles: readonly string[],\n\t\tprojects: readonly string[],\n\t\tadditionallyActiveRoles: ReadonlySet<string>,\n\t): Promise<ResponseError<'INVALID_PERMISSION_CONFIGURATION'> | null> {\n\t\tconst invalidRole = await this.globalRoleValidator.findInvalidRole(db, roles, additionallyActiveRoles)\n\t\tif (invalidRole !== null) {\n\t\t\treturn new ResponseError('INVALID_PERMISSION_CONFIGURATION', `Referenced role ${invalidRole} does not exist or is not globally assignable`)\n\t\t}\n\t\tif (projects.length > 0) {\n\t\t\tconst existingProjects = new Set((await db.queryHandler.fetch(new ProjectsQuery())).map(project => project.slug))\n\t\t\tconst missingProject = projects.find(project => !existingProjects.has(project))\n\t\t\tif (missingProject !== undefined) {\n\t\t\t\treturn new ResponseError('INVALID_PERMISSION_CONFIGURATION', `Referenced project ${missingProject} does not exist`)\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate toState(row: CustomRoleRow): CustomRoleState {\n\t\treturn {\n\t\t\tslug: row.slug,\n\t\t\tdescription: row.description,\n\t\t\tgrants: parsePersistedCustomRoleGrants(row.grants),\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -8,8 +8,9 @@ const exceptions = require("../../exceptions.cjs");
|
|
|
8
8
|
const PersonQuery = require("../queries/person/PersonQuery.cjs");
|
|
9
9
|
require("../authorization/PermissionActions.cjs");
|
|
10
10
|
require("@contember/authorization");
|
|
11
|
+
require("../authorization/CustomRolePermissions.cjs");
|
|
11
12
|
require("../authorization/PermissionContext.cjs");
|
|
12
|
-
require("../authorization/
|
|
13
|
+
require("../authorization/TargetIdentityPermission.cjs");
|
|
13
14
|
require("@contember/schema");
|
|
14
15
|
const getPreferredProject = require("./helpers/getPreferredProject.cjs");
|
|
15
16
|
const token = require("../utils/token.cjs");
|
|
@@ -41,10 +42,10 @@ class EmailChangeManager {
|
|
|
41
42
|
if (validationError !== null) {
|
|
42
43
|
return new Response.ResponseError(validationError.error, validationError.errorMessage);
|
|
43
44
|
}
|
|
44
|
-
const
|
|
45
|
+
const retryAfter = await dbContext.queryHandler.fetch(
|
|
45
46
|
new NextMailAttemptQuery.NextMailAttemptQuery(normalizedNewEmail, "email_change_init", "email_change_complete")
|
|
46
47
|
);
|
|
47
|
-
if (
|
|
48
|
+
if (retryAfter > 0) {
|
|
48
49
|
return new Response.ResponseError("RATE_LIMIT_EXCEEDED", "Too many e-mail change requests for this address.");
|
|
49
50
|
}
|
|
50
51
|
const projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext);
|
|
@@ -74,7 +75,7 @@ class EmailChangeManager {
|
|
|
74
75
|
}
|
|
75
76
|
async confirmEmailChange(dbContext, token$1) {
|
|
76
77
|
const tokenRow = await dbContext.queryHandler.fetch(PersonTokenQuery.PersonTokenQuery.byToken(token$1, "email_change"));
|
|
77
|
-
const validation = token.validateToken({ entry: tokenRow, token: token$1,
|
|
78
|
+
const validation = token.validateToken({ entry: tokenRow, token: token$1, validationType: "token" });
|
|
78
79
|
if (!validation.ok) {
|
|
79
80
|
return new Response.ResponseError(validation.error, validation.errorMessage, {
|
|
80
81
|
[AuthLogService.AuthLogService.Key]: new AuthLogService.AuthLogService.Bag(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailChangeManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/EmailChangeManager.ts"],"sourcesContent":["import { Response, ResponseError, ResponseOk } from '../utils/Response.js'\nimport { UserMailer } from '../mailing/index.js'\nimport { PersonQuery, PersonRow } from '../queries/index.js'\nimport { PermissionContext, PermissionContextFactory } from '../authorization/index.js'\nimport { ProjectManager } from './ProjectManager.js'\nimport { ApiKeyManager } from './apiKey/index.js'\nimport { EmailValidator, EmailValidatorError } from './EmailValidator.js'\nimport { DatabaseContext } from '../utils/index.js'\nimport { ImplementationException } from '../../exceptions.js'\nimport { getPreferredProject } from './helpers/getPreferredProject.js'\nimport { CreatePersonTokenCommand, InvalidateTokenCommand, MarkEmailVerifiedCommand } from '../commands/index.js'\nimport { PersonTokenQuery } from '../queries/personToken/PersonTokenQuery.js'\nimport { NextMailAttemptQuery } from '../queries/authLog/NextMailAttemptQuery.js'\nimport { validateToken } from '../utils/index.js'\nimport { normalizeEmail } from '../utils/email.js'\nimport { PersonToken } from '../type/index.js'\nimport { UniqueViolationError } from '@contember/database'\nimport { AuthLogService } from './AuthLogService.js'\n\ninterface MailOptions {\n\tproject?: string\n\tmailVariant?: string\n}\n\nexport class EmailChangeManager {\n\tconstructor(\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t\tprivate readonly emailValidator: EmailValidator,\n\t\tprivate readonly apiKeyManager: ApiKeyManager,\n\t\tprivate readonly permissionContextFactory: PermissionContextFactory,\n\t) {}\n\n\t/**\n\t * Request an e-mail change. Validation and rate-limiting run BEFORE any\n\t * write, so a rejected request never leaves a half-applied profile (e.g. a\n\t * persisted name change without the e-mail change going through). Any\n\t * immediate side-changes the caller wants applied atomically with the token\n\t * (the name change) are passed via `applyWithinTransaction`.\n\t */\n\tpublic async requestEmailChange(\n\t\tdbContext: DatabaseContext,\n\t\tpermissionContext: PermissionContext,\n\t\tperson: PersonRow,\n\t\tnewEmail: string,\n\t\tmailOptions: MailOptions = {},\n\t\tapplyWithinTransaction?: (db: DatabaseContext) => Promise<void>,\n\t): Promise<RequestEmailChangeResponse> {\n\t\tconst normalizedNewEmail = normalizeEmail(newEmail)\n\t\tconst validationError = await this.emailValidator.validateEmail(dbContext, normalizedNewEmail)\n\t\tif (validationError !== null) {\n\t\t\treturn new ResponseError(validationError.error, validationError.errorMessage)\n\t\t}\n\n\t\t// Per-recipient exponential backoff: an authenticated user (or a hijacked\n\t\t// session) must not be able to flood an arbitrary address with\n\t\t// \"confirm your new e-mail\" mails. Keyed on the normalized NEW address so\n\t\t// the `email_change_init` auth-log entries (written with the same\n\t\t// normalized address) actually drive the backoff. Reuses login_* config.\n\t\tconst nextAllowed = await dbContext.queryHandler.fetch(\n\t\t\tnew NextMailAttemptQuery(normalizedNewEmail, 'email_change_init', 'email_change_complete'),\n\t\t)\n\t\tif (nextAllowed > dbContext.providers.now()) {\n\t\t\treturn new ResponseError('RATE_LIMIT_EXCEEDED', 'Too many e-mail change requests for this address.')\n\t\t}\n\n\t\tconst projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext)\n\t\tconst project = getPreferredProject(projects, mailOptions.project ?? null)\n\n\t\tawait dbContext.transaction(async db => {\n\t\t\tif (applyWithinTransaction) {\n\t\t\t\tawait applyWithinTransaction(db)\n\t\t\t}\n\t\t\tconst result = await db.commandBus.execute(\n\t\t\t\tCreatePersonTokenCommand.createEmailChangeRequest(person.id, normalizedNewEmail),\n\t\t\t)\n\t\t\t// The verification link goes to the NEW address — clicking it proves\n\t\t\t// ownership of the address being switched to, which is the whole point.\n\t\t\tawait this.mailer.sendEmailChangeVerifyEmail(\n\t\t\t\tdb,\n\t\t\t\t{\n\t\t\t\t\temail: normalizedNewEmail,\n\t\t\t\t\ttoken: result.token,\n\t\t\t\t\tproject: project?.name,\n\t\t\t\t\tprojectSlug: project?.slug,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tvariant: mailOptions.mailVariant || '',\n\t\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t\t},\n\t\t\t)\n\t\t})\n\t\treturn new ResponseOk(null)\n\t}\n\n\tpublic async confirmEmailChange(dbContext: DatabaseContext, token: string): Promise<ConfirmEmailChangeResponse> {\n\t\tconst tokenRow = await dbContext.queryHandler.fetch(PersonTokenQuery.byToken(token, 'email_change'))\n\t\tconst validation = validateToken({ entry: tokenRow, token, now: dbContext.providers.now(), validationType: 'token' })\n\t\tif (!validation.ok) {\n\t\t\t// Tie the failure to a person/token in the audit log when we can, even\n\t\t\t// for an invalid/expired token (matches verifyEmail / password reset).\n\t\t\treturn new ResponseError(validation.error, validation.errorMessage, {\n\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag(\n\t\t\t\t\ttokenRow ? { personId: tokenRow.person_id, tokenId: tokenRow.id } : {},\n\t\t\t\t),\n\t\t\t})\n\t\t}\n\t\tconst authLogData = new AuthLogService.Bag({\n\t\t\tpersonId: validation.result.person_id,\n\t\t\ttokenId: validation.result.id,\n\t\t})\n\t\tconst newEmail = validation.result.meta?.email\n\t\tif (!newEmail) {\n\t\t\tthrow new ImplementationException('email_change token is missing its email payload')\n\t\t}\n\n\t\tconst person = await dbContext.queryHandler.fetch(PersonQuery.byId(validation.result.person_id))\n\t\tif (!person) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\t// Re-check uniqueness at confirmation time: another account may have\n\t\t// claimed the address between request and confirmation.\n\t\tconst validationError = await this.emailValidator.validateEmail(dbContext, newEmail)\n\t\tif (validationError !== null) {\n\t\t\treturn new ResponseError(validationError.error, validationError.errorMessage, {\n\t\t\t\t[AuthLogService.Key]: authLogData,\n\t\t\t})\n\t\t}\n\n\t\tconst oldEmail = person.email\n\t\ttry {\n\t\t\tawait dbContext.transaction(async db => {\n\t\t\t\tawait db.commandBus.execute(new InvalidateTokenCommand(validation.result.id))\n\t\t\t\tawait db.commandBus.execute(new MarkEmailVerifiedCommand(person.id, newEmail))\n\t\t\t\t// An email change is a takeover-grade event: drop every existing\n\t\t\t\t// session so a stale attacker session cannot ride the new address.\n\t\t\t\tawait this.apiKeyManager.disableIdentityApiKeys(db, person.identity_id)\n\t\t\t})\n\t\t} catch (e) {\n\t\t\t// The uniqueness re-check above narrows but cannot fully close the\n\t\t\t// window: another account may claim the address between the check and\n\t\t\t// this UPDATE. The unique index is the real guard — translate its\n\t\t\t// violation into a clean error instead of leaking a 500.\n\t\t\tif (e instanceof UniqueViolationError) {\n\t\t\t\treturn new ResponseError('EMAIL_ALREADY_EXISTS', `User with email ${newEmail} already exists`, {\n\t\t\t\t\t[AuthLogService.Key]: authLogData,\n\t\t\t\t})\n\t\t\t}\n\t\t\tthrow e\n\t\t}\n\n\t\tif (oldEmail) {\n\t\t\t// Resolve the person's preferred project so a per-project\n\t\t\t// EMAIL_CHANGE_NOTIFY template (and branding) is honoured, mirroring\n\t\t\t// requestEmailChange. The token carries no project, so derive it from the\n\t\t\t// person's own identity.\n\t\t\tconst permissionContext = this.permissionContextFactory.create(dbContext, {\n\t\t\t\tid: person.identity_id,\n\t\t\t\troles: person.roles,\n\t\t\t})\n\t\t\tconst projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext)\n\t\t\tconst project = getPreferredProject(projects, null)\n\t\t\tawait this.mailer.sendEmailChangeNotifyEmail(\n\t\t\t\tdbContext,\n\t\t\t\t{ email: oldEmail, newEmail, project: project?.name, projectSlug: project?.slug },\n\t\t\t\t{ projectId: project?.id ?? null, variant: '' },\n\t\t\t)\n\t\t}\n\n\t\treturn new ResponseOk({ personId: person.id, newEmail, [AuthLogService.Key]: authLogData })\n\t}\n}\n\nexport type RequestEmailChangeResponse = Response<null, EmailValidatorError | 'RATE_LIMIT_EXCEEDED'>\n\nexport type ConfirmEmailChangeResponse = Response<\n\t{ personId: string; newEmail: string; [AuthLogService.Key]: AuthLogService.Bag },\n\tPersonToken.TokenValidationError | EmailValidatorError,\n\t{ [AuthLogService.Key]: AuthLogService.Bag }\n>\n"],"names":["normalizeEmail","ResponseError","NextMailAttemptQuery","getPreferredProject","CreatePersonTokenCommand","ResponseOk","token","PersonTokenQuery","validateToken","AuthLogService","ImplementationException","PersonQuery","InvalidateTokenCommand","MarkEmailVerifiedCommand","UniqueViolationError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EmailChangeManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/EmailChangeManager.ts"],"sourcesContent":["import { Response, ResponseError, ResponseOk } from '../utils/Response.js'\nimport { UserMailer } from '../mailing/index.js'\nimport { PersonQuery, PersonRow } from '../queries/index.js'\nimport { PermissionContext, PermissionContextFactory } from '../authorization/index.js'\nimport { ProjectManager } from './ProjectManager.js'\nimport { ApiKeyManager } from './apiKey/index.js'\nimport { EmailValidator, EmailValidatorError } from './EmailValidator.js'\nimport { DatabaseContext } from '../utils/index.js'\nimport { ImplementationException } from '../../exceptions.js'\nimport { getPreferredProject } from './helpers/getPreferredProject.js'\nimport { CreatePersonTokenCommand, InvalidateTokenCommand, MarkEmailVerifiedCommand } from '../commands/index.js'\nimport { PersonTokenQuery } from '../queries/personToken/PersonTokenQuery.js'\nimport { NextMailAttemptQuery } from '../queries/authLog/NextMailAttemptQuery.js'\nimport { validateToken } from '../utils/index.js'\nimport { normalizeEmail } from '../utils/email.js'\nimport { PersonToken } from '../type/index.js'\nimport { UniqueViolationError } from '@contember/database'\nimport { AuthLogService } from './AuthLogService.js'\n\ninterface MailOptions {\n\tproject?: string\n\tmailVariant?: string\n}\n\nexport class EmailChangeManager {\n\tconstructor(\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t\tprivate readonly emailValidator: EmailValidator,\n\t\tprivate readonly apiKeyManager: ApiKeyManager,\n\t\tprivate readonly permissionContextFactory: PermissionContextFactory,\n\t) {}\n\n\t/**\n\t * Request an e-mail change. Validation and rate-limiting run BEFORE any\n\t * write, so a rejected request never leaves a half-applied profile (e.g. a\n\t * persisted name change without the e-mail change going through). Any\n\t * immediate side-changes the caller wants applied atomically with the token\n\t * (the name change) are passed via `applyWithinTransaction`.\n\t */\n\tpublic async requestEmailChange(\n\t\tdbContext: DatabaseContext,\n\t\tpermissionContext: PermissionContext,\n\t\tperson: PersonRow,\n\t\tnewEmail: string,\n\t\tmailOptions: MailOptions = {},\n\t\tapplyWithinTransaction?: (db: DatabaseContext) => Promise<void>,\n\t): Promise<RequestEmailChangeResponse> {\n\t\tconst normalizedNewEmail = normalizeEmail(newEmail)\n\t\tconst validationError = await this.emailValidator.validateEmail(dbContext, normalizedNewEmail)\n\t\tif (validationError !== null) {\n\t\t\treturn new ResponseError(validationError.error, validationError.errorMessage)\n\t\t}\n\n\t\t// Per-recipient exponential backoff: an authenticated user (or a hijacked\n\t\t// session) must not be able to flood an arbitrary address with\n\t\t// \"confirm your new e-mail\" mails. Keyed on the normalized NEW address so\n\t\t// the `email_change_init` auth-log entries (written with the same\n\t\t// normalized address) actually drive the backoff. Reuses login_* config.\n\t\tconst retryAfter = await dbContext.queryHandler.fetch(\n\t\t\tnew NextMailAttemptQuery(normalizedNewEmail, 'email_change_init', 'email_change_complete'),\n\t\t)\n\t\tif (retryAfter > 0) {\n\t\t\treturn new ResponseError('RATE_LIMIT_EXCEEDED', 'Too many e-mail change requests for this address.')\n\t\t}\n\n\t\tconst projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext)\n\t\tconst project = getPreferredProject(projects, mailOptions.project ?? null)\n\n\t\tawait dbContext.transaction(async db => {\n\t\t\tif (applyWithinTransaction) {\n\t\t\t\tawait applyWithinTransaction(db)\n\t\t\t}\n\t\t\tconst result = await db.commandBus.execute(\n\t\t\t\tCreatePersonTokenCommand.createEmailChangeRequest(person.id, normalizedNewEmail),\n\t\t\t)\n\t\t\t// The verification link goes to the NEW address — clicking it proves\n\t\t\t// ownership of the address being switched to, which is the whole point.\n\t\t\tawait this.mailer.sendEmailChangeVerifyEmail(\n\t\t\t\tdb,\n\t\t\t\t{\n\t\t\t\t\temail: normalizedNewEmail,\n\t\t\t\t\ttoken: result.token,\n\t\t\t\t\tproject: project?.name,\n\t\t\t\t\tprojectSlug: project?.slug,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tvariant: mailOptions.mailVariant || '',\n\t\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t\t},\n\t\t\t)\n\t\t})\n\t\treturn new ResponseOk(null)\n\t}\n\n\tpublic async confirmEmailChange(dbContext: DatabaseContext, token: string): Promise<ConfirmEmailChangeResponse> {\n\t\tconst tokenRow = await dbContext.queryHandler.fetch(PersonTokenQuery.byToken(token, 'email_change'))\n\t\tconst validation = validateToken({ entry: tokenRow, token, validationType: 'token' })\n\t\tif (!validation.ok) {\n\t\t\t// Tie the failure to a person/token in the audit log when we can, even\n\t\t\t// for an invalid/expired token (matches verifyEmail / password reset).\n\t\t\treturn new ResponseError(validation.error, validation.errorMessage, {\n\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag(\n\t\t\t\t\ttokenRow ? { personId: tokenRow.person_id, tokenId: tokenRow.id } : {},\n\t\t\t\t),\n\t\t\t})\n\t\t}\n\t\tconst authLogData = new AuthLogService.Bag({\n\t\t\tpersonId: validation.result.person_id,\n\t\t\ttokenId: validation.result.id,\n\t\t})\n\t\tconst newEmail = validation.result.meta?.email\n\t\tif (!newEmail) {\n\t\t\tthrow new ImplementationException('email_change token is missing its email payload')\n\t\t}\n\n\t\tconst person = await dbContext.queryHandler.fetch(PersonQuery.byId(validation.result.person_id))\n\t\tif (!person) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\t// Re-check uniqueness at confirmation time: another account may have\n\t\t// claimed the address between request and confirmation.\n\t\tconst validationError = await this.emailValidator.validateEmail(dbContext, newEmail)\n\t\tif (validationError !== null) {\n\t\t\treturn new ResponseError(validationError.error, validationError.errorMessage, {\n\t\t\t\t[AuthLogService.Key]: authLogData,\n\t\t\t})\n\t\t}\n\n\t\tconst oldEmail = person.email\n\t\ttry {\n\t\t\tawait dbContext.transaction(async db => {\n\t\t\t\tawait db.commandBus.execute(new InvalidateTokenCommand(validation.result.id))\n\t\t\t\tawait db.commandBus.execute(new MarkEmailVerifiedCommand(person.id, newEmail))\n\t\t\t\t// An email change is a takeover-grade event: drop every existing\n\t\t\t\t// session so a stale attacker session cannot ride the new address.\n\t\t\t\tawait this.apiKeyManager.disableIdentityApiKeys(db, person.identity_id)\n\t\t\t})\n\t\t} catch (e) {\n\t\t\t// The uniqueness re-check above narrows but cannot fully close the\n\t\t\t// window: another account may claim the address between the check and\n\t\t\t// this UPDATE. The unique index is the real guard — translate its\n\t\t\t// violation into a clean error instead of leaking a 500.\n\t\t\tif (e instanceof UniqueViolationError) {\n\t\t\t\treturn new ResponseError('EMAIL_ALREADY_EXISTS', `User with email ${newEmail} already exists`, {\n\t\t\t\t\t[AuthLogService.Key]: authLogData,\n\t\t\t\t})\n\t\t\t}\n\t\t\tthrow e\n\t\t}\n\n\t\tif (oldEmail) {\n\t\t\t// Resolve the person's preferred project so a per-project\n\t\t\t// EMAIL_CHANGE_NOTIFY template (and branding) is honoured, mirroring\n\t\t\t// requestEmailChange. The token carries no project, so derive it from the\n\t\t\t// person's own identity.\n\t\t\tconst permissionContext = this.permissionContextFactory.create(dbContext, {\n\t\t\t\tid: person.identity_id,\n\t\t\t\troles: person.roles,\n\t\t\t})\n\t\t\tconst projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext)\n\t\t\tconst project = getPreferredProject(projects, null)\n\t\t\tawait this.mailer.sendEmailChangeNotifyEmail(\n\t\t\t\tdbContext,\n\t\t\t\t{ email: oldEmail, newEmail, project: project?.name, projectSlug: project?.slug },\n\t\t\t\t{ projectId: project?.id ?? null, variant: '' },\n\t\t\t)\n\t\t}\n\n\t\treturn new ResponseOk({ personId: person.id, newEmail, [AuthLogService.Key]: authLogData })\n\t}\n}\n\nexport type RequestEmailChangeResponse = Response<null, EmailValidatorError | 'RATE_LIMIT_EXCEEDED'>\n\nexport type ConfirmEmailChangeResponse = Response<\n\t{ personId: string; newEmail: string; [AuthLogService.Key]: AuthLogService.Bag },\n\tPersonToken.TokenValidationError | EmailValidatorError,\n\t{ [AuthLogService.Key]: AuthLogService.Bag }\n>\n"],"names":["normalizeEmail","ResponseError","NextMailAttemptQuery","getPreferredProject","CreatePersonTokenCommand","ResponseOk","token","PersonTokenQuery","validateToken","AuthLogService","ImplementationException","PersonQuery","InvalidateTokenCommand","MarkEmailVerifiedCommand","UniqueViolationError"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAwBO,MAAM,mBAAmB;AAAA,EAC/B,YACkB,QACA,gBACA,gBACA,eACA,0BAChB;AALgB,SAAA,SAAA;AACA,SAAA,iBAAA;AACA,SAAA,iBAAA;AACA,SAAA,gBAAA;AACA,SAAA,2BAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASH,MAAa,mBACZ,WACA,mBACA,QACA,UACA,cAA2B,CAAA,GAC3B,wBACsC;AACtC,UAAM,qBAAqBA,MAAAA,eAAe,QAAQ;AAClD,UAAM,kBAAkB,MAAM,KAAK,eAAe,cAAc,WAAW,kBAAkB;AAC7F,QAAI,oBAAoB,MAAM;AAC7B,aAAO,IAAIC,SAAAA,cAAc,gBAAgB,OAAO,gBAAgB,YAAY;AAAA,IAC7E;AAOA,UAAM,aAAa,MAAM,UAAU,aAAa;AAAA,MAC/C,IAAIC,qBAAAA,qBAAqB,oBAAoB,qBAAqB,uBAAuB;AAAA,IAAA;AAE1F,QAAI,aAAa,GAAG;AACnB,aAAO,IAAID,SAAAA,cAAc,uBAAuB,mDAAmD;AAAA,IACpG;AAEA,UAAM,WAAW,MAAM,KAAK,eAAe,sBAAsB,WAAW,OAAO,aAAa,iBAAiB;AACjH,UAAM,UAAUE,oBAAAA,oBAAoB,UAAU,YAAY,WAAW,IAAI;AAEzE,UAAM,UAAU,YAAY,OAAM,OAAM;AACvC,UAAI,wBAAwB;AAC3B,cAAM,uBAAuB,EAAE;AAAA,MAChC;AACA,YAAM,SAAS,MAAM,GAAG,WAAW;AAAA,QAClCC,yBAAAA,yBAAyB,yBAAyB,OAAO,IAAI,kBAAkB;AAAA,MAAA;AAIhF,YAAM,KAAK,OAAO;AAAA,QACjB;AAAA,QACA;AAAA,UACC,OAAO;AAAA,UACP,OAAO,OAAO;AAAA,UACd,SAAS,SAAS;AAAA,UAClB,aAAa,SAAS;AAAA,QAAA;AAAA,QAEvB;AAAA,UACC,SAAS,YAAY,eAAe;AAAA,UACpC,WAAW,SAAS,MAAM;AAAA,QAAA;AAAA,MAC3B;AAAA,IAEF,CAAC;AACD,WAAO,IAAIC,SAAAA,WAAW,IAAI;AAAA,EAC3B;AAAA,EAEA,MAAa,mBAAmB,WAA4BC,SAAoD;AAC/G,UAAM,WAAW,MAAM,UAAU,aAAa,MAAMC,iBAAAA,iBAAiB,QAAQD,SAAO,cAAc,CAAC;AACnG,UAAM,aAAaE,MAAAA,cAAc,EAAE,OAAO,iBAAUF,SAAO,gBAAgB,SAAS;AACpF,QAAI,CAAC,WAAW,IAAI;AAGnB,aAAO,IAAIL,SAAAA,cAAc,WAAW,OAAO,WAAW,cAAc;AAAA,QACnE,CAACQ,8BAAe,GAAG,GAAG,IAAIA,eAAAA,eAAe;AAAA,UACxC,WAAW,EAAE,UAAU,SAAS,WAAW,SAAS,SAAS,OAAO,CAAA;AAAA,QAAC;AAAA,MACtE,CACA;AAAA,IACF;AACA,UAAM,cAAc,IAAIA,eAAAA,eAAe,IAAI;AAAA,MAC1C,UAAU,WAAW,OAAO;AAAA,MAC5B,SAAS,WAAW,OAAO;AAAA,IAAA,CAC3B;AACD,UAAM,WAAW,WAAW,OAAO,MAAM;AACzC,QAAI,CAAC,UAAU;AACd,YAAM,IAAIC,WAAAA,wBAAwB,iDAAiD;AAAA,IACpF;AAEA,UAAM,SAAS,MAAM,UAAU,aAAa,MAAMC,wBAAY,KAAK,WAAW,OAAO,SAAS,CAAC;AAC/F,QAAI,CAAC,QAAQ;AACZ,YAAM,IAAID,WAAAA,wBAAA;AAAA,IACX;AAIA,UAAM,kBAAkB,MAAM,KAAK,eAAe,cAAc,WAAW,QAAQ;AACnF,QAAI,oBAAoB,MAAM;AAC7B,aAAO,IAAIT,SAAAA,cAAc,gBAAgB,OAAO,gBAAgB,cAAc;AAAA,QAC7E,CAACQ,eAAAA,eAAe,GAAG,GAAG;AAAA,MAAA,CACtB;AAAA,IACF;AAEA,UAAM,WAAW,OAAO;AACxB,QAAI;AACH,YAAM,UAAU,YAAY,OAAM,OAAM;AACvC,cAAM,GAAG,WAAW,QAAQ,IAAIG,uBAAAA,uBAAuB,WAAW,OAAO,EAAE,CAAC;AAC5E,cAAM,GAAG,WAAW,QAAQ,IAAIC,yBAAAA,yBAAyB,OAAO,IAAI,QAAQ,CAAC;AAG7E,cAAM,KAAK,cAAc,uBAAuB,IAAI,OAAO,WAAW;AAAA,MACvE,CAAC;AAAA,IACF,SAAS,GAAG;AAKX,UAAI,aAAaC,SAAAA,sBAAsB;AACtC,eAAO,IAAIb,SAAAA,cAAc,wBAAwB,mBAAmB,QAAQ,mBAAmB;AAAA,UAC9F,CAACQ,eAAAA,eAAe,GAAG,GAAG;AAAA,QAAA,CACtB;AAAA,MACF;AACA,YAAM;AAAA,IACP;AAEA,QAAI,UAAU;AAKb,YAAM,oBAAoB,KAAK,yBAAyB,OAAO,WAAW;AAAA,QACzE,IAAI,OAAO;AAAA,QACX,OAAO,OAAO;AAAA,MAAA,CACd;AACD,YAAM,WAAW,MAAM,KAAK,eAAe,sBAAsB,WAAW,OAAO,aAAa,iBAAiB;AACjH,YAAM,UAAUN,oBAAAA,oBAAoB,UAAU,IAAI;AAClD,YAAM,KAAK,OAAO;AAAA,QACjB;AAAA,QACA,EAAE,OAAO,UAAU,UAAU,SAAS,SAAS,MAAM,aAAa,SAAS,KAAA;AAAA,QAC3E,EAAE,WAAW,SAAS,MAAM,MAAM,SAAS,GAAA;AAAA,MAAG;AAAA,IAEhD;AAEA,WAAO,IAAIE,SAAAA,WAAW,EAAE,UAAU,OAAO,IAAI,UAAU,CAACI,eAAAA,eAAe,GAAG,GAAG,aAAa;AAAA,EAC3F;AACD;;"}
|
|
@@ -6,8 +6,9 @@ import { ImplementationException } from "../../exceptions.js";
|
|
|
6
6
|
import { PersonQuery } from "../queries/person/PersonQuery.js";
|
|
7
7
|
import "../authorization/PermissionActions.js";
|
|
8
8
|
import "@contember/authorization";
|
|
9
|
+
import "../authorization/CustomRolePermissions.js";
|
|
9
10
|
import "../authorization/PermissionContext.js";
|
|
10
|
-
import "../authorization/
|
|
11
|
+
import "../authorization/TargetIdentityPermission.js";
|
|
11
12
|
import "@contember/schema";
|
|
12
13
|
import { getPreferredProject } from "./helpers/getPreferredProject.js";
|
|
13
14
|
import { validateToken } from "../utils/token.js";
|
|
@@ -39,10 +40,10 @@ class EmailChangeManager {
|
|
|
39
40
|
if (validationError !== null) {
|
|
40
41
|
return new ResponseError(validationError.error, validationError.errorMessage);
|
|
41
42
|
}
|
|
42
|
-
const
|
|
43
|
+
const retryAfter = await dbContext.queryHandler.fetch(
|
|
43
44
|
new NextMailAttemptQuery(normalizedNewEmail, "email_change_init", "email_change_complete")
|
|
44
45
|
);
|
|
45
|
-
if (
|
|
46
|
+
if (retryAfter > 0) {
|
|
46
47
|
return new ResponseError("RATE_LIMIT_EXCEEDED", "Too many e-mail change requests for this address.");
|
|
47
48
|
}
|
|
48
49
|
const projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext);
|
|
@@ -72,7 +73,7 @@ class EmailChangeManager {
|
|
|
72
73
|
}
|
|
73
74
|
async confirmEmailChange(dbContext, token) {
|
|
74
75
|
const tokenRow = await dbContext.queryHandler.fetch(PersonTokenQuery.byToken(token, "email_change"));
|
|
75
|
-
const validation = validateToken({ entry: tokenRow, token,
|
|
76
|
+
const validation = validateToken({ entry: tokenRow, token, validationType: "token" });
|
|
76
77
|
if (!validation.ok) {
|
|
77
78
|
return new ResponseError(validation.error, validation.errorMessage, {
|
|
78
79
|
[AuthLogService.Key]: new AuthLogService.Bag(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailChangeManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/EmailChangeManager.ts"],"sourcesContent":["import { Response, ResponseError, ResponseOk } from '../utils/Response.js'\nimport { UserMailer } from '../mailing/index.js'\nimport { PersonQuery, PersonRow } from '../queries/index.js'\nimport { PermissionContext, PermissionContextFactory } from '../authorization/index.js'\nimport { ProjectManager } from './ProjectManager.js'\nimport { ApiKeyManager } from './apiKey/index.js'\nimport { EmailValidator, EmailValidatorError } from './EmailValidator.js'\nimport { DatabaseContext } from '../utils/index.js'\nimport { ImplementationException } from '../../exceptions.js'\nimport { getPreferredProject } from './helpers/getPreferredProject.js'\nimport { CreatePersonTokenCommand, InvalidateTokenCommand, MarkEmailVerifiedCommand } from '../commands/index.js'\nimport { PersonTokenQuery } from '../queries/personToken/PersonTokenQuery.js'\nimport { NextMailAttemptQuery } from '../queries/authLog/NextMailAttemptQuery.js'\nimport { validateToken } from '../utils/index.js'\nimport { normalizeEmail } from '../utils/email.js'\nimport { PersonToken } from '../type/index.js'\nimport { UniqueViolationError } from '@contember/database'\nimport { AuthLogService } from './AuthLogService.js'\n\ninterface MailOptions {\n\tproject?: string\n\tmailVariant?: string\n}\n\nexport class EmailChangeManager {\n\tconstructor(\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t\tprivate readonly emailValidator: EmailValidator,\n\t\tprivate readonly apiKeyManager: ApiKeyManager,\n\t\tprivate readonly permissionContextFactory: PermissionContextFactory,\n\t) {}\n\n\t/**\n\t * Request an e-mail change. Validation and rate-limiting run BEFORE any\n\t * write, so a rejected request never leaves a half-applied profile (e.g. a\n\t * persisted name change without the e-mail change going through). Any\n\t * immediate side-changes the caller wants applied atomically with the token\n\t * (the name change) are passed via `applyWithinTransaction`.\n\t */\n\tpublic async requestEmailChange(\n\t\tdbContext: DatabaseContext,\n\t\tpermissionContext: PermissionContext,\n\t\tperson: PersonRow,\n\t\tnewEmail: string,\n\t\tmailOptions: MailOptions = {},\n\t\tapplyWithinTransaction?: (db: DatabaseContext) => Promise<void>,\n\t): Promise<RequestEmailChangeResponse> {\n\t\tconst normalizedNewEmail = normalizeEmail(newEmail)\n\t\tconst validationError = await this.emailValidator.validateEmail(dbContext, normalizedNewEmail)\n\t\tif (validationError !== null) {\n\t\t\treturn new ResponseError(validationError.error, validationError.errorMessage)\n\t\t}\n\n\t\t// Per-recipient exponential backoff: an authenticated user (or a hijacked\n\t\t// session) must not be able to flood an arbitrary address with\n\t\t// \"confirm your new e-mail\" mails. Keyed on the normalized NEW address so\n\t\t// the `email_change_init` auth-log entries (written with the same\n\t\t// normalized address) actually drive the backoff. Reuses login_* config.\n\t\tconst nextAllowed = await dbContext.queryHandler.fetch(\n\t\t\tnew NextMailAttemptQuery(normalizedNewEmail, 'email_change_init', 'email_change_complete'),\n\t\t)\n\t\tif (nextAllowed > dbContext.providers.now()) {\n\t\t\treturn new ResponseError('RATE_LIMIT_EXCEEDED', 'Too many e-mail change requests for this address.')\n\t\t}\n\n\t\tconst projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext)\n\t\tconst project = getPreferredProject(projects, mailOptions.project ?? null)\n\n\t\tawait dbContext.transaction(async db => {\n\t\t\tif (applyWithinTransaction) {\n\t\t\t\tawait applyWithinTransaction(db)\n\t\t\t}\n\t\t\tconst result = await db.commandBus.execute(\n\t\t\t\tCreatePersonTokenCommand.createEmailChangeRequest(person.id, normalizedNewEmail),\n\t\t\t)\n\t\t\t// The verification link goes to the NEW address — clicking it proves\n\t\t\t// ownership of the address being switched to, which is the whole point.\n\t\t\tawait this.mailer.sendEmailChangeVerifyEmail(\n\t\t\t\tdb,\n\t\t\t\t{\n\t\t\t\t\temail: normalizedNewEmail,\n\t\t\t\t\ttoken: result.token,\n\t\t\t\t\tproject: project?.name,\n\t\t\t\t\tprojectSlug: project?.slug,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tvariant: mailOptions.mailVariant || '',\n\t\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t\t},\n\t\t\t)\n\t\t})\n\t\treturn new ResponseOk(null)\n\t}\n\n\tpublic async confirmEmailChange(dbContext: DatabaseContext, token: string): Promise<ConfirmEmailChangeResponse> {\n\t\tconst tokenRow = await dbContext.queryHandler.fetch(PersonTokenQuery.byToken(token, 'email_change'))\n\t\tconst validation = validateToken({ entry: tokenRow, token, now: dbContext.providers.now(), validationType: 'token' })\n\t\tif (!validation.ok) {\n\t\t\t// Tie the failure to a person/token in the audit log when we can, even\n\t\t\t// for an invalid/expired token (matches verifyEmail / password reset).\n\t\t\treturn new ResponseError(validation.error, validation.errorMessage, {\n\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag(\n\t\t\t\t\ttokenRow ? { personId: tokenRow.person_id, tokenId: tokenRow.id } : {},\n\t\t\t\t),\n\t\t\t})\n\t\t}\n\t\tconst authLogData = new AuthLogService.Bag({\n\t\t\tpersonId: validation.result.person_id,\n\t\t\ttokenId: validation.result.id,\n\t\t})\n\t\tconst newEmail = validation.result.meta?.email\n\t\tif (!newEmail) {\n\t\t\tthrow new ImplementationException('email_change token is missing its email payload')\n\t\t}\n\n\t\tconst person = await dbContext.queryHandler.fetch(PersonQuery.byId(validation.result.person_id))\n\t\tif (!person) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\t// Re-check uniqueness at confirmation time: another account may have\n\t\t// claimed the address between request and confirmation.\n\t\tconst validationError = await this.emailValidator.validateEmail(dbContext, newEmail)\n\t\tif (validationError !== null) {\n\t\t\treturn new ResponseError(validationError.error, validationError.errorMessage, {\n\t\t\t\t[AuthLogService.Key]: authLogData,\n\t\t\t})\n\t\t}\n\n\t\tconst oldEmail = person.email\n\t\ttry {\n\t\t\tawait dbContext.transaction(async db => {\n\t\t\t\tawait db.commandBus.execute(new InvalidateTokenCommand(validation.result.id))\n\t\t\t\tawait db.commandBus.execute(new MarkEmailVerifiedCommand(person.id, newEmail))\n\t\t\t\t// An email change is a takeover-grade event: drop every existing\n\t\t\t\t// session so a stale attacker session cannot ride the new address.\n\t\t\t\tawait this.apiKeyManager.disableIdentityApiKeys(db, person.identity_id)\n\t\t\t})\n\t\t} catch (e) {\n\t\t\t// The uniqueness re-check above narrows but cannot fully close the\n\t\t\t// window: another account may claim the address between the check and\n\t\t\t// this UPDATE. The unique index is the real guard — translate its\n\t\t\t// violation into a clean error instead of leaking a 500.\n\t\t\tif (e instanceof UniqueViolationError) {\n\t\t\t\treturn new ResponseError('EMAIL_ALREADY_EXISTS', `User with email ${newEmail} already exists`, {\n\t\t\t\t\t[AuthLogService.Key]: authLogData,\n\t\t\t\t})\n\t\t\t}\n\t\t\tthrow e\n\t\t}\n\n\t\tif (oldEmail) {\n\t\t\t// Resolve the person's preferred project so a per-project\n\t\t\t// EMAIL_CHANGE_NOTIFY template (and branding) is honoured, mirroring\n\t\t\t// requestEmailChange. The token carries no project, so derive it from the\n\t\t\t// person's own identity.\n\t\t\tconst permissionContext = this.permissionContextFactory.create(dbContext, {\n\t\t\t\tid: person.identity_id,\n\t\t\t\troles: person.roles,\n\t\t\t})\n\t\t\tconst projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext)\n\t\t\tconst project = getPreferredProject(projects, null)\n\t\t\tawait this.mailer.sendEmailChangeNotifyEmail(\n\t\t\t\tdbContext,\n\t\t\t\t{ email: oldEmail, newEmail, project: project?.name, projectSlug: project?.slug },\n\t\t\t\t{ projectId: project?.id ?? null, variant: '' },\n\t\t\t)\n\t\t}\n\n\t\treturn new ResponseOk({ personId: person.id, newEmail, [AuthLogService.Key]: authLogData })\n\t}\n}\n\nexport type RequestEmailChangeResponse = Response<null, EmailValidatorError | 'RATE_LIMIT_EXCEEDED'>\n\nexport type ConfirmEmailChangeResponse = Response<\n\t{ personId: string; newEmail: string; [AuthLogService.Key]: AuthLogService.Bag },\n\tPersonToken.TokenValidationError | EmailValidatorError,\n\t{ [AuthLogService.Key]: AuthLogService.Bag }\n>\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EmailChangeManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/EmailChangeManager.ts"],"sourcesContent":["import { Response, ResponseError, ResponseOk } from '../utils/Response.js'\nimport { UserMailer } from '../mailing/index.js'\nimport { PersonQuery, PersonRow } from '../queries/index.js'\nimport { PermissionContext, PermissionContextFactory } from '../authorization/index.js'\nimport { ProjectManager } from './ProjectManager.js'\nimport { ApiKeyManager } from './apiKey/index.js'\nimport { EmailValidator, EmailValidatorError } from './EmailValidator.js'\nimport { DatabaseContext } from '../utils/index.js'\nimport { ImplementationException } from '../../exceptions.js'\nimport { getPreferredProject } from './helpers/getPreferredProject.js'\nimport { CreatePersonTokenCommand, InvalidateTokenCommand, MarkEmailVerifiedCommand } from '../commands/index.js'\nimport { PersonTokenQuery } from '../queries/personToken/PersonTokenQuery.js'\nimport { NextMailAttemptQuery } from '../queries/authLog/NextMailAttemptQuery.js'\nimport { validateToken } from '../utils/index.js'\nimport { normalizeEmail } from '../utils/email.js'\nimport { PersonToken } from '../type/index.js'\nimport { UniqueViolationError } from '@contember/database'\nimport { AuthLogService } from './AuthLogService.js'\n\ninterface MailOptions {\n\tproject?: string\n\tmailVariant?: string\n}\n\nexport class EmailChangeManager {\n\tconstructor(\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t\tprivate readonly emailValidator: EmailValidator,\n\t\tprivate readonly apiKeyManager: ApiKeyManager,\n\t\tprivate readonly permissionContextFactory: PermissionContextFactory,\n\t) {}\n\n\t/**\n\t * Request an e-mail change. Validation and rate-limiting run BEFORE any\n\t * write, so a rejected request never leaves a half-applied profile (e.g. a\n\t * persisted name change without the e-mail change going through). Any\n\t * immediate side-changes the caller wants applied atomically with the token\n\t * (the name change) are passed via `applyWithinTransaction`.\n\t */\n\tpublic async requestEmailChange(\n\t\tdbContext: DatabaseContext,\n\t\tpermissionContext: PermissionContext,\n\t\tperson: PersonRow,\n\t\tnewEmail: string,\n\t\tmailOptions: MailOptions = {},\n\t\tapplyWithinTransaction?: (db: DatabaseContext) => Promise<void>,\n\t): Promise<RequestEmailChangeResponse> {\n\t\tconst normalizedNewEmail = normalizeEmail(newEmail)\n\t\tconst validationError = await this.emailValidator.validateEmail(dbContext, normalizedNewEmail)\n\t\tif (validationError !== null) {\n\t\t\treturn new ResponseError(validationError.error, validationError.errorMessage)\n\t\t}\n\n\t\t// Per-recipient exponential backoff: an authenticated user (or a hijacked\n\t\t// session) must not be able to flood an arbitrary address with\n\t\t// \"confirm your new e-mail\" mails. Keyed on the normalized NEW address so\n\t\t// the `email_change_init` auth-log entries (written with the same\n\t\t// normalized address) actually drive the backoff. Reuses login_* config.\n\t\tconst retryAfter = await dbContext.queryHandler.fetch(\n\t\t\tnew NextMailAttemptQuery(normalizedNewEmail, 'email_change_init', 'email_change_complete'),\n\t\t)\n\t\tif (retryAfter > 0) {\n\t\t\treturn new ResponseError('RATE_LIMIT_EXCEEDED', 'Too many e-mail change requests for this address.')\n\t\t}\n\n\t\tconst projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext)\n\t\tconst project = getPreferredProject(projects, mailOptions.project ?? null)\n\n\t\tawait dbContext.transaction(async db => {\n\t\t\tif (applyWithinTransaction) {\n\t\t\t\tawait applyWithinTransaction(db)\n\t\t\t}\n\t\t\tconst result = await db.commandBus.execute(\n\t\t\t\tCreatePersonTokenCommand.createEmailChangeRequest(person.id, normalizedNewEmail),\n\t\t\t)\n\t\t\t// The verification link goes to the NEW address — clicking it proves\n\t\t\t// ownership of the address being switched to, which is the whole point.\n\t\t\tawait this.mailer.sendEmailChangeVerifyEmail(\n\t\t\t\tdb,\n\t\t\t\t{\n\t\t\t\t\temail: normalizedNewEmail,\n\t\t\t\t\ttoken: result.token,\n\t\t\t\t\tproject: project?.name,\n\t\t\t\t\tprojectSlug: project?.slug,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tvariant: mailOptions.mailVariant || '',\n\t\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t\t},\n\t\t\t)\n\t\t})\n\t\treturn new ResponseOk(null)\n\t}\n\n\tpublic async confirmEmailChange(dbContext: DatabaseContext, token: string): Promise<ConfirmEmailChangeResponse> {\n\t\tconst tokenRow = await dbContext.queryHandler.fetch(PersonTokenQuery.byToken(token, 'email_change'))\n\t\tconst validation = validateToken({ entry: tokenRow, token, validationType: 'token' })\n\t\tif (!validation.ok) {\n\t\t\t// Tie the failure to a person/token in the audit log when we can, even\n\t\t\t// for an invalid/expired token (matches verifyEmail / password reset).\n\t\t\treturn new ResponseError(validation.error, validation.errorMessage, {\n\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag(\n\t\t\t\t\ttokenRow ? { personId: tokenRow.person_id, tokenId: tokenRow.id } : {},\n\t\t\t\t),\n\t\t\t})\n\t\t}\n\t\tconst authLogData = new AuthLogService.Bag({\n\t\t\tpersonId: validation.result.person_id,\n\t\t\ttokenId: validation.result.id,\n\t\t})\n\t\tconst newEmail = validation.result.meta?.email\n\t\tif (!newEmail) {\n\t\t\tthrow new ImplementationException('email_change token is missing its email payload')\n\t\t}\n\n\t\tconst person = await dbContext.queryHandler.fetch(PersonQuery.byId(validation.result.person_id))\n\t\tif (!person) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\t// Re-check uniqueness at confirmation time: another account may have\n\t\t// claimed the address between request and confirmation.\n\t\tconst validationError = await this.emailValidator.validateEmail(dbContext, newEmail)\n\t\tif (validationError !== null) {\n\t\t\treturn new ResponseError(validationError.error, validationError.errorMessage, {\n\t\t\t\t[AuthLogService.Key]: authLogData,\n\t\t\t})\n\t\t}\n\n\t\tconst oldEmail = person.email\n\t\ttry {\n\t\t\tawait dbContext.transaction(async db => {\n\t\t\t\tawait db.commandBus.execute(new InvalidateTokenCommand(validation.result.id))\n\t\t\t\tawait db.commandBus.execute(new MarkEmailVerifiedCommand(person.id, newEmail))\n\t\t\t\t// An email change is a takeover-grade event: drop every existing\n\t\t\t\t// session so a stale attacker session cannot ride the new address.\n\t\t\t\tawait this.apiKeyManager.disableIdentityApiKeys(db, person.identity_id)\n\t\t\t})\n\t\t} catch (e) {\n\t\t\t// The uniqueness re-check above narrows but cannot fully close the\n\t\t\t// window: another account may claim the address between the check and\n\t\t\t// this UPDATE. The unique index is the real guard — translate its\n\t\t\t// violation into a clean error instead of leaking a 500.\n\t\t\tif (e instanceof UniqueViolationError) {\n\t\t\t\treturn new ResponseError('EMAIL_ALREADY_EXISTS', `User with email ${newEmail} already exists`, {\n\t\t\t\t\t[AuthLogService.Key]: authLogData,\n\t\t\t\t})\n\t\t\t}\n\t\t\tthrow e\n\t\t}\n\n\t\tif (oldEmail) {\n\t\t\t// Resolve the person's preferred project so a per-project\n\t\t\t// EMAIL_CHANGE_NOTIFY template (and branding) is honoured, mirroring\n\t\t\t// requestEmailChange. The token carries no project, so derive it from the\n\t\t\t// person's own identity.\n\t\t\tconst permissionContext = this.permissionContextFactory.create(dbContext, {\n\t\t\t\tid: person.identity_id,\n\t\t\t\troles: person.roles,\n\t\t\t})\n\t\t\tconst projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext)\n\t\t\tconst project = getPreferredProject(projects, null)\n\t\t\tawait this.mailer.sendEmailChangeNotifyEmail(\n\t\t\t\tdbContext,\n\t\t\t\t{ email: oldEmail, newEmail, project: project?.name, projectSlug: project?.slug },\n\t\t\t\t{ projectId: project?.id ?? null, variant: '' },\n\t\t\t)\n\t\t}\n\n\t\treturn new ResponseOk({ personId: person.id, newEmail, [AuthLogService.Key]: authLogData })\n\t}\n}\n\nexport type RequestEmailChangeResponse = Response<null, EmailValidatorError | 'RATE_LIMIT_EXCEEDED'>\n\nexport type ConfirmEmailChangeResponse = Response<\n\t{ personId: string; newEmail: string; [AuthLogService.Key]: AuthLogService.Bag },\n\tPersonToken.TokenValidationError | EmailValidatorError,\n\t{ [AuthLogService.Key]: AuthLogService.Bag }\n>\n"],"names":[],"mappings":"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"}
|