@contember/engine-tenant-api 2.1.0-alpha.2 → 2.1.0-alpha.21

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 (759) 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/authorization/MembershipMatcher.cjs +6 -0
  29. package/dist/development/src/model/authorization/MembershipMatcher.cjs.map +1 -1
  30. package/dist/development/src/model/authorization/MembershipMatcher.js +6 -0
  31. package/dist/development/src/model/authorization/MembershipMatcher.js.map +1 -1
  32. package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.cjs +7 -7
  33. package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.cjs.map +1 -1
  34. package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.js +1 -1
  35. package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs +27 -0
  36. package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs.map +1 -0
  37. package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.js +27 -0
  38. package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.js.map +1 -0
  39. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.cjs +15 -2
  40. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.cjs.map +1 -1
  41. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.js +15 -2
  42. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.js.map +1 -1
  43. package/dist/development/src/model/commands/personToken/CreatePersonTokenCommand.cjs +4 -4
  44. package/dist/development/src/model/commands/personToken/CreatePersonTokenCommand.cjs.map +1 -1
  45. package/dist/development/src/model/commands/personToken/CreatePersonTokenCommand.js +1 -1
  46. package/dist/development/src/model/commands/personToken/ResetPasswordCommand.cjs +5 -5
  47. package/dist/development/src/model/commands/personToken/ResetPasswordCommand.cjs.map +1 -1
  48. package/dist/development/src/model/commands/personToken/ResetPasswordCommand.js +1 -1
  49. package/dist/development/src/model/queries/apiKey/ApiKeyQuery.cjs +4 -4
  50. package/dist/development/src/model/queries/apiKey/ApiKeyQuery.cjs.map +1 -1
  51. package/dist/development/src/model/queries/apiKey/ApiKeyQuery.js +1 -1
  52. package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.cjs +46 -0
  53. package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.cjs.map +1 -0
  54. package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.js +46 -0
  55. package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.js.map +1 -0
  56. package/dist/development/src/model/queries/configuration/ConfigurationQuery.cjs +18 -1
  57. package/dist/development/src/model/queries/configuration/ConfigurationQuery.cjs.map +1 -1
  58. package/dist/development/src/model/queries/configuration/ConfigurationQuery.js +18 -1
  59. package/dist/development/src/model/queries/configuration/ConfigurationQuery.js.map +1 -1
  60. package/dist/development/src/model/queries/personToken/PersonTokenQuery.cjs +3 -3
  61. package/dist/development/src/model/queries/personToken/PersonTokenQuery.cjs.map +1 -1
  62. package/dist/development/src/model/queries/personToken/PersonTokenQuery.js +1 -1
  63. package/dist/development/src/model/service/AuthLogService.cjs +34 -0
  64. package/dist/development/src/model/service/AuthLogService.cjs.map +1 -0
  65. package/dist/development/src/model/service/AuthLogService.js +34 -0
  66. package/dist/development/src/model/service/AuthLogService.js.map +1 -0
  67. package/dist/development/src/model/service/ConfigurationManager.cjs +0 -10
  68. package/dist/development/src/model/service/ConfigurationManager.cjs.map +1 -1
  69. package/dist/development/src/model/service/ConfigurationManager.js +0 -10
  70. package/dist/development/src/model/service/ConfigurationManager.js.map +1 -1
  71. package/dist/development/src/model/service/IDPSignInManager.cjs +37 -5
  72. package/dist/development/src/model/service/IDPSignInManager.cjs.map +1 -1
  73. package/dist/development/src/model/service/IDPSignInManager.js +37 -5
  74. package/dist/development/src/model/service/IDPSignInManager.js.map +1 -1
  75. package/dist/development/src/model/service/MembershipValidator.cjs +1 -1
  76. package/dist/development/src/model/service/MembershipValidator.cjs.map +1 -1
  77. package/dist/development/src/model/service/MembershipValidator.js +1 -1
  78. package/dist/development/src/model/service/MembershipValidator.js.map +1 -1
  79. package/dist/development/src/model/service/PasswordChangeManager.cjs +21 -12
  80. package/dist/development/src/model/service/PasswordChangeManager.cjs.map +1 -1
  81. package/dist/development/src/model/service/PasswordChangeManager.js +20 -11
  82. package/dist/development/src/model/service/PasswordChangeManager.js.map +1 -1
  83. package/dist/development/src/model/service/PasswordResetManager.cjs +40 -8
  84. package/dist/development/src/model/service/PasswordResetManager.cjs.map +1 -1
  85. package/dist/development/src/model/service/PasswordResetManager.js +40 -8
  86. package/dist/development/src/model/service/PasswordResetManager.js.map +1 -1
  87. package/dist/development/src/model/service/PasswordStrengthValidator.cjs +63 -0
  88. package/dist/development/src/model/service/PasswordStrengthValidator.cjs.map +1 -0
  89. package/dist/development/src/model/service/PasswordStrengthValidator.js +63 -0
  90. package/dist/development/src/model/service/PasswordStrengthValidator.js.map +1 -0
  91. package/dist/development/src/model/service/PasswordlessSignInManager.cjs +89 -24
  92. package/dist/development/src/model/service/PasswordlessSignInManager.cjs.map +1 -1
  93. package/dist/development/src/model/service/PasswordlessSignInManager.js +81 -16
  94. package/dist/development/src/model/service/PasswordlessSignInManager.js.map +1 -1
  95. package/dist/development/src/model/service/PersonAccessManager.cjs +7 -29
  96. package/dist/development/src/model/service/PersonAccessManager.cjs.map +1 -1
  97. package/dist/development/src/model/service/PersonAccessManager.js +7 -29
  98. package/dist/development/src/model/service/PersonAccessManager.js.map +1 -1
  99. package/dist/development/src/model/service/SignInManager.cjs +56 -31
  100. package/dist/development/src/model/service/SignInManager.cjs.map +1 -1
  101. package/dist/development/src/model/service/SignInManager.js +57 -32
  102. package/dist/development/src/model/service/SignInManager.js.map +1 -1
  103. package/dist/development/src/model/service/SignUpManager.cjs +13 -8
  104. package/dist/development/src/model/service/SignUpManager.cjs.map +1 -1
  105. package/dist/development/src/model/service/SignUpManager.js +11 -6
  106. package/dist/development/src/model/service/SignUpManager.js.map +1 -1
  107. package/dist/development/src/model/service/apiKey/ApiKeyManager.cjs +6 -1
  108. package/dist/development/src/model/service/apiKey/ApiKeyManager.cjs.map +1 -1
  109. package/dist/development/src/model/service/apiKey/ApiKeyManager.js +6 -1
  110. package/dist/development/src/model/service/apiKey/ApiKeyManager.js.map +1 -1
  111. package/dist/development/src/model/utils/Response.cjs +2 -1
  112. package/dist/development/src/model/utils/Response.cjs.map +1 -1
  113. package/dist/development/src/model/utils/Response.js +2 -1
  114. package/dist/development/src/model/utils/Response.js.map +1 -1
  115. package/dist/development/src/model/utils/blacklist.cjs +10006 -0
  116. package/dist/development/src/model/utils/blacklist.cjs.map +1 -0
  117. package/dist/development/src/model/utils/blacklist.js +10006 -0
  118. package/dist/development/src/model/utils/blacklist.js.map +1 -0
  119. package/dist/{production/src/model/utils/typeUtils.cjs → development/src/model/utils/hex.cjs} +1 -1
  120. package/dist/development/src/model/utils/hex.cjs.map +1 -0
  121. package/dist/development/src/model/utils/{typeUtils.js → hex.js} +1 -1
  122. package/dist/development/src/model/utils/hex.js.map +1 -0
  123. package/dist/development/src/model/utils/interval.cjs +8 -0
  124. package/dist/development/src/model/utils/interval.cjs.map +1 -0
  125. package/dist/development/src/model/utils/interval.js +8 -0
  126. package/dist/development/src/model/utils/interval.js.map +1 -0
  127. package/dist/development/src/model/utils/{tokenUtils.cjs → token.cjs} +3 -3
  128. package/dist/development/src/model/utils/token.cjs.map +1 -0
  129. package/dist/development/src/model/utils/{tokenUtils.js → token.js} +2 -2
  130. package/dist/development/src/model/utils/token.js.map +1 -0
  131. package/dist/development/src/resolvers/ResolverFactory.cjs +1 -0
  132. package/dist/development/src/resolvers/ResolverFactory.cjs.map +1 -1
  133. package/dist/development/src/resolvers/ResolverFactory.js +2 -1
  134. package/dist/development/src/resolvers/ResolverFactory.js.map +1 -1
  135. package/dist/development/src/resolvers/TenantResolverContextFactory.cjs +10 -2
  136. package/dist/development/src/resolvers/TenantResolverContextFactory.cjs.map +1 -1
  137. package/dist/development/src/resolvers/TenantResolverContextFactory.js +10 -2
  138. package/dist/development/src/resolvers/TenantResolverContextFactory.js.map +1 -1
  139. package/dist/development/src/resolvers/errorUtils.cjs +15 -4
  140. package/dist/development/src/resolvers/errorUtils.cjs.map +1 -1
  141. package/dist/development/src/resolvers/errorUtils.js +15 -4
  142. package/dist/development/src/resolvers/errorUtils.js.map +1 -1
  143. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs +4 -3
  144. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs.map +1 -1
  145. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js +2 -1
  146. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js.map +1 -1
  147. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs +1 -0
  148. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs.map +1 -1
  149. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js +1 -0
  150. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js.map +1 -1
  151. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs +1 -0
  152. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs.map +1 -1
  153. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js +1 -0
  154. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js.map +1 -1
  155. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs +1 -0
  156. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs.map +1 -1
  157. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js +1 -0
  158. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js.map +1 -1
  159. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs +1 -0
  160. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs.map +1 -1
  161. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.js +1 -0
  162. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.js.map +1 -1
  163. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs +1 -0
  164. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs.map +1 -1
  165. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.js +1 -0
  166. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.js.map +1 -1
  167. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs +1 -0
  168. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs.map +1 -1
  169. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.js +1 -0
  170. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.js.map +1 -1
  171. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs +1 -0
  172. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs.map +1 -1
  173. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js +1 -0
  174. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js.map +1 -1
  175. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs +1 -0
  176. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs.map +1 -1
  177. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js +1 -0
  178. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js.map +1 -1
  179. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs +17 -6
  180. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs.map +1 -1
  181. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.js +17 -6
  182. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.js.map +1 -1
  183. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs +14 -0
  184. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs.map +1 -1
  185. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.js +14 -0
  186. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.js.map +1 -1
  187. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs +7 -1
  188. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs.map +1 -1
  189. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.js +7 -1
  190. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.js.map +1 -1
  191. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.cjs +5 -0
  192. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.cjs.map +1 -1
  193. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.js +5 -0
  194. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.js.map +1 -1
  195. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.cjs +3 -2
  196. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.cjs.map +1 -1
  197. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.js +2 -1
  198. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.js.map +1 -1
  199. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.cjs +26 -1
  200. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.cjs.map +1 -1
  201. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.js +26 -1
  202. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.js.map +1 -1
  203. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs +20 -0
  204. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs.map +1 -1
  205. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.js +20 -0
  206. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.js.map +1 -1
  207. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs +25 -2
  208. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs.map +1 -1
  209. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.js +25 -2
  210. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.js.map +1 -1
  211. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.cjs +22 -0
  212. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.cjs.map +1 -1
  213. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.js +22 -0
  214. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.js.map +1 -1
  215. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.cjs +1 -0
  216. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.cjs.map +1 -1
  217. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.js +1 -0
  218. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.js.map +1 -1
  219. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.cjs +2 -1
  220. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.cjs.map +1 -1
  221. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.js +2 -1
  222. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.js.map +1 -1
  223. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs +3 -1
  224. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs.map +1 -1
  225. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js +3 -1
  226. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js.map +1 -1
  227. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs +3 -2
  228. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs.map +1 -1
  229. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.js +2 -1
  230. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.js.map +1 -1
  231. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs +1 -0
  232. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs.map +1 -1
  233. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js +1 -0
  234. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js.map +1 -1
  235. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs +1 -0
  236. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs.map +1 -1
  237. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.js +1 -0
  238. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.js.map +1 -1
  239. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs +1 -0
  240. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs.map +1 -1
  241. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js +1 -0
  242. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js.map +1 -1
  243. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs +1 -0
  244. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs.map +1 -1
  245. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js +1 -0
  246. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js.map +1 -1
  247. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs +1 -0
  248. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs.map +1 -1
  249. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js +1 -0
  250. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js.map +1 -1
  251. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.cjs +3 -1
  252. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.cjs.map +1 -1
  253. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.js +3 -1
  254. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.js.map +1 -1
  255. package/dist/development/src/resolvers/query/IDPQueryResolver.cjs +1 -0
  256. package/dist/development/src/resolvers/query/IDPQueryResolver.cjs.map +1 -1
  257. package/dist/development/src/resolvers/query/IDPQueryResolver.js +1 -0
  258. package/dist/development/src/resolvers/query/IDPQueryResolver.js.map +1 -1
  259. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.cjs +1 -0
  260. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.cjs.map +1 -1
  261. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.js +1 -0
  262. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.js.map +1 -1
  263. package/dist/development/src/resolvers/query/PersonQueryResolver.cjs +1 -0
  264. package/dist/development/src/resolvers/query/PersonQueryResolver.cjs.map +1 -1
  265. package/dist/development/src/resolvers/query/PersonQueryResolver.js +1 -0
  266. package/dist/development/src/resolvers/query/PersonQueryResolver.js.map +1 -1
  267. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.cjs +1 -0
  268. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.cjs.map +1 -1
  269. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.js +1 -0
  270. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.js.map +1 -1
  271. package/dist/development/src/resolvers/query/ProjectQueryResolver.cjs +1 -0
  272. package/dist/development/src/resolvers/query/ProjectQueryResolver.cjs.map +1 -1
  273. package/dist/development/src/resolvers/query/ProjectQueryResolver.js +1 -0
  274. package/dist/development/src/resolvers/query/ProjectQueryResolver.js.map +1 -1
  275. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.cjs +1 -0
  276. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.cjs.map +1 -1
  277. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.js +1 -0
  278. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.js.map +1 -1
  279. package/dist/development/src/resolvers/types/IdentityTypeResolver.cjs +1 -0
  280. package/dist/development/src/resolvers/types/IdentityTypeResolver.cjs.map +1 -1
  281. package/dist/development/src/resolvers/types/IdentityTypeResolver.js +1 -0
  282. package/dist/development/src/resolvers/types/IdentityTypeResolver.js.map +1 -1
  283. package/dist/development/src/resolvers/types/ProjectTypeResolver.cjs +1 -0
  284. package/dist/development/src/resolvers/types/ProjectTypeResolver.cjs.map +1 -1
  285. package/dist/development/src/resolvers/types/ProjectTypeResolver.js +1 -0
  286. package/dist/development/src/resolvers/types/ProjectTypeResolver.js.map +1 -1
  287. package/dist/development/src/schema/tenant.graphql.cjs +64 -2
  288. package/dist/development/src/schema/tenant.graphql.cjs.map +1 -1
  289. package/dist/development/src/schema/tenant.graphql.js +64 -2
  290. package/dist/development/src/schema/tenant.graphql.js.map +1 -1
  291. package/dist/production/index.cjs +5 -6
  292. package/dist/production/index.cjs.map +1 -1
  293. package/dist/production/index.js +2 -3
  294. package/dist/production/src/TenantContainer.cjs +4 -2
  295. package/dist/production/src/TenantContainer.cjs.map +1 -1
  296. package/dist/production/src/TenantContainer.js +4 -2
  297. package/dist/production/src/TenantContainer.js.map +1 -1
  298. package/dist/production/src/bridges/system/IdentityFetcher.cjs +1 -0
  299. package/dist/production/src/bridges/system/IdentityFetcher.cjs.map +1 -1
  300. package/dist/production/src/bridges/system/IdentityFetcher.js +1 -0
  301. package/dist/production/src/bridges/system/IdentityFetcher.js.map +1 -1
  302. package/dist/production/src/migrations/2025-04-16-180000-config-up.cjs +39 -0
  303. package/dist/production/src/migrations/2025-04-16-180000-config-up.cjs.map +1 -0
  304. package/dist/production/src/migrations/2025-04-16-180000-config-up.js +40 -0
  305. package/dist/production/src/migrations/2025-04-16-180000-config-up.js.map +1 -0
  306. package/dist/production/src/migrations/2025-04-17-160000-auth-log.cjs +45 -0
  307. package/dist/production/src/migrations/2025-04-17-160000-auth-log.cjs.map +1 -0
  308. package/dist/production/src/migrations/2025-04-17-160000-auth-log.js +46 -0
  309. package/dist/production/src/migrations/2025-04-17-160000-auth-log.js.map +1 -0
  310. package/dist/production/src/migrations/runner.cjs +9 -4
  311. package/dist/production/src/migrations/runner.cjs.map +1 -1
  312. package/dist/production/src/migrations/runner.js +7 -2
  313. package/dist/production/src/migrations/runner.js.map +1 -1
  314. package/dist/production/src/migrations/snapshot.cjs +56 -1
  315. package/dist/production/src/migrations/snapshot.cjs.map +1 -1
  316. package/dist/production/src/migrations/snapshot.js +56 -1
  317. package/dist/production/src/migrations/snapshot.js.map +1 -1
  318. package/dist/production/src/model/authorization/MembershipMatcher.cjs +6 -0
  319. package/dist/production/src/model/authorization/MembershipMatcher.cjs.map +1 -1
  320. package/dist/production/src/model/authorization/MembershipMatcher.js +6 -0
  321. package/dist/production/src/model/authorization/MembershipMatcher.js.map +1 -1
  322. package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.cjs +7 -7
  323. package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.cjs.map +1 -1
  324. package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.js +1 -1
  325. package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs +27 -0
  326. package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs.map +1 -0
  327. package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.js +27 -0
  328. package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.js.map +1 -0
  329. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.cjs +15 -2
  330. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.cjs.map +1 -1
  331. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.js +15 -2
  332. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.js.map +1 -1
  333. package/dist/production/src/model/commands/personToken/CreatePersonTokenCommand.cjs +4 -4
  334. package/dist/production/src/model/commands/personToken/CreatePersonTokenCommand.cjs.map +1 -1
  335. package/dist/production/src/model/commands/personToken/CreatePersonTokenCommand.js +1 -1
  336. package/dist/production/src/model/commands/personToken/ResetPasswordCommand.cjs +5 -5
  337. package/dist/production/src/model/commands/personToken/ResetPasswordCommand.cjs.map +1 -1
  338. package/dist/production/src/model/commands/personToken/ResetPasswordCommand.js +1 -1
  339. package/dist/production/src/model/queries/apiKey/ApiKeyQuery.cjs +4 -4
  340. package/dist/production/src/model/queries/apiKey/ApiKeyQuery.cjs.map +1 -1
  341. package/dist/production/src/model/queries/apiKey/ApiKeyQuery.js +1 -1
  342. package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.cjs +46 -0
  343. package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.cjs.map +1 -0
  344. package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.js +46 -0
  345. package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.js.map +1 -0
  346. package/dist/production/src/model/queries/configuration/ConfigurationQuery.cjs +18 -1
  347. package/dist/production/src/model/queries/configuration/ConfigurationQuery.cjs.map +1 -1
  348. package/dist/production/src/model/queries/configuration/ConfigurationQuery.js +18 -1
  349. package/dist/production/src/model/queries/configuration/ConfigurationQuery.js.map +1 -1
  350. package/dist/production/src/model/queries/personToken/PersonTokenQuery.cjs +3 -3
  351. package/dist/production/src/model/queries/personToken/PersonTokenQuery.cjs.map +1 -1
  352. package/dist/production/src/model/queries/personToken/PersonTokenQuery.js +1 -1
  353. package/dist/production/src/model/service/AuthLogService.cjs +34 -0
  354. package/dist/production/src/model/service/AuthLogService.cjs.map +1 -0
  355. package/dist/production/src/model/service/AuthLogService.js +34 -0
  356. package/dist/production/src/model/service/AuthLogService.js.map +1 -0
  357. package/dist/production/src/model/service/ConfigurationManager.cjs +0 -10
  358. package/dist/production/src/model/service/ConfigurationManager.cjs.map +1 -1
  359. package/dist/production/src/model/service/ConfigurationManager.js +0 -10
  360. package/dist/production/src/model/service/ConfigurationManager.js.map +1 -1
  361. package/dist/production/src/model/service/IDPSignInManager.cjs +37 -5
  362. package/dist/production/src/model/service/IDPSignInManager.cjs.map +1 -1
  363. package/dist/production/src/model/service/IDPSignInManager.js +37 -5
  364. package/dist/production/src/model/service/IDPSignInManager.js.map +1 -1
  365. package/dist/production/src/model/service/MembershipValidator.cjs +1 -1
  366. package/dist/production/src/model/service/MembershipValidator.cjs.map +1 -1
  367. package/dist/production/src/model/service/MembershipValidator.js +1 -1
  368. package/dist/production/src/model/service/MembershipValidator.js.map +1 -1
  369. package/dist/production/src/model/service/PasswordChangeManager.cjs +21 -12
  370. package/dist/production/src/model/service/PasswordChangeManager.cjs.map +1 -1
  371. package/dist/production/src/model/service/PasswordChangeManager.js +20 -11
  372. package/dist/production/src/model/service/PasswordChangeManager.js.map +1 -1
  373. package/dist/production/src/model/service/PasswordResetManager.cjs +40 -8
  374. package/dist/production/src/model/service/PasswordResetManager.cjs.map +1 -1
  375. package/dist/production/src/model/service/PasswordResetManager.js +40 -8
  376. package/dist/production/src/model/service/PasswordResetManager.js.map +1 -1
  377. package/dist/production/src/model/service/PasswordStrengthValidator.cjs +63 -0
  378. package/dist/production/src/model/service/PasswordStrengthValidator.cjs.map +1 -0
  379. package/dist/production/src/model/service/PasswordStrengthValidator.js +63 -0
  380. package/dist/production/src/model/service/PasswordStrengthValidator.js.map +1 -0
  381. package/dist/production/src/model/service/PasswordlessSignInManager.cjs +89 -24
  382. package/dist/production/src/model/service/PasswordlessSignInManager.cjs.map +1 -1
  383. package/dist/production/src/model/service/PasswordlessSignInManager.js +81 -16
  384. package/dist/production/src/model/service/PasswordlessSignInManager.js.map +1 -1
  385. package/dist/production/src/model/service/PersonAccessManager.cjs +7 -29
  386. package/dist/production/src/model/service/PersonAccessManager.cjs.map +1 -1
  387. package/dist/production/src/model/service/PersonAccessManager.js +7 -29
  388. package/dist/production/src/model/service/PersonAccessManager.js.map +1 -1
  389. package/dist/production/src/model/service/SignInManager.cjs +56 -31
  390. package/dist/production/src/model/service/SignInManager.cjs.map +1 -1
  391. package/dist/production/src/model/service/SignInManager.js +57 -32
  392. package/dist/production/src/model/service/SignInManager.js.map +1 -1
  393. package/dist/production/src/model/service/SignUpManager.cjs +13 -8
  394. package/dist/production/src/model/service/SignUpManager.cjs.map +1 -1
  395. package/dist/production/src/model/service/SignUpManager.js +11 -6
  396. package/dist/production/src/model/service/SignUpManager.js.map +1 -1
  397. package/dist/production/src/model/service/apiKey/ApiKeyManager.cjs +6 -1
  398. package/dist/production/src/model/service/apiKey/ApiKeyManager.cjs.map +1 -1
  399. package/dist/production/src/model/service/apiKey/ApiKeyManager.js +6 -1
  400. package/dist/production/src/model/service/apiKey/ApiKeyManager.js.map +1 -1
  401. package/dist/production/src/model/utils/Response.cjs +2 -1
  402. package/dist/production/src/model/utils/Response.cjs.map +1 -1
  403. package/dist/production/src/model/utils/Response.js +2 -1
  404. package/dist/production/src/model/utils/Response.js.map +1 -1
  405. package/dist/production/src/model/utils/blacklist.cjs +10006 -0
  406. package/dist/production/src/model/utils/blacklist.cjs.map +1 -0
  407. package/dist/production/src/model/utils/blacklist.js +10006 -0
  408. package/dist/production/src/model/utils/blacklist.js.map +1 -0
  409. package/dist/{development/src/model/utils/typeUtils.cjs → production/src/model/utils/hex.cjs} +1 -1
  410. package/dist/production/src/model/utils/hex.cjs.map +1 -0
  411. package/dist/production/src/model/utils/{typeUtils.js → hex.js} +1 -1
  412. package/dist/production/src/model/utils/hex.js.map +1 -0
  413. package/dist/production/src/model/utils/interval.cjs +8 -0
  414. package/dist/production/src/model/utils/interval.cjs.map +1 -0
  415. package/dist/production/src/model/utils/interval.js +8 -0
  416. package/dist/production/src/model/utils/interval.js.map +1 -0
  417. package/dist/production/src/model/utils/{tokenUtils.cjs → token.cjs} +3 -3
  418. package/dist/production/src/model/utils/token.cjs.map +1 -0
  419. package/dist/production/src/model/utils/{tokenUtils.js → token.js} +2 -2
  420. package/dist/production/src/model/utils/token.js.map +1 -0
  421. package/dist/production/src/resolvers/ResolverFactory.cjs +1 -0
  422. package/dist/production/src/resolvers/ResolverFactory.cjs.map +1 -1
  423. package/dist/production/src/resolvers/ResolverFactory.js +2 -1
  424. package/dist/production/src/resolvers/ResolverFactory.js.map +1 -1
  425. package/dist/production/src/resolvers/TenantResolverContextFactory.cjs +10 -2
  426. package/dist/production/src/resolvers/TenantResolverContextFactory.cjs.map +1 -1
  427. package/dist/production/src/resolvers/TenantResolverContextFactory.js +10 -2
  428. package/dist/production/src/resolvers/TenantResolverContextFactory.js.map +1 -1
  429. package/dist/production/src/resolvers/errorUtils.cjs +15 -4
  430. package/dist/production/src/resolvers/errorUtils.cjs.map +1 -1
  431. package/dist/production/src/resolvers/errorUtils.js +15 -4
  432. package/dist/production/src/resolvers/errorUtils.js.map +1 -1
  433. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs +4 -3
  434. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs.map +1 -1
  435. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js +2 -1
  436. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js.map +1 -1
  437. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs +1 -0
  438. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs.map +1 -1
  439. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js +1 -0
  440. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js.map +1 -1
  441. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs +1 -0
  442. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs.map +1 -1
  443. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js +1 -0
  444. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js.map +1 -1
  445. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs +1 -0
  446. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs.map +1 -1
  447. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js +1 -0
  448. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js.map +1 -1
  449. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs +1 -0
  450. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs.map +1 -1
  451. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.js +1 -0
  452. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.js.map +1 -1
  453. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs +1 -0
  454. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs.map +1 -1
  455. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.js +1 -0
  456. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.js.map +1 -1
  457. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs +1 -0
  458. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs.map +1 -1
  459. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.js +1 -0
  460. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.js.map +1 -1
  461. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs +1 -0
  462. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs.map +1 -1
  463. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js +1 -0
  464. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js.map +1 -1
  465. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs +1 -0
  466. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs.map +1 -1
  467. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js +1 -0
  468. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js.map +1 -1
  469. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs +17 -6
  470. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs.map +1 -1
  471. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.js +17 -6
  472. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.js.map +1 -1
  473. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs +14 -0
  474. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs.map +1 -1
  475. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.js +14 -0
  476. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.js.map +1 -1
  477. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs +7 -1
  478. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs.map +1 -1
  479. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.js +7 -1
  480. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.js.map +1 -1
  481. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.cjs +5 -0
  482. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.cjs.map +1 -1
  483. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.js +5 -0
  484. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.js.map +1 -1
  485. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.cjs +3 -2
  486. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.cjs.map +1 -1
  487. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.js +2 -1
  488. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.js.map +1 -1
  489. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.cjs +26 -1
  490. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.cjs.map +1 -1
  491. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.js +26 -1
  492. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.js.map +1 -1
  493. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs +20 -0
  494. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs.map +1 -1
  495. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.js +20 -0
  496. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.js.map +1 -1
  497. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs +25 -2
  498. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs.map +1 -1
  499. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.js +25 -2
  500. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.js.map +1 -1
  501. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.cjs +22 -0
  502. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.cjs.map +1 -1
  503. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.js +22 -0
  504. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.js.map +1 -1
  505. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.cjs +1 -0
  506. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.cjs.map +1 -1
  507. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.js +1 -0
  508. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.js.map +1 -1
  509. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.cjs +2 -1
  510. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.cjs.map +1 -1
  511. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.js +2 -1
  512. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.js.map +1 -1
  513. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs +3 -1
  514. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs.map +1 -1
  515. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js +3 -1
  516. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js.map +1 -1
  517. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs +3 -2
  518. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs.map +1 -1
  519. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.js +2 -1
  520. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.js.map +1 -1
  521. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs +1 -0
  522. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs.map +1 -1
  523. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js +1 -0
  524. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js.map +1 -1
  525. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs +1 -0
  526. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs.map +1 -1
  527. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.js +1 -0
  528. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.js.map +1 -1
  529. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs +1 -0
  530. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs.map +1 -1
  531. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js +1 -0
  532. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js.map +1 -1
  533. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs +1 -0
  534. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs.map +1 -1
  535. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js +1 -0
  536. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js.map +1 -1
  537. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs +1 -0
  538. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs.map +1 -1
  539. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js +1 -0
  540. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js.map +1 -1
  541. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.cjs +3 -1
  542. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.cjs.map +1 -1
  543. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.js +3 -1
  544. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.js.map +1 -1
  545. package/dist/production/src/resolvers/query/IDPQueryResolver.cjs +1 -0
  546. package/dist/production/src/resolvers/query/IDPQueryResolver.cjs.map +1 -1
  547. package/dist/production/src/resolvers/query/IDPQueryResolver.js +1 -0
  548. package/dist/production/src/resolvers/query/IDPQueryResolver.js.map +1 -1
  549. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.cjs +1 -0
  550. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.cjs.map +1 -1
  551. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.js +1 -0
  552. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.js.map +1 -1
  553. package/dist/production/src/resolvers/query/PersonQueryResolver.cjs +1 -0
  554. package/dist/production/src/resolvers/query/PersonQueryResolver.cjs.map +1 -1
  555. package/dist/production/src/resolvers/query/PersonQueryResolver.js +1 -0
  556. package/dist/production/src/resolvers/query/PersonQueryResolver.js.map +1 -1
  557. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.cjs +1 -0
  558. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.cjs.map +1 -1
  559. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.js +1 -0
  560. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.js.map +1 -1
  561. package/dist/production/src/resolvers/query/ProjectQueryResolver.cjs +1 -0
  562. package/dist/production/src/resolvers/query/ProjectQueryResolver.cjs.map +1 -1
  563. package/dist/production/src/resolvers/query/ProjectQueryResolver.js +1 -0
  564. package/dist/production/src/resolvers/query/ProjectQueryResolver.js.map +1 -1
  565. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.cjs +1 -0
  566. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.cjs.map +1 -1
  567. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.js +1 -0
  568. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.js.map +1 -1
  569. package/dist/production/src/resolvers/types/IdentityTypeResolver.cjs +1 -0
  570. package/dist/production/src/resolvers/types/IdentityTypeResolver.cjs.map +1 -1
  571. package/dist/production/src/resolvers/types/IdentityTypeResolver.js +1 -0
  572. package/dist/production/src/resolvers/types/IdentityTypeResolver.js.map +1 -1
  573. package/dist/production/src/resolvers/types/ProjectTypeResolver.cjs +1 -0
  574. package/dist/production/src/resolvers/types/ProjectTypeResolver.cjs.map +1 -1
  575. package/dist/production/src/resolvers/types/ProjectTypeResolver.js +1 -0
  576. package/dist/production/src/resolvers/types/ProjectTypeResolver.js.map +1 -1
  577. package/dist/production/src/schema/tenant.graphql.cjs +64 -2
  578. package/dist/production/src/schema/tenant.graphql.cjs.map +1 -1
  579. package/dist/production/src/schema/tenant.graphql.js +64 -2
  580. package/dist/production/src/schema/tenant.graphql.js.map +1 -1
  581. package/dist/tests/cases/integration/mocked/sql/createSessionKeySql.d.ts +1 -1
  582. package/dist/tests/cases/integration/mocked/sql/getConfigSql.d.ts +3 -0
  583. package/dist/tests/cases/integration/mocked/sql/getConfigSql.d.ts.map +1 -0
  584. package/dist/tests/cases/integration/mocked/sql/getNextLoginAttemptSql.d.ts +3 -0
  585. package/dist/tests/cases/integration/mocked/sql/getNextLoginAttemptSql.d.ts.map +1 -0
  586. package/dist/tests/src/testTenant.d.ts +2 -0
  587. package/dist/tests/src/testTenant.d.ts.map +1 -1
  588. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  589. package/dist/types/TenantContainer.d.ts +6 -0
  590. package/dist/types/TenantContainer.d.ts.map +1 -1
  591. package/dist/types/migrations/2025-04-16-180000-config-up.d.ts +3 -0
  592. package/dist/types/migrations/2025-04-16-180000-config-up.d.ts.map +1 -0
  593. package/dist/types/migrations/2025-04-17-160000-auth-log.d.ts +3 -0
  594. package/dist/types/migrations/2025-04-17-160000-auth-log.d.ts.map +1 -0
  595. package/dist/types/migrations/runner.d.ts.map +1 -1
  596. package/dist/types/migrations/snapshot.d.ts.map +1 -1
  597. package/dist/types/model/authorization/MembershipMatcher.d.ts.map +1 -1
  598. package/dist/types/model/commands/authLog/CreateAuthLogEntryCommand.d.ts +26 -0
  599. package/dist/types/model/commands/authLog/CreateAuthLogEntryCommand.d.ts.map +1 -0
  600. package/dist/types/model/commands/configuration/UpdateConfigurationCommand.d.ts.map +1 -1
  601. package/dist/types/model/dtos/AuthLogBag.d.ts +3 -0
  602. package/dist/types/model/dtos/AuthLogBag.d.ts.map +1 -0
  603. package/dist/types/model/queries/authLog/NextLoginAttemptQuery.d.ts +7 -0
  604. package/dist/types/model/queries/authLog/NextLoginAttemptQuery.d.ts.map +1 -0
  605. package/dist/types/model/queries/configuration/ConfigurationQuery.d.ts +1 -1
  606. package/dist/types/model/queries/configuration/ConfigurationQuery.d.ts.map +1 -1
  607. package/dist/types/model/service/AuthLogService.d.ts +34 -0
  608. package/dist/types/model/service/AuthLogService.d.ts.map +1 -0
  609. package/dist/types/model/service/ConfigurationManager.d.ts +1 -2
  610. package/dist/types/model/service/ConfigurationManager.d.ts.map +1 -1
  611. package/dist/types/model/service/IDPSignInManager.d.ts +5 -1
  612. package/dist/types/model/service/IDPSignInManager.d.ts.map +1 -1
  613. package/dist/types/model/service/PasswordChangeManager.d.ts +8 -4
  614. package/dist/types/model/service/PasswordChangeManager.d.ts.map +1 -1
  615. package/dist/types/model/service/PasswordResetManager.d.ts +11 -4
  616. package/dist/types/model/service/PasswordResetManager.d.ts.map +1 -1
  617. package/dist/types/model/service/PasswordStrengthValidator.d.ts +11 -0
  618. package/dist/types/model/service/PasswordStrengthValidator.d.ts.map +1 -0
  619. package/dist/types/model/service/PasswordlessSignInManager.d.ts +16 -6
  620. package/dist/types/model/service/PasswordlessSignInManager.d.ts.map +1 -1
  621. package/dist/types/model/service/PersonAccessManager.d.ts +2 -1
  622. package/dist/types/model/service/PersonAccessManager.d.ts.map +1 -1
  623. package/dist/types/model/service/SignInManager.d.ts +9 -4
  624. package/dist/types/model/service/SignInManager.d.ts.map +1 -1
  625. package/dist/types/model/service/SignUpManager.d.ts +7 -3
  626. package/dist/types/model/service/SignUpManager.d.ts.map +1 -1
  627. package/dist/types/model/service/apiKey/ApiKeyManager.d.ts.map +1 -1
  628. package/dist/types/model/type/AuthLog.d.ts +2 -0
  629. package/dist/types/model/type/AuthLog.d.ts.map +1 -0
  630. package/dist/types/model/type/Config.d.ts +28 -0
  631. package/dist/types/model/type/Config.d.ts.map +1 -0
  632. package/dist/types/model/utils/Response.d.ts +4 -3
  633. package/dist/types/model/utils/Response.d.ts.map +1 -1
  634. package/dist/types/model/utils/blacklist.d.ts +2 -0
  635. package/dist/types/model/utils/blacklist.d.ts.map +1 -0
  636. package/dist/types/model/utils/{typeUtils.d.ts → hex.d.ts} +1 -1
  637. package/dist/types/model/utils/hex.d.ts.map +1 -0
  638. package/dist/types/model/utils/index.d.ts +1 -1
  639. package/dist/types/model/utils/index.d.ts.map +1 -1
  640. package/dist/types/model/utils/interval.d.ts +3 -0
  641. package/dist/types/model/utils/interval.d.ts.map +1 -0
  642. package/dist/types/model/utils/{tokenUtils.d.ts → token.d.ts} +2 -2
  643. package/dist/types/model/utils/token.d.ts.map +1 -0
  644. package/dist/types/resolvers/ResolverFactory.d.ts.map +1 -1
  645. package/dist/types/resolvers/TenantResolverContext.d.ts +2 -0
  646. package/dist/types/resolvers/TenantResolverContext.d.ts.map +1 -1
  647. package/dist/types/resolvers/TenantResolverContextFactory.d.ts +6 -1
  648. package/dist/types/resolvers/TenantResolverContextFactory.d.ts.map +1 -1
  649. package/dist/types/resolvers/errorUtils.d.ts +7 -5
  650. package/dist/types/resolvers/errorUtils.d.ts.map +1 -1
  651. package/dist/types/resolvers/mutation/person/ChangePasswordMutationResolver.d.ts.map +1 -1
  652. package/dist/types/resolvers/mutation/person/ChangeProfileMutationResolver.d.ts.map +1 -1
  653. package/dist/types/resolvers/mutation/person/DisablePersonMutationResolver.d.ts.map +1 -1
  654. package/dist/types/resolvers/mutation/person/IDPMutationResolver.d.ts.map +1 -1
  655. package/dist/types/resolvers/mutation/person/OtpMutationResolver.d.ts.map +1 -1
  656. package/dist/types/resolvers/mutation/person/PasswordlessMutationResolver.d.ts.map +1 -1
  657. package/dist/types/resolvers/mutation/person/ResetPasswordMutationResolver.d.ts.map +1 -1
  658. package/dist/types/resolvers/mutation/person/SignInMutationResolver.d.ts.map +1 -1
  659. package/dist/types/resolvers/mutation/person/TogglePasswordlessMutationResolver.d.ts.map +1 -1
  660. package/dist/types/resolvers/types/ProjectTypeResolver.d.ts +2 -2
  661. package/dist/types/resolvers/types/ProjectTypeResolver.d.ts.map +1 -1
  662. package/dist/types/schema/index.d.ts +103 -8
  663. package/dist/types/schema/index.d.ts.map +1 -1
  664. package/dist/types/schema/tenant.graphql.d.ts.map +1 -1
  665. package/dist/types/schema/types.d.ts +8 -0
  666. package/dist/types/schema/types.d.ts.map +1 -0
  667. package/dist/types/tsconfig.tsbuildinfo +1 -1
  668. package/graphql.codegen.yml +7 -3
  669. package/package.json +13 -12
  670. package/src/TenantContainer.ts +16 -10
  671. package/src/migrations/2025-04-16-180000-config-up.ts +39 -0
  672. package/src/migrations/2025-04-17-160000-auth-log.ts +45 -0
  673. package/src/migrations/runner.ts +4 -1
  674. package/src/migrations/snapshot.ts +56 -1
  675. package/src/model/authorization/MembershipMatcher.ts +6 -0
  676. package/src/model/commands/authLog/CreateAuthLogEntryCommand.ts +51 -0
  677. package/src/model/commands/configuration/UpdateConfigurationCommand.ts +20 -2
  678. package/src/model/dtos/AuthLogBag.ts +3 -0
  679. package/src/model/queries/authLog/NextLoginAttemptQuery.ts +63 -0
  680. package/src/model/queries/configuration/ConfigurationQuery.ts +20 -8
  681. package/src/model/service/AuthLogService.ts +62 -0
  682. package/src/model/service/ConfigurationManager.ts +1 -6
  683. package/src/model/service/IDPSignInManager.ts +41 -6
  684. package/src/model/service/MembershipValidator.ts +1 -1
  685. package/src/model/service/PasswordChangeManager.ts +17 -12
  686. package/src/model/service/PasswordResetManager.ts +42 -11
  687. package/src/model/service/PasswordStrengthValidator.ts +85 -0
  688. package/src/model/service/PasswordlessSignInManager.ts +95 -28
  689. package/src/model/service/PersonAccessManager.ts +8 -27
  690. package/src/model/service/SignInManager.ts +68 -33
  691. package/src/model/service/SignUpManager.ts +16 -8
  692. package/src/model/service/apiKey/ApiKeyManager.ts +8 -2
  693. package/src/model/type/AuthLog.ts +14 -0
  694. package/src/model/type/Config.ts +29 -0
  695. package/src/model/utils/Response.ts +10 -3
  696. package/src/model/utils/blacklist.ts +4 -0
  697. package/src/model/utils/index.ts +1 -1
  698. package/src/model/utils/interval.ts +14 -0
  699. package/src/model/utils/{tokenUtils.ts → token.ts} +1 -1
  700. package/src/resolvers/ResolverFactory.ts +2 -1
  701. package/src/resolvers/TenantResolverContext.ts +2 -0
  702. package/src/resolvers/TenantResolverContextFactory.ts +10 -0
  703. package/src/resolvers/errorUtils.ts +23 -5
  704. package/src/resolvers/mutation/idp/AddIDPMutationResolver.ts +1 -1
  705. package/src/resolvers/mutation/idp/UpdateIDPMutationResolver.ts +1 -1
  706. package/src/resolvers/mutation/person/ChangePasswordMutationResolver.ts +17 -15
  707. package/src/resolvers/mutation/person/ChangeProfileMutationResolver.ts +13 -0
  708. package/src/resolvers/mutation/person/DisablePersonMutationResolver.ts +7 -7
  709. package/src/resolvers/mutation/person/IDPMutationResolver.ts +4 -0
  710. package/src/resolvers/mutation/person/OtpMutationResolver.ts +25 -1
  711. package/src/resolvers/mutation/person/PasswordlessMutationResolver.ts +21 -1
  712. package/src/resolvers/mutation/person/ResetPasswordMutationResolver.ts +27 -3
  713. package/src/resolvers/mutation/person/SignInMutationResolver.ts +26 -8
  714. package/src/resolvers/mutation/person/SignUpMutationResolver.ts +1 -1
  715. package/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.ts +2 -2
  716. package/src/resolvers/mutation/project/CreateProjectMutationResolver.ts +1 -1
  717. package/src/resolvers/mutation/project/UpdateProjectMutationResolver.ts +1 -1
  718. package/src/resolvers/query/ConfigurationQueryResolver.ts +2 -2
  719. package/src/resolvers/types/ProjectTypeResolver.ts +2 -2
  720. package/src/schema/index.ts +114 -5
  721. package/src/schema/tenant.graphql.ts +64 -2
  722. package/src/schema/types.ts +4 -0
  723. package/tests/cases/integration/mocked/changeMyPasswordMutation.test.ts +42 -2
  724. package/tests/cases/integration/mocked/changeMyProfileMutation.test.ts +25 -4
  725. package/tests/cases/integration/mocked/changePasswordMutation.test.ts +10 -2
  726. package/tests/cases/integration/mocked/changeProfileMutation.test.ts +7 -1
  727. package/tests/cases/integration/mocked/confirmOtpMutation.test.ts +13 -8
  728. package/tests/cases/integration/mocked/createSessionKeyMutation.test.ts +9 -21
  729. package/tests/cases/integration/mocked/inviteMutations.test.ts +0 -24
  730. package/tests/cases/integration/mocked/signInIdpMutation.test.ts +16 -1
  731. package/tests/cases/integration/mocked/signInMutation.test.ts +54 -22
  732. package/tests/cases/integration/mocked/signOutMutation.test.ts +0 -5
  733. package/tests/cases/integration/mocked/signUpMutation.test.ts +3 -12
  734. package/tests/cases/integration/mocked/sql/createSessionKeySql.ts +1 -1
  735. package/tests/cases/integration/mocked/sql/getConfigSql.ts +29 -0
  736. package/tests/cases/integration/mocked/sql/getNextLoginAttemptSql.ts +20 -0
  737. package/tests/src/testTenant.ts +13 -0
  738. package/dist/development/src/model/utils/password.cjs +0 -12
  739. package/dist/development/src/model/utils/password.cjs.map +0 -1
  740. package/dist/development/src/model/utils/password.js +0 -12
  741. package/dist/development/src/model/utils/password.js.map +0 -1
  742. package/dist/development/src/model/utils/tokenUtils.cjs.map +0 -1
  743. package/dist/development/src/model/utils/tokenUtils.js.map +0 -1
  744. package/dist/development/src/model/utils/typeUtils.cjs.map +0 -1
  745. package/dist/development/src/model/utils/typeUtils.js.map +0 -1
  746. package/dist/production/src/model/utils/password.cjs +0 -12
  747. package/dist/production/src/model/utils/password.cjs.map +0 -1
  748. package/dist/production/src/model/utils/password.js +0 -12
  749. package/dist/production/src/model/utils/password.js.map +0 -1
  750. package/dist/production/src/model/utils/tokenUtils.cjs.map +0 -1
  751. package/dist/production/src/model/utils/tokenUtils.js.map +0 -1
  752. package/dist/production/src/model/utils/typeUtils.cjs.map +0 -1
  753. package/dist/production/src/model/utils/typeUtils.js.map +0 -1
  754. package/dist/types/model/utils/password.d.ts +0 -4
  755. package/dist/types/model/utils/password.d.ts.map +0 -1
  756. package/dist/types/model/utils/tokenUtils.d.ts.map +0 -1
  757. package/dist/types/model/utils/typeUtils.d.ts.map +0 -1
  758. package/src/model/utils/password.ts +0 -8
  759. /package/src/model/utils/{typeUtils.ts → hex.ts} +0 -0
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;AAiBA,MAAM,0BAA0B;AAAA,EAC/B,YACkB,eACA,QACA,gBACA,kBAEhB;AALgB,SAAA,gBAAA;AACA,SAAA,SAAA;AACA,SAAA,iBAAA;AACA,SAAA,mBAAA;AAAA,EAAA;AAAA,EAIlB,MAAM,uBAAuB,EAAE,IAAI,mBAAmB,aAAa,aAAa,SAMV;AAC9D,WAAA,GAAG,YAAY,OAAOA,QAA0E;AACtG,YAAM,gBAAgB,MAAMA,IAAG,aAAa,MAAM,IAAIC,mBAAAA,oBAAoB;AACtE,UAAA,cAAc,aAAa,YAAY,SAAS;AAC5C,eAAA,IAAIC,SAAAA,cAAc,yBAAyB,oCAAoC;AAAA,UACrF,CAACC,8BAAe,GAAG,GAAG,IAAIA,eAAe,eAAA,IAAI,CAAE,CAAA;AAAA,QAAA,CAC/C;AAAA,MAAA;AAGI,YAAA,SAAS,MAAMH,IAAG,aAAa,MAAMI,wBAAY,QAAQ,KAAK,CAAC;AACrE,UAAI,CAAC,QAAQ;AACZ,eAAO,IAAIF,SAAA,cAAc,oBAAoB,UAAU,KAAK,cAAc;AAAA,UACzE,CAACC,8BAAe,GAAG,GAAG,IAAIA,eAAAA,eAAe,IAAI;AAAA,YAC5C,aAAa;AAAA,UACb,CAAA;AAAA,QAAA,CACD;AAAA,MAAA;AAEE,UAAA,CAAC,KAAK,UAAU,cAAc,aAAa,SAAS,OAAO,oBAAoB,GAAG;AAC9E,eAAA,IAAID,SAAAA,cAAc,yBAAyB,oDAAoD;AAAA,UACrG,CAACC,8BAAe,GAAG,GAAG,IAAIA,eAAAA,eAAe,IAAI;AAAA,YAC5C,aAAa;AAAA,YACb,UAAU,OAAO;AAAA,UACjB,CAAA;AAAA,QAAA,CACD;AAAA,MAAA;AAGI,YAAA,qBAAqBE,yBAAAA,yBAAyB,0BAA0B,OAAO,IAAIC,2BAAkB,cAAc,aAAa,UAAU,IAAI,EAAE;AACtJ,YAAM,SAAS,MAAMN,IAAG,WAAW,QAAQ,kBAAkB;AAG7D,YAAM,MAAM,KAAK,UAAU,cAAc,aAAa,OAAO,MAAM,OAAO,OAAO,OAAO,IAAI,KAAK,KAAK;AAEhG,YAAA,WAAW,MAAM,KAAK,eAAe,sBAAsBA,KAAI,OAAO,aAAa,iBAAiB;AAC1G,YAAM,UAAUO,oBAAA,oBAAoB,UAAU,eAAe,IAAI;AAE3D,YAAA,KAAK,OAAO,sBAAsBP,KAAI;AAAA,QAC3C;AAAA,QACA,OAAO,OAAO;AAAA,QACd;AAAA,QACA,SAAS,SAAS;AAAA,QAClB,aAAa,SAAS;AAAA,MAAA,GACpB;AAAA,QACF,SAAS,eAAe;AAAA,QACxB,WAAW,SAAS,MAAM;AAAA,MAAA,CAC1B;AAED,aAAO,IAAIQ,SAAAA,WAAW;AAAA,QACrB,WAAW,OAAO;AAAA,QAClB,WAAW,OAAO;AAAA,QAClB;AAAA,QACA,CAACL,8BAAe,GAAG,GAAG,IAAIA,eAAAA,eAAe,IAAI;AAAA,UAC5C,aAAa;AAAA,UACb,UAAU,OAAO;AAAA,UACjB,SAAS,OAAO;AAAA,QAChB,CAAA;AAAA,MAAA,CACD;AAAA,IAAA,CACD;AAAA,EAAA;AAAA,EAGM,UAAU,KAAoBM,QAAe,WAAmB,OAA8B;AACrG,QAAI,CAAC,KAAK;AACF,aAAA;AAAA,IAAA;AAEF,UAAA,SAAS,IAAI,IAAI,GAAG;AACnB,WAAA,aAAa,IAAI,SAASA,MAAK;AAC/B,WAAA,aAAa,IAAI,cAAc,SAAS;AACxC,WAAA,aAAa,IAAI,SAAS,KAAK;AACtC,WAAO,OAAO,SAAS;AAAA,EAAA;AAAA,EAGxB,MAAM,mBAAmB,EAAE,IAAI,mBAAYA,SAAO,WAAW,QAAQ,kBAOH;AAC1D,WAAA,GAAG,YAAY,OAAOT,QAAsE;AAE5F,YAAA,cAAc,MAAMA,IAAG,aAAa,MAAMU,iBAAAA,iBAAiB,KAAK,WAAW,cAAc,CAAC;AAChG,YAAM,wBAAwBC,MAAAA,cAAc;AAAA,QAC3C,OAAO;AAAA,QAAA,OACPF;AAAAA,QACA,KAAKT,IAAG,UAAU,IAAI;AAAA,QACtB;AAAA,MAAA,CACA;AACG,UAAA,CAAC,sBAAsB,IAAI;AAC9B,YAAI,sBAAsB,UAAU,mBAAmB,mBAAmB,OAAO;AAChF,gBAAMA,IAAG,WAAW,QAAQ,IAAIY,0BAAAA,0BAA0B,YAAa,EAAE,CAAC;AAAA,QAAA;AAE3E,eAAO,IAAIV,SAAAA,cAAc,sBAAsB,OAAO,sBAAsB,cAAc;AAAA,UACzF,GAAG,sBAAsB,YAAY,CAAC;AAAA,UACtC,CAACC,8BAAe,GAAG,GAAG,IAAIA,eAAAA,eAAe,IAAI;AAAA,YAC5C,UAAU,aAAa;AAAA,YACvB,SAAS,aAAa;AAAA,UACtB,CAAA;AAAA,QAAA,CACD;AAAA,MAAA;AAEF,UAAI,CAAC,aAAa;AACjB,cAAM,IAAIU,WAAAA,wBAAwB;AAAA,MAAA;AAE7B,YAAA,YAAY,MAAMb,IAAG,aAAa,MAAMI,wBAAY,KAAK,sBAAsB,OAAO,SAAS,CAAC;AACtG,UAAI,CAAC,WAAW;AACf,cAAM,IAAIS,WAAAA,wBAAwB;AAAA,MAAA;AAE/B,UAAA,UAAU,gBAAgB,MAAM;AAC5B,eAAA,IAAIX,SAAc,cAAA,mBAAmB,sBAAsB;AAAA,UACjE,CAACC,8BAAe,GAAG,GAAG,IAAIA,eAAAA,eAAe,IAAI;AAAA,YAC5C,UAAU,UAAU;AAAA,YACpB,SAAS,aAAa;AAAA,UACtB,CAAA;AAAA,QAAA,CACD;AAAA,MAAA;AAGE,UAAA,UAAU,WAAW,UAAU,kBAAkB;AACpD,YAAI,CAAC,QAAQ;AACL,iBAAA,IAAID,SAAc,cAAA,gBAAgB,yCAAyC;AAAA,YACjF,CAACC,8BAAe,GAAG,GAAG,IAAIA,eAAAA,eAAe,IAAI;AAAA,cAC5C,UAAU,UAAU;AAAA,cACpB,SAAS,aAAa;AAAA,YACtB,CAAA;AAAA,UAAA,CACD;AAAA,QAAA;AAGE,YAAA,CAAC,KAAK,iBAAiB,SAAS,EAAE,KAAK,UAAU,WAAW,MAAM,GAAG;AACjE,iBAAA,IAAID,SAAAA,cAAc,qBAAqB,mCAAmC;AAAA,YAChF,CAACC,8BAAe,GAAG,GAAG,IAAIA,eAAAA,eAAe,IAAI;AAAA,cAC5C,UAAU,UAAU;AAAA,cACpB,SAAS,aAAa;AAAA,YACtB,CAAA;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,MACF;AAGKH,YAAAA,IAAG,WAAW,QAAQ,IAAIc,8CAAuB,sBAAsB,OAAO,EAAE,CAAC;AACjF,YAAA,eAAe,MAAM,KAAK,cAAc,oBAAoBd,KAAI,UAAU,aAAa,UAAU;AAEvG,aAAO,IAAIQ,SAAAA,WAAW;AAAA,QACrB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,CAACL,8BAAe,GAAG,GAAG,IAAIA,eAAAA,eAAe,IAAI;AAAA,UAC5C,UAAU,UAAU;AAAA,UACpB,SAAS,aAAa;AAAA,QACtB,CAAA;AAAA,MAAA,CACD;AAAA,IAAA,CACD;AAAA,EAAA;AAAA,EAGF,MAAM,wBAAwB,EAAE,WAAIM,SAAO,WAAW,WAKiB;AAC/D,WAAA,GAAG,YAAY,OAAOT,QAA2E;AAEjG,YAAA,cAAc,MAAMA,IAAG,aAAa,MAAMU,iBAAAA,iBAAiB,KAAK,WAAW,cAAc,CAAC;AAChG,YAAM,wBAAwBC,MAAAA,cAAc;AAAA,QAC3C,OAAO;AAAA,QAAA,OACPF;AAAAA,QACA,KAAKT,IAAG,UAAU,IAAI;AAAA,QACtB,gBAAgB;AAAA,MAAA,CAChB;AACG,UAAA,CAAC,sBAAsB,IAAI;AAC9B,eAAO,IAAIE,SAAAA,cAAc,sBAAsB,OAAO,sBAAsB,cAAc;AAAA,UACzF,GAAG,sBAAsB,YAAY,CAAC;AAAA,UACtC,CAACC,8BAAe,GAAG,GAAG,IAAIA,eAAAA,eAAe,IAAI;AAAA,YAC5C,UAAU,aAAa;AAAA,YACvB,SAAS,aAAa;AAAA,UACtB,CAAA;AAAA,QAAA,CACD;AAAA,MAAA;AAGIH,YAAAA,IAAG,WAAW,QAAQ,IAAIe,mBAAAA,mBAAmB,sBAAsB,OAAO,IAAI,OAAO,CAAC;AAE5F,aAAO,IAAIP,SAAAA,WAAW;AAAA,QACrB,QAAQ,aAAa;AAAA,QACrB,CAACL,8BAAe,GAAG,GAAG,IAAIA,eAAAA,eAAe,IAAI;AAAA,UAC5C,UAAU,aAAa;AAAA,UACvB,SAAS,aAAa;AAAA,QACtB,CAAA;AAAA,MAAA,CACD;AAAA,IAAA,CACD;AAAA,EAAA;AAAA,EAGM,UAAU,aAA2B,aAAsC;AAClF,YAAQ,aAAa;AAAA,MACpB,KAAK;AACG,eAAA;AAAA,MACR,KAAK;AACG,eAAA;AAAA,MACR,KAAK;AACJ,eAAO,gBAAgB;AAAA,MACxB,KAAK;AACJ,eAAO,gBAAgB;AAAA,IAAA;AAAA,EACzB;AAEF;;"}
@@ -1,4 +1,5 @@
1
1
  import "../queries/apiKey/ApiKeyQuery.js";
