@contember/engine-tenant-api 2.1.0-alpha.16 → 2.1.0-alpha.18
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/dist/development/index.cjs +5 -6
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +2 -3
- package/dist/development/src/TenantContainer.cjs +4 -2
- package/dist/development/src/TenantContainer.cjs.map +1 -1
- package/dist/development/src/TenantContainer.js +4 -2
- package/dist/development/src/TenantContainer.js.map +1 -1
- package/dist/development/src/bridges/system/IdentityFetcher.cjs +1 -0
- package/dist/development/src/bridges/system/IdentityFetcher.cjs.map +1 -1
- package/dist/development/src/bridges/system/IdentityFetcher.js +1 -0
- package/dist/development/src/bridges/system/IdentityFetcher.js.map +1 -1
- package/dist/development/src/migrations/2025-04-16-180000-config-up.cjs +39 -0
- package/dist/development/src/migrations/2025-04-16-180000-config-up.cjs.map +1 -0
- package/dist/development/src/migrations/2025-04-16-180000-config-up.js +40 -0
- package/dist/development/src/migrations/2025-04-16-180000-config-up.js.map +1 -0
- package/dist/development/src/migrations/2025-04-17-160000-auth-log.cjs +45 -0
- package/dist/development/src/migrations/2025-04-17-160000-auth-log.cjs.map +1 -0
- package/dist/development/src/migrations/2025-04-17-160000-auth-log.js +46 -0
- package/dist/development/src/migrations/2025-04-17-160000-auth-log.js.map +1 -0
- package/dist/development/src/migrations/runner.cjs +9 -4
- package/dist/development/src/migrations/runner.cjs.map +1 -1
- package/dist/development/src/migrations/runner.js +7 -2
- package/dist/development/src/migrations/runner.js.map +1 -1
- package/dist/development/src/migrations/snapshot.cjs +56 -1
- package/dist/development/src/migrations/snapshot.cjs.map +1 -1
- package/dist/development/src/migrations/snapshot.js +56 -1
- package/dist/development/src/migrations/snapshot.js.map +1 -1
- package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.cjs +7 -7
- package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.js +1 -1
- package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs +27 -0
- package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs.map +1 -0
- package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.js +27 -0
- package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.js.map +1 -0
- package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.cjs +15 -2
- package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.js +15 -2
- package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.js.map +1 -1
- package/dist/development/src/model/commands/personToken/CreatePersonTokenCommand.cjs +4 -4
- package/dist/development/src/model/commands/personToken/CreatePersonTokenCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/personToken/CreatePersonTokenCommand.js +1 -1
- package/dist/development/src/model/commands/personToken/ResetPasswordCommand.cjs +5 -5
- package/dist/development/src/model/commands/personToken/ResetPasswordCommand.cjs.map +1 -1
- package/dist/development/src/model/commands/personToken/ResetPasswordCommand.js +1 -1
- package/dist/development/src/model/queries/apiKey/ApiKeyQuery.cjs +4 -4
- package/dist/development/src/model/queries/apiKey/ApiKeyQuery.cjs.map +1 -1
- package/dist/development/src/model/queries/apiKey/ApiKeyQuery.js +1 -1
- package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.cjs +46 -0
- package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.cjs.map +1 -0
- package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.js +46 -0
- package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.js.map +1 -0
- package/dist/development/src/model/queries/configuration/ConfigurationQuery.cjs +18 -1
- package/dist/development/src/model/queries/configuration/ConfigurationQuery.cjs.map +1 -1
- package/dist/development/src/model/queries/configuration/ConfigurationQuery.js +18 -1
- package/dist/development/src/model/queries/configuration/ConfigurationQuery.js.map +1 -1
- package/dist/development/src/model/queries/personToken/PersonTokenQuery.cjs +3 -3
- 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/service/AuthLogService.cjs +34 -0
- package/dist/development/src/model/service/AuthLogService.cjs.map +1 -0
- package/dist/development/src/model/service/AuthLogService.js +34 -0
- package/dist/development/src/model/service/AuthLogService.js.map +1 -0
- package/dist/development/src/model/service/ConfigurationManager.cjs +0 -10
- package/dist/development/src/model/service/ConfigurationManager.cjs.map +1 -1
- package/dist/development/src/model/service/ConfigurationManager.js +0 -10
- package/dist/development/src/model/service/ConfigurationManager.js.map +1 -1
- package/dist/development/src/model/service/IDPSignInManager.cjs +37 -5
- package/dist/development/src/model/service/IDPSignInManager.cjs.map +1 -1
- package/dist/development/src/model/service/IDPSignInManager.js +37 -5
- package/dist/development/src/model/service/IDPSignInManager.js.map +1 -1
- package/dist/development/src/model/service/PasswordChangeManager.cjs +21 -12
- package/dist/development/src/model/service/PasswordChangeManager.cjs.map +1 -1
- package/dist/development/src/model/service/PasswordChangeManager.js +20 -11
- package/dist/development/src/model/service/PasswordChangeManager.js.map +1 -1
- package/dist/development/src/model/service/PasswordResetManager.cjs +40 -8
- package/dist/development/src/model/service/PasswordResetManager.cjs.map +1 -1
- package/dist/development/src/model/service/PasswordResetManager.js +40 -8
- package/dist/development/src/model/service/PasswordResetManager.js.map +1 -1
- package/dist/development/src/model/service/PasswordStrengthValidator.cjs +63 -0
- package/dist/development/src/model/service/PasswordStrengthValidator.cjs.map +1 -0
- package/dist/development/src/model/service/PasswordStrengthValidator.js +63 -0
- package/dist/development/src/model/service/PasswordStrengthValidator.js.map +1 -0
- package/dist/development/src/model/service/PasswordlessSignInManager.cjs +89 -24
- package/dist/development/src/model/service/PasswordlessSignInManager.cjs.map +1 -1
- package/dist/development/src/model/service/PasswordlessSignInManager.js +81 -16
- package/dist/development/src/model/service/PasswordlessSignInManager.js.map +1 -1
- package/dist/development/src/model/service/PersonAccessManager.cjs +7 -29
- package/dist/development/src/model/service/PersonAccessManager.cjs.map +1 -1
- package/dist/development/src/model/service/PersonAccessManager.js +7 -29
- package/dist/development/src/model/service/PersonAccessManager.js.map +1 -1
- package/dist/development/src/model/service/SignInManager.cjs +56 -31
- package/dist/development/src/model/service/SignInManager.cjs.map +1 -1
- package/dist/development/src/model/service/SignInManager.js +57 -32
- package/dist/development/src/model/service/SignInManager.js.map +1 -1
- package/dist/development/src/model/service/SignUpManager.cjs +13 -8
- package/dist/development/src/model/service/SignUpManager.cjs.map +1 -1
- package/dist/development/src/model/service/SignUpManager.js +11 -6
- package/dist/development/src/model/service/SignUpManager.js.map +1 -1
- package/dist/development/src/model/service/apiKey/ApiKeyManager.cjs +6 -1
- package/dist/development/src/model/service/apiKey/ApiKeyManager.cjs.map +1 -1
- package/dist/development/src/model/service/apiKey/ApiKeyManager.js +6 -1
- package/dist/development/src/model/service/apiKey/ApiKeyManager.js.map +1 -1
- package/dist/development/src/model/utils/Response.cjs +2 -1
- package/dist/development/src/model/utils/Response.cjs.map +1 -1
- package/dist/development/src/model/utils/Response.js +2 -1
- package/dist/development/src/model/utils/Response.js.map +1 -1
- package/dist/development/src/model/utils/blacklist.cjs +10006 -0
- package/dist/development/src/model/utils/blacklist.cjs.map +1 -0
- package/dist/development/src/model/utils/blacklist.js +10006 -0
- package/dist/development/src/model/utils/blacklist.js.map +1 -0
- package/dist/{production/src/model/utils/typeUtils.cjs → development/src/model/utils/hex.cjs} +1 -1
- package/dist/development/src/model/utils/hex.cjs.map +1 -0
- package/dist/development/src/model/utils/{typeUtils.js → hex.js} +1 -1
- package/dist/development/src/model/utils/hex.js.map +1 -0
- package/dist/development/src/model/utils/interval.cjs +8 -0
- package/dist/development/src/model/utils/interval.cjs.map +1 -0
- package/dist/development/src/model/utils/interval.js +8 -0
- package/dist/development/src/model/utils/interval.js.map +1 -0
- package/dist/development/src/model/utils/{tokenUtils.cjs → token.cjs} +3 -3
- package/dist/development/src/model/utils/token.cjs.map +1 -0
- package/dist/development/src/model/utils/{tokenUtils.js → token.js} +2 -2
- package/dist/development/src/model/utils/token.js.map +1 -0
- package/dist/development/src/resolvers/ResolverFactory.cjs +1 -0
- package/dist/development/src/resolvers/ResolverFactory.cjs.map +1 -1
- package/dist/development/src/resolvers/ResolverFactory.js +2 -1
- package/dist/development/src/resolvers/ResolverFactory.js.map +1 -1
- package/dist/development/src/resolvers/TenantResolverContextFactory.cjs +10 -2
- package/dist/development/src/resolvers/TenantResolverContextFactory.cjs.map +1 -1
- package/dist/development/src/resolvers/TenantResolverContextFactory.js +10 -2
- package/dist/development/src/resolvers/TenantResolverContextFactory.js.map +1 -1
- package/dist/development/src/resolvers/errorUtils.cjs +15 -4
- package/dist/development/src/resolvers/errorUtils.cjs.map +1 -1
- package/dist/development/src/resolvers/errorUtils.js +15 -4
- package/dist/development/src/resolvers/errorUtils.js.map +1 -1
- package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs +4 -3
- package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js +2 -1
- package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js +1 -0
- package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js +1 -0
- package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js +1 -0
- package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.js +1 -0
- package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.js +1 -0
- package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.js +1 -0
- package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js +1 -0
- package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js +1 -0
- package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs +17 -6
- package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.js +17 -6
- package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs +14 -0
- package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.js +14 -0
- package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs +7 -1
- package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.js +7 -1
- package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.cjs +5 -0
- package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.js +5 -0
- package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.cjs +3 -2
- package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.js +2 -1
- package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.cjs +26 -1
- package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.js +26 -1
- package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs +20 -0
- package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.js +20 -0
- package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs +25 -2
- package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.js +25 -2
- package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.cjs +22 -0
- package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.js +22 -0
- package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.js +1 -0
- package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.cjs +2 -1
- package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.js +2 -1
- package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs +3 -1
- package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js +3 -1
- package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs +3 -2
- package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.js +2 -1
- package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js +1 -0
- package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.js +1 -0
- package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js +1 -0
- package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js +1 -0
- package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js +1 -0
- package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/ConfigurationQueryResolver.cjs +3 -1
- package/dist/development/src/resolvers/query/ConfigurationQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/ConfigurationQueryResolver.js +3 -1
- package/dist/development/src/resolvers/query/ConfigurationQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/IDPQueryResolver.cjs +1 -0
- package/dist/development/src/resolvers/query/IDPQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/IDPQueryResolver.js +1 -0
- package/dist/development/src/resolvers/query/IDPQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/MailTemplateQueryResolver.cjs +1 -0
- package/dist/development/src/resolvers/query/MailTemplateQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/MailTemplateQueryResolver.js +1 -0
- package/dist/development/src/resolvers/query/MailTemplateQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/PersonQueryResolver.cjs +1 -0
- package/dist/development/src/resolvers/query/PersonQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/PersonQueryResolver.js +1 -0
- package/dist/development/src/resolvers/query/PersonQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.cjs +1 -0
- package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.js +1 -0
- package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/ProjectQueryResolver.cjs +1 -0
- package/dist/development/src/resolvers/query/ProjectQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/ProjectQueryResolver.js +1 -0
- package/dist/development/src/resolvers/query/ProjectQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.cjs +1 -0
- package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.cjs.map +1 -1
- package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.js +1 -0
- package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.js.map +1 -1
- package/dist/development/src/resolvers/types/IdentityTypeResolver.cjs +1 -0
- package/dist/development/src/resolvers/types/IdentityTypeResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/types/IdentityTypeResolver.js +1 -0
- package/dist/development/src/resolvers/types/IdentityTypeResolver.js.map +1 -1
- package/dist/development/src/resolvers/types/ProjectTypeResolver.cjs +1 -0
- package/dist/development/src/resolvers/types/ProjectTypeResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/types/ProjectTypeResolver.js +1 -0
- package/dist/development/src/resolvers/types/ProjectTypeResolver.js.map +1 -1
- package/dist/development/src/schema/tenant.graphql.cjs +64 -2
- package/dist/development/src/schema/tenant.graphql.cjs.map +1 -1
- package/dist/development/src/schema/tenant.graphql.js +64 -2
- package/dist/development/src/schema/tenant.graphql.js.map +1 -1
- package/dist/production/index.cjs +5 -6
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +2 -3
- package/dist/production/src/TenantContainer.cjs +4 -2
- package/dist/production/src/TenantContainer.cjs.map +1 -1
- package/dist/production/src/TenantContainer.js +4 -2
- package/dist/production/src/TenantContainer.js.map +1 -1
- package/dist/production/src/bridges/system/IdentityFetcher.cjs +1 -0
- package/dist/production/src/bridges/system/IdentityFetcher.cjs.map +1 -1
- package/dist/production/src/bridges/system/IdentityFetcher.js +1 -0
- package/dist/production/src/bridges/system/IdentityFetcher.js.map +1 -1
- package/dist/production/src/migrations/2025-04-16-180000-config-up.cjs +39 -0
- package/dist/production/src/migrations/2025-04-16-180000-config-up.cjs.map +1 -0
- package/dist/production/src/migrations/2025-04-16-180000-config-up.js +40 -0
- package/dist/production/src/migrations/2025-04-16-180000-config-up.js.map +1 -0
- package/dist/production/src/migrations/2025-04-17-160000-auth-log.cjs +45 -0
- package/dist/production/src/migrations/2025-04-17-160000-auth-log.cjs.map +1 -0
- package/dist/production/src/migrations/2025-04-17-160000-auth-log.js +46 -0
- package/dist/production/src/migrations/2025-04-17-160000-auth-log.js.map +1 -0
- package/dist/production/src/migrations/runner.cjs +9 -4
- package/dist/production/src/migrations/runner.cjs.map +1 -1
- package/dist/production/src/migrations/runner.js +7 -2
- package/dist/production/src/migrations/runner.js.map +1 -1
- package/dist/production/src/migrations/snapshot.cjs +56 -1
- package/dist/production/src/migrations/snapshot.cjs.map +1 -1
- package/dist/production/src/migrations/snapshot.js +56 -1
- package/dist/production/src/migrations/snapshot.js.map +1 -1
- package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.cjs +7 -7
- package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.js +1 -1
- package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs +27 -0
- package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs.map +1 -0
- package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.js +27 -0
- package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.js.map +1 -0
- package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.cjs +15 -2
- package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.js +15 -2
- package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.js.map +1 -1
- package/dist/production/src/model/commands/personToken/CreatePersonTokenCommand.cjs +4 -4
- package/dist/production/src/model/commands/personToken/CreatePersonTokenCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/personToken/CreatePersonTokenCommand.js +1 -1
- package/dist/production/src/model/commands/personToken/ResetPasswordCommand.cjs +5 -5
- package/dist/production/src/model/commands/personToken/ResetPasswordCommand.cjs.map +1 -1
- package/dist/production/src/model/commands/personToken/ResetPasswordCommand.js +1 -1
- package/dist/production/src/model/queries/apiKey/ApiKeyQuery.cjs +4 -4
- package/dist/production/src/model/queries/apiKey/ApiKeyQuery.cjs.map +1 -1
- package/dist/production/src/model/queries/apiKey/ApiKeyQuery.js +1 -1
- package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.cjs +46 -0
- package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.cjs.map +1 -0
- package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.js +46 -0
- package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.js.map +1 -0
- package/dist/production/src/model/queries/configuration/ConfigurationQuery.cjs +18 -1
- package/dist/production/src/model/queries/configuration/ConfigurationQuery.cjs.map +1 -1
- package/dist/production/src/model/queries/configuration/ConfigurationQuery.js +18 -1
- package/dist/production/src/model/queries/configuration/ConfigurationQuery.js.map +1 -1
- package/dist/production/src/model/queries/personToken/PersonTokenQuery.cjs +3 -3
- 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/service/AuthLogService.cjs +34 -0
- package/dist/production/src/model/service/AuthLogService.cjs.map +1 -0
- package/dist/production/src/model/service/AuthLogService.js +34 -0
- package/dist/production/src/model/service/AuthLogService.js.map +1 -0
- package/dist/production/src/model/service/ConfigurationManager.cjs +0 -10
- package/dist/production/src/model/service/ConfigurationManager.cjs.map +1 -1
- package/dist/production/src/model/service/ConfigurationManager.js +0 -10
- package/dist/production/src/model/service/ConfigurationManager.js.map +1 -1
- package/dist/production/src/model/service/IDPSignInManager.cjs +37 -5
- package/dist/production/src/model/service/IDPSignInManager.cjs.map +1 -1
- package/dist/production/src/model/service/IDPSignInManager.js +37 -5
- package/dist/production/src/model/service/IDPSignInManager.js.map +1 -1
- package/dist/production/src/model/service/PasswordChangeManager.cjs +21 -12
- package/dist/production/src/model/service/PasswordChangeManager.cjs.map +1 -1
- package/dist/production/src/model/service/PasswordChangeManager.js +20 -11
- package/dist/production/src/model/service/PasswordChangeManager.js.map +1 -1
- package/dist/production/src/model/service/PasswordResetManager.cjs +40 -8
- package/dist/production/src/model/service/PasswordResetManager.cjs.map +1 -1
- package/dist/production/src/model/service/PasswordResetManager.js +40 -8
- package/dist/production/src/model/service/PasswordResetManager.js.map +1 -1
- package/dist/production/src/model/service/PasswordStrengthValidator.cjs +63 -0
- package/dist/production/src/model/service/PasswordStrengthValidator.cjs.map +1 -0
- package/dist/production/src/model/service/PasswordStrengthValidator.js +63 -0
- package/dist/production/src/model/service/PasswordStrengthValidator.js.map +1 -0
- package/dist/production/src/model/service/PasswordlessSignInManager.cjs +89 -24
- package/dist/production/src/model/service/PasswordlessSignInManager.cjs.map +1 -1
- package/dist/production/src/model/service/PasswordlessSignInManager.js +81 -16
- package/dist/production/src/model/service/PasswordlessSignInManager.js.map +1 -1
- package/dist/production/src/model/service/PersonAccessManager.cjs +7 -29
- package/dist/production/src/model/service/PersonAccessManager.cjs.map +1 -1
- package/dist/production/src/model/service/PersonAccessManager.js +7 -29
- package/dist/production/src/model/service/PersonAccessManager.js.map +1 -1
- package/dist/production/src/model/service/SignInManager.cjs +56 -31
- package/dist/production/src/model/service/SignInManager.cjs.map +1 -1
- package/dist/production/src/model/service/SignInManager.js +57 -32
- package/dist/production/src/model/service/SignInManager.js.map +1 -1
- package/dist/production/src/model/service/SignUpManager.cjs +13 -8
- package/dist/production/src/model/service/SignUpManager.cjs.map +1 -1
- package/dist/production/src/model/service/SignUpManager.js +11 -6
- package/dist/production/src/model/service/SignUpManager.js.map +1 -1
- package/dist/production/src/model/service/apiKey/ApiKeyManager.cjs +6 -1
- package/dist/production/src/model/service/apiKey/ApiKeyManager.cjs.map +1 -1
- package/dist/production/src/model/service/apiKey/ApiKeyManager.js +6 -1
- package/dist/production/src/model/service/apiKey/ApiKeyManager.js.map +1 -1
- package/dist/production/src/model/utils/Response.cjs +2 -1
- package/dist/production/src/model/utils/Response.cjs.map +1 -1
- package/dist/production/src/model/utils/Response.js +2 -1
- package/dist/production/src/model/utils/Response.js.map +1 -1
- package/dist/production/src/model/utils/blacklist.cjs +10006 -0
- package/dist/production/src/model/utils/blacklist.cjs.map +1 -0
- package/dist/production/src/model/utils/blacklist.js +10006 -0
- package/dist/production/src/model/utils/blacklist.js.map +1 -0
- package/dist/{development/src/model/utils/typeUtils.cjs → production/src/model/utils/hex.cjs} +1 -1
- package/dist/production/src/model/utils/hex.cjs.map +1 -0
- package/dist/production/src/model/utils/{typeUtils.js → hex.js} +1 -1
- package/dist/production/src/model/utils/hex.js.map +1 -0
- package/dist/production/src/model/utils/interval.cjs +8 -0
- package/dist/production/src/model/utils/interval.cjs.map +1 -0
- package/dist/production/src/model/utils/interval.js +8 -0
- package/dist/production/src/model/utils/interval.js.map +1 -0
- package/dist/production/src/model/utils/{tokenUtils.cjs → token.cjs} +3 -3
- package/dist/production/src/model/utils/token.cjs.map +1 -0
- package/dist/production/src/model/utils/{tokenUtils.js → token.js} +2 -2
- package/dist/production/src/model/utils/token.js.map +1 -0
- package/dist/production/src/resolvers/ResolverFactory.cjs +1 -0
- package/dist/production/src/resolvers/ResolverFactory.cjs.map +1 -1
- package/dist/production/src/resolvers/ResolverFactory.js +2 -1
- package/dist/production/src/resolvers/ResolverFactory.js.map +1 -1
- package/dist/production/src/resolvers/TenantResolverContextFactory.cjs +10 -2
- package/dist/production/src/resolvers/TenantResolverContextFactory.cjs.map +1 -1
- package/dist/production/src/resolvers/TenantResolverContextFactory.js +10 -2
- package/dist/production/src/resolvers/TenantResolverContextFactory.js.map +1 -1
- package/dist/production/src/resolvers/errorUtils.cjs +15 -4
- package/dist/production/src/resolvers/errorUtils.cjs.map +1 -1
- package/dist/production/src/resolvers/errorUtils.js +15 -4
- package/dist/production/src/resolvers/errorUtils.js.map +1 -1
- package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs +4 -3
- package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js +2 -1
- package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js +1 -0
- package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js +1 -0
- package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js +1 -0
- package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.js +1 -0
- package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.js +1 -0
- package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.js +1 -0
- package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js +1 -0
- package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js +1 -0
- package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs +17 -6
- package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.js +17 -6
- package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs +14 -0
- package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.js +14 -0
- package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs +7 -1
- package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.js +7 -1
- package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.cjs +5 -0
- package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.js +5 -0
- package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.cjs +3 -2
- package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.js +2 -1
- package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.cjs +26 -1
- package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.js +26 -1
- package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs +20 -0
- package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.js +20 -0
- package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs +25 -2
- package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.js +25 -2
- package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.cjs +22 -0
- package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.js +22 -0
- package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.js +1 -0
- package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.cjs +2 -1
- package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.js +2 -1
- package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs +3 -1
- package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js +3 -1
- package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs +3 -2
- package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.js +2 -1
- package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js +1 -0
- package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.js +1 -0
- package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js +1 -0
- package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js +1 -0
- package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js +1 -0
- package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/ConfigurationQueryResolver.cjs +3 -1
- package/dist/production/src/resolvers/query/ConfigurationQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/ConfigurationQueryResolver.js +3 -1
- package/dist/production/src/resolvers/query/ConfigurationQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/IDPQueryResolver.cjs +1 -0
- package/dist/production/src/resolvers/query/IDPQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/IDPQueryResolver.js +1 -0
- package/dist/production/src/resolvers/query/IDPQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/MailTemplateQueryResolver.cjs +1 -0
- package/dist/production/src/resolvers/query/MailTemplateQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/MailTemplateQueryResolver.js +1 -0
- package/dist/production/src/resolvers/query/MailTemplateQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/PersonQueryResolver.cjs +1 -0
- package/dist/production/src/resolvers/query/PersonQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/PersonQueryResolver.js +1 -0
- package/dist/production/src/resolvers/query/PersonQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.cjs +1 -0
- package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.js +1 -0
- package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/ProjectQueryResolver.cjs +1 -0
- package/dist/production/src/resolvers/query/ProjectQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/ProjectQueryResolver.js +1 -0
- package/dist/production/src/resolvers/query/ProjectQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.cjs +1 -0
- package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.cjs.map +1 -1
- package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.js +1 -0
- package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.js.map +1 -1
- package/dist/production/src/resolvers/types/IdentityTypeResolver.cjs +1 -0
- package/dist/production/src/resolvers/types/IdentityTypeResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/types/IdentityTypeResolver.js +1 -0
- package/dist/production/src/resolvers/types/IdentityTypeResolver.js.map +1 -1
- package/dist/production/src/resolvers/types/ProjectTypeResolver.cjs +1 -0
- package/dist/production/src/resolvers/types/ProjectTypeResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/types/ProjectTypeResolver.js +1 -0
- package/dist/production/src/resolvers/types/ProjectTypeResolver.js.map +1 -1
- package/dist/production/src/schema/tenant.graphql.cjs +64 -2
- package/dist/production/src/schema/tenant.graphql.cjs.map +1 -1
- package/dist/production/src/schema/tenant.graphql.js +64 -2
- package/dist/production/src/schema/tenant.graphql.js.map +1 -1
- package/dist/tests/cases/integration/mocked/sql/createSessionKeySql.d.ts +1 -1
- package/dist/tests/cases/integration/mocked/sql/getConfigSql.d.ts +3 -0
- package/dist/tests/cases/integration/mocked/sql/getConfigSql.d.ts.map +1 -0
- package/dist/tests/cases/integration/mocked/sql/getNextLoginAttemptSql.d.ts +3 -0
- package/dist/tests/cases/integration/mocked/sql/getNextLoginAttemptSql.d.ts.map +1 -0
- package/dist/tests/src/testTenant.d.ts +2 -0
- package/dist/tests/src/testTenant.d.ts.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/TenantContainer.d.ts +6 -0
- package/dist/types/TenantContainer.d.ts.map +1 -1
- package/dist/types/migrations/2025-04-16-180000-config-up.d.ts +3 -0
- package/dist/types/migrations/2025-04-16-180000-config-up.d.ts.map +1 -0
- package/dist/types/migrations/2025-04-17-160000-auth-log.d.ts +3 -0
- package/dist/types/migrations/2025-04-17-160000-auth-log.d.ts.map +1 -0
- package/dist/types/migrations/runner.d.ts.map +1 -1
- package/dist/types/migrations/snapshot.d.ts.map +1 -1
- package/dist/types/model/commands/authLog/CreateAuthLogEntryCommand.d.ts +26 -0
- package/dist/types/model/commands/authLog/CreateAuthLogEntryCommand.d.ts.map +1 -0
- package/dist/types/model/commands/configuration/UpdateConfigurationCommand.d.ts.map +1 -1
- package/dist/types/model/dtos/AuthLogBag.d.ts +3 -0
- package/dist/types/model/dtos/AuthLogBag.d.ts.map +1 -0
- package/dist/types/model/queries/authLog/NextLoginAttemptQuery.d.ts +7 -0
- package/dist/types/model/queries/authLog/NextLoginAttemptQuery.d.ts.map +1 -0
- package/dist/types/model/queries/configuration/ConfigurationQuery.d.ts +1 -1
- package/dist/types/model/queries/configuration/ConfigurationQuery.d.ts.map +1 -1
- package/dist/types/model/service/AuthLogService.d.ts +34 -0
- package/dist/types/model/service/AuthLogService.d.ts.map +1 -0
- package/dist/types/model/service/ConfigurationManager.d.ts +1 -2
- package/dist/types/model/service/ConfigurationManager.d.ts.map +1 -1
- package/dist/types/model/service/IDPSignInManager.d.ts +5 -1
- package/dist/types/model/service/IDPSignInManager.d.ts.map +1 -1
- package/dist/types/model/service/PasswordChangeManager.d.ts +8 -4
- package/dist/types/model/service/PasswordChangeManager.d.ts.map +1 -1
- package/dist/types/model/service/PasswordResetManager.d.ts +11 -4
- package/dist/types/model/service/PasswordResetManager.d.ts.map +1 -1
- package/dist/types/model/service/PasswordStrengthValidator.d.ts +11 -0
- package/dist/types/model/service/PasswordStrengthValidator.d.ts.map +1 -0
- package/dist/types/model/service/PasswordlessSignInManager.d.ts +16 -6
- package/dist/types/model/service/PasswordlessSignInManager.d.ts.map +1 -1
- package/dist/types/model/service/PersonAccessManager.d.ts +2 -1
- package/dist/types/model/service/PersonAccessManager.d.ts.map +1 -1
- package/dist/types/model/service/SignInManager.d.ts +9 -4
- package/dist/types/model/service/SignInManager.d.ts.map +1 -1
- package/dist/types/model/service/SignUpManager.d.ts +7 -3
- package/dist/types/model/service/SignUpManager.d.ts.map +1 -1
- package/dist/types/model/service/apiKey/ApiKeyManager.d.ts.map +1 -1
- package/dist/types/model/type/AuthLog.d.ts +2 -0
- package/dist/types/model/type/AuthLog.d.ts.map +1 -0
- package/dist/types/model/type/Config.d.ts +28 -0
- package/dist/types/model/type/Config.d.ts.map +1 -0
- package/dist/types/model/utils/Response.d.ts +4 -3
- package/dist/types/model/utils/Response.d.ts.map +1 -1
- package/dist/types/model/utils/blacklist.d.ts +2 -0
- package/dist/types/model/utils/blacklist.d.ts.map +1 -0
- package/dist/types/model/utils/{typeUtils.d.ts → hex.d.ts} +1 -1
- package/dist/types/model/utils/hex.d.ts.map +1 -0
- package/dist/types/model/utils/index.d.ts +1 -1
- package/dist/types/model/utils/index.d.ts.map +1 -1
- package/dist/types/model/utils/interval.d.ts +3 -0
- package/dist/types/model/utils/interval.d.ts.map +1 -0
- package/dist/types/model/utils/{tokenUtils.d.ts → token.d.ts} +2 -2
- package/dist/types/model/utils/token.d.ts.map +1 -0
- package/dist/types/resolvers/ResolverFactory.d.ts.map +1 -1
- package/dist/types/resolvers/TenantResolverContext.d.ts +2 -0
- package/dist/types/resolvers/TenantResolverContext.d.ts.map +1 -1
- package/dist/types/resolvers/TenantResolverContextFactory.d.ts +6 -1
- package/dist/types/resolvers/TenantResolverContextFactory.d.ts.map +1 -1
- package/dist/types/resolvers/errorUtils.d.ts +7 -5
- package/dist/types/resolvers/errorUtils.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.map +1 -1
- package/dist/types/resolvers/mutation/person/IDPMutationResolver.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/ResetPasswordMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/SignInMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/mutation/person/TogglePasswordlessMutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/types/ProjectTypeResolver.d.ts +2 -2
- package/dist/types/resolvers/types/ProjectTypeResolver.d.ts.map +1 -1
- package/dist/types/schema/index.d.ts +103 -8
- 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 +8 -0
- package/dist/types/schema/types.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/graphql.codegen.yml +7 -3
- package/package.json +13 -12
- package/src/TenantContainer.ts +16 -10
- package/src/migrations/2025-04-16-180000-config-up.ts +39 -0
- package/src/migrations/2025-04-17-160000-auth-log.ts +45 -0
- package/src/migrations/runner.ts +4 -1
- package/src/migrations/snapshot.ts +56 -1
- package/src/model/commands/authLog/CreateAuthLogEntryCommand.ts +51 -0
- package/src/model/commands/configuration/UpdateConfigurationCommand.ts +20 -2
- package/src/model/dtos/AuthLogBag.ts +3 -0
- package/src/model/queries/authLog/NextLoginAttemptQuery.ts +63 -0
- package/src/model/queries/configuration/ConfigurationQuery.ts +20 -8
- package/src/model/service/AuthLogService.ts +62 -0
- package/src/model/service/ConfigurationManager.ts +1 -6
- package/src/model/service/IDPSignInManager.ts +41 -6
- package/src/model/service/PasswordChangeManager.ts +17 -12
- package/src/model/service/PasswordResetManager.ts +42 -11
- package/src/model/service/PasswordStrengthValidator.ts +85 -0
- package/src/model/service/PasswordlessSignInManager.ts +95 -28
- package/src/model/service/PersonAccessManager.ts +8 -27
- package/src/model/service/SignInManager.ts +68 -33
- package/src/model/service/SignUpManager.ts +16 -8
- package/src/model/service/apiKey/ApiKeyManager.ts +8 -2
- package/src/model/type/AuthLog.ts +14 -0
- package/src/model/type/Config.ts +29 -0
- package/src/model/utils/Response.ts +10 -3
- package/src/model/utils/blacklist.ts +4 -0
- package/src/model/utils/index.ts +1 -1
- package/src/model/utils/interval.ts +14 -0
- package/src/model/utils/{tokenUtils.ts → token.ts} +1 -1
- package/src/resolvers/ResolverFactory.ts +2 -1
- package/src/resolvers/TenantResolverContext.ts +2 -0
- package/src/resolvers/TenantResolverContextFactory.ts +10 -0
- package/src/resolvers/errorUtils.ts +23 -5
- package/src/resolvers/mutation/idp/AddIDPMutationResolver.ts +1 -1
- package/src/resolvers/mutation/idp/UpdateIDPMutationResolver.ts +1 -1
- package/src/resolvers/mutation/person/ChangePasswordMutationResolver.ts +17 -15
- package/src/resolvers/mutation/person/ChangeProfileMutationResolver.ts +13 -0
- package/src/resolvers/mutation/person/DisablePersonMutationResolver.ts +7 -7
- package/src/resolvers/mutation/person/IDPMutationResolver.ts +4 -0
- package/src/resolvers/mutation/person/OtpMutationResolver.ts +25 -1
- package/src/resolvers/mutation/person/PasswordlessMutationResolver.ts +21 -1
- package/src/resolvers/mutation/person/ResetPasswordMutationResolver.ts +27 -3
- package/src/resolvers/mutation/person/SignInMutationResolver.ts +26 -8
- package/src/resolvers/mutation/person/SignUpMutationResolver.ts +1 -1
- package/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.ts +2 -2
- package/src/resolvers/mutation/project/CreateProjectMutationResolver.ts +1 -1
- package/src/resolvers/mutation/project/UpdateProjectMutationResolver.ts +1 -1
- package/src/resolvers/query/ConfigurationQueryResolver.ts +2 -2
- package/src/resolvers/types/ProjectTypeResolver.ts +2 -2
- package/src/schema/index.ts +114 -5
- package/src/schema/tenant.graphql.ts +64 -2
- package/src/schema/types.ts +4 -0
- package/tests/cases/integration/mocked/changeMyPasswordMutation.test.ts +42 -2
- package/tests/cases/integration/mocked/changeMyProfileMutation.test.ts +25 -4
- package/tests/cases/integration/mocked/changePasswordMutation.test.ts +10 -2
- package/tests/cases/integration/mocked/changeProfileMutation.test.ts +7 -1
- package/tests/cases/integration/mocked/confirmOtpMutation.test.ts +13 -8
- package/tests/cases/integration/mocked/createSessionKeyMutation.test.ts +9 -21
- package/tests/cases/integration/mocked/inviteMutations.test.ts +0 -24
- package/tests/cases/integration/mocked/signInIdpMutation.test.ts +16 -1
- package/tests/cases/integration/mocked/signInMutation.test.ts +54 -22
- package/tests/cases/integration/mocked/signOutMutation.test.ts +0 -5
- package/tests/cases/integration/mocked/signUpMutation.test.ts +3 -12
- package/tests/cases/integration/mocked/sql/createSessionKeySql.ts +1 -1
- package/tests/cases/integration/mocked/sql/getConfigSql.ts +29 -0
- package/tests/cases/integration/mocked/sql/getNextLoginAttemptSql.ts +20 -0
- package/tests/src/testTenant.ts +13 -0
- package/dist/development/src/model/utils/password.cjs +0 -12
- package/dist/development/src/model/utils/password.cjs.map +0 -1
- package/dist/development/src/model/utils/password.js +0 -12
- package/dist/development/src/model/utils/password.js.map +0 -1
- package/dist/development/src/model/utils/tokenUtils.cjs.map +0 -1
- package/dist/development/src/model/utils/tokenUtils.js.map +0 -1
- package/dist/development/src/model/utils/typeUtils.cjs.map +0 -1
- package/dist/development/src/model/utils/typeUtils.js.map +0 -1
- package/dist/production/src/model/utils/password.cjs +0 -12
- package/dist/production/src/model/utils/password.cjs.map +0 -1
- package/dist/production/src/model/utils/password.js +0 -12
- package/dist/production/src/model/utils/password.js.map +0 -1
- package/dist/production/src/model/utils/tokenUtils.cjs.map +0 -1
- package/dist/production/src/model/utils/tokenUtils.js.map +0 -1
- package/dist/production/src/model/utils/typeUtils.cjs.map +0 -1
- package/dist/production/src/model/utils/typeUtils.js.map +0 -1
- package/dist/types/model/utils/password.d.ts +0 -4
- package/dist/types/model/utils/password.d.ts.map +0 -1
- package/dist/types/model/utils/tokenUtils.d.ts.map +0 -1
- package/dist/types/model/utils/typeUtils.d.ts.map +0 -1
- package/src/model/utils/password.ts +0 -8
- /package/src/model/utils/{typeUtils.ts → hex.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PasswordResetManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordResetManager.ts"],"sourcesContent":["import { Response, ResponseError } from '../utils/Response'\nimport {
|
|
1
|
+
{"version":3,"file":"PasswordResetManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordResetManager.ts"],"sourcesContent":["import { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { UserMailer } from '../mailing'\nimport { ConfigurationQuery, PersonRow } from '../queries'\nimport { PermissionContext } from '../authorization'\nimport { ProjectManager } from './ProjectManager'\nimport { DatabaseContext } from '../utils'\nimport { ImplementationException } from '../../exceptions'\nimport { getPreferredProject } from './helpers/getPreferredProject'\nimport { CreatePersonTokenCommand, ResetPasswordCommand } from '../commands/personToken'\nimport { PasswordStrengthValidator } from './PasswordStrengthValidator'\nimport { ResetPasswordErrorCode, WeakPasswordReason } from '../../schema'\nimport { PersonTokenQuery } from '../queries/personToken/PersonTokenQuery'\nimport { AuthLogService } from './AuthLogService'\n\ninterface MailOptions {\n\tproject?: string\n\tmailVariant?: string\n}\n\nexport class PasswordResetManager {\n\tconstructor(\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t\tprivate readonly passwordStrengthValidator: PasswordStrengthValidator,\n\t) { }\n\n\tpublic async createPasswordResetRequest(\n\t\tdbContext: DatabaseContext,\n\t\tpermissionContext: PermissionContext,\n\t\tperson: PersonRow,\n\t\tmailOptions: MailOptions = {},\n\t): Promise<void> {\n\t\tconst result = await dbContext.commandBus.execute(CreatePersonTokenCommand.createPasswordResetRequest(person.id))\n\t\tconst projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext)\n\t\tconst project = getPreferredProject(projects, mailOptions.project ?? null)\n\t\tif (!person.email) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\tawait this.mailer.sendPasswordResetEmail(\n\t\t\tdbContext,\n\t\t\t{\n\t\t\t\temail: person.email,\n\t\t\t\ttoken: result.token,\n\t\t\t\tproject: project?.name,\n\t\t\t\tprojectSlug: project?.slug,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvariant: mailOptions.mailVariant || '',\n\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t},\n\t\t)\n\t}\n\n\tpublic async resetPassword(dbContext: DatabaseContext, token: string, password: string): Promise<ResetPasswordResponse> {\n\t\tconst config = await dbContext.queryHandler.fetch(new ConfigurationQuery())\n\t\tconst tokenRow = await dbContext.queryHandler.fetch(PersonTokenQuery.byToken(token, 'password_reset'))\n\t\tif (!tokenRow) {\n\t\t\treturn new ResponseError('TOKEN_NOT_FOUND', 'Token not found', {\n\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({}),\n\t\t\t})\n\t\t}\n\n\t\tconst authLogData = new AuthLogService.Bag({\n\t\t\tpersonId: tokenRow.person_id,\n\t\t\ttokenId: tokenRow.id,\n\t\t})\n\t\tconst weakPassword = await this.passwordStrengthValidator.verify(password, config.password, 'PASSWORD_TOO_WEAK')\n\t\tif (!weakPassword.ok) {\n\t\t\treturn new ResponseError(weakPassword.error, weakPassword.errorMessage, {\n\t\t\t\t...weakPassword.metadata ?? {},\n\t\t\t\t[AuthLogService.Key]: authLogData,\n\t\t\t})\n\t\t}\n\t\tconst resetPasswordResult = await dbContext.commandBus.execute(new ResetPasswordCommand(token, password))\n\t\tif (!resetPasswordResult.ok) {\n\t\t\treturn new ResponseError(resetPasswordResult.error, resetPasswordResult.errorMessage, {\n\t\t\t\t...resetPasswordResult.metadata ?? {},\n\t\t\t\t[AuthLogService.Key]: authLogData,\n\t\t\t})\n\t\t}\n\t\treturn new ResponseOk({\n\t\t\t[AuthLogService.Key]: authLogData,\n\t\t})\n\t}\n}\n\nexport type ResetPasswordResponse = Response<{\n\t[AuthLogService.Key]: AuthLogService.Bag\n}, ResetPasswordErrorCode, {\n\tweakPasswordReasons?: WeakPasswordReason[]\n\t[AuthLogService.Key]: AuthLogService.Bag\n}>\n"],"names":["CreatePersonTokenCommand","getPreferredProject","ImplementationException","ConfigurationQuery","PersonTokenQuery","ResponseError","AuthLogService","ResetPasswordCommand","ResponseOk"],"mappings":";;;;;;;;;;;;;;;;;AAmBO,MAAM,qBAAqB;AAAA,EACjC,YACkB,QACA,gBACA,2BAChB;AAHgB,SAAA,SAAA;AACA,SAAA,iBAAA;AACA,SAAA,4BAAA;AAAA,EAAA;AAAA,EAGlB,MAAa,2BACZ,WACA,mBACA,QACA,cAA2B,CAAA,GACX;AACV,UAAA,SAAS,MAAM,UAAU,WAAW,QAAQA,yBAAAA,yBAAyB,2BAA2B,OAAO,EAAE,CAAC;AAC1G,UAAA,WAAW,MAAM,KAAK,eAAe,sBAAsB,WAAW,OAAO,aAAa,iBAAiB;AACjH,UAAM,UAAUC,oBAAAA,oBAAoB,UAAU,YAAY,WAAW,IAAI;AACrE,QAAA,CAAC,OAAO,OAAO;AAClB,YAAM,IAAIC,WAAAA,wBAAwB;AAAA,IAAA;AAGnC,UAAM,KAAK,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,QACC,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,QACd,SAAS,SAAS;AAAA,QAClB,aAAa,SAAS;AAAA,MACvB;AAAA,MACA;AAAA,QACC,SAAS,YAAY,eAAe;AAAA,QACpC,WAAW,SAAS,MAAM;AAAA,MAAA;AAAA,IAE5B;AAAA,EAAA;AAAA,EAGD,MAAa,cAAc,WAA4B,OAAe,UAAkD;AACvH,UAAM,SAAS,MAAM,UAAU,aAAa,MAAM,IAAIC,mBAAAA,oBAAoB;AACpE,UAAA,WAAW,MAAM,UAAU,aAAa,MAAMC,iBAAAA,iBAAiB,QAAQ,OAAO,gBAAgB,CAAC;AACrG,QAAI,CAAC,UAAU;AACP,aAAA,IAAIC,SAAAA,cAAc,mBAAmB,mBAAmB;AAAA,QAC9D,CAACC,8BAAe,GAAG,GAAG,IAAIA,eAAe,eAAA,IAAI,CAAE,CAAA;AAAA,MAAA,CAC/C;AAAA,IAAA;AAGI,UAAA,cAAc,IAAIA,eAAA,eAAe,IAAI;AAAA,MAC1C,UAAU,SAAS;AAAA,MACnB,SAAS,SAAS;AAAA,IAAA,CAClB;AACK,UAAA,eAAe,MAAM,KAAK,0BAA0B,OAAO,UAAU,OAAO,UAAU,mBAAmB;AAC3G,QAAA,CAAC,aAAa,IAAI;AACrB,aAAO,IAAID,SAAAA,cAAc,aAAa,OAAO,aAAa,cAAc;AAAA,QACvE,GAAG,aAAa,YAAY,CAAC;AAAA,QAC7B,CAACC,eAAAA,eAAe,GAAG,GAAG;AAAA,MAAA,CACtB;AAAA,IAAA;AAEI,UAAA,sBAAuB,MAAM,UAAU,WAAW,QAAQ,IAAIC,qBAAA,qBAAqB,OAAO,QAAQ,CAAC;AACrG,QAAA,CAAC,oBAAoB,IAAI;AAC5B,aAAO,IAAIF,SAAAA,cAAc,oBAAoB,OAAO,oBAAoB,cAAc;AAAA,QACrF,GAAG,oBAAoB,YAAY,CAAC;AAAA,QACpC,CAACC,eAAAA,eAAe,GAAG,GAAG;AAAA,MAAA,CACtB;AAAA,IAAA;AAEF,WAAO,IAAIE,SAAAA,WAAW;AAAA,MACrB,CAACF,eAAAA,eAAe,GAAG,GAAG;AAAA,IAAA,CACtB;AAAA,EAAA;AAEH;;"}
|
|
@@ -1,14 +1,23 @@
|
|
|
1
|
-
import { ResponseError } from "../utils/Response.js";
|
|
2
|
-
import
|
|
1
|
+
import { ResponseError, ResponseOk } from "../utils/Response.js";
|
|
2
|
+
import "../queries/apiKey/ApiKeyQuery.js";
|
|
3
|
+
import { ConfigurationQuery } from "../queries/configuration/ConfigurationQuery.js";
|
|
4
|
+
import "@contember/database";
|
|
3
5
|
import { ImplementationException } from "../../exceptions.js";
|
|
6
|
+
import "../authorization/PermissionActions.js";
|
|
7
|
+
import "@contember/authorization";
|
|
8
|
+
import "../authorization/PermissionContext.js";
|
|
9
|
+
import "../authorization/PermissionsFactory.js";
|
|
10
|
+
import "@contember/schema";
|
|
4
11
|
import { getPreferredProject } from "./helpers/getPreferredProject.js";
|
|
5
|
-
import "@contember/database";
|
|
6
12
|
import { CreatePersonTokenCommand } from "../commands/personToken/CreatePersonTokenCommand.js";
|
|
7
13
|
import { ResetPasswordCommand } from "../commands/personToken/ResetPasswordCommand.js";
|
|
14
|
+
import { PersonTokenQuery } from "../queries/personToken/PersonTokenQuery.js";
|
|
15
|
+
import { AuthLogService } from "./AuthLogService.js";
|
|
8
16
|
class PasswordResetManager {
|
|
9
|
-
constructor(mailer, projectManager) {
|
|
17
|
+
constructor(mailer, projectManager, passwordStrengthValidator) {
|
|
10
18
|
this.mailer = mailer;
|
|
11
19
|
this.projectManager = projectManager;
|
|
20
|
+
this.passwordStrengthValidator = passwordStrengthValidator;
|
|
12
21
|
}
|
|
13
22
|
async createPasswordResetRequest(dbContext, permissionContext, person, mailOptions = {}) {
|
|
14
23
|
const result = await dbContext.commandBus.execute(CreatePersonTokenCommand.createPasswordResetRequest(person.id));
|
|
@@ -32,11 +41,34 @@ class PasswordResetManager {
|
|
|
32
41
|
);
|
|
33
42
|
}
|
|
34
43
|
async resetPassword(dbContext, token, password) {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
44
|
+
const config = await dbContext.queryHandler.fetch(new ConfigurationQuery());
|
|
45
|
+
const tokenRow = await dbContext.queryHandler.fetch(PersonTokenQuery.byToken(token, "password_reset"));
|
|
46
|
+
if (!tokenRow) {
|
|
47
|
+
return new ResponseError("TOKEN_NOT_FOUND", "Token not found", {
|
|
48
|
+
[AuthLogService.Key]: new AuthLogService.Bag({})
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const authLogData = new AuthLogService.Bag({
|
|
52
|
+
personId: tokenRow.person_id,
|
|
53
|
+
tokenId: tokenRow.id
|
|
54
|
+
});
|
|
55
|
+
const weakPassword = await this.passwordStrengthValidator.verify(password, config.password, "PASSWORD_TOO_WEAK");
|
|
56
|
+
if (!weakPassword.ok) {
|
|
57
|
+
return new ResponseError(weakPassword.error, weakPassword.errorMessage, {
|
|
58
|
+
...weakPassword.metadata ?? {},
|
|
59
|
+
[AuthLogService.Key]: authLogData
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
const resetPasswordResult = await dbContext.commandBus.execute(new ResetPasswordCommand(token, password));
|
|
63
|
+
if (!resetPasswordResult.ok) {
|
|
64
|
+
return new ResponseError(resetPasswordResult.error, resetPasswordResult.errorMessage, {
|
|
65
|
+
...resetPasswordResult.metadata ?? {},
|
|
66
|
+
[AuthLogService.Key]: authLogData
|
|
67
|
+
});
|
|
38
68
|
}
|
|
39
|
-
return
|
|
69
|
+
return new ResponseOk({
|
|
70
|
+
[AuthLogService.Key]: authLogData
|
|
71
|
+
});
|
|
40
72
|
}
|
|
41
73
|
}
|
|
42
74
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PasswordResetManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordResetManager.ts"],"sourcesContent":["import { Response, ResponseError } from '../utils/Response'\nimport {
|
|
1
|
+
{"version":3,"file":"PasswordResetManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordResetManager.ts"],"sourcesContent":["import { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { UserMailer } from '../mailing'\nimport { ConfigurationQuery, PersonRow } from '../queries'\nimport { PermissionContext } from '../authorization'\nimport { ProjectManager } from './ProjectManager'\nimport { DatabaseContext } from '../utils'\nimport { ImplementationException } from '../../exceptions'\nimport { getPreferredProject } from './helpers/getPreferredProject'\nimport { CreatePersonTokenCommand, ResetPasswordCommand } from '../commands/personToken'\nimport { PasswordStrengthValidator } from './PasswordStrengthValidator'\nimport { ResetPasswordErrorCode, WeakPasswordReason } from '../../schema'\nimport { PersonTokenQuery } from '../queries/personToken/PersonTokenQuery'\nimport { AuthLogService } from './AuthLogService'\n\ninterface MailOptions {\n\tproject?: string\n\tmailVariant?: string\n}\n\nexport class PasswordResetManager {\n\tconstructor(\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t\tprivate readonly passwordStrengthValidator: PasswordStrengthValidator,\n\t) { }\n\n\tpublic async createPasswordResetRequest(\n\t\tdbContext: DatabaseContext,\n\t\tpermissionContext: PermissionContext,\n\t\tperson: PersonRow,\n\t\tmailOptions: MailOptions = {},\n\t): Promise<void> {\n\t\tconst result = await dbContext.commandBus.execute(CreatePersonTokenCommand.createPasswordResetRequest(person.id))\n\t\tconst projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext)\n\t\tconst project = getPreferredProject(projects, mailOptions.project ?? null)\n\t\tif (!person.email) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\tawait this.mailer.sendPasswordResetEmail(\n\t\t\tdbContext,\n\t\t\t{\n\t\t\t\temail: person.email,\n\t\t\t\ttoken: result.token,\n\t\t\t\tproject: project?.name,\n\t\t\t\tprojectSlug: project?.slug,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvariant: mailOptions.mailVariant || '',\n\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t},\n\t\t)\n\t}\n\n\tpublic async resetPassword(dbContext: DatabaseContext, token: string, password: string): Promise<ResetPasswordResponse> {\n\t\tconst config = await dbContext.queryHandler.fetch(new ConfigurationQuery())\n\t\tconst tokenRow = await dbContext.queryHandler.fetch(PersonTokenQuery.byToken(token, 'password_reset'))\n\t\tif (!tokenRow) {\n\t\t\treturn new ResponseError('TOKEN_NOT_FOUND', 'Token not found', {\n\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({}),\n\t\t\t})\n\t\t}\n\n\t\tconst authLogData = new AuthLogService.Bag({\n\t\t\tpersonId: tokenRow.person_id,\n\t\t\ttokenId: tokenRow.id,\n\t\t})\n\t\tconst weakPassword = await this.passwordStrengthValidator.verify(password, config.password, 'PASSWORD_TOO_WEAK')\n\t\tif (!weakPassword.ok) {\n\t\t\treturn new ResponseError(weakPassword.error, weakPassword.errorMessage, {\n\t\t\t\t...weakPassword.metadata ?? {},\n\t\t\t\t[AuthLogService.Key]: authLogData,\n\t\t\t})\n\t\t}\n\t\tconst resetPasswordResult = await dbContext.commandBus.execute(new ResetPasswordCommand(token, password))\n\t\tif (!resetPasswordResult.ok) {\n\t\t\treturn new ResponseError(resetPasswordResult.error, resetPasswordResult.errorMessage, {\n\t\t\t\t...resetPasswordResult.metadata ?? {},\n\t\t\t\t[AuthLogService.Key]: authLogData,\n\t\t\t})\n\t\t}\n\t\treturn new ResponseOk({\n\t\t\t[AuthLogService.Key]: authLogData,\n\t\t})\n\t}\n}\n\nexport type ResetPasswordResponse = Response<{\n\t[AuthLogService.Key]: AuthLogService.Bag\n}, ResetPasswordErrorCode, {\n\tweakPasswordReasons?: WeakPasswordReason[]\n\t[AuthLogService.Key]: AuthLogService.Bag\n}>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAmBO,MAAM,qBAAqB;AAAA,EACjC,YACkB,QACA,gBACA,2BAChB;AAHgB,SAAA,SAAA;AACA,SAAA,iBAAA;AACA,SAAA,4BAAA;AAAA,EAAA;AAAA,EAGlB,MAAa,2BACZ,WACA,mBACA,QACA,cAA2B,CAAA,GACX;AACV,UAAA,SAAS,MAAM,UAAU,WAAW,QAAQ,yBAAyB,2BAA2B,OAAO,EAAE,CAAC;AAC1G,UAAA,WAAW,MAAM,KAAK,eAAe,sBAAsB,WAAW,OAAO,aAAa,iBAAiB;AACjH,UAAM,UAAU,oBAAoB,UAAU,YAAY,WAAW,IAAI;AACrE,QAAA,CAAC,OAAO,OAAO;AAClB,YAAM,IAAI,wBAAwB;AAAA,IAAA;AAGnC,UAAM,KAAK,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,QACC,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,QACd,SAAS,SAAS;AAAA,QAClB,aAAa,SAAS;AAAA,MACvB;AAAA,MACA;AAAA,QACC,SAAS,YAAY,eAAe;AAAA,QACpC,WAAW,SAAS,MAAM;AAAA,MAAA;AAAA,IAE5B;AAAA,EAAA;AAAA,EAGD,MAAa,cAAc,WAA4B,OAAe,UAAkD;AACvH,UAAM,SAAS,MAAM,UAAU,aAAa,MAAM,IAAI,oBAAoB;AACpE,UAAA,WAAW,MAAM,UAAU,aAAa,MAAM,iBAAiB,QAAQ,OAAO,gBAAgB,CAAC;AACrG,QAAI,CAAC,UAAU;AACP,aAAA,IAAI,cAAc,mBAAmB,mBAAmB;AAAA,QAC9D,CAAC,eAAe,GAAG,GAAG,IAAI,eAAe,IAAI,CAAE,CAAA;AAAA,MAAA,CAC/C;AAAA,IAAA;AAGI,UAAA,cAAc,IAAI,eAAe,IAAI;AAAA,MAC1C,UAAU,SAAS;AAAA,MACnB,SAAS,SAAS;AAAA,IAAA,CAClB;AACK,UAAA,eAAe,MAAM,KAAK,0BAA0B,OAAO,UAAU,OAAO,UAAU,mBAAmB;AAC3G,QAAA,CAAC,aAAa,IAAI;AACrB,aAAO,IAAI,cAAc,aAAa,OAAO,aAAa,cAAc;AAAA,QACvE,GAAG,aAAa,YAAY,CAAC;AAAA,QAC7B,CAAC,eAAe,GAAG,GAAG;AAAA,MAAA,CACtB;AAAA,IAAA;AAEI,UAAA,sBAAuB,MAAM,UAAU,WAAW,QAAQ,IAAI,qBAAqB,OAAO,QAAQ,CAAC;AACrG,QAAA,CAAC,oBAAoB,IAAI;AAC5B,aAAO,IAAI,cAAc,oBAAoB,OAAO,oBAAoB,cAAc;AAAA,QACrF,GAAG,oBAAoB,YAAY,CAAC;AAAA,QACpC,CAAC,eAAe,GAAG,GAAG;AAAA,MAAA,CACtB;AAAA,IAAA;AAEF,WAAO,IAAI,WAAW;AAAA,MACrB,CAAC,eAAe,GAAG,GAAG;AAAA,IAAA,CACtB;AAAA,EAAA;AAEH;"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const blacklist = require("../utils/blacklist.cjs");
|
|
4
|
+
const Response = require("../utils/Response.cjs");
|
|
5
|
+
class PasswordStrengthValidator {
|
|
6
|
+
async verify(password, passwordConfig, errorCode) {
|
|
7
|
+
const failureReasons = [];
|
|
8
|
+
const developerMessage = [];
|
|
9
|
+
if (password.length < passwordConfig.minLength) {
|
|
10
|
+
failureReasons.push("TOO_SHORT");
|
|
11
|
+
developerMessage.push(`Password is too short. Minimum length is ${passwordConfig.minLength}.`);
|
|
12
|
+
}
|
|
13
|
+
if (passwordConfig.requireUppercase > 0 && (password.match(/[A-Z]/g) || []).length < passwordConfig.requireUppercase) {
|
|
14
|
+
failureReasons.push("MISSING_UPPERCASE");
|
|
15
|
+
developerMessage.push(`Password must contain at least ${passwordConfig.requireUppercase} uppercase letter${passwordConfig.requireUppercase > 1 ? "s" : ""}.`);
|
|
16
|
+
}
|
|
17
|
+
if (passwordConfig.requireLowercase > 0 && (password.match(/[a-z]/g) || []).length < passwordConfig.requireLowercase) {
|
|
18
|
+
failureReasons.push("MISSING_LOWERCASE");
|
|
19
|
+
developerMessage.push(`Password must contain at least ${passwordConfig.requireLowercase} lowercase letter${passwordConfig.requireLowercase > 1 ? "s" : ""}.`);
|
|
20
|
+
}
|
|
21
|
+
if (passwordConfig.requireDigit > 0 && (password.match(/\d/g) || []).length < passwordConfig.requireDigit) {
|
|
22
|
+
failureReasons.push("MISSING_DIGIT");
|
|
23
|
+
developerMessage.push(`Password must contain at least ${passwordConfig.requireDigit} digit${passwordConfig.requireDigit > 1 ? "s" : ""}.`);
|
|
24
|
+
}
|
|
25
|
+
if (passwordConfig.requireSpecial > 0 && (password.match(/[!@#$%^&*(),.?":{}|<>]/g) || []).length < passwordConfig.requireSpecial) {
|
|
26
|
+
failureReasons.push("MISSING_SPECIAL");
|
|
27
|
+
developerMessage.push(`Password must contain at least ${passwordConfig.requireSpecial} special character${passwordConfig.requireSpecial > 1 ? "s" : ""}.`);
|
|
28
|
+
}
|
|
29
|
+
if (passwordConfig.pattern && !new RegExp(passwordConfig.pattern).test(password)) {
|
|
30
|
+
failureReasons.push("INVALID_PATTERN");
|
|
31
|
+
developerMessage.push(`Password does not match the required pattern: ${passwordConfig.pattern}.`);
|
|
32
|
+
}
|
|
33
|
+
if (passwordConfig.checkBlacklist && this.isBlacklisted(password.toLowerCase())) {
|
|
34
|
+
failureReasons.push("BLACKLISTED");
|
|
35
|
+
developerMessage.push(`Password is blacklisted.`);
|
|
36
|
+
}
|
|
37
|
+
if (failureReasons.length > 0) {
|
|
38
|
+
return new Response.ResponseError(errorCode, developerMessage.join(" "), {
|
|
39
|
+
weakPasswordReasons: failureReasons
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return new Response.ResponseOk(null);
|
|
43
|
+
}
|
|
44
|
+
isBlacklisted(password) {
|
|
45
|
+
return blacklist.blacklist.has(password) || blacklist.blacklist.has(this.decodeLeetspeak(password));
|
|
46
|
+
}
|
|
47
|
+
decodeLeetspeak(input) {
|
|
48
|
+
const leetspeakMap = {
|
|
49
|
+
"@": "a",
|
|
50
|
+
"$": "s",
|
|
51
|
+
"0": "o",
|
|
52
|
+
"1": "l",
|
|
53
|
+
"3": "e",
|
|
54
|
+
"7": "t",
|
|
55
|
+
"!": "i"
|
|
56
|
+
};
|
|
57
|
+
return input.split("").map((char) => {
|
|
58
|
+
return leetspeakMap[char] || char;
|
|
59
|
+
}).join("");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.PasswordStrengthValidator = PasswordStrengthValidator;
|
|
63
|
+
//# sourceMappingURL=PasswordStrengthValidator.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PasswordStrengthValidator.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordStrengthValidator.ts"],"sourcesContent":["import { Config } from '../type/Config'\nimport { blacklist } from '../utils/blacklist'\nimport { WeakPasswordReason } from '../../schema'\nimport { ResponseError, Response, ResponseOk } from '../utils/Response'\n\nexport class PasswordStrengthValidator {\n\tpublic async verify<const Code extends string>(password: string, passwordConfig: Config['password'], errorCode: Code): Promise<ResponseOk<null> | ResponseError<Code, {\n\t\tweakPasswordReasons: WeakPasswordReason[]\n\t}>> {\n\t\tconst failureReasons: WeakPasswordReason[] = []\n\t\tconst developerMessage: string[] = []\n\n\t\tif (password.length < passwordConfig.minLength) {\n\t\t\tfailureReasons.push('TOO_SHORT')\n\t\t\tdeveloperMessage.push(`Password is too short. Minimum length is ${passwordConfig.minLength}.`)\n\t\t}\n\n\t\tif (passwordConfig.requireUppercase > 0 && (password.match(/[A-Z]/g) || []).length < passwordConfig.requireUppercase) {\n\t\t\tfailureReasons.push('MISSING_UPPERCASE')\n\t\t\tdeveloperMessage.push(`Password must contain at least ${passwordConfig.requireUppercase} uppercase letter${passwordConfig.requireUppercase > 1 ? 's' : ''}.`)\n\t\t}\n\n\t\tif (passwordConfig.requireLowercase > 0 && (password.match(/[a-z]/g) || []).length < passwordConfig.requireLowercase) {\n\t\t\tfailureReasons.push('MISSING_LOWERCASE')\n\t\t\tdeveloperMessage.push(`Password must contain at least ${passwordConfig.requireLowercase} lowercase letter${passwordConfig.requireLowercase > 1 ? 's' : ''}.`)\n\t\t}\n\n\t\tif (passwordConfig.requireDigit > 0 && (password.match(/\\d/g) || []).length < passwordConfig.requireDigit) {\n\t\t\tfailureReasons.push('MISSING_DIGIT')\n\t\t\tdeveloperMessage.push(`Password must contain at least ${passwordConfig.requireDigit} digit${passwordConfig.requireDigit > 1 ? 's' : ''}.`)\n\t\t}\n\n\t\tif (passwordConfig.requireSpecial > 0 && (password.match(/[!@#$%^&*(),.?\":{}|<>]/g) || []).length < passwordConfig.requireSpecial) {\n\t\t\tfailureReasons.push('MISSING_SPECIAL')\n\t\t\tdeveloperMessage.push(`Password must contain at least ${passwordConfig.requireSpecial} special character${passwordConfig.requireSpecial > 1 ? 's' : ''}.`)\n\t\t}\n\n\t\tif (passwordConfig.pattern && !new RegExp(passwordConfig.pattern).test(password)) {\n\t\t\tfailureReasons.push('INVALID_PATTERN')\n\t\t\tdeveloperMessage.push(`Password does not match the required pattern: ${passwordConfig.pattern}.`)\n\t\t}\n\n\t\tif (passwordConfig.checkBlacklist && this.isBlacklisted(password.toLowerCase())) {\n\t\t\tfailureReasons.push('BLACKLISTED')\n\t\t\tdeveloperMessage.push(`Password is blacklisted.`)\n\t\t}\n\n\t\tif (failureReasons.length > 0) {\n\t\t\treturn new ResponseError(errorCode as any, developerMessage.join(' '), {\n\t\t\t\tweakPasswordReasons: failureReasons,\n\t\t\t})\n\t\t}\n\t\treturn new ResponseOk(null)\n\t}\n\n\n\tprivate isBlacklisted(password: string): boolean {\n\t\treturn blacklist.has(password) || blacklist.has(this.decodeLeetspeak(password))\n\t}\n\n\tprivate decodeLeetspeak(input: string): string {\n\t\tconst leetspeakMap: { [key: string]: string } = {\n\t\t\t'@': 'a',\n\t\t\t'$': 's',\n\t\t\t'0': 'o',\n\t\t\t'1': 'l',\n\t\t\t'3': 'e',\n\t\t\t'7': 't',\n\t\t\t'!': 'i',\n\t\t}\n\t\treturn input\n\t\t\t.split('')\n\t\t\t.map(char => {\n\t\t\t\treturn leetspeakMap[char] || char\n\t\t\t})\n\t\t\t.join('')\n\t}\n}\n\nnamespace PasswordStrengthValidator {\n\texport type Result =\n\t\t| { ok: true }\n\t\t| { ok: false; reasons: WeakPasswordReason[]; message: string }\n}\n\n"],"names":["ResponseError","ResponseOk","blacklist"],"mappings":";;;;AAKO,MAAM,0BAA0B;AAAA,EACtC,MAAa,OAAkC,UAAkB,gBAAoC,WAEjG;AACH,UAAM,iBAAuC,CAAC;AAC9C,UAAM,mBAA6B,CAAC;AAEhC,QAAA,SAAS,SAAS,eAAe,WAAW;AAC/C,qBAAe,KAAK,WAAW;AAC/B,uBAAiB,KAAK,4CAA4C,eAAe,SAAS,GAAG;AAAA,IAAA;AAG1F,QAAA,eAAe,mBAAmB,MAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,GAAG,SAAS,eAAe,kBAAkB;AACrH,qBAAe,KAAK,mBAAmB;AACtB,uBAAA,KAAK,kCAAkC,eAAe,gBAAgB,oBAAoB,eAAe,mBAAmB,IAAI,MAAM,EAAE,GAAG;AAAA,IAAA;AAGzJ,QAAA,eAAe,mBAAmB,MAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,GAAG,SAAS,eAAe,kBAAkB;AACrH,qBAAe,KAAK,mBAAmB;AACtB,uBAAA,KAAK,kCAAkC,eAAe,gBAAgB,oBAAoB,eAAe,mBAAmB,IAAI,MAAM,EAAE,GAAG;AAAA,IAAA;AAGzJ,QAAA,eAAe,eAAe,MAAM,SAAS,MAAM,KAAK,KAAK,CAAC,GAAG,SAAS,eAAe,cAAc;AAC1G,qBAAe,KAAK,eAAe;AAClB,uBAAA,KAAK,kCAAkC,eAAe,YAAY,SAAS,eAAe,eAAe,IAAI,MAAM,EAAE,GAAG;AAAA,IAAA;AAGtI,QAAA,eAAe,iBAAiB,MAAM,SAAS,MAAM,yBAAyB,KAAK,CAAC,GAAG,SAAS,eAAe,gBAAgB;AAClI,qBAAe,KAAK,iBAAiB;AACpB,uBAAA,KAAK,kCAAkC,eAAe,cAAc,qBAAqB,eAAe,iBAAiB,IAAI,MAAM,EAAE,GAAG;AAAA,IAAA;AAGtJ,QAAA,eAAe,WAAW,CAAC,IAAI,OAAO,eAAe,OAAO,EAAE,KAAK,QAAQ,GAAG;AACjF,qBAAe,KAAK,iBAAiB;AACrC,uBAAiB,KAAK,iDAAiD,eAAe,OAAO,GAAG;AAAA,IAAA;AAGjG,QAAI,eAAe,kBAAkB,KAAK,cAAc,SAAS,YAAA,CAAa,GAAG;AAChF,qBAAe,KAAK,aAAa;AACjC,uBAAiB,KAAK,0BAA0B;AAAA,IAAA;AAG7C,QAAA,eAAe,SAAS,GAAG;AAC9B,aAAO,IAAIA,SAAc,cAAA,WAAkB,iBAAiB,KAAK,GAAG,GAAG;AAAA,QACtE,qBAAqB;AAAA,MAAA,CACrB;AAAA,IAAA;AAEK,WAAA,IAAIC,oBAAW,IAAI;AAAA,EAAA;AAAA,EAInB,cAAc,UAA2B;AACzC,WAAAC,UAAA,UAAU,IAAI,QAAQ,KAAKA,UAAAA,UAAU,IAAI,KAAK,gBAAgB,QAAQ,CAAC;AAAA,EAAA;AAAA,EAGvE,gBAAgB,OAAuB;AAC9C,UAAM,eAA0C;AAAA,MAC/C,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AACA,WAAO,MACL,MAAM,EAAE,EACR,IAAI,CAAQ,SAAA;AACL,aAAA,aAAa,IAAI,KAAK;AAAA,IAAA,CAC7B,EACA,KAAK,EAAE;AAAA,EAAA;AAEX;;"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { blacklist } from "../utils/blacklist.js";
|
|
2
|
+
import { ResponseError, ResponseOk } from "../utils/Response.js";
|
|
3
|
+
class PasswordStrengthValidator {
|
|
4
|
+
async verify(password, passwordConfig, errorCode) {
|
|
5
|
+
const failureReasons = [];
|
|
6
|
+
const developerMessage = [];
|
|
7
|
+
if (password.length < passwordConfig.minLength) {
|
|
8
|
+
failureReasons.push("TOO_SHORT");
|
|
9
|
+
developerMessage.push(`Password is too short. Minimum length is ${passwordConfig.minLength}.`);
|
|
10
|
+
}
|
|
11
|
+
if (passwordConfig.requireUppercase > 0 && (password.match(/[A-Z]/g) || []).length < passwordConfig.requireUppercase) {
|
|
12
|
+
failureReasons.push("MISSING_UPPERCASE");
|
|
13
|
+
developerMessage.push(`Password must contain at least ${passwordConfig.requireUppercase} uppercase letter${passwordConfig.requireUppercase > 1 ? "s" : ""}.`);
|
|
14
|
+
}
|
|
15
|
+
if (passwordConfig.requireLowercase > 0 && (password.match(/[a-z]/g) || []).length < passwordConfig.requireLowercase) {
|
|
16
|
+
failureReasons.push("MISSING_LOWERCASE");
|
|
17
|
+
developerMessage.push(`Password must contain at least ${passwordConfig.requireLowercase} lowercase letter${passwordConfig.requireLowercase > 1 ? "s" : ""}.`);
|
|
18
|
+
}
|
|
19
|
+
if (passwordConfig.requireDigit > 0 && (password.match(/\d/g) || []).length < passwordConfig.requireDigit) {
|
|
20
|
+
failureReasons.push("MISSING_DIGIT");
|
|
21
|
+
developerMessage.push(`Password must contain at least ${passwordConfig.requireDigit} digit${passwordConfig.requireDigit > 1 ? "s" : ""}.`);
|
|
22
|
+
}
|
|
23
|
+
if (passwordConfig.requireSpecial > 0 && (password.match(/[!@#$%^&*(),.?":{}|<>]/g) || []).length < passwordConfig.requireSpecial) {
|
|
24
|
+
failureReasons.push("MISSING_SPECIAL");
|
|
25
|
+
developerMessage.push(`Password must contain at least ${passwordConfig.requireSpecial} special character${passwordConfig.requireSpecial > 1 ? "s" : ""}.`);
|
|
26
|
+
}
|
|
27
|
+
if (passwordConfig.pattern && !new RegExp(passwordConfig.pattern).test(password)) {
|
|
28
|
+
failureReasons.push("INVALID_PATTERN");
|
|
29
|
+
developerMessage.push(`Password does not match the required pattern: ${passwordConfig.pattern}.`);
|
|
30
|
+
}
|
|
31
|
+
if (passwordConfig.checkBlacklist && this.isBlacklisted(password.toLowerCase())) {
|
|
32
|
+
failureReasons.push("BLACKLISTED");
|
|
33
|
+
developerMessage.push(`Password is blacklisted.`);
|
|
34
|
+
}
|
|
35
|
+
if (failureReasons.length > 0) {
|
|
36
|
+
return new ResponseError(errorCode, developerMessage.join(" "), {
|
|
37
|
+
weakPasswordReasons: failureReasons
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return new ResponseOk(null);
|
|
41
|
+
}
|
|
42
|
+
isBlacklisted(password) {
|
|
43
|
+
return blacklist.has(password) || blacklist.has(this.decodeLeetspeak(password));
|
|
44
|
+
}
|
|
45
|
+
decodeLeetspeak(input) {
|
|
46
|
+
const leetspeakMap = {
|
|
47
|
+
"@": "a",
|
|
48
|
+
"$": "s",
|
|
49
|
+
"0": "o",
|
|
50
|
+
"1": "l",
|
|
51
|
+
"3": "e",
|
|
52
|
+
"7": "t",
|
|
53
|
+
"!": "i"
|
|
54
|
+
};
|
|
55
|
+
return input.split("").map((char) => {
|
|
56
|
+
return leetspeakMap[char] || char;
|
|
57
|
+
}).join("");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
PasswordStrengthValidator
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=PasswordStrengthValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PasswordStrengthValidator.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordStrengthValidator.ts"],"sourcesContent":["import { Config } from '../type/Config'\nimport { blacklist } from '../utils/blacklist'\nimport { WeakPasswordReason } from '../../schema'\nimport { ResponseError, Response, ResponseOk } from '../utils/Response'\n\nexport class PasswordStrengthValidator {\n\tpublic async verify<const Code extends string>(password: string, passwordConfig: Config['password'], errorCode: Code): Promise<ResponseOk<null> | ResponseError<Code, {\n\t\tweakPasswordReasons: WeakPasswordReason[]\n\t}>> {\n\t\tconst failureReasons: WeakPasswordReason[] = []\n\t\tconst developerMessage: string[] = []\n\n\t\tif (password.length < passwordConfig.minLength) {\n\t\t\tfailureReasons.push('TOO_SHORT')\n\t\t\tdeveloperMessage.push(`Password is too short. Minimum length is ${passwordConfig.minLength}.`)\n\t\t}\n\n\t\tif (passwordConfig.requireUppercase > 0 && (password.match(/[A-Z]/g) || []).length < passwordConfig.requireUppercase) {\n\t\t\tfailureReasons.push('MISSING_UPPERCASE')\n\t\t\tdeveloperMessage.push(`Password must contain at least ${passwordConfig.requireUppercase} uppercase letter${passwordConfig.requireUppercase > 1 ? 's' : ''}.`)\n\t\t}\n\n\t\tif (passwordConfig.requireLowercase > 0 && (password.match(/[a-z]/g) || []).length < passwordConfig.requireLowercase) {\n\t\t\tfailureReasons.push('MISSING_LOWERCASE')\n\t\t\tdeveloperMessage.push(`Password must contain at least ${passwordConfig.requireLowercase} lowercase letter${passwordConfig.requireLowercase > 1 ? 's' : ''}.`)\n\t\t}\n\n\t\tif (passwordConfig.requireDigit > 0 && (password.match(/\\d/g) || []).length < passwordConfig.requireDigit) {\n\t\t\tfailureReasons.push('MISSING_DIGIT')\n\t\t\tdeveloperMessage.push(`Password must contain at least ${passwordConfig.requireDigit} digit${passwordConfig.requireDigit > 1 ? 's' : ''}.`)\n\t\t}\n\n\t\tif (passwordConfig.requireSpecial > 0 && (password.match(/[!@#$%^&*(),.?\":{}|<>]/g) || []).length < passwordConfig.requireSpecial) {\n\t\t\tfailureReasons.push('MISSING_SPECIAL')\n\t\t\tdeveloperMessage.push(`Password must contain at least ${passwordConfig.requireSpecial} special character${passwordConfig.requireSpecial > 1 ? 's' : ''}.`)\n\t\t}\n\n\t\tif (passwordConfig.pattern && !new RegExp(passwordConfig.pattern).test(password)) {\n\t\t\tfailureReasons.push('INVALID_PATTERN')\n\t\t\tdeveloperMessage.push(`Password does not match the required pattern: ${passwordConfig.pattern}.`)\n\t\t}\n\n\t\tif (passwordConfig.checkBlacklist && this.isBlacklisted(password.toLowerCase())) {\n\t\t\tfailureReasons.push('BLACKLISTED')\n\t\t\tdeveloperMessage.push(`Password is blacklisted.`)\n\t\t}\n\n\t\tif (failureReasons.length > 0) {\n\t\t\treturn new ResponseError(errorCode as any, developerMessage.join(' '), {\n\t\t\t\tweakPasswordReasons: failureReasons,\n\t\t\t})\n\t\t}\n\t\treturn new ResponseOk(null)\n\t}\n\n\n\tprivate isBlacklisted(password: string): boolean {\n\t\treturn blacklist.has(password) || blacklist.has(this.decodeLeetspeak(password))\n\t}\n\n\tprivate decodeLeetspeak(input: string): string {\n\t\tconst leetspeakMap: { [key: string]: string } = {\n\t\t\t'@': 'a',\n\t\t\t'$': 's',\n\t\t\t'0': 'o',\n\t\t\t'1': 'l',\n\t\t\t'3': 'e',\n\t\t\t'7': 't',\n\t\t\t'!': 'i',\n\t\t}\n\t\treturn input\n\t\t\t.split('')\n\t\t\t.map(char => {\n\t\t\t\treturn leetspeakMap[char] || char\n\t\t\t})\n\t\t\t.join('')\n\t}\n}\n\nnamespace PasswordStrengthValidator {\n\texport type Result =\n\t\t| { ok: true }\n\t\t| { ok: false; reasons: WeakPasswordReason[]; message: string }\n}\n\n"],"names":[],"mappings":";;AAKO,MAAM,0BAA0B;AAAA,EACtC,MAAa,OAAkC,UAAkB,gBAAoC,WAEjG;AACH,UAAM,iBAAuC,CAAC;AAC9C,UAAM,mBAA6B,CAAC;AAEhC,QAAA,SAAS,SAAS,eAAe,WAAW;AAC/C,qBAAe,KAAK,WAAW;AAC/B,uBAAiB,KAAK,4CAA4C,eAAe,SAAS,GAAG;AAAA,IAAA;AAG1F,QAAA,eAAe,mBAAmB,MAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,GAAG,SAAS,eAAe,kBAAkB;AACrH,qBAAe,KAAK,mBAAmB;AACtB,uBAAA,KAAK,kCAAkC,eAAe,gBAAgB,oBAAoB,eAAe,mBAAmB,IAAI,MAAM,EAAE,GAAG;AAAA,IAAA;AAGzJ,QAAA,eAAe,mBAAmB,MAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,GAAG,SAAS,eAAe,kBAAkB;AACrH,qBAAe,KAAK,mBAAmB;AACtB,uBAAA,KAAK,kCAAkC,eAAe,gBAAgB,oBAAoB,eAAe,mBAAmB,IAAI,MAAM,EAAE,GAAG;AAAA,IAAA;AAGzJ,QAAA,eAAe,eAAe,MAAM,SAAS,MAAM,KAAK,KAAK,CAAC,GAAG,SAAS,eAAe,cAAc;AAC1G,qBAAe,KAAK,eAAe;AAClB,uBAAA,KAAK,kCAAkC,eAAe,YAAY,SAAS,eAAe,eAAe,IAAI,MAAM,EAAE,GAAG;AAAA,IAAA;AAGtI,QAAA,eAAe,iBAAiB,MAAM,SAAS,MAAM,yBAAyB,KAAK,CAAC,GAAG,SAAS,eAAe,gBAAgB;AAClI,qBAAe,KAAK,iBAAiB;AACpB,uBAAA,KAAK,kCAAkC,eAAe,cAAc,qBAAqB,eAAe,iBAAiB,IAAI,MAAM,EAAE,GAAG;AAAA,IAAA;AAGtJ,QAAA,eAAe,WAAW,CAAC,IAAI,OAAO,eAAe,OAAO,EAAE,KAAK,QAAQ,GAAG;AACjF,qBAAe,KAAK,iBAAiB;AACrC,uBAAiB,KAAK,iDAAiD,eAAe,OAAO,GAAG;AAAA,IAAA;AAGjG,QAAI,eAAe,kBAAkB,KAAK,cAAc,SAAS,YAAA,CAAa,GAAG;AAChF,qBAAe,KAAK,aAAa;AACjC,uBAAiB,KAAK,0BAA0B;AAAA,IAAA;AAG7C,QAAA,eAAe,SAAS,GAAG;AAC9B,aAAO,IAAI,cAAc,WAAkB,iBAAiB,KAAK,GAAG,GAAG;AAAA,QACtE,qBAAqB;AAAA,MAAA,CACrB;AAAA,IAAA;AAEK,WAAA,IAAI,WAAW,IAAI;AAAA,EAAA;AAAA,EAInB,cAAc,UAA2B;AACzC,WAAA,UAAU,IAAI,QAAQ,KAAK,UAAU,IAAI,KAAK,gBAAgB,QAAQ,CAAC;AAAA,EAAA;AAAA,EAGvE,gBAAgB,OAAuB;AAC9C,UAAM,eAA0C;AAAA,MAC/C,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AACA,WAAO,MACL,MAAM,EAAE,EACR,IAAI,CAAQ,SAAA;AACL,aAAA,aAAa,IAAI,KAAK;AAAA,IAAA,CAC7B,EACA,KAAK,EAAE;AAAA,EAAA;AAEX;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
require("../queries/apiKey/ApiKeyQuery.cjs");
|
|
4
|
+
const ConfigurationQuery = require("../queries/configuration/ConfigurationQuery.cjs");
|
|
4
5
|
require("@contember/database");
|
|
5
6
|
const exceptions = require("../../exceptions.cjs");
|
|
6
7
|
const PersonQuery = require("../queries/person/PersonQuery.cjs");
|
|
@@ -16,30 +17,42 @@ const CreatePersonTokenCommand = require("../commands/personToken/CreatePersonTo
|
|
|
16
17
|
const InvalidateTokenCommand = require("../commands/personToken/InvalidateTokenCommand.cjs");
|
|
17
18
|
const IncreaseOtpAttemptCommand = require("../commands/personToken/IncreaseOtpAttemptCommand.cjs");
|
|
18
19
|
const PersonTokenQuery = require("../queries/personToken/PersonTokenQuery.cjs");
|
|
19
|
-
const
|
|
20
|
+
const token = require("../utils/token.cjs");
|
|
20
21
|
const getPreferredProject = require("./helpers/getPreferredProject.cjs");
|
|
22
|
+
const AuthLogService = require("./AuthLogService.cjs");
|
|
23
|
+
const interval = require("../utils/interval.cjs");
|
|
21
24
|
class PasswordlessSignInManager {
|
|
22
|
-
constructor(apiKeyManager,
|
|
25
|
+
constructor(apiKeyManager, mailer, projectManager, otpAuthenticator) {
|
|
23
26
|
this.apiKeyManager = apiKeyManager;
|
|
24
|
-
this.configurationManager = configurationManager;
|
|
25
27
|
this.mailer = mailer;
|
|
26
28
|
this.projectManager = projectManager;
|
|
27
29
|
this.otpAuthenticator = otpAuthenticator;
|
|
28
30
|
}
|
|
29
31
|
async initSignInPasswordless({ db, permissionContext, mailVariant, mailProject, email }) {
|
|
30
32
|
return db.transaction(async (db2) => {
|
|
31
|
-
const configuration = await
|
|
33
|
+
const configuration = await db2.queryHandler.fetch(new ConfigurationQuery.ConfigurationQuery());
|
|
32
34
|
if (configuration.passwordless.enabled === "never") {
|
|
33
|
-
return new Response.ResponseError("PASSWORDLESS_DISABLED", "Passwordless sign-in is disabled"
|
|
35
|
+
return new Response.ResponseError("PASSWORDLESS_DISABLED", "Passwordless sign-in is disabled", {
|
|
36
|
+
[AuthLogService.AuthLogService.Key]: new AuthLogService.AuthLogService.Bag({})
|
|
37
|
+
});
|
|
34
38
|
}
|
|
35
39
|
const person = await db2.queryHandler.fetch(PersonQuery.PersonQuery.byEmail(email));
|
|
36
40
|
if (!person) {
|
|
37
|
-
return new Response.ResponseError("PERSON_NOT_FOUND", `Person ${email} not found
|
|
41
|
+
return new Response.ResponseError("PERSON_NOT_FOUND", `Person ${email} not found`, {
|
|
42
|
+
[AuthLogService.AuthLogService.Key]: new AuthLogService.AuthLogService.Bag({
|
|
43
|
+
personInput: email
|
|
44
|
+
})
|
|
45
|
+
});
|
|
38
46
|
}
|
|
39
47
|
if (!this.isEnabled(configuration.passwordless.enabled, person.passwordless_enabled)) {
|
|
40
|
-
return new Response.ResponseError("PASSWORDLESS_DISABLED", "Passwordless sign-in is disabled for this person"
|
|
48
|
+
return new Response.ResponseError("PASSWORDLESS_DISABLED", "Passwordless sign-in is disabled for this person", {
|
|
49
|
+
[AuthLogService.AuthLogService.Key]: new AuthLogService.AuthLogService.Bag({
|
|
50
|
+
personInput: email,
|
|
51
|
+
personId: person.id
|
|
52
|
+
})
|
|
53
|
+
});
|
|
41
54
|
}
|
|
42
|
-
const createTokenCommand = CreatePersonTokenCommand.CreatePersonTokenCommand.createPasswordlessRequest(person.id, configuration.passwordless.
|
|
55
|
+
const createTokenCommand = CreatePersonTokenCommand.CreatePersonTokenCommand.createPasswordlessRequest(person.id, interval.intervalToSeconds(configuration.passwordless.expiration) / 60);
|
|
43
56
|
const result = await db2.commandBus.execute(createTokenCommand);
|
|
44
57
|
const url = this.formatUrl(configuration.passwordless.url ?? null, result.token, result.id, email) ?? void 0;
|
|
45
58
|
const projects = await this.projectManager.getProjectsByIdentity(db2, person.identity_id, permissionContext);
|
|
@@ -54,25 +67,34 @@ class PasswordlessSignInManager {
|
|
|
54
67
|
variant: mailVariant || "",
|
|
55
68
|
projectId: project?.id ?? null
|
|
56
69
|
});
|
|
57
|
-
return new Response.ResponseOk({
|
|
70
|
+
return new Response.ResponseOk({
|
|
71
|
+
requestId: result.id,
|
|
72
|
+
expiresAt: result.expiresAt,
|
|
73
|
+
person,
|
|
74
|
+
[AuthLogService.AuthLogService.Key]: new AuthLogService.AuthLogService.Bag({
|
|
75
|
+
personInput: email,
|
|
76
|
+
personId: person.id,
|
|
77
|
+
tokenId: result.id
|
|
78
|
+
})
|
|
79
|
+
});
|
|
58
80
|
});
|
|
59
81
|
}
|
|
60
|
-
formatUrl(url,
|
|
82
|
+
formatUrl(url, token2, requestId, email) {
|
|
61
83
|
if (!url) {
|
|
62
84
|
return null;
|
|
63
85
|
}
|
|
64
86
|
const urlObj = new URL(url);
|
|
65
|
-
urlObj.searchParams.set("token",
|
|
87
|
+
urlObj.searchParams.set("token", token2);
|
|
66
88
|
urlObj.searchParams.set("request_id", requestId);
|
|
67
89
|
urlObj.searchParams.set("email", email);
|
|
68
90
|
return urlObj.toString();
|
|
69
91
|
}
|
|
70
|
-
async signInPasswordless({ db, expiration, token, requestId, mfaOtp, validationType }) {
|
|
92
|
+
async signInPasswordless({ db, expiration, token: token$1, requestId, mfaOtp, validationType }) {
|
|
71
93
|
return db.transaction(async (db2) => {
|
|
72
94
|
const tokenResult = await db2.queryHandler.fetch(PersonTokenQuery.PersonTokenQuery.byId(requestId, "passwordless"));
|
|
73
|
-
const tokenValidationResult =
|
|
95
|
+
const tokenValidationResult = token.validateToken({
|
|
74
96
|
entry: tokenResult,
|
|
75
|
-
token,
|
|
97
|
+
token: token$1,
|
|
76
98
|
now: db2.providers.now(),
|
|
77
99
|
validationType
|
|
78
100
|
});
|
|
@@ -80,42 +102,85 @@ class PasswordlessSignInManager {
|
|
|
80
102
|
if (tokenValidationResult.error === "TOKEN_INVALID" && validationType === "otp") {
|
|
81
103
|
await db2.commandBus.execute(new IncreaseOtpAttemptCommand.IncreaseOtpAttemptCommand(tokenResult.id));
|
|
82
104
|
}
|
|
83
|
-
return tokenValidationResult
|
|
105
|
+
return new Response.ResponseError(tokenValidationResult.error, tokenValidationResult.errorMessage, {
|
|
106
|
+
...tokenValidationResult.metadata ?? {},
|
|
107
|
+
[AuthLogService.AuthLogService.Key]: new AuthLogService.AuthLogService.Bag({
|
|
108
|
+
personId: tokenResult?.person_id,
|
|
109
|
+
tokenId: tokenResult?.id
|
|
110
|
+
})
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
if (!tokenResult) {
|
|
114
|
+
throw new exceptions.ImplementationException();
|
|
84
115
|
}
|
|
85
116
|
const personRow = await db2.queryHandler.fetch(PersonQuery.PersonQuery.byId(tokenValidationResult.result.person_id));
|
|
86
117
|
if (!personRow) {
|
|
87
118
|
throw new exceptions.ImplementationException();
|
|
88
119
|
}
|
|
89
120
|
if (personRow.disabled_at !== null) {
|
|
90
|
-
return new Response.ResponseError("PERSON_DISABLED", `Person is disabled
|
|
121
|
+
return new Response.ResponseError("PERSON_DISABLED", `Person is disabled`, {
|
|
122
|
+
[AuthLogService.AuthLogService.Key]: new AuthLogService.AuthLogService.Bag({
|
|
123
|
+
personId: personRow.id,
|
|
124
|
+
tokenId: tokenResult?.id
|
|
125
|
+
})
|
|
126
|
+
});
|
|
91
127
|
}
|
|
92
128
|
if (personRow.otp_uri && personRow.otp_activated_at) {
|
|
93
129
|
if (!mfaOtp) {
|
|
94
|
-
return new Response.ResponseError("OTP_REQUIRED", `2FA is enabled. OTP token is required
|
|
130
|
+
return new Response.ResponseError("OTP_REQUIRED", `2FA is enabled. OTP token is required`, {
|
|
131
|
+
[AuthLogService.AuthLogService.Key]: new AuthLogService.AuthLogService.Bag({
|
|
132
|
+
personId: personRow.id,
|
|
133
|
+
tokenId: tokenResult?.id
|
|
134
|
+
})
|
|
135
|
+
});
|
|
95
136
|
}
|
|
96
137
|
if (!this.otpAuthenticator.validate({ uri: personRow.otp_uri }, mfaOtp)) {
|
|
97
|
-
return new Response.ResponseError("INVALID_OTP_TOKEN", "OTP token validation has failed"
|
|
138
|
+
return new Response.ResponseError("INVALID_OTP_TOKEN", "OTP token validation has failed", {
|
|
139
|
+
[AuthLogService.AuthLogService.Key]: new AuthLogService.AuthLogService.Bag({
|
|
140
|
+
personId: personRow.id,
|
|
141
|
+
tokenId: tokenResult?.id
|
|
142
|
+
})
|
|
143
|
+
});
|
|
98
144
|
}
|
|
99
145
|
}
|
|
100
146
|
await db2.commandBus.execute(new InvalidateTokenCommand.InvalidateTokenCommand(tokenValidationResult.result.id));
|
|
101
147
|
const sessionToken = await this.apiKeyManager.createSessionApiKey(db2, personRow.identity_id, expiration);
|
|
102
|
-
return new Response.ResponseOk({
|
|
148
|
+
return new Response.ResponseOk({
|
|
149
|
+
person: personRow,
|
|
150
|
+
token: sessionToken,
|
|
151
|
+
[AuthLogService.AuthLogService.Key]: new AuthLogService.AuthLogService.Bag({
|
|
152
|
+
personId: personRow.id,
|
|
153
|
+
tokenId: tokenResult?.id
|
|
154
|
+
})
|
|
155
|
+
});
|
|
103
156
|
});
|
|
104
157
|
}
|
|
105
|
-
async activatePasswordlessOtp({ db, token, requestId, otpHash }) {
|
|
158
|
+
async activatePasswordlessOtp({ db, token: token$1, requestId, otpHash }) {
|
|
106
159
|
return db.transaction(async (db2) => {
|
|
107
160
|
const tokenResult = await db2.queryHandler.fetch(PersonTokenQuery.PersonTokenQuery.byId(requestId, "passwordless"));
|
|
108
|
-
const tokenValidationResult =
|
|
161
|
+
const tokenValidationResult = token.validateToken({
|
|
109
162
|
entry: tokenResult,
|
|
110
|
-
token,
|
|
163
|
+
token: token$1,
|
|
111
164
|
now: db2.providers.now(),
|
|
112
165
|
validationType: "token"
|
|
113
166
|
});
|
|
114
167
|
if (!tokenValidationResult.ok) {
|
|
115
|
-
return tokenValidationResult
|
|
168
|
+
return new Response.ResponseError(tokenValidationResult.error, tokenValidationResult.errorMessage, {
|
|
169
|
+
...tokenValidationResult.metadata ?? {},
|
|
170
|
+
[AuthLogService.AuthLogService.Key]: new AuthLogService.AuthLogService.Bag({
|
|
171
|
+
personId: tokenResult?.person_id,
|
|
172
|
+
tokenId: tokenResult?.id
|
|
173
|
+
})
|
|
174
|
+
});
|
|
116
175
|
}
|
|
117
176
|
await db2.commandBus.execute(new ActivateOtpCommand.ActivateOtpCommand(tokenValidationResult.result.id, otpHash));
|
|
118
|
-
return new Response.ResponseOk(
|
|
177
|
+
return new Response.ResponseOk({
|
|
178
|
+
person: tokenResult?.person_id,
|
|
179
|
+
[AuthLogService.AuthLogService.Key]: new AuthLogService.AuthLogService.Bag({
|
|
180
|
+
personId: tokenResult?.person_id,
|
|
181
|
+
tokenId: tokenResult?.id
|
|
182
|
+
})
|
|
183
|
+
});
|
|
119
184
|
});
|
|
120
185
|
}
|
|
121
186
|
isEnabled(globalValue, personValue) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PasswordlessSignInManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordlessSignInManager.ts"],"sourcesContent":["import { ApiKeyManager } from './apiKey'\nimport { PersonQuery, PersonRow } from '../queries'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport {\n\tActivatePasswordlessOtpErrorCode,\n\tConfigPolicy,\n\tInitSignInPasswordlessErrorCode,\n\tInitSignInPasswordlessResult,\n\tSignInPasswordlessErrorCode,\n} from '../../schema'\nimport { DatabaseContext, validateToken } from '../utils'\nimport { ConfigurationManager } from './ConfigurationManager'\nimport { UserMailer } from '../mailing'\nimport { ActivateOtpCommand, CreatePersonTokenCommand, IncreaseOtpAttemptCommand } from '../commands'\nimport { getPreferredProject } from './helpers/getPreferredProject'\nimport { ProjectManager } from './ProjectManager'\nimport { PermissionContext } from '../authorization'\nimport { PersonTokenQuery } from '../queries/personToken/PersonTokenQuery'\nimport { ImplementationException } from '../../exceptions'\nimport { OtpAuthenticator } from './OtpAuthenticator'\nimport { InvalidateTokenCommand } from '../commands/personToken/InvalidateTokenCommand'\nimport { PersonToken } from '../type'\n\nclass PasswordlessSignInManager {\n\tconstructor(\n\t\tprivate readonly apiKeyManager: ApiKeyManager,\n\t\tprivate readonly configurationManager: ConfigurationManager,\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t\tprivate readonly otpAuthenticator: OtpAuthenticator,\n\n\t) {}\n\n\tasync initSignInPasswordless({ db, permissionContext, mailVariant, mailProject, email }: {\n\t\tdb: DatabaseContext\n\t\tpermissionContext: PermissionContext\n\t\temail: string\n\t\tmailVariant?: string\n\t\tmailProject?: string\n\t}): Promise<PasswordlessSignInManager.InitSignInPasswordlessResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.InitSignInPasswordlessResponse> => {\n\t\t\tconst configuration = await this.configurationManager.fetchConfiguration(db)\n\t\t\tif (configuration.passwordless.enabled === 'never') {\n\t\t\t\treturn new ResponseError('PASSWORDLESS_DISABLED', 'Passwordless sign-in is disabled')\n\t\t\t}\n\n\t\t\tconst person = await db.queryHandler.fetch(PersonQuery.byEmail(email))\n\t\t\tif (!person) {\n\t\t\t\treturn new ResponseError('PERSON_NOT_FOUND', `Person ${email} not found`)\n\t\t\t}\n\t\t\tif (!this.isEnabled(configuration.passwordless.enabled, person.passwordless_enabled)) {\n\t\t\t\treturn new ResponseError('PASSWORDLESS_DISABLED', 'Passwordless sign-in is disabled for this person')\n\t\t\t}\n\n\t\t\tconst createTokenCommand = CreatePersonTokenCommand.createPasswordlessRequest(person.id, configuration.passwordless.expirationMinutes)\n\t\t\tconst result = await db.commandBus.execute(createTokenCommand)\n\n\n\t\t\tconst url = this.formatUrl(configuration.passwordless.url ?? null, result.token, result.id, email) ?? undefined\n\n\t\t\tconst projects = await this.projectManager.getProjectsByIdentity(db, person.identity_id, permissionContext)\n\t\t\tconst project = getPreferredProject(projects, mailProject ?? null)\n\n\t\t\tawait this.mailer.sendPasswordlessEmail(db, {\n\t\t\t\temail,\n\t\t\t\ttoken: result.token,\n\t\t\t\turl,\n\t\t\t\tproject: project?.name,\n\t\t\t\tprojectSlug: project?.slug,\n\t\t\t}, {\n\t\t\t\tvariant: mailVariant || '',\n\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t})\n\n\t\t\treturn new ResponseOk({ requestId: result.id, expiresAt: result.expiresAt })\n\t\t})\n\t}\n\n\tprivate formatUrl(url: string | null, token: string, requestId: string, email: string): string | null {\n\t\tif (!url) {\n\t\t\treturn null\n\t\t}\n\t\tconst urlObj = new URL(url)\n\t\turlObj.searchParams.set('token', token)\n\t\turlObj.searchParams.set('request_id', requestId)\n\t\turlObj.searchParams.set('email', email)\n\t\treturn urlObj.toString()\n\t}\n\n\tasync signInPasswordless({ db, expiration, token, requestId, mfaOtp, validationType }: {\n\t\tdb: DatabaseContext\n\t\tvalidationType: PersonToken.ValidationType\n\t\trequestId: string\n\t\ttoken: string\n\t\tmfaOtp?: string\n\t\texpiration?: number\n\t}): Promise<PasswordlessSignInManager.SignInPasswordlessResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.SignInPasswordlessResponse> => {\n\n\t\t\tconst tokenResult = await db.queryHandler.fetch(PersonTokenQuery.byId(requestId, 'passwordless'))\n\t\t\tconst tokenValidationResult = validateToken({\n\t\t\t\tentry: tokenResult,\n\t\t\t\ttoken,\n\t\t\t\tnow: db.providers.now(),\n\t\t\t\tvalidationType,\n\t\t\t})\n\t\t\tif (!tokenValidationResult.ok) {\n\t\t\t\tif (tokenValidationResult.error === 'TOKEN_INVALID' && validationType === 'otp') {\n\t\t\t\t\tawait db.commandBus.execute(new IncreaseOtpAttemptCommand(tokenResult!.id))\n\t\t\t\t}\n\t\t\t\treturn tokenValidationResult\n\t\t\t}\n\t\t\tconst personRow = await db.queryHandler.fetch(PersonQuery.byId(tokenValidationResult.result.person_id))\n\t\t\tif (!personRow) {\n\t\t\t\tthrow new ImplementationException()\n\t\t\t}\n\t\t\tif (personRow.disabled_at !== null) {\n\t\t\t\treturn new ResponseError('PERSON_DISABLED', `Person is disabled`)\n\t\t\t}\n\n\t\t\tif (personRow.otp_uri && personRow.otp_activated_at) {\n\t\t\t\tif (!mfaOtp) {\n\t\t\t\t\treturn new ResponseError('OTP_REQUIRED', `2FA is enabled. OTP token is required`)\n\t\t\t\t}\n\n\t\t\t\tif (!this.otpAuthenticator.validate({ uri: personRow.otp_uri }, mfaOtp)) {\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait db.commandBus.execute(new InvalidateTokenCommand(tokenValidationResult.result.id))\n\t\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(db, personRow.identity_id, expiration)\n\n\t\t\treturn new ResponseOk({ person: personRow, token: sessionToken })\n\t\t})\n\t}\n\n\tasync activatePasswordlessOtp({ db, token, requestId, otpHash }: {\n\t\tdb: DatabaseContext\n\t\trequestId: string\n\t\ttoken: string\n\t\totpHash: string\n\t}): Promise<PasswordlessSignInManager.ActivatePasswordlessOtpResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.ActivatePasswordlessOtpResponse> => {\n\n\t\t\tconst tokenResult = await db.queryHandler.fetch(PersonTokenQuery.byId(requestId, 'passwordless'))\n\t\t\tconst tokenValidationResult = validateToken({\n\t\t\t\tentry: tokenResult,\n\t\t\t\ttoken,\n\t\t\t\tnow: db.providers.now(),\n\t\t\t\tvalidationType: 'token',\n\t\t\t})\n\t\t\tif (!tokenValidationResult.ok) {\n\t\t\t\treturn tokenValidationResult\n\t\t\t}\n\n\t\t\tawait db.commandBus.execute(new ActivateOtpCommand(tokenValidationResult.result.id, otpHash))\n\n\t\t\treturn new ResponseOk(null)\n\t\t})\n\t}\n\n\tprivate isEnabled(globalValue: ConfigPolicy, personValue: boolean | null): boolean {\n\t\tswitch (globalValue) {\n\t\t\tcase 'always':\n\t\t\t\treturn true\n\t\t\tcase 'never':\n\t\t\t\treturn false\n\t\t\tcase 'optIn':\n\t\t\t\treturn personValue === true\n\t\t\tcase 'optOut':\n\t\t\t\treturn personValue !== false\n\t\t}\n\t}\n}\n\nnamespace PasswordlessSignInManager {\n\texport type InitSignInPasswordlessResponse = Response<InitSignInPasswordlessResult, InitSignInPasswordlessErrorCode>\n\n\n\tinterface SignInPasswordlessResult {\n\t\treadonly person: PersonRow\n\t\treadonly token: string\n\t}\n\texport type SignInPasswordlessResponse = Response<SignInPasswordlessResult, SignInPasswordlessErrorCode>\n\n\texport type ActivatePasswordlessOtpResponse = Response<null, ActivatePasswordlessOtpErrorCode>\n}\n\nexport { PasswordlessSignInManager }\n"],"names":["db","ResponseError","PersonQuery","CreatePersonTokenCommand","getPreferredProject","ResponseOk","PersonTokenQuery","validateToken","IncreaseOtpAttemptCommand","ImplementationException","InvalidateTokenCommand","ActivateOtpCommand"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PasswordlessSignInManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordlessSignInManager.ts"],"sourcesContent":["import { ApiKeyManager } from './apiKey'\nimport { ConfigurationQuery, PersonQuery, PersonRow } from '../queries'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { ActivatePasswordlessOtpErrorCode, ConfigPolicy, InitSignInPasswordlessErrorCode, InitSignInPasswordlessResult, SignInPasswordlessErrorCode } from '../../schema'\nimport { DatabaseContext, validateToken } from '../utils'\nimport { UserMailer } from '../mailing'\nimport { ActivateOtpCommand, CreatePersonTokenCommand, IncreaseOtpAttemptCommand, InvalidateTokenCommand } from '../commands'\nimport { getPreferredProject } from './helpers/getPreferredProject'\nimport { ProjectManager } from './ProjectManager'\nimport { PermissionContext } from '../authorization'\nimport { PersonTokenQuery } from '../queries/personToken/PersonTokenQuery'\nimport { ImplementationException } from '../../exceptions'\nimport { OtpAuthenticator } from './OtpAuthenticator'\nimport { PersonToken } from '../type'\nimport { AuthLogService } from './AuthLogService'\nimport { intervalToSeconds } from '../utils/interval'\n\nclass PasswordlessSignInManager {\n\tconstructor(\n\t\tprivate readonly apiKeyManager: ApiKeyManager,\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t\tprivate readonly otpAuthenticator: OtpAuthenticator,\n\n\t) {}\n\n\tasync initSignInPasswordless({ db, permissionContext, mailVariant, mailProject, email }: {\n\t\tdb: DatabaseContext\n\t\tpermissionContext: PermissionContext\n\t\temail: string\n\t\tmailVariant?: string\n\t\tmailProject?: string\n\t}): Promise<PasswordlessSignInManager.InitSignInPasswordlessResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.InitSignInPasswordlessResponse> => {\n\t\t\tconst configuration = await db.queryHandler.fetch(new ConfigurationQuery())\n\t\t\tif (configuration.passwordless.enabled === 'never') {\n\t\t\t\treturn new ResponseError('PASSWORDLESS_DISABLED', 'Passwordless sign-in is disabled', {\n\t\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({}),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst person = await db.queryHandler.fetch(PersonQuery.byEmail(email))\n\t\t\tif (!person) {\n\t\t\t\treturn new ResponseError('PERSON_NOT_FOUND', `Person ${email} not found`, {\n\t\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\t\tpersonInput: email,\n\t\t\t\t\t}),\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (!this.isEnabled(configuration.passwordless.enabled, person.passwordless_enabled)) {\n\t\t\t\treturn new ResponseError('PASSWORDLESS_DISABLED', 'Passwordless sign-in is disabled for this person', {\n\t\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\t\tpersonInput: email,\n\t\t\t\t\t\tpersonId: person.id,\n\t\t\t\t\t}),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst createTokenCommand = CreatePersonTokenCommand.createPasswordlessRequest(person.id, intervalToSeconds(configuration.passwordless.expiration) / 60)\n\t\t\tconst result = await db.commandBus.execute(createTokenCommand)\n\n\n\t\t\tconst url = this.formatUrl(configuration.passwordless.url ?? null, result.token, result.id, email) ?? undefined\n\n\t\t\tconst projects = await this.projectManager.getProjectsByIdentity(db, person.identity_id, permissionContext)\n\t\t\tconst project = getPreferredProject(projects, mailProject ?? null)\n\n\t\t\tawait this.mailer.sendPasswordlessEmail(db, {\n\t\t\t\temail,\n\t\t\t\ttoken: result.token,\n\t\t\t\turl,\n\t\t\t\tproject: project?.name,\n\t\t\t\tprojectSlug: project?.slug,\n\t\t\t}, {\n\t\t\t\tvariant: mailVariant || '',\n\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t})\n\n\t\t\treturn new ResponseOk({\n\t\t\t\trequestId: result.id,\n\t\t\t\texpiresAt: result.expiresAt,\n\t\t\t\tperson,\n\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\tpersonInput: email,\n\t\t\t\t\tpersonId: person.id,\n\t\t\t\t\ttokenId: result.id,\n\t\t\t\t}),\n\t\t\t})\n\t\t})\n\t}\n\n\tprivate formatUrl(url: string | null, token: string, requestId: string, email: string): string | null {\n\t\tif (!url) {\n\t\t\treturn null\n\t\t}\n\t\tconst urlObj = new URL(url)\n\t\turlObj.searchParams.set('token', token)\n\t\turlObj.searchParams.set('request_id', requestId)\n\t\turlObj.searchParams.set('email', email)\n\t\treturn urlObj.toString()\n\t}\n\n\tasync signInPasswordless({ db, expiration, token, requestId, mfaOtp, validationType }: {\n\t\tdb: DatabaseContext\n\t\tvalidationType: PersonToken.ValidationType\n\t\trequestId: string\n\t\ttoken: string\n\t\tmfaOtp?: string\n\t\texpiration?: number\n\t}): Promise<PasswordlessSignInManager.SignInPasswordlessResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.SignInPasswordlessResponse> => {\n\n\t\t\tconst tokenResult = await db.queryHandler.fetch(PersonTokenQuery.byId(requestId, 'passwordless'))\n\t\t\tconst tokenValidationResult = validateToken({\n\t\t\t\tentry: tokenResult,\n\t\t\t\ttoken,\n\t\t\t\tnow: db.providers.now(),\n\t\t\t\tvalidationType,\n\t\t\t})\n\t\t\tif (!tokenValidationResult.ok) {\n\t\t\t\tif (tokenValidationResult.error === 'TOKEN_INVALID' && validationType === 'otp') {\n\t\t\t\t\tawait db.commandBus.execute(new IncreaseOtpAttemptCommand(tokenResult!.id))\n\t\t\t\t}\n\t\t\t\treturn new ResponseError(tokenValidationResult.error, tokenValidationResult.errorMessage, {\n\t\t\t\t\t...tokenValidationResult.metadata ?? {},\n\t\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\t\tpersonId: tokenResult?.person_id,\n\t\t\t\t\t\ttokenId: tokenResult?.id,\n\t\t\t\t\t}),\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (!tokenResult) {\n\t\t\t\tthrow new ImplementationException()\n\t\t\t}\n\t\t\tconst personRow = await db.queryHandler.fetch(PersonQuery.byId(tokenValidationResult.result.person_id))\n\t\t\tif (!personRow) {\n\t\t\t\tthrow new ImplementationException()\n\t\t\t}\n\t\t\tif (personRow.disabled_at !== null) {\n\t\t\t\treturn new ResponseError('PERSON_DISABLED', `Person is disabled`, {\n\t\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\t\tpersonId: personRow.id,\n\t\t\t\t\t\ttokenId: tokenResult?.id,\n\t\t\t\t\t}),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (personRow.otp_uri && personRow.otp_activated_at) {\n\t\t\t\tif (!mfaOtp) {\n\t\t\t\t\treturn new ResponseError('OTP_REQUIRED', `2FA is enabled. OTP token is required`, {\n\t\t\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\t\t\tpersonId: personRow.id,\n\t\t\t\t\t\t\ttokenId: tokenResult?.id,\n\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tif (!this.otpAuthenticator.validate({ uri: personRow.otp_uri }, mfaOtp)) {\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed', {\n\t\t\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\t\t\tpersonId: personRow.id,\n\t\t\t\t\t\t\ttokenId: tokenResult?.id,\n\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait db.commandBus.execute(new InvalidateTokenCommand(tokenValidationResult.result.id))\n\t\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(db, personRow.identity_id, expiration)\n\n\t\t\treturn new ResponseOk({\n\t\t\t\tperson: personRow,\n\t\t\t\ttoken: sessionToken,\n\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\tpersonId: personRow.id,\n\t\t\t\t\ttokenId: tokenResult?.id,\n\t\t\t\t}),\n\t\t\t})\n\t\t})\n\t}\n\n\tasync activatePasswordlessOtp({ db, token, requestId, otpHash }: {\n\t\tdb: DatabaseContext\n\t\trequestId: string\n\t\ttoken: string\n\t\totpHash: string\n\t}): Promise<PasswordlessSignInManager.ActivatePasswordlessOtpResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.ActivatePasswordlessOtpResponse> => {\n\n\t\t\tconst tokenResult = await db.queryHandler.fetch(PersonTokenQuery.byId(requestId, 'passwordless'))\n\t\t\tconst tokenValidationResult = validateToken({\n\t\t\t\tentry: tokenResult,\n\t\t\t\ttoken,\n\t\t\t\tnow: db.providers.now(),\n\t\t\t\tvalidationType: 'token',\n\t\t\t})\n\t\t\tif (!tokenValidationResult.ok) {\n\t\t\t\treturn new ResponseError(tokenValidationResult.error, tokenValidationResult.errorMessage, {\n\t\t\t\t\t...tokenValidationResult.metadata ?? {},\n\t\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\t\tpersonId: tokenResult?.person_id,\n\t\t\t\t\t\ttokenId: tokenResult?.id,\n\t\t\t\t\t}),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tawait db.commandBus.execute(new ActivateOtpCommand(tokenValidationResult.result.id, otpHash))\n\n\t\t\treturn new ResponseOk({\n\t\t\t\tperson: tokenResult?.person_id,\n\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\tpersonId: tokenResult?.person_id,\n\t\t\t\t\ttokenId: tokenResult?.id,\n\t\t\t\t}),\n\t\t\t})\n\t\t})\n\t}\n\n\tprivate isEnabled(globalValue: ConfigPolicy, personValue: boolean | null): boolean {\n\t\tswitch (globalValue) {\n\t\t\tcase 'always':\n\t\t\t\treturn true\n\t\t\tcase 'never':\n\t\t\t\treturn false\n\t\t\tcase 'optIn':\n\t\t\t\treturn personValue === true\n\t\t\tcase 'optOut':\n\t\t\t\treturn personValue !== false\n\t\t}\n\t}\n}\n\nnamespace PasswordlessSignInManager {\n\texport type InitSignInPasswordlessResponse = Response<InitSignInPasswordlessResult & {\n\t\t[AuthLogService.Key]: AuthLogService.Bag\n\t}, InitSignInPasswordlessErrorCode, {\n\t\t[AuthLogService.Key]: AuthLogService.Bag\n\t}>\n\n\n\tinterface SignInPasswordlessResult {\n\t\treadonly person: PersonRow\n\t\treadonly token: string\n\t\t[AuthLogService.Key]: AuthLogService.Bag\n\t}\n\texport type SignInPasswordlessResponse = Response<SignInPasswordlessResult, SignInPasswordlessErrorCode, {\n\t\t[AuthLogService.Key]: AuthLogService.Bag\n\t}>\n\n\texport type ActivatePasswordlessOtpResponse = Response<{\n\t\t[AuthLogService.Key]: AuthLogService.Bag\n\t}, ActivatePasswordlessOtpErrorCode, {\n\t\t[AuthLogService.Key]: AuthLogService.Bag\n\t}>\n}\n\nexport { PasswordlessSignInManager }\n"],"names":["db","ConfigurationQuery","ResponseError","AuthLogService","PersonQuery","CreatePersonTokenCommand","intervalToSeconds","getPreferredProject","ResponseOk","token","PersonTokenQuery","validateToken","IncreaseOtpAttemptCommand","ImplementationException","InvalidateTokenCommand","ActivateOtpCommand"],"mappings":"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"}
|