@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.
Files changed (740) hide show
  1. package/dist/development/index.cjs +5 -6
  2. package/dist/development/index.cjs.map +1 -1
  3. package/dist/development/index.js +2 -3
  4. package/dist/development/src/TenantContainer.cjs +4 -2
  5. package/dist/development/src/TenantContainer.cjs.map +1 -1
  6. package/dist/development/src/TenantContainer.js +4 -2
  7. package/dist/development/src/TenantContainer.js.map +1 -1
  8. package/dist/development/src/bridges/system/IdentityFetcher.cjs +1 -0
  9. package/dist/development/src/bridges/system/IdentityFetcher.cjs.map +1 -1
  10. package/dist/development/src/bridges/system/IdentityFetcher.js +1 -0
  11. package/dist/development/src/bridges/system/IdentityFetcher.js.map +1 -1
  12. package/dist/development/src/migrations/2025-04-16-180000-config-up.cjs +39 -0
  13. package/dist/development/src/migrations/2025-04-16-180000-config-up.cjs.map +1 -0
  14. package/dist/development/src/migrations/2025-04-16-180000-config-up.js +40 -0
  15. package/dist/development/src/migrations/2025-04-16-180000-config-up.js.map +1 -0
  16. package/dist/development/src/migrations/2025-04-17-160000-auth-log.cjs +45 -0
  17. package/dist/development/src/migrations/2025-04-17-160000-auth-log.cjs.map +1 -0
  18. package/dist/development/src/migrations/2025-04-17-160000-auth-log.js +46 -0
  19. package/dist/development/src/migrations/2025-04-17-160000-auth-log.js.map +1 -0
  20. package/dist/development/src/migrations/runner.cjs +9 -4
  21. package/dist/development/src/migrations/runner.cjs.map +1 -1
  22. package/dist/development/src/migrations/runner.js +7 -2
  23. package/dist/development/src/migrations/runner.js.map +1 -1
  24. package/dist/development/src/migrations/snapshot.cjs +56 -1
  25. package/dist/development/src/migrations/snapshot.cjs.map +1 -1
  26. package/dist/development/src/migrations/snapshot.js +56 -1
  27. package/dist/development/src/migrations/snapshot.js.map +1 -1
  28. package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.cjs +7 -7
  29. package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.cjs.map +1 -1
  30. package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.js +1 -1
  31. package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs +27 -0
  32. package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs.map +1 -0
  33. package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.js +27 -0
  34. package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.js.map +1 -0
  35. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.cjs +15 -2
  36. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.cjs.map +1 -1
  37. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.js +15 -2
  38. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.js.map +1 -1
  39. package/dist/development/src/model/commands/personToken/CreatePersonTokenCommand.cjs +4 -4
  40. package/dist/development/src/model/commands/personToken/CreatePersonTokenCommand.cjs.map +1 -1
  41. package/dist/development/src/model/commands/personToken/CreatePersonTokenCommand.js +1 -1
  42. package/dist/development/src/model/commands/personToken/ResetPasswordCommand.cjs +5 -5
  43. package/dist/development/src/model/commands/personToken/ResetPasswordCommand.cjs.map +1 -1
  44. package/dist/development/src/model/commands/personToken/ResetPasswordCommand.js +1 -1
  45. package/dist/development/src/model/queries/apiKey/ApiKeyQuery.cjs +4 -4
  46. package/dist/development/src/model/queries/apiKey/ApiKeyQuery.cjs.map +1 -1
  47. package/dist/development/src/model/queries/apiKey/ApiKeyQuery.js +1 -1
  48. package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.cjs +46 -0
  49. package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.cjs.map +1 -0
  50. package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.js +46 -0
  51. package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.js.map +1 -0
  52. package/dist/development/src/model/queries/configuration/ConfigurationQuery.cjs +18 -1
  53. package/dist/development/src/model/queries/configuration/ConfigurationQuery.cjs.map +1 -1
  54. package/dist/development/src/model/queries/configuration/ConfigurationQuery.js +18 -1
  55. package/dist/development/src/model/queries/configuration/ConfigurationQuery.js.map +1 -1
  56. package/dist/development/src/model/queries/personToken/PersonTokenQuery.cjs +3 -3
  57. package/dist/development/src/model/queries/personToken/PersonTokenQuery.cjs.map +1 -1
  58. package/dist/development/src/model/queries/personToken/PersonTokenQuery.js +1 -1
  59. package/dist/development/src/model/service/AuthLogService.cjs +34 -0
  60. package/dist/development/src/model/service/AuthLogService.cjs.map +1 -0
  61. package/dist/development/src/model/service/AuthLogService.js +34 -0
  62. package/dist/development/src/model/service/AuthLogService.js.map +1 -0
  63. package/dist/development/src/model/service/ConfigurationManager.cjs +0 -10
  64. package/dist/development/src/model/service/ConfigurationManager.cjs.map +1 -1
  65. package/dist/development/src/model/service/ConfigurationManager.js +0 -10
  66. package/dist/development/src/model/service/ConfigurationManager.js.map +1 -1
  67. package/dist/development/src/model/service/IDPSignInManager.cjs +37 -5
  68. package/dist/development/src/model/service/IDPSignInManager.cjs.map +1 -1
  69. package/dist/development/src/model/service/IDPSignInManager.js +37 -5
  70. package/dist/development/src/model/service/IDPSignInManager.js.map +1 -1
  71. package/dist/development/src/model/service/PasswordChangeManager.cjs +21 -12
  72. package/dist/development/src/model/service/PasswordChangeManager.cjs.map +1 -1
  73. package/dist/development/src/model/service/PasswordChangeManager.js +20 -11
  74. package/dist/development/src/model/service/PasswordChangeManager.js.map +1 -1
  75. package/dist/development/src/model/service/PasswordResetManager.cjs +40 -8
  76. package/dist/development/src/model/service/PasswordResetManager.cjs.map +1 -1
  77. package/dist/development/src/model/service/PasswordResetManager.js +40 -8
  78. package/dist/development/src/model/service/PasswordResetManager.js.map +1 -1
  79. package/dist/development/src/model/service/PasswordStrengthValidator.cjs +63 -0
  80. package/dist/development/src/model/service/PasswordStrengthValidator.cjs.map +1 -0
  81. package/dist/development/src/model/service/PasswordStrengthValidator.js +63 -0
  82. package/dist/development/src/model/service/PasswordStrengthValidator.js.map +1 -0
  83. package/dist/development/src/model/service/PasswordlessSignInManager.cjs +89 -24
  84. package/dist/development/src/model/service/PasswordlessSignInManager.cjs.map +1 -1
  85. package/dist/development/src/model/service/PasswordlessSignInManager.js +81 -16
  86. package/dist/development/src/model/service/PasswordlessSignInManager.js.map +1 -1
  87. package/dist/development/src/model/service/PersonAccessManager.cjs +7 -29
  88. package/dist/development/src/model/service/PersonAccessManager.cjs.map +1 -1
  89. package/dist/development/src/model/service/PersonAccessManager.js +7 -29
  90. package/dist/development/src/model/service/PersonAccessManager.js.map +1 -1
  91. package/dist/development/src/model/service/SignInManager.cjs +56 -31
  92. package/dist/development/src/model/service/SignInManager.cjs.map +1 -1
  93. package/dist/development/src/model/service/SignInManager.js +57 -32
  94. package/dist/development/src/model/service/SignInManager.js.map +1 -1
  95. package/dist/development/src/model/service/SignUpManager.cjs +13 -8
  96. package/dist/development/src/model/service/SignUpManager.cjs.map +1 -1
  97. package/dist/development/src/model/service/SignUpManager.js +11 -6
  98. package/dist/development/src/model/service/SignUpManager.js.map +1 -1
  99. package/dist/development/src/model/service/apiKey/ApiKeyManager.cjs +6 -1
  100. package/dist/development/src/model/service/apiKey/ApiKeyManager.cjs.map +1 -1
  101. package/dist/development/src/model/service/apiKey/ApiKeyManager.js +6 -1
  102. package/dist/development/src/model/service/apiKey/ApiKeyManager.js.map +1 -1
  103. package/dist/development/src/model/utils/Response.cjs +2 -1
  104. package/dist/development/src/model/utils/Response.cjs.map +1 -1
  105. package/dist/development/src/model/utils/Response.js +2 -1
  106. package/dist/development/src/model/utils/Response.js.map +1 -1
  107. package/dist/development/src/model/utils/blacklist.cjs +10006 -0
  108. package/dist/development/src/model/utils/blacklist.cjs.map +1 -0
  109. package/dist/development/src/model/utils/blacklist.js +10006 -0
  110. package/dist/development/src/model/utils/blacklist.js.map +1 -0
  111. package/dist/{production/src/model/utils/typeUtils.cjs → development/src/model/utils/hex.cjs} +1 -1
  112. package/dist/development/src/model/utils/hex.cjs.map +1 -0
  113. package/dist/development/src/model/utils/{typeUtils.js → hex.js} +1 -1
  114. package/dist/development/src/model/utils/hex.js.map +1 -0
  115. package/dist/development/src/model/utils/interval.cjs +8 -0
  116. package/dist/development/src/model/utils/interval.cjs.map +1 -0
  117. package/dist/development/src/model/utils/interval.js +8 -0
  118. package/dist/development/src/model/utils/interval.js.map +1 -0
  119. package/dist/development/src/model/utils/{tokenUtils.cjs → token.cjs} +3 -3
  120. package/dist/development/src/model/utils/token.cjs.map +1 -0
  121. package/dist/development/src/model/utils/{tokenUtils.js → token.js} +2 -2
  122. package/dist/development/src/model/utils/token.js.map +1 -0
  123. package/dist/development/src/resolvers/ResolverFactory.cjs +1 -0
  124. package/dist/development/src/resolvers/ResolverFactory.cjs.map +1 -1
  125. package/dist/development/src/resolvers/ResolverFactory.js +2 -1
  126. package/dist/development/src/resolvers/ResolverFactory.js.map +1 -1
  127. package/dist/development/src/resolvers/TenantResolverContextFactory.cjs +10 -2
  128. package/dist/development/src/resolvers/TenantResolverContextFactory.cjs.map +1 -1
  129. package/dist/development/src/resolvers/TenantResolverContextFactory.js +10 -2
  130. package/dist/development/src/resolvers/TenantResolverContextFactory.js.map +1 -1
  131. package/dist/development/src/resolvers/errorUtils.cjs +15 -4
  132. package/dist/development/src/resolvers/errorUtils.cjs.map +1 -1
  133. package/dist/development/src/resolvers/errorUtils.js +15 -4
  134. package/dist/development/src/resolvers/errorUtils.js.map +1 -1
  135. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs +4 -3
  136. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs.map +1 -1
  137. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js +2 -1
  138. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js.map +1 -1
  139. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs +1 -0
  140. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs.map +1 -1
  141. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js +1 -0
  142. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js.map +1 -1
  143. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs +1 -0
  144. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs.map +1 -1
  145. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js +1 -0
  146. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js.map +1 -1
  147. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs +1 -0
  148. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs.map +1 -1
  149. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js +1 -0
  150. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js.map +1 -1
  151. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs +1 -0
  152. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs.map +1 -1
  153. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.js +1 -0
  154. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.js.map +1 -1
  155. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs +1 -0
  156. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs.map +1 -1
  157. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.js +1 -0
  158. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.js.map +1 -1
  159. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs +1 -0
  160. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs.map +1 -1
  161. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.js +1 -0
  162. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.js.map +1 -1
  163. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs +1 -0
  164. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs.map +1 -1
  165. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js +1 -0
  166. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js.map +1 -1
  167. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs +1 -0
  168. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs.map +1 -1
  169. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js +1 -0
  170. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js.map +1 -1
  171. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs +17 -6
  172. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs.map +1 -1
  173. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.js +17 -6
  174. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.js.map +1 -1
  175. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs +14 -0
  176. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs.map +1 -1
  177. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.js +14 -0
  178. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.js.map +1 -1
  179. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs +7 -1
  180. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs.map +1 -1
  181. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.js +7 -1
  182. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.js.map +1 -1
  183. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.cjs +5 -0
  184. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.cjs.map +1 -1
  185. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.js +5 -0
  186. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.js.map +1 -1
  187. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.cjs +3 -2
  188. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.cjs.map +1 -1
  189. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.js +2 -1
  190. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.js.map +1 -1
  191. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.cjs +26 -1
  192. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.cjs.map +1 -1
  193. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.js +26 -1
  194. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.js.map +1 -1
  195. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs +20 -0
  196. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs.map +1 -1
  197. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.js +20 -0
  198. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.js.map +1 -1
  199. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs +25 -2
  200. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs.map +1 -1
  201. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.js +25 -2
  202. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.js.map +1 -1
  203. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.cjs +22 -0
  204. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.cjs.map +1 -1
  205. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.js +22 -0
  206. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.js.map +1 -1
  207. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.cjs +1 -0
  208. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.cjs.map +1 -1
  209. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.js +1 -0
  210. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.js.map +1 -1
  211. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.cjs +2 -1
  212. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.cjs.map +1 -1
  213. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.js +2 -1
  214. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.js.map +1 -1
  215. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs +3 -1
  216. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs.map +1 -1
  217. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js +3 -1
  218. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js.map +1 -1
  219. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs +3 -2
  220. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs.map +1 -1
  221. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.js +2 -1
  222. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.js.map +1 -1
  223. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs +1 -0
  224. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs.map +1 -1
  225. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js +1 -0
  226. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js.map +1 -1
  227. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs +1 -0
  228. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs.map +1 -1
  229. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.js +1 -0
  230. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.js.map +1 -1
  231. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs +1 -0
  232. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs.map +1 -1
  233. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js +1 -0
  234. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js.map +1 -1
  235. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs +1 -0
  236. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs.map +1 -1
  237. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js +1 -0
  238. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js.map +1 -1
  239. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs +1 -0
  240. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs.map +1 -1
  241. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js +1 -0
  242. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js.map +1 -1
  243. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.cjs +3 -1
  244. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.cjs.map +1 -1
  245. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.js +3 -1
  246. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.js.map +1 -1
  247. package/dist/development/src/resolvers/query/IDPQueryResolver.cjs +1 -0
  248. package/dist/development/src/resolvers/query/IDPQueryResolver.cjs.map +1 -1
  249. package/dist/development/src/resolvers/query/IDPQueryResolver.js +1 -0
  250. package/dist/development/src/resolvers/query/IDPQueryResolver.js.map +1 -1
  251. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.cjs +1 -0
  252. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.cjs.map +1 -1
  253. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.js +1 -0
  254. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.js.map +1 -1
  255. package/dist/development/src/resolvers/query/PersonQueryResolver.cjs +1 -0
  256. package/dist/development/src/resolvers/query/PersonQueryResolver.cjs.map +1 -1
  257. package/dist/development/src/resolvers/query/PersonQueryResolver.js +1 -0
  258. package/dist/development/src/resolvers/query/PersonQueryResolver.js.map +1 -1
  259. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.cjs +1 -0
  260. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.cjs.map +1 -1
  261. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.js +1 -0
  262. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.js.map +1 -1
  263. package/dist/development/src/resolvers/query/ProjectQueryResolver.cjs +1 -0
  264. package/dist/development/src/resolvers/query/ProjectQueryResolver.cjs.map +1 -1
  265. package/dist/development/src/resolvers/query/ProjectQueryResolver.js +1 -0
  266. package/dist/development/src/resolvers/query/ProjectQueryResolver.js.map +1 -1
  267. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.cjs +1 -0
  268. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.cjs.map +1 -1
  269. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.js +1 -0
  270. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.js.map +1 -1
  271. package/dist/development/src/resolvers/types/IdentityTypeResolver.cjs +1 -0
  272. package/dist/development/src/resolvers/types/IdentityTypeResolver.cjs.map +1 -1
  273. package/dist/development/src/resolvers/types/IdentityTypeResolver.js +1 -0
  274. package/dist/development/src/resolvers/types/IdentityTypeResolver.js.map +1 -1
  275. package/dist/development/src/resolvers/types/ProjectTypeResolver.cjs +1 -0
  276. package/dist/development/src/resolvers/types/ProjectTypeResolver.cjs.map +1 -1
  277. package/dist/development/src/resolvers/types/ProjectTypeResolver.js +1 -0
  278. package/dist/development/src/resolvers/types/ProjectTypeResolver.js.map +1 -1
  279. package/dist/development/src/schema/tenant.graphql.cjs +64 -2
  280. package/dist/development/src/schema/tenant.graphql.cjs.map +1 -1
  281. package/dist/development/src/schema/tenant.graphql.js +64 -2
  282. package/dist/development/src/schema/tenant.graphql.js.map +1 -1
  283. package/dist/production/index.cjs +5 -6
  284. package/dist/production/index.cjs.map +1 -1
  285. package/dist/production/index.js +2 -3
  286. package/dist/production/src/TenantContainer.cjs +4 -2
  287. package/dist/production/src/TenantContainer.cjs.map +1 -1
  288. package/dist/production/src/TenantContainer.js +4 -2
  289. package/dist/production/src/TenantContainer.js.map +1 -1
  290. package/dist/production/src/bridges/system/IdentityFetcher.cjs +1 -0
  291. package/dist/production/src/bridges/system/IdentityFetcher.cjs.map +1 -1
  292. package/dist/production/src/bridges/system/IdentityFetcher.js +1 -0
  293. package/dist/production/src/bridges/system/IdentityFetcher.js.map +1 -1
  294. package/dist/production/src/migrations/2025-04-16-180000-config-up.cjs +39 -0
  295. package/dist/production/src/migrations/2025-04-16-180000-config-up.cjs.map +1 -0
  296. package/dist/production/src/migrations/2025-04-16-180000-config-up.js +40 -0
  297. package/dist/production/src/migrations/2025-04-16-180000-config-up.js.map +1 -0
  298. package/dist/production/src/migrations/2025-04-17-160000-auth-log.cjs +45 -0
  299. package/dist/production/src/migrations/2025-04-17-160000-auth-log.cjs.map +1 -0
  300. package/dist/production/src/migrations/2025-04-17-160000-auth-log.js +46 -0
  301. package/dist/production/src/migrations/2025-04-17-160000-auth-log.js.map +1 -0
  302. package/dist/production/src/migrations/runner.cjs +9 -4
  303. package/dist/production/src/migrations/runner.cjs.map +1 -1
  304. package/dist/production/src/migrations/runner.js +7 -2
  305. package/dist/production/src/migrations/runner.js.map +1 -1
  306. package/dist/production/src/migrations/snapshot.cjs +56 -1
  307. package/dist/production/src/migrations/snapshot.cjs.map +1 -1
  308. package/dist/production/src/migrations/snapshot.js +56 -1
  309. package/dist/production/src/migrations/snapshot.js.map +1 -1
  310. package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.cjs +7 -7
  311. package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.cjs.map +1 -1
  312. package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.js +1 -1
  313. package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs +27 -0
  314. package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs.map +1 -0
  315. package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.js +27 -0
  316. package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.js.map +1 -0
  317. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.cjs +15 -2
  318. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.cjs.map +1 -1
  319. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.js +15 -2
  320. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.js.map +1 -1
  321. package/dist/production/src/model/commands/personToken/CreatePersonTokenCommand.cjs +4 -4
  322. package/dist/production/src/model/commands/personToken/CreatePersonTokenCommand.cjs.map +1 -1
  323. package/dist/production/src/model/commands/personToken/CreatePersonTokenCommand.js +1 -1
  324. package/dist/production/src/model/commands/personToken/ResetPasswordCommand.cjs +5 -5
  325. package/dist/production/src/model/commands/personToken/ResetPasswordCommand.cjs.map +1 -1
  326. package/dist/production/src/model/commands/personToken/ResetPasswordCommand.js +1 -1
  327. package/dist/production/src/model/queries/apiKey/ApiKeyQuery.cjs +4 -4
  328. package/dist/production/src/model/queries/apiKey/ApiKeyQuery.cjs.map +1 -1
  329. package/dist/production/src/model/queries/apiKey/ApiKeyQuery.js +1 -1
  330. package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.cjs +46 -0
  331. package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.cjs.map +1 -0
  332. package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.js +46 -0
  333. package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.js.map +1 -0
  334. package/dist/production/src/model/queries/configuration/ConfigurationQuery.cjs +18 -1
  335. package/dist/production/src/model/queries/configuration/ConfigurationQuery.cjs.map +1 -1
  336. package/dist/production/src/model/queries/configuration/ConfigurationQuery.js +18 -1
  337. package/dist/production/src/model/queries/configuration/ConfigurationQuery.js.map +1 -1
  338. package/dist/production/src/model/queries/personToken/PersonTokenQuery.cjs +3 -3
  339. package/dist/production/src/model/queries/personToken/PersonTokenQuery.cjs.map +1 -1
  340. package/dist/production/src/model/queries/personToken/PersonTokenQuery.js +1 -1
  341. package/dist/production/src/model/service/AuthLogService.cjs +34 -0
  342. package/dist/production/src/model/service/AuthLogService.cjs.map +1 -0
  343. package/dist/production/src/model/service/AuthLogService.js +34 -0
  344. package/dist/production/src/model/service/AuthLogService.js.map +1 -0
  345. package/dist/production/src/model/service/ConfigurationManager.cjs +0 -10
  346. package/dist/production/src/model/service/ConfigurationManager.cjs.map +1 -1
  347. package/dist/production/src/model/service/ConfigurationManager.js +0 -10
  348. package/dist/production/src/model/service/ConfigurationManager.js.map +1 -1
  349. package/dist/production/src/model/service/IDPSignInManager.cjs +37 -5
  350. package/dist/production/src/model/service/IDPSignInManager.cjs.map +1 -1
  351. package/dist/production/src/model/service/IDPSignInManager.js +37 -5
  352. package/dist/production/src/model/service/IDPSignInManager.js.map +1 -1
  353. package/dist/production/src/model/service/PasswordChangeManager.cjs +21 -12
  354. package/dist/production/src/model/service/PasswordChangeManager.cjs.map +1 -1
  355. package/dist/production/src/model/service/PasswordChangeManager.js +20 -11
  356. package/dist/production/src/model/service/PasswordChangeManager.js.map +1 -1
  357. package/dist/production/src/model/service/PasswordResetManager.cjs +40 -8
  358. package/dist/production/src/model/service/PasswordResetManager.cjs.map +1 -1
  359. package/dist/production/src/model/service/PasswordResetManager.js +40 -8
  360. package/dist/production/src/model/service/PasswordResetManager.js.map +1 -1
  361. package/dist/production/src/model/service/PasswordStrengthValidator.cjs +63 -0
  362. package/dist/production/src/model/service/PasswordStrengthValidator.cjs.map +1 -0
  363. package/dist/production/src/model/service/PasswordStrengthValidator.js +63 -0
  364. package/dist/production/src/model/service/PasswordStrengthValidator.js.map +1 -0
  365. package/dist/production/src/model/service/PasswordlessSignInManager.cjs +89 -24
  366. package/dist/production/src/model/service/PasswordlessSignInManager.cjs.map +1 -1
  367. package/dist/production/src/model/service/PasswordlessSignInManager.js +81 -16
  368. package/dist/production/src/model/service/PasswordlessSignInManager.js.map +1 -1
  369. package/dist/production/src/model/service/PersonAccessManager.cjs +7 -29
  370. package/dist/production/src/model/service/PersonAccessManager.cjs.map +1 -1
  371. package/dist/production/src/model/service/PersonAccessManager.js +7 -29
  372. package/dist/production/src/model/service/PersonAccessManager.js.map +1 -1
  373. package/dist/production/src/model/service/SignInManager.cjs +56 -31
  374. package/dist/production/src/model/service/SignInManager.cjs.map +1 -1
  375. package/dist/production/src/model/service/SignInManager.js +57 -32
  376. package/dist/production/src/model/service/SignInManager.js.map +1 -1
  377. package/dist/production/src/model/service/SignUpManager.cjs +13 -8
  378. package/dist/production/src/model/service/SignUpManager.cjs.map +1 -1
  379. package/dist/production/src/model/service/SignUpManager.js +11 -6
  380. package/dist/production/src/model/service/SignUpManager.js.map +1 -1
  381. package/dist/production/src/model/service/apiKey/ApiKeyManager.cjs +6 -1
  382. package/dist/production/src/model/service/apiKey/ApiKeyManager.cjs.map +1 -1
  383. package/dist/production/src/model/service/apiKey/ApiKeyManager.js +6 -1
  384. package/dist/production/src/model/service/apiKey/ApiKeyManager.js.map +1 -1
  385. package/dist/production/src/model/utils/Response.cjs +2 -1
  386. package/dist/production/src/model/utils/Response.cjs.map +1 -1
  387. package/dist/production/src/model/utils/Response.js +2 -1
  388. package/dist/production/src/model/utils/Response.js.map +1 -1
  389. package/dist/production/src/model/utils/blacklist.cjs +10006 -0
  390. package/dist/production/src/model/utils/blacklist.cjs.map +1 -0
  391. package/dist/production/src/model/utils/blacklist.js +10006 -0
  392. package/dist/production/src/model/utils/blacklist.js.map +1 -0
  393. package/dist/{development/src/model/utils/typeUtils.cjs → production/src/model/utils/hex.cjs} +1 -1
  394. package/dist/production/src/model/utils/hex.cjs.map +1 -0
  395. package/dist/production/src/model/utils/{typeUtils.js → hex.js} +1 -1
  396. package/dist/production/src/model/utils/hex.js.map +1 -0
  397. package/dist/production/src/model/utils/interval.cjs +8 -0
  398. package/dist/production/src/model/utils/interval.cjs.map +1 -0
  399. package/dist/production/src/model/utils/interval.js +8 -0
  400. package/dist/production/src/model/utils/interval.js.map +1 -0
  401. package/dist/production/src/model/utils/{tokenUtils.cjs → token.cjs} +3 -3
  402. package/dist/production/src/model/utils/token.cjs.map +1 -0
  403. package/dist/production/src/model/utils/{tokenUtils.js → token.js} +2 -2
  404. package/dist/production/src/model/utils/token.js.map +1 -0
  405. package/dist/production/src/resolvers/ResolverFactory.cjs +1 -0
  406. package/dist/production/src/resolvers/ResolverFactory.cjs.map +1 -1
  407. package/dist/production/src/resolvers/ResolverFactory.js +2 -1
  408. package/dist/production/src/resolvers/ResolverFactory.js.map +1 -1
  409. package/dist/production/src/resolvers/TenantResolverContextFactory.cjs +10 -2
  410. package/dist/production/src/resolvers/TenantResolverContextFactory.cjs.map +1 -1
  411. package/dist/production/src/resolvers/TenantResolverContextFactory.js +10 -2
  412. package/dist/production/src/resolvers/TenantResolverContextFactory.js.map +1 -1
  413. package/dist/production/src/resolvers/errorUtils.cjs +15 -4
  414. package/dist/production/src/resolvers/errorUtils.cjs.map +1 -1
  415. package/dist/production/src/resolvers/errorUtils.js +15 -4
  416. package/dist/production/src/resolvers/errorUtils.js.map +1 -1
  417. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs +4 -3
  418. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs.map +1 -1
  419. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js +2 -1
  420. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js.map +1 -1
  421. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs +1 -0
  422. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs.map +1 -1
  423. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js +1 -0
  424. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js.map +1 -1
  425. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs +1 -0
  426. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs.map +1 -1
  427. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js +1 -0
  428. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js.map +1 -1
  429. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs +1 -0
  430. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs.map +1 -1
  431. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js +1 -0
  432. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js.map +1 -1
  433. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs +1 -0
  434. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs.map +1 -1
  435. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.js +1 -0
  436. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.js.map +1 -1
  437. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs +1 -0
  438. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs.map +1 -1
  439. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.js +1 -0
  440. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.js.map +1 -1
  441. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs +1 -0
  442. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs.map +1 -1
  443. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.js +1 -0
  444. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.js.map +1 -1
  445. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs +1 -0
  446. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs.map +1 -1
  447. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js +1 -0
  448. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js.map +1 -1
  449. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs +1 -0
  450. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs.map +1 -1
  451. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js +1 -0
  452. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js.map +1 -1
  453. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs +17 -6
  454. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs.map +1 -1
  455. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.js +17 -6
  456. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.js.map +1 -1
  457. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs +14 -0
  458. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs.map +1 -1
  459. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.js +14 -0
  460. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.js.map +1 -1
  461. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs +7 -1
  462. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs.map +1 -1
  463. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.js +7 -1
  464. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.js.map +1 -1
  465. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.cjs +5 -0
  466. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.cjs.map +1 -1
  467. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.js +5 -0
  468. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.js.map +1 -1
  469. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.cjs +3 -2
  470. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.cjs.map +1 -1
  471. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.js +2 -1
  472. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.js.map +1 -1
  473. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.cjs +26 -1
  474. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.cjs.map +1 -1
  475. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.js +26 -1
  476. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.js.map +1 -1
  477. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs +20 -0
  478. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs.map +1 -1
  479. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.js +20 -0
  480. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.js.map +1 -1
  481. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs +25 -2
  482. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs.map +1 -1
  483. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.js +25 -2
  484. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.js.map +1 -1
  485. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.cjs +22 -0
  486. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.cjs.map +1 -1
  487. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.js +22 -0
  488. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.js.map +1 -1
  489. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.cjs +1 -0
  490. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.cjs.map +1 -1
  491. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.js +1 -0
  492. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.js.map +1 -1
  493. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.cjs +2 -1
  494. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.cjs.map +1 -1
  495. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.js +2 -1
  496. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.js.map +1 -1
  497. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs +3 -1
  498. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs.map +1 -1
  499. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js +3 -1
  500. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js.map +1 -1
  501. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs +3 -2
  502. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs.map +1 -1
  503. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.js +2 -1
  504. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.js.map +1 -1
  505. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs +1 -0
  506. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs.map +1 -1
  507. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js +1 -0
  508. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js.map +1 -1
  509. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs +1 -0
  510. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs.map +1 -1
  511. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.js +1 -0
  512. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.js.map +1 -1
  513. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs +1 -0
  514. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs.map +1 -1
  515. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js +1 -0
  516. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js.map +1 -1
  517. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs +1 -0
  518. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs.map +1 -1
  519. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js +1 -0
  520. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js.map +1 -1
  521. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs +1 -0
  522. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs.map +1 -1
  523. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js +1 -0
  524. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js.map +1 -1
  525. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.cjs +3 -1
  526. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.cjs.map +1 -1
  527. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.js +3 -1
  528. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.js.map +1 -1
  529. package/dist/production/src/resolvers/query/IDPQueryResolver.cjs +1 -0
  530. package/dist/production/src/resolvers/query/IDPQueryResolver.cjs.map +1 -1
  531. package/dist/production/src/resolvers/query/IDPQueryResolver.js +1 -0
  532. package/dist/production/src/resolvers/query/IDPQueryResolver.js.map +1 -1
  533. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.cjs +1 -0
  534. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.cjs.map +1 -1
  535. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.js +1 -0
  536. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.js.map +1 -1
  537. package/dist/production/src/resolvers/query/PersonQueryResolver.cjs +1 -0
  538. package/dist/production/src/resolvers/query/PersonQueryResolver.cjs.map +1 -1
  539. package/dist/production/src/resolvers/query/PersonQueryResolver.js +1 -0
  540. package/dist/production/src/resolvers/query/PersonQueryResolver.js.map +1 -1
  541. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.cjs +1 -0
  542. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.cjs.map +1 -1
  543. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.js +1 -0
  544. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.js.map +1 -1
  545. package/dist/production/src/resolvers/query/ProjectQueryResolver.cjs +1 -0
  546. package/dist/production/src/resolvers/query/ProjectQueryResolver.cjs.map +1 -1
  547. package/dist/production/src/resolvers/query/ProjectQueryResolver.js +1 -0
  548. package/dist/production/src/resolvers/query/ProjectQueryResolver.js.map +1 -1
  549. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.cjs +1 -0
  550. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.cjs.map +1 -1
  551. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.js +1 -0
  552. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.js.map +1 -1
  553. package/dist/production/src/resolvers/types/IdentityTypeResolver.cjs +1 -0
  554. package/dist/production/src/resolvers/types/IdentityTypeResolver.cjs.map +1 -1
  555. package/dist/production/src/resolvers/types/IdentityTypeResolver.js +1 -0
  556. package/dist/production/src/resolvers/types/IdentityTypeResolver.js.map +1 -1
  557. package/dist/production/src/resolvers/types/ProjectTypeResolver.cjs +1 -0
  558. package/dist/production/src/resolvers/types/ProjectTypeResolver.cjs.map +1 -1
  559. package/dist/production/src/resolvers/types/ProjectTypeResolver.js +1 -0
  560. package/dist/production/src/resolvers/types/ProjectTypeResolver.js.map +1 -1
  561. package/dist/production/src/schema/tenant.graphql.cjs +64 -2
  562. package/dist/production/src/schema/tenant.graphql.cjs.map +1 -1
  563. package/dist/production/src/schema/tenant.graphql.js +64 -2
  564. package/dist/production/src/schema/tenant.graphql.js.map +1 -1
  565. package/dist/tests/cases/integration/mocked/sql/createSessionKeySql.d.ts +1 -1
  566. package/dist/tests/cases/integration/mocked/sql/getConfigSql.d.ts +3 -0
  567. package/dist/tests/cases/integration/mocked/sql/getConfigSql.d.ts.map +1 -0
  568. package/dist/tests/cases/integration/mocked/sql/getNextLoginAttemptSql.d.ts +3 -0
  569. package/dist/tests/cases/integration/mocked/sql/getNextLoginAttemptSql.d.ts.map +1 -0
  570. package/dist/tests/src/testTenant.d.ts +2 -0
  571. package/dist/tests/src/testTenant.d.ts.map +1 -1
  572. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  573. package/dist/types/TenantContainer.d.ts +6 -0
  574. package/dist/types/TenantContainer.d.ts.map +1 -1
  575. package/dist/types/migrations/2025-04-16-180000-config-up.d.ts +3 -0
  576. package/dist/types/migrations/2025-04-16-180000-config-up.d.ts.map +1 -0
  577. package/dist/types/migrations/2025-04-17-160000-auth-log.d.ts +3 -0
  578. package/dist/types/migrations/2025-04-17-160000-auth-log.d.ts.map +1 -0
  579. package/dist/types/migrations/runner.d.ts.map +1 -1
  580. package/dist/types/migrations/snapshot.d.ts.map +1 -1
  581. package/dist/types/model/commands/authLog/CreateAuthLogEntryCommand.d.ts +26 -0
  582. package/dist/types/model/commands/authLog/CreateAuthLogEntryCommand.d.ts.map +1 -0
  583. package/dist/types/model/commands/configuration/UpdateConfigurationCommand.d.ts.map +1 -1
  584. package/dist/types/model/dtos/AuthLogBag.d.ts +3 -0
  585. package/dist/types/model/dtos/AuthLogBag.d.ts.map +1 -0
  586. package/dist/types/model/queries/authLog/NextLoginAttemptQuery.d.ts +7 -0
  587. package/dist/types/model/queries/authLog/NextLoginAttemptQuery.d.ts.map +1 -0
  588. package/dist/types/model/queries/configuration/ConfigurationQuery.d.ts +1 -1
  589. package/dist/types/model/queries/configuration/ConfigurationQuery.d.ts.map +1 -1
  590. package/dist/types/model/service/AuthLogService.d.ts +34 -0
  591. package/dist/types/model/service/AuthLogService.d.ts.map +1 -0
  592. package/dist/types/model/service/ConfigurationManager.d.ts +1 -2
  593. package/dist/types/model/service/ConfigurationManager.d.ts.map +1 -1
  594. package/dist/types/model/service/IDPSignInManager.d.ts +5 -1
  595. package/dist/types/model/service/IDPSignInManager.d.ts.map +1 -1
  596. package/dist/types/model/service/PasswordChangeManager.d.ts +8 -4
  597. package/dist/types/model/service/PasswordChangeManager.d.ts.map +1 -1
  598. package/dist/types/model/service/PasswordResetManager.d.ts +11 -4
  599. package/dist/types/model/service/PasswordResetManager.d.ts.map +1 -1
  600. package/dist/types/model/service/PasswordStrengthValidator.d.ts +11 -0
  601. package/dist/types/model/service/PasswordStrengthValidator.d.ts.map +1 -0
  602. package/dist/types/model/service/PasswordlessSignInManager.d.ts +16 -6
  603. package/dist/types/model/service/PasswordlessSignInManager.d.ts.map +1 -1
  604. package/dist/types/model/service/PersonAccessManager.d.ts +2 -1
  605. package/dist/types/model/service/PersonAccessManager.d.ts.map +1 -1
  606. package/dist/types/model/service/SignInManager.d.ts +9 -4
  607. package/dist/types/model/service/SignInManager.d.ts.map +1 -1
  608. package/dist/types/model/service/SignUpManager.d.ts +7 -3
  609. package/dist/types/model/service/SignUpManager.d.ts.map +1 -1
  610. package/dist/types/model/service/apiKey/ApiKeyManager.d.ts.map +1 -1
  611. package/dist/types/model/type/AuthLog.d.ts +2 -0
  612. package/dist/types/model/type/AuthLog.d.ts.map +1 -0
  613. package/dist/types/model/type/Config.d.ts +28 -0
  614. package/dist/types/model/type/Config.d.ts.map +1 -0
  615. package/dist/types/model/utils/Response.d.ts +4 -3
  616. package/dist/types/model/utils/Response.d.ts.map +1 -1
  617. package/dist/types/model/utils/blacklist.d.ts +2 -0
  618. package/dist/types/model/utils/blacklist.d.ts.map +1 -0
  619. package/dist/types/model/utils/{typeUtils.d.ts → hex.d.ts} +1 -1
  620. package/dist/types/model/utils/hex.d.ts.map +1 -0
  621. package/dist/types/model/utils/index.d.ts +1 -1
  622. package/dist/types/model/utils/index.d.ts.map +1 -1
  623. package/dist/types/model/utils/interval.d.ts +3 -0
  624. package/dist/types/model/utils/interval.d.ts.map +1 -0
  625. package/dist/types/model/utils/{tokenUtils.d.ts → token.d.ts} +2 -2
  626. package/dist/types/model/utils/token.d.ts.map +1 -0
  627. package/dist/types/resolvers/ResolverFactory.d.ts.map +1 -1
  628. package/dist/types/resolvers/TenantResolverContext.d.ts +2 -0
  629. package/dist/types/resolvers/TenantResolverContext.d.ts.map +1 -1
  630. package/dist/types/resolvers/TenantResolverContextFactory.d.ts +6 -1
  631. package/dist/types/resolvers/TenantResolverContextFactory.d.ts.map +1 -1
  632. package/dist/types/resolvers/errorUtils.d.ts +7 -5
  633. package/dist/types/resolvers/errorUtils.d.ts.map +1 -1
  634. package/dist/types/resolvers/mutation/person/ChangePasswordMutationResolver.d.ts.map +1 -1
  635. package/dist/types/resolvers/mutation/person/ChangeProfileMutationResolver.d.ts.map +1 -1
  636. package/dist/types/resolvers/mutation/person/DisablePersonMutationResolver.d.ts.map +1 -1
  637. package/dist/types/resolvers/mutation/person/IDPMutationResolver.d.ts.map +1 -1
  638. package/dist/types/resolvers/mutation/person/OtpMutationResolver.d.ts.map +1 -1
  639. package/dist/types/resolvers/mutation/person/PasswordlessMutationResolver.d.ts.map +1 -1
  640. package/dist/types/resolvers/mutation/person/ResetPasswordMutationResolver.d.ts.map +1 -1
  641. package/dist/types/resolvers/mutation/person/SignInMutationResolver.d.ts.map +1 -1
  642. package/dist/types/resolvers/mutation/person/TogglePasswordlessMutationResolver.d.ts.map +1 -1
  643. package/dist/types/resolvers/types/ProjectTypeResolver.d.ts +2 -2
  644. package/dist/types/resolvers/types/ProjectTypeResolver.d.ts.map +1 -1
  645. package/dist/types/schema/index.d.ts +103 -8
  646. package/dist/types/schema/index.d.ts.map +1 -1
  647. package/dist/types/schema/tenant.graphql.d.ts.map +1 -1
  648. package/dist/types/schema/types.d.ts +8 -0
  649. package/dist/types/schema/types.d.ts.map +1 -0
  650. package/dist/types/tsconfig.tsbuildinfo +1 -1
  651. package/graphql.codegen.yml +7 -3
  652. package/package.json +13 -12
  653. package/src/TenantContainer.ts +16 -10
  654. package/src/migrations/2025-04-16-180000-config-up.ts +39 -0
  655. package/src/migrations/2025-04-17-160000-auth-log.ts +45 -0
  656. package/src/migrations/runner.ts +4 -1
  657. package/src/migrations/snapshot.ts +56 -1
  658. package/src/model/commands/authLog/CreateAuthLogEntryCommand.ts +51 -0
  659. package/src/model/commands/configuration/UpdateConfigurationCommand.ts +20 -2
  660. package/src/model/dtos/AuthLogBag.ts +3 -0
  661. package/src/model/queries/authLog/NextLoginAttemptQuery.ts +63 -0
  662. package/src/model/queries/configuration/ConfigurationQuery.ts +20 -8
  663. package/src/model/service/AuthLogService.ts +62 -0
  664. package/src/model/service/ConfigurationManager.ts +1 -6
  665. package/src/model/service/IDPSignInManager.ts +41 -6
  666. package/src/model/service/PasswordChangeManager.ts +17 -12
  667. package/src/model/service/PasswordResetManager.ts +42 -11
  668. package/src/model/service/PasswordStrengthValidator.ts +85 -0
  669. package/src/model/service/PasswordlessSignInManager.ts +95 -28
  670. package/src/model/service/PersonAccessManager.ts +8 -27
  671. package/src/model/service/SignInManager.ts +68 -33
  672. package/src/model/service/SignUpManager.ts +16 -8
  673. package/src/model/service/apiKey/ApiKeyManager.ts +8 -2
  674. package/src/model/type/AuthLog.ts +14 -0
  675. package/src/model/type/Config.ts +29 -0
  676. package/src/model/utils/Response.ts +10 -3
  677. package/src/model/utils/blacklist.ts +4 -0
  678. package/src/model/utils/index.ts +1 -1
  679. package/src/model/utils/interval.ts +14 -0
  680. package/src/model/utils/{tokenUtils.ts → token.ts} +1 -1
  681. package/src/resolvers/ResolverFactory.ts +2 -1
  682. package/src/resolvers/TenantResolverContext.ts +2 -0
  683. package/src/resolvers/TenantResolverContextFactory.ts +10 -0
  684. package/src/resolvers/errorUtils.ts +23 -5
  685. package/src/resolvers/mutation/idp/AddIDPMutationResolver.ts +1 -1
  686. package/src/resolvers/mutation/idp/UpdateIDPMutationResolver.ts +1 -1
  687. package/src/resolvers/mutation/person/ChangePasswordMutationResolver.ts +17 -15
  688. package/src/resolvers/mutation/person/ChangeProfileMutationResolver.ts +13 -0
  689. package/src/resolvers/mutation/person/DisablePersonMutationResolver.ts +7 -7
  690. package/src/resolvers/mutation/person/IDPMutationResolver.ts +4 -0
  691. package/src/resolvers/mutation/person/OtpMutationResolver.ts +25 -1
  692. package/src/resolvers/mutation/person/PasswordlessMutationResolver.ts +21 -1
  693. package/src/resolvers/mutation/person/ResetPasswordMutationResolver.ts +27 -3
  694. package/src/resolvers/mutation/person/SignInMutationResolver.ts +26 -8
  695. package/src/resolvers/mutation/person/SignUpMutationResolver.ts +1 -1
  696. package/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.ts +2 -2
  697. package/src/resolvers/mutation/project/CreateProjectMutationResolver.ts +1 -1
  698. package/src/resolvers/mutation/project/UpdateProjectMutationResolver.ts +1 -1
  699. package/src/resolvers/query/ConfigurationQueryResolver.ts +2 -2
  700. package/src/resolvers/types/ProjectTypeResolver.ts +2 -2
  701. package/src/schema/index.ts +114 -5
  702. package/src/schema/tenant.graphql.ts +64 -2
  703. package/src/schema/types.ts +4 -0
  704. package/tests/cases/integration/mocked/changeMyPasswordMutation.test.ts +42 -2
  705. package/tests/cases/integration/mocked/changeMyProfileMutation.test.ts +25 -4
  706. package/tests/cases/integration/mocked/changePasswordMutation.test.ts +10 -2
  707. package/tests/cases/integration/mocked/changeProfileMutation.test.ts +7 -1
  708. package/tests/cases/integration/mocked/confirmOtpMutation.test.ts +13 -8
  709. package/tests/cases/integration/mocked/createSessionKeyMutation.test.ts +9 -21
  710. package/tests/cases/integration/mocked/inviteMutations.test.ts +0 -24
  711. package/tests/cases/integration/mocked/signInIdpMutation.test.ts +16 -1
  712. package/tests/cases/integration/mocked/signInMutation.test.ts +54 -22
  713. package/tests/cases/integration/mocked/signOutMutation.test.ts +0 -5
  714. package/tests/cases/integration/mocked/signUpMutation.test.ts +3 -12
  715. package/tests/cases/integration/mocked/sql/createSessionKeySql.ts +1 -1
  716. package/tests/cases/integration/mocked/sql/getConfigSql.ts +29 -0
  717. package/tests/cases/integration/mocked/sql/getNextLoginAttemptSql.ts +20 -0
  718. package/tests/src/testTenant.ts +13 -0
  719. package/dist/development/src/model/utils/password.cjs +0 -12
  720. package/dist/development/src/model/utils/password.cjs.map +0 -1
  721. package/dist/development/src/model/utils/password.js +0 -12
  722. package/dist/development/src/model/utils/password.js.map +0 -1
  723. package/dist/development/src/model/utils/tokenUtils.cjs.map +0 -1
  724. package/dist/development/src/model/utils/tokenUtils.js.map +0 -1
  725. package/dist/development/src/model/utils/typeUtils.cjs.map +0 -1
  726. package/dist/development/src/model/utils/typeUtils.js.map +0 -1
  727. package/dist/production/src/model/utils/password.cjs +0 -12
  728. package/dist/production/src/model/utils/password.cjs.map +0 -1
  729. package/dist/production/src/model/utils/password.js +0 -12
  730. package/dist/production/src/model/utils/password.js.map +0 -1
  731. package/dist/production/src/model/utils/tokenUtils.cjs.map +0 -1
  732. package/dist/production/src/model/utils/tokenUtils.js.map +0 -1
  733. package/dist/production/src/model/utils/typeUtils.cjs.map +0 -1
  734. package/dist/production/src/model/utils/typeUtils.js.map +0 -1
  735. package/dist/types/model/utils/password.d.ts +0 -4
  736. package/dist/types/model/utils/password.d.ts.map +0 -1
  737. package/dist/types/model/utils/tokenUtils.d.ts.map +0 -1
  738. package/dist/types/model/utils/typeUtils.d.ts.map +0 -1
  739. package/src/model/utils/password.ts +0 -8
  740. /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 { getPasswordWeaknessMessage } from '../utils/password'\nimport { UserMailer } from '../mailing'\nimport { 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, ResetPasswordCommandErrorCode } from '../commands/personToken'\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) { }\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 weakPassword = getPasswordWeaknessMessage(password)\n\t\tif (weakPassword) {\n\t\t\treturn new ResponseError('PASSWORD_TOO_WEAK', weakPassword)\n\t\t}\n\t\treturn await dbContext.commandBus.execute(new ResetPasswordCommand(token, password))\n\t}\n}\n\nexport type ResetPasswordErrorCode = 'PASSWORD_TOO_WEAK'\n\nexport type ResetPasswordResponse = Response<null, ResetPasswordErrorCode | ResetPasswordCommandErrorCode>\n"],"names":["CreatePersonTokenCommand","getPreferredProject","ImplementationException","password","getPasswordWeaknessMessage","ResponseError","ResetPasswordCommand"],"mappings":";;;;;;;;;AAgBO,MAAM,qBAAqB;AAAA,EACjC,YACkB,QACA,gBAChB;AAFgB,SAAA,SAAA;AACA,SAAA,iBAAA;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,OAAeC,YAAkD;AACjH,UAAA,eAAeC,oCAA2BD,UAAQ;AACxD,QAAI,cAAc;AACV,aAAA,IAAIE,SAAAA,cAAc,qBAAqB,YAAY;AAAA,IAAA;AAEpD,WAAA,MAAM,UAAU,WAAW,QAAQ,IAAIC,0CAAqB,OAAOH,UAAQ,CAAC;AAAA,EAAA;AAErF;;"}
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 { getPasswordWeaknessMessage } from "../utils/password.js";
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 weakPassword = getPasswordWeaknessMessage(password);
36
- if (weakPassword) {
37
- return new ResponseError("PASSWORD_TOO_WEAK", weakPassword);
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 await dbContext.commandBus.execute(new ResetPasswordCommand(token, password));
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 { getPasswordWeaknessMessage } from '../utils/password'\nimport { UserMailer } from '../mailing'\nimport { 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, ResetPasswordCommandErrorCode } from '../commands/personToken'\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) { }\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 weakPassword = getPasswordWeaknessMessage(password)\n\t\tif (weakPassword) {\n\t\t\treturn new ResponseError('PASSWORD_TOO_WEAK', weakPassword)\n\t\t}\n\t\treturn await dbContext.commandBus.execute(new ResetPasswordCommand(token, password))\n\t}\n}\n\nexport type ResetPasswordErrorCode = 'PASSWORD_TOO_WEAK'\n\nexport type ResetPasswordResponse = Response<null, ResetPasswordErrorCode | ResetPasswordCommandErrorCode>\n"],"names":[],"mappings":";;;;;;;AAgBO,MAAM,qBAAqB;AAAA,EACjC,YACkB,QACA,gBAChB;AAFgB,SAAA,SAAA;AACA,SAAA,iBAAA;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;AACjH,UAAA,eAAe,2BAA2B,QAAQ;AACxD,QAAI,cAAc;AACV,aAAA,IAAI,cAAc,qBAAqB,YAAY;AAAA,IAAA;AAEpD,WAAA,MAAM,UAAU,WAAW,QAAQ,IAAI,qBAAqB,OAAO,QAAQ,CAAC;AAAA,EAAA;AAErF;"}
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 tokenUtils = require("../utils/tokenUtils.cjs");
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, configurationManager, mailer, projectManager, otpAuthenticator) {
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 this.configurationManager.fetchConfiguration(db2);
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.expirationMinutes);
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({ requestId: result.id, expiresAt: result.expiresAt });
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, token, requestId, email) {
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", 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 = tokenUtils.validateToken({
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({ person: personRow, token: sessionToken });
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 = tokenUtils.validateToken({
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(null);
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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"}