2
+ import { ConfigurationQuery } from "../queries/configuration/ConfigurationQuery.js";
2
3
  import "@contember/database";
3
4
  import { ImplementationException } from "../../exceptions.js";
4
5
  import { PersonQuery } from "../queries/person/PersonQuery.js";
@@ -14,30 +15,42 @@ import { CreatePersonTokenCommand } from "../commands/personToken/CreatePersonTo
14
15
  import { InvalidateTokenCommand } from "../commands/personToken/InvalidateTokenCommand.js";
15
16
  import { IncreaseOtpAttemptCommand } from "../commands/personToken/IncreaseOtpAttemptCommand.js";
16
17
  import { PersonTokenQuery } from "../queries/personToken/PersonTokenQuery.js";
17
- import { validateToken } from "../utils/tokenUtils.js";
18
+ import { validateToken } from "../utils/token.js";
18
19
  import { getPreferredProject } from "./helpers/getPreferredProject.js";
20
+ import { AuthLogService } from "./AuthLogService.js";
21
+ import { intervalToSeconds } from "../utils/interval.js";
19
22
  class PasswordlessSignInManager {
20
- constructor(apiKeyManager, configurationManager, mailer, projectManager, otpAuthenticator) {
23
+ constructor(apiKeyManager, mailer, projectManager, otpAuthenticator) {
21
24
  this.apiKeyManager = apiKeyManager;
22
- this.configurationManager = configurationManager;
23
25
  this.mailer = mailer;
24
26
  this.projectManager = projectManager;
25
27
  this.otpAuthenticator = otpAuthenticator;
26
28
  }
27
29
  async initSignInPasswordless({ db, permissionContext, mailVariant, mailProject, email }) {
28
30
  return db.transaction(async (db2) => {
29
- const configuration = await this.configurationManager.fetchConfiguration(db2);
31
+ const configuration = await db2.queryHandler.fetch(new ConfigurationQuery());
30
32
  if (configuration.passwordless.enabled === "never") {
31
- return new ResponseError("PASSWORDLESS_DISABLED", "Passwordless sign-in is disabled");
33
+ return new ResponseError("PASSWORDLESS_DISABLED", "Passwordless sign-in is disabled", {
34
+ [AuthLogService.Key]: new AuthLogService.Bag({})
35
+ });
32
36
  }
33
37
  const person = await db2.queryHandler.fetch(PersonQuery.byEmail(email));
34
38
  if (!person) {
35
- return new ResponseError("PERSON_NOT_FOUND", `Person ${email} not found`);
39
+ return new ResponseError("PERSON_NOT_FOUND", `Person ${email} not found`, {
40
+ [AuthLogService.Key]: new AuthLogService.Bag({
41
+ personInput: email
42
+ })
43
+ });
36
44
  }
37
45
  if (!this.isEnabled(configuration.passwordless.enabled, person.passwordless_enabled)) {
38
- return new ResponseError("PASSWORDLESS_DISABLED", "Passwordless sign-in is disabled for this person");
46
+ return new ResponseError("PASSWORDLESS_DISABLED", "Passwordless sign-in is disabled for this person", {
47
+ [AuthLogService.Key]: new AuthLogService.Bag({
48
+ personInput: email,
49
+ personId: person.id
50
+ })
51
+ });
39
52
  }
40
- const createTokenCommand = CreatePersonTokenCommand.createPasswordlessRequest(person.id, configuration.passwordless.expirationMinutes);
53
+ const createTokenCommand = CreatePersonTokenCommand.createPasswordlessRequest(person.id, intervalToSeconds(configuration.passwordless.expiration) / 60);
41
54
  const result = await db2.commandBus.execute(createTokenCommand);
42
55
  const url = this.formatUrl(configuration.passwordless.url ?? null, result.token, result.id, email) ?? void 0;
43
56
  const projects = await this.projectManager.getProjectsByIdentity(db2, person.identity_id, permissionContext);
@@ -52,7 +65,16 @@ class PasswordlessSignInManager {
52
65
  variant: mailVariant || "",
53
66
  projectId: project?.id ?? null
54
67
  });
55
- return new ResponseOk({ requestId: result.id, expiresAt: result.expiresAt });
68
+ return new ResponseOk({
69
+ requestId: result.id,
70
+ expiresAt: result.expiresAt,
71
+ person,
72
+ [AuthLogService.Key]: new AuthLogService.Bag({
73
+ personInput: email,
74
+ personId: person.id,
75
+ tokenId: result.id
76
+ })
77
+ });
56
78
  });
57
79
  }
58
80
  formatUrl(url, token, requestId, email) {
@@ -78,26 +100,57 @@ class PasswordlessSignInManager {
78
100
  if (tokenValidationResult.error === "TOKEN_INVALID" && validationType === "otp") {
79
101
  await db2.commandBus.execute(new IncreaseOtpAttemptCommand(tokenResult.id));
80
102
  }
81
- return tokenValidationResult;
103
+ return new ResponseError(tokenValidationResult.error, tokenValidationResult.errorMessage, {
104
+ ...tokenValidationResult.metadata ?? {},
105
+ [AuthLogService.Key]: new AuthLogService.Bag({
106
+ personId: tokenResult?.person_id,
107
+ tokenId: tokenResult?.id
108
+ })
109
+ });
110
+ }
111
+ if (!tokenResult) {
112
+ throw new ImplementationException();
82
113
  }
83
114
  const personRow = await db2.queryHandler.fetch(PersonQuery.byId(tokenValidationResult.result.person_id));
84
115
  if (!personRow) {
85
116
  throw new ImplementationException();
86
117
  }
87
118
  if (personRow.disabled_at !== null) {
88
- return new ResponseError("PERSON_DISABLED", `Person is disabled`);
119
+ return new ResponseError("PERSON_DISABLED", `Person is disabled`, {
120
+ [AuthLogService.Key]: new AuthLogService.Bag({
121
+ personId: personRow.id,
122
+ tokenId: tokenResult?.id
123
+ })
124
+ });
89
125
  }
90
126
  if (personRow.otp_uri && personRow.otp_activated_at) {
91
127
  if (!mfaOtp) {
92
- return new ResponseError("OTP_REQUIRED", `2FA is enabled. OTP token is required`);
128
+ return new ResponseError("OTP_REQUIRED", `2FA is enabled. OTP token is required`, {
129
+ [AuthLogService.Key]: new AuthLogService.Bag({
130
+ personId: personRow.id,
131
+ tokenId: tokenResult?.id
132
+ })
133
+ });
93
134
  }
94
135
  if (!this.otpAuthenticator.validate({ uri: personRow.otp_uri }, mfaOtp)) {
95
- return new ResponseError("INVALID_OTP_TOKEN", "OTP token validation has failed");
136
+ return new ResponseError("INVALID_OTP_TOKEN", "OTP token validation has failed", {
137
+ [AuthLogService.Key]: new AuthLogService.Bag({
138
+ personId: personRow.id,
139
+ tokenId: tokenResult?.id
140
+ })
141
+ });
96
142
  }
97
143
  }
98
144
  await db2.commandBus.execute(new InvalidateTokenCommand(tokenValidationResult.result.id));
99
145
  const sessionToken = await this.apiKeyManager.createSessionApiKey(db2, personRow.identity_id, expiration);
100
- return new ResponseOk({ person: personRow, token: sessionToken });
146
+ return new ResponseOk({
147
+ person: personRow,
148
+ token: sessionToken,
149
+ [AuthLogService.Key]: new AuthLogService.Bag({
150
+ personId: personRow.id,
151
+ tokenId: tokenResult?.id
152
+ })
153
+ });
101
154
  });
102
155
  }
103
156
  async activatePasswordlessOtp({ db, token, requestId, otpHash }) {
@@ -110,10 +163,22 @@ class PasswordlessSignInManager {
110
163
  validationType: "token"
111
164
  });
112
165
  if (!tokenValidationResult.ok) {
113
- return tokenValidationResult;
166
+ return new ResponseError(tokenValidationResult.error, tokenValidationResult.errorMessage, {
167
+ ...tokenValidationResult.metadata ?? {},
168
+ [AuthLogService.Key]: new AuthLogService.Bag({
169
+ personId: tokenResult?.person_id,
170
+ tokenId: tokenResult?.id
171
+ })
172
+ });
114
173
  }
115
174
  await db2.commandBus.execute(new ActivateOtpCommand(tokenValidationResult.result.id, otpHash));
116
- return new ResponseOk(null);
175
+ return new ResponseOk({
176
+ person: tokenResult?.person_id,
177
+ [AuthLogService.Key]: new AuthLogService.Bag({
178
+ personId: tokenResult?.person_id,
179
+ tokenId: tokenResult?.id
180
+ })
181
+ });
117
182
  });
118
183
  }
119
184
  isEnabled(globalValue, personValue) {
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordlessSignInManager.js","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"],"mappings":"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"}
1
+ {"version":3,"file":"PasswordlessSignInManager.js","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"],"mappings":"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"}
@@ -1,42 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- require("../queries/apiKey/ApiKeyQuery.cjs");
4
- require("@contember/database");
5
- const PersonQuery = require("../queries/person/PersonQuery.cjs");
6
- require("../authorization/PermissionActions.cjs");
7
- require("@contember/authorization");
8
- require("../authorization/PermissionContext.cjs");
9
- require("../authorization/PermissionsFactory.cjs");
10
- require("@contember/schema");
11
3
  const DisablePersonCommand = require("../commands/person/DisablePersonCommand.cjs");
12
4
  const Response = require("../utils/Response.cjs");
13
5
  class PersonAccessManager {
14
6
  constructor(apiKeyManager) {
15
7
  this.apiKeyManager = apiKeyManager;
16
8
  }
17
- async disablePerson(dbContext, personId) {
18
- const result = await dbContext.transaction(async (trx) => {
19
- const personRow = await trx.queryHandler.fetch(
20
- PersonQuery.PersonQuery.byId(personId)
21
- );
22
- if (personRow === null) {
23
- return "PERSON_NOT_FOUND";
9
+ async disablePerson(dbContext, person) {
10
+ return await dbContext.transaction(async (trx) => {
11
+ if (person.disabled_at !== null) {
12
+ return new Response.ResponseError("PERSON_ALREADY_DISABLED", "Person is already disabled");
24
13
  }
25
- if (personRow.disabled_at !== null) {
26
- return "PERSON_ALREADY_DISABLED";
27
- }
28
- await this.disablePersonAccount(trx, personRow.id);
29
- await this.disableIdentityApiKeys(trx, personRow.identity_id);
30
- return null;
14
+ await this.disablePersonAccount(trx, person.id);
15
+ await this.disableIdentityApiKeys(trx, person.identity_id);
16
+ return new Response.ResponseOk(null);
31
17
  });
32
- switch (result) {
33
- case null:
34
- return new Response.ResponseOk(null);
35
- case "PERSON_ALREADY_DISABLED":
36
- return new Response.ResponseError(result, "Person is already disable");
37
- case "PERSON_NOT_FOUND":
38
- return new Response.ResponseError(result, "Person not found");
39
- }
40
18
  }
41
19
  async disablePersonAccount(dbContext, personId) {
42
20
  await dbContext.commandBus.execute(new DisablePersonCommand.DisablePersonCommand(personId));
@@ -1 +1 @@
1
- {"version":3,"file":"PersonAccessManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PersonAccessManager.ts"],"sourcesContent":["import { PersonQuery } from '../queries'\nimport { DatabaseContext } from '../utils'\nimport { DisablePersonCommand } from '../commands/person/DisablePersonCommand'\nimport { ApiKeyManager } from './apiKey'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { DisablePersonErrorCode } from '../../schema'\n\nclass PersonAccessManager {\n\n\tconstructor(private readonly apiKeyManager: ApiKeyManager) {}\n\n\tasync disablePerson(dbContext: DatabaseContext, personId: string): Promise<PersonDisableAccessResponse> {\n\t\tconst result = await dbContext.transaction(async trx => {\n\t\t\tconst personRow = await trx.queryHandler.fetch(\n\t\t\t\tPersonQuery.byId(personId),\n\t\t\t)\n\n\t\t\tif (personRow === null) {\n\t\t\t\treturn 'PERSON_NOT_FOUND'\n\t\t\t}\n\n\t\t\tif (personRow.disabled_at !== null) {\n\t\t\t\treturn 'PERSON_ALREADY_DISABLED'\n\t\t\t}\n\n\t\t\t// Deactivate person & invalidate all api keys associated with person identity\n\t\t\tawait this.disablePersonAccount(trx, personRow.id)\n\t\t\tawait this.disableIdentityApiKeys(trx, personRow.identity_id)\n\n\t\t\treturn null\n\t\t})\n\n\t\tswitch (result) {\n\t\t\tcase null:\n\t\t\t\treturn new ResponseOk(null)\n\n\t\t\tcase 'PERSON_ALREADY_DISABLED':\n\t\t\t\treturn new ResponseError(result, 'Person is already disable')\n\n\t\t\tcase 'PERSON_NOT_FOUND':\n\t\t\t\treturn new ResponseError(result, 'Person not found')\n\t\t}\n\t}\n\n\tprivate async disablePersonAccount(dbContext: DatabaseContext, personId: string) {\n\t\tawait dbContext.commandBus.execute(new DisablePersonCommand(personId))\n\t}\n\n\tprivate async disableIdentityApiKeys(dbContext: DatabaseContext, personIdentityId: string) {\n\t\tawait this.apiKeyManager.disableIdentityApiKeys(dbContext, personIdentityId)\n\t}\n}\n\nexport type PersonDisableAccessResponse = Response<null, DisablePersonErrorCode>\n\nexport { PersonAccessManager }\n"],"names":["PersonQuery","ResponseOk","ResponseError","DisablePersonCommand"],"mappings":";;;;;;;;;;;;AAOA,MAAM,oBAAoB;AAAA,EAEzB,YAA6B,eAA8B;AAA9B,SAAA,gBAAA;AAAA,EAAA;AAAA,EAE7B,MAAM,cAAc,WAA4B,UAAwD;AACvG,UAAM,SAAS,MAAM,UAAU,YAAY,OAAM,QAAO;AACjD,YAAA,YAAY,MAAM,IAAI,aAAa;AAAA,QACxCA,YAAA,YAAY,KAAK,QAAQ;AAAA,MAC1B;AAEA,UAAI,cAAc,MAAM;AAChB,eAAA;AAAA,MAAA;AAGJ,UAAA,UAAU,gBAAgB,MAAM;AAC5B,eAAA;AAAA,MAAA;AAIR,YAAM,KAAK,qBAAqB,KAAK,UAAU,EAAE;AACjD,YAAM,KAAK,uBAAuB,KAAK,UAAU,WAAW;AAErD,aAAA;AAAA,IAAA,CACP;AAED,YAAQ,QAAQ;AAAA,MACf,KAAK;AACG,eAAA,IAAIC,oBAAW,IAAI;AAAA,MAE3B,KAAK;AACG,eAAA,IAAIC,SAAAA,cAAc,QAAQ,2BAA2B;AAAA,MAE7D,KAAK;AACG,eAAA,IAAIA,SAAAA,cAAc,QAAQ,kBAAkB;AAAA,IAAA;AAAA,EACrD;AAAA,EAGD,MAAc,qBAAqB,WAA4B,UAAkB;AAChF,UAAM,UAAU,WAAW,QAAQ,IAAIC,qBAAA,qBAAqB,QAAQ,CAAC;AAAA,EAAA;AAAA,EAGtE,MAAc,uBAAuB,WAA4B,kBAA0B;AAC1F,UAAM,KAAK,cAAc,uBAAuB,WAAW,gBAAgB;AAAA,EAAA;AAE7E;;"}
1
+ {"version":3,"file":"PersonAccessManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PersonAccessManager.ts"],"sourcesContent":["import { PersonQuery, PersonRow } from '../queries'\nimport { DatabaseContext } from '../utils'\nimport { DisablePersonCommand } from '../commands/person/DisablePersonCommand'\nimport { ApiKeyManager } from './apiKey'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { DisablePersonErrorCode } from '../../schema'\n\nclass PersonAccessManager {\n\n\tconstructor(private readonly apiKeyManager: ApiKeyManager) {}\n\n\tasync disablePerson(dbContext: DatabaseContext, person: PersonRow): Promise<PersonDisableAccessResponse> {\n\t\treturn await dbContext.transaction(async trx => {\n\t\t\tif (person.disabled_at !== null) {\n\t\t\t\treturn new ResponseError('PERSON_ALREADY_DISABLED', 'Person is already disabled')\n\t\t\t}\n\n\t\t\t// Deactivate person & invalidate all api keys associated with person identity\n\t\t\tawait this.disablePersonAccount(trx, person.id)\n\t\t\tawait this.disableIdentityApiKeys(trx, person.identity_id)\n\n\t\t\treturn new ResponseOk(null)\n\t\t})\n\t}\n\n\tprivate async disablePersonAccount(dbContext: DatabaseContext, personId: string) {\n\t\tawait dbContext.commandBus.execute(new DisablePersonCommand(personId))\n\t}\n\n\tprivate async disableIdentityApiKeys(dbContext: DatabaseContext, personIdentityId: string) {\n\t\tawait this.apiKeyManager.disableIdentityApiKeys(dbContext, personIdentityId)\n\t}\n}\n\nexport type PersonDisableAccessResponse = Response<null, DisablePersonErrorCode>\n\nexport { PersonAccessManager }\n"],"names":["ResponseError","ResponseOk","DisablePersonCommand"],"mappings":";;;;AAOA,MAAM,oBAAoB;AAAA,EAEzB,YAA6B,eAA8B;AAA9B,SAAA,gBAAA;AAAA,EAAA;AAAA,EAE7B,MAAM,cAAc,WAA4B,QAAyD;AACxG,WAAO,MAAM,UAAU,YAAY,OAAM,QAAO;AAC3C,UAAA,OAAO,gBAAgB,MAAM;AACzB,eAAA,IAAIA,SAAAA,cAAc,2BAA2B,4BAA4B;AAAA,MAAA;AAIjF,YAAM,KAAK,qBAAqB,KAAK,OAAO,EAAE;AAC9C,YAAM,KAAK,uBAAuB,KAAK,OAAO,WAAW;AAElD,aAAA,IAAIC,oBAAW,IAAI;AAAA,IAAA,CAC1B;AAAA,EAAA;AAAA,EAGF,MAAc,qBAAqB,WAA4B,UAAkB;AAChF,UAAM,UAAU,WAAW,QAAQ,IAAIC,qBAAA,qBAAqB,QAAQ,CAAC;AAAA,EAAA;AAAA,EAGtE,MAAc,uBAAuB,WAA4B,kBAA0B;AAC1F,UAAM,KAAK,cAAc,uBAAuB,WAAW,gBAAgB;AAAA,EAAA;AAE7E;;"}
@@ -1,40 +1,18 @@
1
- import "../queries/apiKey/ApiKeyQuery.js";
2
- import "@contember/database";
3
- import { PersonQuery } from "../queries/person/PersonQuery.js";
4
- import "../authorization/PermissionActions.js";
5
- import "@contember/authorization";
6
- import "../authorization/PermissionContext.js";
7
- import "../authorization/PermissionsFactory.js";
8
- import "@contember/schema";
9
1
  import { DisablePersonCommand } from "../commands/person/DisablePersonCommand.js";
10
2
  import { ResponseError, ResponseOk } from "../utils/Response.js";
11
3
  class PersonAccessManager {
12
4
  constructor(apiKeyManager) {
13
5
  this.apiKeyManager = apiKeyManager;
14
6
  }
15
- async disablePerson(dbContext, personId) {
16
- const result = await dbContext.transaction(async (trx) => {
17
- const personRow = await trx.queryHandler.fetch(
18
- PersonQuery.byId(personId)
19
- );
20
- if (personRow === null) {
21
- return "PERSON_NOT_FOUND";
7
+ async disablePerson(dbContext, person) {
8
+ return await dbContext.transaction(async (trx) => {
9
+ if (person.disabled_at !== null) {
10
+ return new ResponseError("PERSON_ALREADY_DISABLED", "Person is already disabled");
22
11
  }
23
- if (personRow.disabled_at !== null) {
24
- return "PERSON_ALREADY_DISABLED";
25
- }
26
- await this.disablePersonAccount(trx, personRow.id);
27
- await this.disableIdentityApiKeys(trx, personRow.identity_id);
28
- return null;
12
+ await this.disablePersonAccount(trx, person.id);
13
+ await this.disableIdentityApiKeys(trx, person.identity_id);
14
+ return new ResponseOk(null);
29
15
  });
30
- switch (result) {
31
- case null:
32
- return new ResponseOk(null);
33
- case "PERSON_ALREADY_DISABLED":
34
- return new ResponseError(result, "Person is already disable");
35
- case "PERSON_NOT_FOUND":
36
- return new ResponseError(result, "Person not found");
37
- }
38
16
  }
39
17
  async disablePersonAccount(dbContext, personId) {
40
18
  await dbContext.commandBus.execute(new DisablePersonCommand(personId));
@@ -1 +1 @@
1
- {"version":3,"file":"PersonAccessManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PersonAccessManager.ts"],"sourcesContent":["import { PersonQuery } from '../queries'\nimport { DatabaseContext } from '../utils'\nimport { DisablePersonCommand } from '../commands/person/DisablePersonCommand'\nimport { ApiKeyManager } from './apiKey'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { DisablePersonErrorCode } from '../../schema'\n\nclass PersonAccessManager {\n\n\tconstructor(private readonly apiKeyManager: ApiKeyManager) {}\n\n\tasync disablePerson(dbContext: DatabaseContext, personId: string): Promise<PersonDisableAccessResponse> {\n\t\tconst result = await dbContext.transaction(async trx => {\n\t\t\tconst personRow = await trx.queryHandler.fetch(\n\t\t\t\tPersonQuery.byId(personId),\n\t\t\t)\n\n\t\t\tif (personRow === null) {\n\t\t\t\treturn 'PERSON_NOT_FOUND'\n\t\t\t}\n\n\t\t\tif (personRow.disabled_at !== null) {\n\t\t\t\treturn 'PERSON_ALREADY_DISABLED'\n\t\t\t}\n\n\t\t\t// Deactivate person & invalidate all api keys associated with person identity\n\t\t\tawait this.disablePersonAccount(trx, personRow.id)\n\t\t\tawait this.disableIdentityApiKeys(trx, personRow.identity_id)\n\n\t\t\treturn null\n\t\t})\n\n\t\tswitch (result) {\n\t\t\tcase null:\n\t\t\t\treturn new ResponseOk(null)\n\n\t\t\tcase 'PERSON_ALREADY_DISABLED':\n\t\t\t\treturn new ResponseError(result, 'Person is already disable')\n\n\t\t\tcase 'PERSON_NOT_FOUND':\n\t\t\t\treturn new ResponseError(result, 'Person not found')\n\t\t}\n\t}\n\n\tprivate async disablePersonAccount(dbContext: DatabaseContext, personId: string) {\n\t\tawait dbContext.commandBus.execute(new DisablePersonCommand(personId))\n\t}\n\n\tprivate async disableIdentityApiKeys(dbContext: DatabaseContext, personIdentityId: string) {\n\t\tawait this.apiKeyManager.disableIdentityApiKeys(dbContext, personIdentityId)\n\t}\n}\n\nexport type PersonDisableAccessResponse = Response<null, DisablePersonErrorCode>\n\nexport { PersonAccessManager }\n"],"names":[],"mappings":";;;;;;;;;;AAOA,MAAM,oBAAoB;AAAA,EAEzB,YAA6B,eAA8B;AAA9B,SAAA,gBAAA;AAAA,EAAA;AAAA,EAE7B,MAAM,cAAc,WAA4B,UAAwD;AACvG,UAAM,SAAS,MAAM,UAAU,YAAY,OAAM,QAAO;AACjD,YAAA,YAAY,MAAM,IAAI,aAAa;AAAA,QACxC,YAAY,KAAK,QAAQ;AAAA,MAC1B;AAEA,UAAI,cAAc,MAAM;AAChB,eAAA;AAAA,MAAA;AAGJ,UAAA,UAAU,gBAAgB,MAAM;AAC5B,eAAA;AAAA,MAAA;AAIR,YAAM,KAAK,qBAAqB,KAAK,UAAU,EAAE;AACjD,YAAM,KAAK,uBAAuB,KAAK,UAAU,WAAW;AAErD,aAAA;AAAA,IAAA,CACP;AAED,YAAQ,QAAQ;AAAA,MACf,KAAK;AACG,eAAA,IAAI,WAAW,IAAI;AAAA,MAE3B,KAAK;AACG,eAAA,IAAI,cAAc,QAAQ,2BAA2B;AAAA,MAE7D,KAAK;AACG,eAAA,IAAI,cAAc,QAAQ,kBAAkB;AAAA,IAAA;AAAA,EACrD;AAAA,EAGD,MAAc,qBAAqB,WAA4B,UAAkB;AAChF,UAAM,UAAU,WAAW,QAAQ,IAAI,qBAAqB,QAAQ,CAAC;AAAA,EAAA;AAAA,EAGtE,MAAc,uBAAuB,WAA4B,kBAA0B;AAC1F,UAAM,KAAK,cAAc,uBAAuB,WAAW,gBAAgB;AAAA,EAAA;AAE7E;"}
1
+ {"version":3,"file":"PersonAccessManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PersonAccessManager.ts"],"sourcesContent":["import { PersonQuery, PersonRow } from '../queries'\nimport { DatabaseContext } from '../utils'\nimport { DisablePersonCommand } from '../commands/person/DisablePersonCommand'\nimport { ApiKeyManager } from './apiKey'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { DisablePersonErrorCode } from '../../schema'\n\nclass PersonAccessManager {\n\n\tconstructor(private readonly apiKeyManager: ApiKeyManager) {}\n\n\tasync disablePerson(dbContext: DatabaseContext, person: PersonRow): Promise<PersonDisableAccessResponse> {\n\t\treturn await dbContext.transaction(async trx => {\n\t\t\tif (person.disabled_at !== null) {\n\t\t\t\treturn new ResponseError('PERSON_ALREADY_DISABLED', 'Person is already disabled')\n\t\t\t}\n\n\t\t\t// Deactivate person & invalidate all api keys associated with person identity\n\t\t\tawait this.disablePersonAccount(trx, person.id)\n\t\t\tawait this.disableIdentityApiKeys(trx, person.identity_id)\n\n\t\t\treturn new ResponseOk(null)\n\t\t})\n\t}\n\n\tprivate async disablePersonAccount(dbContext: DatabaseContext, personId: string) {\n\t\tawait dbContext.commandBus.execute(new DisablePersonCommand(personId))\n\t}\n\n\tprivate async disableIdentityApiKeys(dbContext: DatabaseContext, personIdentityId: string) {\n\t\tawait this.apiKeyManager.disableIdentityApiKeys(dbContext, personIdentityId)\n\t}\n}\n\nexport type PersonDisableAccessResponse = Response<null, DisablePersonErrorCode>\n\nexport { PersonAccessManager }\n"],"names":[],"mappings":";;AAOA,MAAM,oBAAoB;AAAA,EAEzB,YAA6B,eAA8B;AAA9B,SAAA,gBAAA;AAAA,EAAA;AAAA,EAE7B,MAAM,cAAc,WAA4B,QAAyD;AACxG,WAAO,MAAM,UAAU,YAAY,OAAM,QAAO;AAC3C,UAAA,OAAO,gBAAgB,MAAM;AACzB,eAAA,IAAI,cAAc,2BAA2B,4BAA4B;AAAA,MAAA;AAIjF,YAAM,KAAK,qBAAqB,KAAK,OAAO,EAAE;AAC9C,YAAM,KAAK,uBAAuB,KAAK,OAAO,WAAW;AAElD,aAAA,IAAI,WAAW,IAAI;AAAA,IAAA,CAC1B;AAAA,EAAA;AAAA,EAGF,MAAc,qBAAqB,WAA4B,UAAkB;AAChF,UAAM,UAAU,WAAW,QAAQ,IAAI,qBAAqB,QAAQ,CAAC;AAAA,EAAA;AAAA,EAGtE,MAAc,uBAAuB,WAA4B,kBAA0B;AAC1F,UAAM,KAAK,cAAc,uBAAuB,WAAW,gBAAgB;AAAA,EAAA;AAE7E;"}