@contember/engine-tenant-api 2.2.0-alpha.1 → 2.2.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2014) hide show
  1. package/CLAUDE.md +60 -7
  2. package/dist/development/index.cjs +69 -0
  3. package/dist/development/index.cjs.map +1 -1
  4. package/dist/development/index.js +71 -2
  5. package/dist/development/index.js.map +1 -1
  6. package/dist/development/src/TenantContainer.cjs +39 -10
  7. package/dist/development/src/TenantContainer.cjs.map +1 -1
  8. package/dist/development/src/TenantContainer.js +39 -10
  9. package/dist/development/src/TenantContainer.js.map +1 -1
  10. package/dist/development/src/bridges/system/IdentityFetcher.cjs +9 -7
  11. package/dist/development/src/bridges/system/IdentityFetcher.cjs.map +1 -1
  12. package/dist/development/src/bridges/system/IdentityFetcher.js +9 -7
  13. package/dist/development/src/bridges/system/IdentityFetcher.js.map +1 -1
  14. package/dist/development/src/migrations/2026-06-18-120000-idp-claim-mapping.cjs +10 -0
  15. package/dist/development/src/migrations/2026-06-18-120000-idp-claim-mapping.cjs.map +1 -0
  16. package/dist/development/src/migrations/2026-06-18-120000-idp-claim-mapping.js +11 -0
  17. package/dist/development/src/migrations/2026-06-18-120000-idp-claim-mapping.js.map +1 -0
  18. package/dist/development/src/migrations/2026-08-03-120000-person-enable-auth-log.cjs +9 -0
  19. package/dist/development/src/migrations/2026-08-03-120000-person-enable-auth-log.cjs.map +1 -0
  20. package/dist/development/src/migrations/2026-08-03-120000-person-enable-auth-log.js +10 -0
  21. package/dist/development/src/migrations/2026-08-03-120000-person-enable-auth-log.js.map +1 -0
  22. package/dist/development/src/migrations/2026-08-04-120000-config-panel.cjs +11 -0
  23. package/dist/development/src/migrations/2026-08-04-120000-config-panel.cjs.map +1 -0
  24. package/dist/development/src/migrations/2026-08-04-120000-config-panel.js +12 -0
  25. package/dist/development/src/migrations/2026-08-04-120000-config-panel.js.map +1 -0
  26. package/dist/development/src/migrations/2026-09-04-120000-idp-disable-local-authentication.cjs +18 -0
  27. package/dist/development/src/migrations/2026-09-04-120000-idp-disable-local-authentication.cjs.map +1 -0
  28. package/dist/development/src/migrations/2026-09-04-120000-idp-disable-local-authentication.js +19 -0
  29. package/dist/development/src/migrations/2026-09-04-120000-idp-disable-local-authentication.js.map +1 -0
  30. package/dist/development/src/migrations/2026-09-11-120000-custom-role.cjs +18 -0
  31. package/dist/development/src/migrations/2026-09-11-120000-custom-role.cjs.map +1 -0
  32. package/dist/development/src/migrations/2026-09-11-120000-custom-role.js +19 -0
  33. package/dist/development/src/migrations/2026-09-11-120000-custom-role.js.map +1 -0
  34. package/dist/development/src/migrations/runner.cjs +17 -5
  35. package/dist/development/src/migrations/runner.cjs.map +1 -1
  36. package/dist/development/src/migrations/runner.js +17 -5
  37. package/dist/development/src/migrations/runner.js.map +1 -1
  38. package/dist/development/src/migrations/snapshot.cjs +22 -2
  39. package/dist/development/src/migrations/snapshot.cjs.map +1 -1
  40. package/dist/development/src/migrations/snapshot.js +22 -2
  41. package/dist/development/src/migrations/snapshot.js.map +1 -1
  42. package/dist/development/src/model/authorization/CustomRoleAuthorizator.cjs +65 -0
  43. package/dist/development/src/model/authorization/CustomRoleAuthorizator.cjs.map +1 -0
  44. package/dist/development/src/model/authorization/CustomRoleAuthorizator.js +65 -0
  45. package/dist/development/src/model/authorization/CustomRoleAuthorizator.js.map +1 -0
  46. package/dist/development/src/model/authorization/CustomRolePermissions.cjs +404 -0
  47. package/dist/development/src/model/authorization/CustomRolePermissions.cjs.map +1 -0
  48. package/dist/development/src/model/authorization/CustomRolePermissions.js +387 -0
  49. package/dist/development/src/model/authorization/CustomRolePermissions.js.map +1 -0
  50. package/dist/development/src/model/authorization/PermissionActions.cjs +19 -16
  51. package/dist/development/src/model/authorization/PermissionActions.cjs.map +1 -1
  52. package/dist/development/src/model/authorization/PermissionActions.js +19 -16
  53. package/dist/development/src/model/authorization/PermissionActions.js.map +1 -1
  54. package/dist/development/src/model/authorization/PermissionContextFactory.cjs +20 -2
  55. package/dist/development/src/model/authorization/PermissionContextFactory.cjs.map +1 -1
  56. package/dist/development/src/model/authorization/PermissionContextFactory.js +20 -2
  57. package/dist/development/src/model/authorization/PermissionContextFactory.js.map +1 -1
  58. package/dist/development/src/model/authorization/PermissionsFactory.cjs +32 -24
  59. package/dist/development/src/model/authorization/PermissionsFactory.cjs.map +1 -1
  60. package/dist/development/src/model/authorization/PermissionsFactory.js +33 -25
  61. package/dist/development/src/model/authorization/PermissionsFactory.js.map +1 -1
  62. package/dist/development/src/model/authorization/Roles.cjs +8 -0
  63. package/dist/development/src/model/authorization/Roles.cjs.map +1 -1
  64. package/dist/development/src/model/authorization/Roles.js +8 -0
  65. package/dist/development/src/model/authorization/Roles.js.map +1 -1
  66. package/dist/development/src/model/authorization/TargetIdentityPermission.cjs +35 -0
  67. package/dist/development/src/model/authorization/TargetIdentityPermission.cjs.map +1 -0
  68. package/dist/development/src/model/authorization/TargetIdentityPermission.js +35 -0
  69. package/dist/development/src/model/authorization/TargetIdentityPermission.js.map +1 -0
  70. package/dist/development/src/model/commands/apiKey/ApiKeyHelper.cjs +19 -0
  71. package/dist/development/src/model/commands/apiKey/ApiKeyHelper.cjs.map +1 -1
  72. package/dist/development/src/model/commands/apiKey/ApiKeyHelper.js +19 -0
  73. package/dist/development/src/model/commands/apiKey/ApiKeyHelper.js.map +1 -1
  74. package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.cjs +4 -2
  75. package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.cjs.map +1 -1
  76. package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.js +5 -3
  77. package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.js.map +1 -1
  78. package/dist/development/src/model/commands/apiKey/ProlongApiKeyCommand.cjs +9 -10
  79. package/dist/development/src/model/commands/apiKey/ProlongApiKeyCommand.cjs.map +1 -1
  80. package/dist/development/src/model/commands/apiKey/ProlongApiKeyCommand.js +10 -11
  81. package/dist/development/src/model/commands/apiKey/ProlongApiKeyCommand.js.map +1 -1
  82. package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs.map +1 -1
  83. package/dist/development/src/model/commands/authLog/CreateAuthLogEntryCommand.js.map +1 -1
  84. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.cjs +5 -3
  85. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.cjs.map +1 -1
  86. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.js +5 -3
  87. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.js.map +1 -1
  88. package/dist/development/src/model/commands/customRole/CreateCustomRoleCommand.cjs +23 -0
  89. package/dist/development/src/model/commands/customRole/CreateCustomRoleCommand.cjs.map +1 -0
  90. package/dist/development/src/model/commands/customRole/CreateCustomRoleCommand.js +23 -0
  91. package/dist/development/src/model/commands/customRole/CreateCustomRoleCommand.js.map +1 -0
  92. package/dist/development/src/model/commands/customRole/DeleteCustomRoleCommand.cjs +14 -0
  93. package/dist/development/src/model/commands/customRole/DeleteCustomRoleCommand.cjs.map +1 -0
  94. package/dist/development/src/model/commands/customRole/DeleteCustomRoleCommand.js +14 -0
  95. package/dist/development/src/model/commands/customRole/DeleteCustomRoleCommand.js.map +1 -0
  96. package/dist/development/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.cjs +16 -0
  97. package/dist/development/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.cjs.map +1 -0
  98. package/dist/development/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.js +16 -0
  99. package/dist/development/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.js.map +1 -0
  100. package/dist/development/src/model/commands/customRole/UpdateCustomRoleCommand.cjs +19 -0
  101. package/dist/development/src/model/commands/customRole/UpdateCustomRoleCommand.cjs.map +1 -0
  102. package/dist/development/src/model/commands/customRole/UpdateCustomRoleCommand.js +19 -0
  103. package/dist/development/src/model/commands/customRole/UpdateCustomRoleCommand.js.map +1 -0
  104. package/dist/development/src/model/commands/identity/PatchIdentityGlobalRoles.cjs +1 -1
  105. package/dist/development/src/model/commands/identity/PatchIdentityGlobalRoles.cjs.map +1 -1
  106. package/dist/development/src/model/commands/identity/PatchIdentityGlobalRoles.js +1 -1
  107. package/dist/development/src/model/commands/identity/PatchIdentityGlobalRoles.js.map +1 -1
  108. package/dist/development/src/model/commands/idp/ClaimIdpRevalidationCommand.cjs +3 -7
  109. package/dist/development/src/model/commands/idp/ClaimIdpRevalidationCommand.cjs.map +1 -1
  110. package/dist/development/src/model/commands/idp/ClaimIdpRevalidationCommand.js +3 -7
  111. package/dist/development/src/model/commands/idp/ClaimIdpRevalidationCommand.js.map +1 -1
  112. package/dist/development/src/model/commands/idp/CreateIdpCommand.cjs +8 -2
  113. package/dist/development/src/model/commands/idp/CreateIdpCommand.cjs.map +1 -1
  114. package/dist/development/src/model/commands/idp/CreateIdpCommand.js +8 -2
  115. package/dist/development/src/model/commands/idp/CreateIdpCommand.js.map +1 -1
  116. package/dist/development/src/model/commands/idp/CreateIdpSessionCommand.cjs +4 -1
  117. package/dist/development/src/model/commands/idp/CreateIdpSessionCommand.cjs.map +1 -1
  118. package/dist/development/src/model/commands/idp/CreateIdpSessionCommand.js +5 -2
  119. package/dist/development/src/model/commands/idp/CreateIdpSessionCommand.js.map +1 -1
  120. package/dist/development/src/model/commands/idp/UpdateIdpCommand.cjs +6 -2
  121. package/dist/development/src/model/commands/idp/UpdateIdpCommand.cjs.map +1 -1
  122. package/dist/development/src/model/commands/idp/UpdateIdpCommand.js +6 -2
  123. package/dist/development/src/model/commands/idp/UpdateIdpCommand.js.map +1 -1
  124. package/dist/development/src/model/commands/idp/UpdateIdpSessionCommand.cjs +2 -1
  125. package/dist/development/src/model/commands/idp/UpdateIdpSessionCommand.cjs.map +1 -1
  126. package/dist/development/src/model/commands/idp/UpdateIdpSessionCommand.js +3 -2
  127. package/dist/development/src/model/commands/idp/UpdateIdpSessionCommand.js.map +1 -1
  128. package/dist/development/src/model/commands/membership/{RemoveProjectMembershipsCommand.cjs → RemoveProjectMembershipCommand.cjs} +1 -1
  129. package/dist/development/src/model/commands/membership/RemoveProjectMembershipCommand.cjs.map +1 -0
  130. package/dist/development/src/model/commands/membership/{RemoveProjectMembershipsCommand.js → RemoveProjectMembershipCommand.js} +1 -1
  131. package/dist/development/src/model/commands/membership/RemoveProjectMembershipCommand.js.map +1 -0
  132. package/dist/development/src/model/commands/membership/UpdateProjectMemberCommand.cjs +2 -2
  133. package/dist/development/src/model/commands/membership/UpdateProjectMemberCommand.cjs.map +1 -1
  134. package/dist/development/src/model/commands/membership/UpdateProjectMemberCommand.js +1 -1
  135. package/dist/development/src/model/commands/membership/UpdateProjectMemberCommand.js.map +1 -1
  136. package/dist/development/src/model/commands/person/CreatePersonCommand.cjs +1 -0
  137. package/dist/development/src/model/commands/person/CreatePersonCommand.cjs.map +1 -1
  138. package/dist/development/src/model/commands/person/CreatePersonCommand.js +1 -0
  139. package/dist/development/src/model/commands/person/CreatePersonCommand.js.map +1 -1
  140. package/dist/development/src/model/commands/person/EnablePersonCommand.cjs +17 -0
  141. package/dist/development/src/model/commands/person/EnablePersonCommand.cjs.map +1 -0
  142. package/dist/development/src/model/commands/person/EnablePersonCommand.js +17 -0
  143. package/dist/development/src/model/commands/person/EnablePersonCommand.js.map +1 -0
  144. package/dist/development/src/model/commands/person/SetMfaGraceUntilCommand.cjs +3 -3
  145. package/dist/development/src/model/commands/person/SetMfaGraceUntilCommand.cjs.map +1 -1
  146. package/dist/development/src/model/commands/person/SetMfaGraceUntilCommand.js +4 -4
  147. package/dist/development/src/model/commands/person/SetMfaGraceUntilCommand.js.map +1 -1
  148. package/dist/development/src/model/commands/personToken/ResetPasswordCommand.cjs +2 -3
  149. package/dist/development/src/model/commands/personToken/ResetPasswordCommand.cjs.map +1 -1
  150. package/dist/development/src/model/commands/personToken/ResetPasswordCommand.js +2 -3
  151. package/dist/development/src/model/commands/personToken/ResetPasswordCommand.js.map +1 -1
  152. package/dist/development/src/model/commands/personToken/SaveEmailOtpTokenCommand.cjs +3 -3
  153. package/dist/development/src/model/commands/personToken/SaveEmailOtpTokenCommand.cjs.map +1 -1
  154. package/dist/development/src/model/commands/personToken/SaveEmailOtpTokenCommand.js +4 -4
  155. package/dist/development/src/model/commands/personToken/SaveEmailOtpTokenCommand.js.map +1 -1
  156. package/dist/development/src/model/commands/personToken/SavePersonTokenCommand.cjs +12 -6
  157. package/dist/development/src/model/commands/personToken/SavePersonTokenCommand.cjs.map +1 -1
  158. package/dist/development/src/model/commands/personToken/SavePersonTokenCommand.js +13 -7
  159. package/dist/development/src/model/commands/personToken/SavePersonTokenCommand.js.map +1 -1
  160. package/dist/development/src/model/commands/rateLimit/RecordRateLimitEventCommand.cjs +1 -2
  161. package/dist/development/src/model/commands/rateLimit/RecordRateLimitEventCommand.cjs.map +1 -1
  162. package/dist/development/src/model/commands/rateLimit/RecordRateLimitEventCommand.js +1 -2
  163. package/dist/development/src/model/commands/rateLimit/RecordRateLimitEventCommand.js.map +1 -1
  164. package/dist/development/src/model/mailing/UserMailer.cjs +2 -1
  165. package/dist/development/src/model/mailing/UserMailer.cjs.map +1 -1
  166. package/dist/development/src/model/mailing/UserMailer.js +2 -1
  167. package/dist/development/src/model/mailing/UserMailer.js.map +1 -1
  168. package/dist/development/src/model/queries/apiKey/ApiKeyQuery.cjs +8 -1
  169. package/dist/development/src/model/queries/apiKey/ApiKeyQuery.cjs.map +1 -1
  170. package/dist/development/src/model/queries/apiKey/ApiKeyQuery.js +9 -2
  171. package/dist/development/src/model/queries/apiKey/ApiKeyQuery.js.map +1 -1
  172. package/dist/development/src/model/queries/apiKey/ApiKeySessionsQuery.cjs +2 -3
  173. package/dist/development/src/model/queries/apiKey/ApiKeySessionsQuery.cjs.map +1 -1
  174. package/dist/development/src/model/queries/apiKey/ApiKeySessionsQuery.js +2 -3
  175. package/dist/development/src/model/queries/apiKey/ApiKeySessionsQuery.js.map +1 -1
  176. package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.cjs +12 -10
  177. package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.cjs.map +1 -1
  178. package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.js +12 -10
  179. package/dist/development/src/model/queries/authLog/NextLoginAttemptQuery.js.map +1 -1
  180. package/dist/development/src/model/queries/authLog/NextMailAttemptQuery.cjs +10 -8
  181. package/dist/development/src/model/queries/authLog/NextMailAttemptQuery.cjs.map +1 -1
  182. package/dist/development/src/model/queries/authLog/NextMailAttemptQuery.js +10 -8
  183. package/dist/development/src/model/queries/authLog/NextMailAttemptQuery.js.map +1 -1
  184. package/dist/development/src/model/queries/configuration/ConfigurationQuery.cjs +4 -0
  185. package/dist/development/src/model/queries/configuration/ConfigurationQuery.cjs.map +1 -1
  186. package/dist/development/src/model/queries/configuration/ConfigurationQuery.js +4 -0
  187. package/dist/development/src/model/queries/configuration/ConfigurationQuery.js.map +1 -1
  188. package/dist/development/src/model/queries/customRole/CustomRolesQuery.cjs +23 -0
  189. package/dist/development/src/model/queries/customRole/CustomRolesQuery.cjs.map +1 -0
  190. package/dist/development/src/model/queries/customRole/CustomRolesQuery.js +23 -0
  191. package/dist/development/src/model/queries/customRole/CustomRolesQuery.js.map +1 -0
  192. package/dist/development/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.cjs +15 -0
  193. package/dist/development/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.cjs.map +1 -0
  194. package/dist/development/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.js +15 -0
  195. package/dist/development/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.js.map +1 -0
  196. package/dist/development/src/model/queries/identity/IdentityQuery.cjs +7 -2
  197. package/dist/development/src/model/queries/identity/IdentityQuery.cjs.map +1 -1
  198. package/dist/development/src/model/queries/identity/IdentityQuery.js +7 -2
  199. package/dist/development/src/model/queries/identity/IdentityQuery.js.map +1 -1
  200. package/dist/development/src/model/queries/idp/LocalAuthDisablingIdpsQuery.cjs +21 -0
  201. package/dist/development/src/model/queries/idp/LocalAuthDisablingIdpsQuery.cjs.map +1 -0
  202. package/dist/development/src/model/queries/idp/LocalAuthDisablingIdpsQuery.js +21 -0
  203. package/dist/development/src/model/queries/idp/LocalAuthDisablingIdpsQuery.js.map +1 -0
  204. package/dist/development/src/model/queries/idp/PersonIdentityProvidersQuery.cjs +1 -1
  205. package/dist/development/src/model/queries/idp/PersonIdentityProvidersQuery.cjs.map +1 -1
  206. package/dist/development/src/model/queries/idp/PersonIdentityProvidersQuery.js +1 -1
  207. package/dist/development/src/model/queries/idp/PersonIdentityProvidersQuery.js.map +1 -1
  208. package/dist/development/src/model/queries/idp/helpers.cjs +3 -3
  209. package/dist/development/src/model/queries/idp/helpers.cjs.map +1 -1
  210. package/dist/development/src/model/queries/idp/helpers.js +3 -3
  211. package/dist/development/src/model/queries/idp/helpers.js.map +1 -1
  212. package/dist/development/src/model/queries/membership/IdentityHasProjectMembershipsQuery.cjs +15 -0
  213. package/dist/development/src/model/queries/membership/IdentityHasProjectMembershipsQuery.cjs.map +1 -0
  214. package/dist/development/src/model/queries/membership/IdentityHasProjectMembershipsQuery.js +15 -0
  215. package/dist/development/src/model/queries/membership/IdentityHasProjectMembershipsQuery.js.map +1 -0
  216. package/dist/development/src/model/queries/membership/ProjectMembersQuery.cjs +1 -1
  217. package/dist/development/src/model/queries/membership/ProjectMembersQuery.cjs.map +1 -1
  218. package/dist/development/src/model/queries/membership/ProjectMembersQuery.js +1 -1
  219. package/dist/development/src/model/queries/membership/ProjectMembersQuery.js.map +1 -1
  220. package/dist/development/src/model/queries/person/PersonQueryBuilderFactory.cjs +2 -2
  221. package/dist/development/src/model/queries/person/PersonQueryBuilderFactory.cjs.map +1 -1
  222. package/dist/development/src/model/queries/person/PersonQueryBuilderFactory.js +2 -2
  223. package/dist/development/src/model/queries/person/PersonQueryBuilderFactory.js.map +1 -1
  224. package/dist/development/src/model/queries/personToken/PersonTokenQuery.cjs +1 -1
  225. package/dist/development/src/model/queries/personToken/PersonTokenQuery.cjs.map +1 -1
  226. package/dist/development/src/model/queries/personToken/PersonTokenQuery.js +1 -1
  227. package/dist/development/src/model/queries/personToken/PersonTokenQuery.js.map +1 -1
  228. package/dist/development/src/model/queries/project/ProjectsByIdentityQuery.cjs +4 -1
  229. package/dist/development/src/model/queries/project/ProjectsByIdentityQuery.cjs.map +1 -1
  230. package/dist/development/src/model/queries/project/ProjectsByIdentityQuery.js +4 -1
  231. package/dist/development/src/model/queries/project/ProjectsByIdentityQuery.js.map +1 -1
  232. package/dist/development/src/model/queries/rateLimit/RateLimitCountQuery.cjs +3 -3
  233. package/dist/development/src/model/queries/rateLimit/RateLimitCountQuery.cjs.map +1 -1
  234. package/dist/development/src/model/queries/rateLimit/RateLimitCountQuery.js +3 -3
  235. package/dist/development/src/model/queries/rateLimit/RateLimitCountQuery.js.map +1 -1
  236. package/dist/development/src/model/service/AuthLogService.cjs +8 -2
  237. package/dist/development/src/model/service/AuthLogService.cjs.map +1 -1
  238. package/dist/development/src/model/service/AuthLogService.js +8 -2
  239. package/dist/development/src/model/service/AuthLogService.js.map +1 -1
  240. package/dist/development/src/model/service/AuthPolicyManager.cjs +2 -1
  241. package/dist/development/src/model/service/AuthPolicyManager.cjs.map +1 -1
  242. package/dist/development/src/model/service/AuthPolicyManager.js +2 -1
  243. package/dist/development/src/model/service/AuthPolicyManager.js.map +1 -1
  244. package/dist/development/src/model/service/AuthPolicyResolver.cjs +2 -1
  245. package/dist/development/src/model/service/AuthPolicyResolver.cjs.map +1 -1
  246. package/dist/development/src/model/service/AuthPolicyResolver.js +2 -1
  247. package/dist/development/src/model/service/AuthPolicyResolver.js.map +1 -1
  248. package/dist/development/src/model/service/CustomRoleManager.cjs +170 -0
  249. package/dist/development/src/model/service/CustomRoleManager.cjs.map +1 -0
  250. package/dist/development/src/model/service/CustomRoleManager.js +170 -0
  251. package/dist/development/src/model/service/CustomRoleManager.js.map +1 -0
  252. package/dist/development/src/model/service/EmailChangeManager.cjs +5 -4
  253. package/dist/development/src/model/service/EmailChangeManager.cjs.map +1 -1
  254. package/dist/development/src/model/service/EmailChangeManager.js +5 -4
  255. package/dist/development/src/model/service/EmailChangeManager.js.map +1 -1
  256. package/dist/development/src/model/service/EmailOtpManager.cjs +0 -1
  257. package/dist/development/src/model/service/EmailOtpManager.cjs.map +1 -1
  258. package/dist/development/src/model/service/EmailOtpManager.js +0 -1
  259. package/dist/development/src/model/service/EmailOtpManager.js.map +1 -1
  260. package/dist/development/src/model/service/EmailValidator.cjs +2 -1
  261. package/dist/development/src/model/service/EmailValidator.cjs.map +1 -1
  262. package/dist/development/src/model/service/EmailValidator.js +2 -1
  263. package/dist/development/src/model/service/EmailValidator.js.map +1 -1
  264. package/dist/development/src/model/service/EmailVerificationManager.cjs +5 -4
  265. package/dist/development/src/model/service/EmailVerificationManager.cjs.map +1 -1
  266. package/dist/development/src/model/service/EmailVerificationManager.js +5 -4
  267. package/dist/development/src/model/service/EmailVerificationManager.js.map +1 -1
  268. package/dist/development/src/model/service/GlobalRoleValidator.cjs +35 -0
  269. package/dist/development/src/model/service/GlobalRoleValidator.cjs.map +1 -0
  270. package/dist/development/src/model/service/GlobalRoleValidator.js +35 -0
  271. package/dist/development/src/model/service/GlobalRoleValidator.js.map +1 -0
  272. package/dist/development/src/model/service/IDPSignInManager.cjs +52 -16
  273. package/dist/development/src/model/service/IDPSignInManager.cjs.map +1 -1
  274. package/dist/development/src/model/service/IDPSignInManager.js +52 -16
  275. package/dist/development/src/model/service/IDPSignInManager.js.map +1 -1
  276. package/dist/development/src/model/service/InviteManager.cjs +2 -1
  277. package/dist/development/src/model/service/InviteManager.cjs.map +1 -1
  278. package/dist/development/src/model/service/InviteManager.js +2 -1
  279. package/dist/development/src/model/service/InviteManager.js.map +1 -1
  280. package/dist/development/src/model/service/PanelAccessResolver.cjs +32 -0
  281. package/dist/development/src/model/service/PanelAccessResolver.cjs.map +1 -0
  282. package/dist/development/src/model/service/PanelAccessResolver.js +32 -0
  283. package/dist/development/src/model/service/PanelAccessResolver.js.map +1 -0
  284. package/dist/development/src/model/service/PasswordChangeManager.cjs +2 -1
  285. package/dist/development/src/model/service/PasswordChangeManager.cjs.map +1 -1
  286. package/dist/development/src/model/service/PasswordChangeManager.js +2 -1
  287. package/dist/development/src/model/service/PasswordChangeManager.js.map +1 -1
  288. package/dist/development/src/model/service/PasswordResetManager.cjs +9 -3
  289. package/dist/development/src/model/service/PasswordResetManager.cjs.map +1 -1
  290. package/dist/development/src/model/service/PasswordResetManager.js +9 -3
  291. package/dist/development/src/model/service/PasswordResetManager.js.map +1 -1
  292. package/dist/development/src/model/service/PasswordlessSignInManager.cjs +24 -6
  293. package/dist/development/src/model/service/PasswordlessSignInManager.cjs.map +1 -1
  294. package/dist/development/src/model/service/PasswordlessSignInManager.js +24 -6
  295. package/dist/development/src/model/service/PasswordlessSignInManager.js.map +1 -1
  296. package/dist/development/src/model/service/PersonAccessManager.cjs +10 -2
  297. package/dist/development/src/model/service/PersonAccessManager.cjs.map +1 -1
  298. package/dist/development/src/model/service/PersonAccessManager.js +10 -2
  299. package/dist/development/src/model/service/PersonAccessManager.js.map +1 -1
  300. package/dist/development/src/model/service/PersonManager.cjs +2 -1
  301. package/dist/development/src/model/service/PersonManager.cjs.map +1 -1
  302. package/dist/development/src/model/service/PersonManager.js +2 -1
  303. package/dist/development/src/model/service/PersonManager.js.map +1 -1
  304. package/dist/development/src/model/service/ProjectMemberManager.cjs +2 -1
  305. package/dist/development/src/model/service/ProjectMemberManager.cjs.map +1 -1
  306. package/dist/development/src/model/service/ProjectMemberManager.js +2 -1
  307. package/dist/development/src/model/service/ProjectMemberManager.js.map +1 -1
  308. package/dist/development/src/model/service/RateLimiter.cjs +1 -2
  309. package/dist/development/src/model/service/RateLimiter.cjs.map +1 -1
  310. package/dist/development/src/model/service/RateLimiter.js +1 -2
  311. package/dist/development/src/model/service/RateLimiter.js.map +1 -1
  312. package/dist/development/src/model/service/RolesManager.cjs +17 -18
  313. package/dist/development/src/model/service/RolesManager.cjs.map +1 -1
  314. package/dist/development/src/model/service/RolesManager.js +18 -19
  315. package/dist/development/src/model/service/RolesManager.js.map +1 -1
  316. package/dist/development/src/model/service/SecretsManager.cjs +2 -1
  317. package/dist/development/src/model/service/SecretsManager.cjs.map +1 -1
  318. package/dist/development/src/model/service/SecretsManager.js +2 -1
  319. package/dist/development/src/model/service/SecretsManager.js.map +1 -1
  320. package/dist/development/src/model/service/SignInManager.cjs +9 -5
  321. package/dist/development/src/model/service/SignInManager.cjs.map +1 -1
  322. package/dist/development/src/model/service/SignInManager.js +9 -5
  323. package/dist/development/src/model/service/SignInManager.js.map +1 -1
  324. package/dist/development/src/model/service/SignOutManager.cjs +2 -1
  325. package/dist/development/src/model/service/SignOutManager.cjs.map +1 -1
  326. package/dist/development/src/model/service/SignOutManager.js +2 -1
  327. package/dist/development/src/model/service/SignOutManager.js.map +1 -1
  328. package/dist/development/src/model/service/SignUpManager.cjs +15 -7
  329. package/dist/development/src/model/service/SignUpManager.cjs.map +1 -1
  330. package/dist/development/src/model/service/SignUpManager.js +15 -7
  331. package/dist/development/src/model/service/SignUpManager.js.map +1 -1
  332. package/dist/development/src/model/service/apiKey/ApiKeyManager.cjs +56 -40
  333. package/dist/development/src/model/service/apiKey/ApiKeyManager.cjs.map +1 -1
  334. package/dist/development/src/model/service/apiKey/ApiKeyManager.js +57 -41
  335. package/dist/development/src/model/service/apiKey/ApiKeyManager.js.map +1 -1
  336. package/dist/development/src/model/service/apiKey/ApiKeyService.cjs.map +1 -1
  337. package/dist/development/src/model/service/apiKey/ApiKeyService.js.map +1 -1
  338. package/dist/development/src/model/service/apiKey/UnpersistedApiKeyManager.cjs +10 -1
  339. package/dist/development/src/model/service/apiKey/UnpersistedApiKeyManager.cjs.map +1 -1
  340. package/dist/development/src/model/service/apiKey/UnpersistedApiKeyManager.js +11 -2
  341. package/dist/development/src/model/service/apiKey/UnpersistedApiKeyManager.js.map +1 -1
  342. package/dist/development/src/model/service/idp/ClaimMapping.cjs +187 -0
  343. package/dist/development/src/model/service/idp/ClaimMapping.cjs.map +1 -0
  344. package/dist/development/src/model/service/idp/ClaimMapping.js +170 -0
  345. package/dist/development/src/model/service/idp/ClaimMapping.js.map +1 -0
  346. package/dist/development/src/model/service/idp/ClaimMappingEvaluator.cjs +155 -0
  347. package/dist/development/src/model/service/idp/ClaimMappingEvaluator.cjs.map +1 -0
  348. package/dist/development/src/model/service/idp/ClaimMappingEvaluator.js +155 -0
  349. package/dist/development/src/model/service/idp/ClaimMappingEvaluator.js.map +1 -0
  350. package/dist/development/src/model/service/idp/ClaimMappingValidation.cjs +83 -0
  351. package/dist/development/src/model/service/idp/ClaimMappingValidation.cjs.map +1 -0
  352. package/dist/development/src/model/service/idp/ClaimMappingValidation.js +83 -0
  353. package/dist/development/src/model/service/idp/ClaimMappingValidation.js.map +1 -0
  354. package/dist/development/src/model/service/idp/IDPClaimSyncService.cjs +261 -0
  355. package/dist/development/src/model/service/idp/IDPClaimSyncService.cjs.map +1 -0
  356. package/dist/development/src/model/service/idp/IDPClaimSyncService.js +261 -0
  357. package/dist/development/src/model/service/idp/IDPClaimSyncService.js.map +1 -0
  358. package/dist/development/src/model/service/idp/IDPManager.cjs +98 -21
  359. package/dist/development/src/model/service/idp/IDPManager.cjs.map +1 -1
  360. package/dist/development/src/model/service/idp/IDPManager.js +98 -21
  361. package/dist/development/src/model/service/idp/IDPManager.js.map +1 -1
  362. package/dist/development/src/model/service/idp/IdpSessionRevalidator.cjs +93 -28
  363. package/dist/development/src/model/service/idp/IdpSessionRevalidator.cjs.map +1 -1
  364. package/dist/development/src/model/service/idp/IdpSessionRevalidator.js +93 -28
  365. package/dist/development/src/model/service/idp/IdpSessionRevalidator.js.map +1 -1
  366. package/dist/development/src/model/service/idp/PersonIdentityProviderManager.cjs +8 -1
  367. package/dist/development/src/model/service/idp/PersonIdentityProviderManager.cjs.map +1 -1
  368. package/dist/development/src/model/service/idp/PersonIdentityProviderManager.js +8 -1
  369. package/dist/development/src/model/service/idp/PersonIdentityProviderManager.js.map +1 -1
  370. package/dist/development/src/model/service/idp/providers/OIDCHelpers.cjs +69 -33
  371. package/dist/development/src/model/service/idp/providers/OIDCHelpers.cjs.map +1 -1
  372. package/dist/development/src/model/service/idp/providers/OIDCHelpers.js +69 -33
  373. package/dist/development/src/model/service/idp/providers/OIDCHelpers.js.map +1 -1
  374. package/dist/development/src/model/service/idp/providers/OIDCProvider.cjs +4 -1
  375. package/dist/development/src/model/service/idp/providers/OIDCProvider.cjs.map +1 -1
  376. package/dist/development/src/model/service/idp/providers/OIDCProvider.js +4 -1
  377. package/dist/development/src/model/service/idp/providers/OIDCProvider.js.map +1 -1
  378. package/dist/development/src/model/utils/DatabaseContext.cjs +10 -3
  379. package/dist/development/src/model/utils/DatabaseContext.cjs.map +1 -1
  380. package/dist/development/src/model/utils/DatabaseContext.js +11 -4
  381. package/dist/development/src/model/utils/DatabaseContext.js.map +1 -1
  382. package/dist/development/src/model/utils/token.cjs +2 -2
  383. package/dist/development/src/model/utils/token.cjs.map +1 -1
  384. package/dist/development/src/model/utils/token.js +2 -2
  385. package/dist/development/src/model/utils/token.js.map +1 -1
  386. package/dist/development/src/resolvers/ResolverFactory.cjs +12 -3
  387. package/dist/development/src/resolvers/ResolverFactory.cjs.map +1 -1
  388. package/dist/development/src/resolvers/ResolverFactory.js +12 -3
  389. package/dist/development/src/resolvers/ResolverFactory.js.map +1 -1
  390. package/dist/development/src/resolvers/TenantResolverContextFactory.cjs +4 -4
  391. package/dist/development/src/resolvers/TenantResolverContextFactory.cjs.map +1 -1
  392. package/dist/development/src/resolvers/TenantResolverContextFactory.js +4 -4
  393. package/dist/development/src/resolvers/TenantResolverContextFactory.js.map +1 -1
  394. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs +19 -9
  395. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs.map +1 -1
  396. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js +20 -10
  397. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js.map +1 -1
  398. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs +7 -5
  399. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs.map +1 -1
  400. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js +7 -5
  401. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js.map +1 -1
  402. package/dist/development/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.cjs +7 -5
  403. package/dist/development/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.cjs.map +1 -1
  404. package/dist/development/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.js +7 -5
  405. package/dist/development/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.js.map +1 -1
  406. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs +7 -5
  407. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs.map +1 -1
  408. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js +7 -5
  409. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js.map +1 -1
  410. package/dist/development/src/resolvers/mutation/customRole/CustomRoleMutationResolver.cjs +124 -0
  411. package/dist/development/src/resolvers/mutation/customRole/CustomRoleMutationResolver.cjs.map +1 -0
  412. package/dist/development/src/resolvers/mutation/customRole/CustomRoleMutationResolver.js +124 -0
  413. package/dist/development/src/resolvers/mutation/customRole/CustomRoleMutationResolver.js.map +1 -0
  414. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs +35 -11
  415. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs.map +1 -1
  416. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js +35 -11
  417. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js.map +1 -1
  418. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs +10 -7
  419. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs.map +1 -1
  420. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.js +10 -7
  421. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.js.map +1 -1
  422. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs +7 -5
  423. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs.map +1 -1
  424. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.js +7 -5
  425. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.js.map +1 -1
  426. package/dist/development/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.cjs +8 -6
  427. package/dist/development/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.cjs.map +1 -1
  428. package/dist/development/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.js +8 -6
  429. package/dist/development/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.js.map +1 -1
  430. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs +7 -5
  431. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs.map +1 -1
  432. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.js +7 -5
  433. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.js.map +1 -1
  434. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs +10 -7
  435. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs.map +1 -1
  436. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js +10 -7
  437. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js.map +1 -1
  438. package/dist/development/src/resolvers/mutation/idp/audit.cjs +1 -0
  439. package/dist/development/src/resolvers/mutation/idp/audit.cjs.map +1 -1
  440. package/dist/development/src/resolvers/mutation/idp/audit.js +1 -0
  441. package/dist/development/src/resolvers/mutation/idp/audit.js.map +1 -1
  442. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs +38 -18
  443. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs.map +1 -1
  444. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js +38 -18
  445. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js.map +1 -1
  446. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs +10 -8
  447. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs.map +1 -1
  448. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.js +10 -8
  449. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.js.map +1 -1
  450. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs +17 -11
  451. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs.map +1 -1
  452. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.js +17 -11
  453. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.js.map +1 -1
  454. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs +10 -8
  455. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs.map +1 -1
  456. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.js +10 -8
  457. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.js.map +1 -1
  458. package/dist/development/src/resolvers/mutation/person/EmailOtpMutationResolver.cjs +10 -8
  459. package/dist/development/src/resolvers/mutation/person/EmailOtpMutationResolver.cjs.map +1 -1
  460. package/dist/development/src/resolvers/mutation/person/EmailOtpMutationResolver.js +10 -8
  461. package/dist/development/src/resolvers/mutation/person/EmailOtpMutationResolver.js.map +1 -1
  462. package/dist/development/src/resolvers/mutation/person/EmailVerificationMutationResolver.cjs +10 -8
  463. package/dist/development/src/resolvers/mutation/person/EmailVerificationMutationResolver.cjs.map +1 -1
  464. package/dist/development/src/resolvers/mutation/person/EmailVerificationMutationResolver.js +10 -8
  465. package/dist/development/src/resolvers/mutation/person/EmailVerificationMutationResolver.js.map +1 -1
  466. package/dist/development/src/resolvers/mutation/person/EnablePersonMutationResolver.cjs +61 -0
  467. package/dist/development/src/resolvers/mutation/person/EnablePersonMutationResolver.cjs.map +1 -0
  468. package/dist/development/src/resolvers/mutation/person/EnablePersonMutationResolver.js +61 -0
  469. package/dist/development/src/resolvers/mutation/person/EnablePersonMutationResolver.js.map +1 -0
  470. package/dist/development/src/resolvers/mutation/person/ForceSignOutMutationResolver.cjs +8 -6
  471. package/dist/development/src/resolvers/mutation/person/ForceSignOutMutationResolver.cjs.map +1 -1
  472. package/dist/development/src/resolvers/mutation/person/ForceSignOutMutationResolver.js +8 -6
  473. package/dist/development/src/resolvers/mutation/person/ForceSignOutMutationResolver.js.map +1 -1
  474. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.cjs +32 -5
  475. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.cjs.map +1 -1
  476. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.js +32 -5
  477. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.js.map +1 -1
  478. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.cjs +7 -5
  479. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.cjs.map +1 -1
  480. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.js +7 -5
  481. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.js.map +1 -1
  482. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.cjs +9 -7
  483. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.cjs.map +1 -1
  484. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.js +9 -7
  485. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.js.map +1 -1
  486. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs +12 -6
  487. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs.map +1 -1
  488. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.js +12 -6
  489. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.js.map +1 -1
  490. package/dist/development/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.cjs +9 -7
  491. package/dist/development/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.cjs.map +1 -1
  492. package/dist/development/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.js +9 -7
  493. package/dist/development/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.js.map +1 -1
  494. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs +10 -8
  495. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs.map +1 -1
  496. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.js +10 -8
  497. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.js.map +1 -1
  498. package/dist/development/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.cjs +8 -6
  499. package/dist/development/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.cjs.map +1 -1
  500. package/dist/development/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.js +8 -6
  501. package/dist/development/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.js.map +1 -1
  502. package/dist/development/src/resolvers/mutation/person/RevokeSessionMutationResolver.cjs +8 -6
  503. package/dist/development/src/resolvers/mutation/person/RevokeSessionMutationResolver.cjs.map +1 -1
  504. package/dist/development/src/resolvers/mutation/person/RevokeSessionMutationResolver.js +8 -6
  505. package/dist/development/src/resolvers/mutation/person/RevokeSessionMutationResolver.js.map +1 -1
  506. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.cjs +22 -14
  507. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.cjs.map +1 -1
  508. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.js +22 -14
  509. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.js.map +1 -1
  510. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.cjs +7 -5
  511. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.cjs.map +1 -1
  512. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.js +7 -5
  513. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.js.map +1 -1
  514. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.cjs +10 -8
  515. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.cjs.map +1 -1
  516. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.js +10 -8
  517. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.js.map +1 -1
  518. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs +9 -7
  519. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs.map +1 -1
  520. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js +9 -7
  521. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js.map +1 -1
  522. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs +7 -5
  523. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs.map +1 -1
  524. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.js +7 -5
  525. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.js.map +1 -1
  526. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs +7 -5
  527. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs.map +1 -1
  528. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js +7 -5
  529. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js.map +1 -1
  530. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs +7 -5
  531. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs.map +1 -1
  532. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.js +7 -5
  533. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.js.map +1 -1
  534. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs +7 -5
  535. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs.map +1 -1
  536. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js +7 -5
  537. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js.map +1 -1
  538. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs +8 -6
  539. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs.map +1 -1
  540. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js +8 -6
  541. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js.map +1 -1
  542. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs +8 -6
  543. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs.map +1 -1
  544. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js +8 -6
  545. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js.map +1 -1
  546. package/dist/development/src/resolvers/mutation/projectMember/audit.cjs +2 -1
  547. package/dist/development/src/resolvers/mutation/projectMember/audit.cjs.map +1 -1
  548. package/dist/development/src/resolvers/mutation/projectMember/audit.js +2 -1
  549. package/dist/development/src/resolvers/mutation/projectMember/audit.js.map +1 -1
  550. package/dist/development/src/resolvers/query/ApiKeyQueryResolver.cjs +8 -6
  551. package/dist/development/src/resolvers/query/ApiKeyQueryResolver.cjs.map +1 -1
  552. package/dist/development/src/resolvers/query/ApiKeyQueryResolver.js +8 -6
  553. package/dist/development/src/resolvers/query/ApiKeyQueryResolver.js.map +1 -1
  554. package/dist/development/src/resolvers/query/AuthLogQueryResolver.cjs +7 -5
  555. package/dist/development/src/resolvers/query/AuthLogQueryResolver.cjs.map +1 -1
  556. package/dist/development/src/resolvers/query/AuthLogQueryResolver.js +7 -5
  557. package/dist/development/src/resolvers/query/AuthLogQueryResolver.js.map +1 -1
  558. package/dist/development/src/resolvers/query/AuthPolicyQueryResolver.cjs +8 -6
  559. package/dist/development/src/resolvers/query/AuthPolicyQueryResolver.cjs.map +1 -1
  560. package/dist/development/src/resolvers/query/AuthPolicyQueryResolver.js +8 -6
  561. package/dist/development/src/resolvers/query/AuthPolicyQueryResolver.js.map +1 -1
  562. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.cjs +8 -6
  563. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.cjs.map +1 -1
  564. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.js +8 -6
  565. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.js.map +1 -1
  566. package/dist/development/src/resolvers/query/CustomRoleQueryResolver.cjs +55 -0
  567. package/dist/development/src/resolvers/query/CustomRoleQueryResolver.cjs.map +1 -0
  568. package/dist/development/src/resolvers/query/CustomRoleQueryResolver.js +55 -0
  569. package/dist/development/src/resolvers/query/CustomRoleQueryResolver.js.map +1 -0
  570. package/dist/development/src/resolvers/query/IDPQueryResolver.cjs +7 -5
  571. package/dist/development/src/resolvers/query/IDPQueryResolver.cjs.map +1 -1
  572. package/dist/development/src/resolvers/query/IDPQueryResolver.js +7 -5
  573. package/dist/development/src/resolvers/query/IDPQueryResolver.js.map +1 -1
  574. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.cjs +21 -14
  575. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.cjs.map +1 -1
  576. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.js +21 -14
  577. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.js.map +1 -1
  578. package/dist/development/src/resolvers/query/PersonQueryResolver.cjs +7 -5
  579. package/dist/development/src/resolvers/query/PersonQueryResolver.cjs.map +1 -1
  580. package/dist/development/src/resolvers/query/PersonQueryResolver.js +7 -5
  581. package/dist/development/src/resolvers/query/PersonQueryResolver.js.map +1 -1
  582. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.cjs +7 -5
  583. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.cjs.map +1 -1
  584. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.js +7 -5
  585. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.js.map +1 -1
  586. package/dist/development/src/resolvers/query/ProjectQueryResolver.cjs +10 -7
  587. package/dist/development/src/resolvers/query/ProjectQueryResolver.cjs.map +1 -1
  588. package/dist/development/src/resolvers/query/ProjectQueryResolver.js +10 -7
  589. package/dist/development/src/resolvers/query/ProjectQueryResolver.js.map +1 -1
  590. package/dist/development/src/resolvers/responseHelpers/ApiKeyResponseFactory.cjs +7 -5
  591. package/dist/development/src/resolvers/responseHelpers/ApiKeyResponseFactory.cjs.map +1 -1
  592. package/dist/development/src/resolvers/responseHelpers/ApiKeyResponseFactory.js +7 -5
  593. package/dist/development/src/resolvers/responseHelpers/ApiKeyResponseFactory.js.map +1 -1
  594. package/dist/development/src/resolvers/responseHelpers/PersonResponseFactory.cjs +5 -0
  595. package/dist/development/src/resolvers/responseHelpers/PersonResponseFactory.cjs.map +1 -1
  596. package/dist/development/src/resolvers/responseHelpers/PersonResponseFactory.js +5 -0
  597. package/dist/development/src/resolvers/responseHelpers/PersonResponseFactory.js.map +1 -1
  598. package/dist/development/src/resolvers/responseHelpers/ProjectResponseFactory.cjs +23 -0
  599. package/dist/development/src/resolvers/responseHelpers/ProjectResponseFactory.cjs.map +1 -0
  600. package/dist/development/src/resolvers/responseHelpers/ProjectResponseFactory.js +23 -0
  601. package/dist/development/src/resolvers/responseHelpers/ProjectResponseFactory.js.map +1 -0
  602. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.cjs +8 -6
  603. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.cjs.map +1 -1
  604. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.js +8 -6
  605. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.js.map +1 -1
  606. package/dist/development/src/resolvers/types/IdentityTypeResolver.cjs +50 -18
  607. package/dist/development/src/resolvers/types/IdentityTypeResolver.cjs.map +1 -1
  608. package/dist/development/src/resolvers/types/IdentityTypeResolver.js +50 -18
  609. package/dist/development/src/resolvers/types/IdentityTypeResolver.js.map +1 -1
  610. package/dist/development/src/resolvers/types/PersonTypeResolver.cjs +38 -8
  611. package/dist/development/src/resolvers/types/PersonTypeResolver.cjs.map +1 -1
  612. package/dist/development/src/resolvers/types/PersonTypeResolver.js +38 -8
  613. package/dist/development/src/resolvers/types/PersonTypeResolver.js.map +1 -1
  614. package/dist/development/src/resolvers/types/ProjectTypeResolver.cjs +31 -6
  615. package/dist/development/src/resolvers/types/ProjectTypeResolver.cjs.map +1 -1
  616. package/dist/development/src/resolvers/types/ProjectTypeResolver.js +31 -6
  617. package/dist/development/src/resolvers/types/ProjectTypeResolver.js.map +1 -1
  618. package/dist/development/src/schema/tenant.graphql.cjs +275 -15
  619. package/dist/development/src/schema/tenant.graphql.cjs.map +1 -1
  620. package/dist/development/src/schema/tenant.graphql.js +275 -15
  621. package/dist/development/src/schema/tenant.graphql.js.map +1 -1
  622. package/dist/production/index.cjs +69 -0
  623. package/dist/production/index.cjs.map +1 -1
  624. package/dist/production/index.js +71 -2
  625. package/dist/production/index.js.map +1 -1
  626. package/dist/production/src/TenantContainer.cjs +39 -10
  627. package/dist/production/src/TenantContainer.cjs.map +1 -1
  628. package/dist/production/src/TenantContainer.js +39 -10
  629. package/dist/production/src/TenantContainer.js.map +1 -1
  630. package/dist/production/src/bridges/system/IdentityFetcher.cjs +9 -7
  631. package/dist/production/src/bridges/system/IdentityFetcher.cjs.map +1 -1
  632. package/dist/production/src/bridges/system/IdentityFetcher.js +9 -7
  633. package/dist/production/src/bridges/system/IdentityFetcher.js.map +1 -1
  634. package/dist/production/src/migrations/2026-06-18-120000-idp-claim-mapping.cjs +10 -0
  635. package/dist/production/src/migrations/2026-06-18-120000-idp-claim-mapping.cjs.map +1 -0
  636. package/dist/production/src/migrations/2026-06-18-120000-idp-claim-mapping.js +11 -0
  637. package/dist/production/src/migrations/2026-06-18-120000-idp-claim-mapping.js.map +1 -0
  638. package/dist/production/src/migrations/2026-08-03-120000-person-enable-auth-log.cjs +9 -0
  639. package/dist/production/src/migrations/2026-08-03-120000-person-enable-auth-log.cjs.map +1 -0
  640. package/dist/production/src/migrations/2026-08-03-120000-person-enable-auth-log.js +10 -0
  641. package/dist/production/src/migrations/2026-08-03-120000-person-enable-auth-log.js.map +1 -0
  642. package/dist/production/src/migrations/2026-08-04-120000-config-panel.cjs +11 -0
  643. package/dist/production/src/migrations/2026-08-04-120000-config-panel.cjs.map +1 -0
  644. package/dist/production/src/migrations/2026-08-04-120000-config-panel.js +12 -0
  645. package/dist/production/src/migrations/2026-08-04-120000-config-panel.js.map +1 -0
  646. package/dist/production/src/migrations/2026-09-04-120000-idp-disable-local-authentication.cjs +18 -0
  647. package/dist/production/src/migrations/2026-09-04-120000-idp-disable-local-authentication.cjs.map +1 -0
  648. package/dist/production/src/migrations/2026-09-04-120000-idp-disable-local-authentication.js +19 -0
  649. package/dist/production/src/migrations/2026-09-04-120000-idp-disable-local-authentication.js.map +1 -0
  650. package/dist/production/src/migrations/2026-09-11-120000-custom-role.cjs +18 -0
  651. package/dist/production/src/migrations/2026-09-11-120000-custom-role.cjs.map +1 -0
  652. package/dist/production/src/migrations/2026-09-11-120000-custom-role.js +19 -0
  653. package/dist/production/src/migrations/2026-09-11-120000-custom-role.js.map +1 -0
  654. package/dist/production/src/migrations/runner.cjs +17 -5
  655. package/dist/production/src/migrations/runner.cjs.map +1 -1
  656. package/dist/production/src/migrations/runner.js +17 -5
  657. package/dist/production/src/migrations/runner.js.map +1 -1
  658. package/dist/production/src/migrations/snapshot.cjs +22 -2
  659. package/dist/production/src/migrations/snapshot.cjs.map +1 -1
  660. package/dist/production/src/migrations/snapshot.js +22 -2
  661. package/dist/production/src/migrations/snapshot.js.map +1 -1
  662. package/dist/production/src/model/authorization/CustomRoleAuthorizator.cjs +65 -0
  663. package/dist/production/src/model/authorization/CustomRoleAuthorizator.cjs.map +1 -0
  664. package/dist/production/src/model/authorization/CustomRoleAuthorizator.js +65 -0
  665. package/dist/production/src/model/authorization/CustomRoleAuthorizator.js.map +1 -0
  666. package/dist/production/src/model/authorization/CustomRolePermissions.cjs +404 -0
  667. package/dist/production/src/model/authorization/CustomRolePermissions.cjs.map +1 -0
  668. package/dist/production/src/model/authorization/CustomRolePermissions.js +387 -0
  669. package/dist/production/src/model/authorization/CustomRolePermissions.js.map +1 -0
  670. package/dist/production/src/model/authorization/PermissionActions.cjs +19 -16
  671. package/dist/production/src/model/authorization/PermissionActions.cjs.map +1 -1
  672. package/dist/production/src/model/authorization/PermissionActions.js +19 -16
  673. package/dist/production/src/model/authorization/PermissionActions.js.map +1 -1
  674. package/dist/production/src/model/authorization/PermissionContextFactory.cjs +20 -2
  675. package/dist/production/src/model/authorization/PermissionContextFactory.cjs.map +1 -1
  676. package/dist/production/src/model/authorization/PermissionContextFactory.js +20 -2
  677. package/dist/production/src/model/authorization/PermissionContextFactory.js.map +1 -1
  678. package/dist/production/src/model/authorization/PermissionsFactory.cjs +32 -24
  679. package/dist/production/src/model/authorization/PermissionsFactory.cjs.map +1 -1
  680. package/dist/production/src/model/authorization/PermissionsFactory.js +33 -25
  681. package/dist/production/src/model/authorization/PermissionsFactory.js.map +1 -1
  682. package/dist/production/src/model/authorization/Roles.cjs +8 -0
  683. package/dist/production/src/model/authorization/Roles.cjs.map +1 -1
  684. package/dist/production/src/model/authorization/Roles.js +8 -0
  685. package/dist/production/src/model/authorization/Roles.js.map +1 -1
  686. package/dist/production/src/model/authorization/TargetIdentityPermission.cjs +35 -0
  687. package/dist/production/src/model/authorization/TargetIdentityPermission.cjs.map +1 -0
  688. package/dist/production/src/model/authorization/TargetIdentityPermission.js +35 -0
  689. package/dist/production/src/model/authorization/TargetIdentityPermission.js.map +1 -0
  690. package/dist/production/src/model/commands/apiKey/ApiKeyHelper.cjs +19 -0
  691. package/dist/production/src/model/commands/apiKey/ApiKeyHelper.cjs.map +1 -1
  692. package/dist/production/src/model/commands/apiKey/ApiKeyHelper.js +19 -0
  693. package/dist/production/src/model/commands/apiKey/ApiKeyHelper.js.map +1 -1
  694. package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.cjs +4 -2
  695. package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.cjs.map +1 -1
  696. package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.js +5 -3
  697. package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.js.map +1 -1
  698. package/dist/production/src/model/commands/apiKey/ProlongApiKeyCommand.cjs +9 -10
  699. package/dist/production/src/model/commands/apiKey/ProlongApiKeyCommand.cjs.map +1 -1
  700. package/dist/production/src/model/commands/apiKey/ProlongApiKeyCommand.js +10 -11
  701. package/dist/production/src/model/commands/apiKey/ProlongApiKeyCommand.js.map +1 -1
  702. package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.cjs.map +1 -1
  703. package/dist/production/src/model/commands/authLog/CreateAuthLogEntryCommand.js.map +1 -1
  704. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.cjs +5 -3
  705. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.cjs.map +1 -1
  706. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.js +5 -3
  707. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.js.map +1 -1
  708. package/dist/production/src/model/commands/customRole/CreateCustomRoleCommand.cjs +23 -0
  709. package/dist/production/src/model/commands/customRole/CreateCustomRoleCommand.cjs.map +1 -0
  710. package/dist/production/src/model/commands/customRole/CreateCustomRoleCommand.js +23 -0
  711. package/dist/production/src/model/commands/customRole/CreateCustomRoleCommand.js.map +1 -0
  712. package/dist/production/src/model/commands/customRole/DeleteCustomRoleCommand.cjs +14 -0
  713. package/dist/production/src/model/commands/customRole/DeleteCustomRoleCommand.cjs.map +1 -0
  714. package/dist/production/src/model/commands/customRole/DeleteCustomRoleCommand.js +14 -0
  715. package/dist/production/src/model/commands/customRole/DeleteCustomRoleCommand.js.map +1 -0
  716. package/dist/production/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.cjs +16 -0
  717. package/dist/production/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.cjs.map +1 -0
  718. package/dist/production/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.js +16 -0
  719. package/dist/production/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.js.map +1 -0
  720. package/dist/production/src/model/commands/customRole/UpdateCustomRoleCommand.cjs +19 -0
  721. package/dist/production/src/model/commands/customRole/UpdateCustomRoleCommand.cjs.map +1 -0
  722. package/dist/production/src/model/commands/customRole/UpdateCustomRoleCommand.js +19 -0
  723. package/dist/production/src/model/commands/customRole/UpdateCustomRoleCommand.js.map +1 -0
  724. package/dist/production/src/model/commands/identity/PatchIdentityGlobalRoles.cjs +1 -1
  725. package/dist/production/src/model/commands/identity/PatchIdentityGlobalRoles.cjs.map +1 -1
  726. package/dist/production/src/model/commands/identity/PatchIdentityGlobalRoles.js +1 -1
  727. package/dist/production/src/model/commands/identity/PatchIdentityGlobalRoles.js.map +1 -1
  728. package/dist/production/src/model/commands/idp/ClaimIdpRevalidationCommand.cjs +3 -7
  729. package/dist/production/src/model/commands/idp/ClaimIdpRevalidationCommand.cjs.map +1 -1
  730. package/dist/production/src/model/commands/idp/ClaimIdpRevalidationCommand.js +3 -7
  731. package/dist/production/src/model/commands/idp/ClaimIdpRevalidationCommand.js.map +1 -1
  732. package/dist/production/src/model/commands/idp/CreateIdpCommand.cjs +8 -2
  733. package/dist/production/src/model/commands/idp/CreateIdpCommand.cjs.map +1 -1
  734. package/dist/production/src/model/commands/idp/CreateIdpCommand.js +8 -2
  735. package/dist/production/src/model/commands/idp/CreateIdpCommand.js.map +1 -1
  736. package/dist/production/src/model/commands/idp/CreateIdpSessionCommand.cjs +4 -1
  737. package/dist/production/src/model/commands/idp/CreateIdpSessionCommand.cjs.map +1 -1
  738. package/dist/production/src/model/commands/idp/CreateIdpSessionCommand.js +5 -2
  739. package/dist/production/src/model/commands/idp/CreateIdpSessionCommand.js.map +1 -1
  740. package/dist/production/src/model/commands/idp/UpdateIdpCommand.cjs +6 -2
  741. package/dist/production/src/model/commands/idp/UpdateIdpCommand.cjs.map +1 -1
  742. package/dist/production/src/model/commands/idp/UpdateIdpCommand.js +6 -2
  743. package/dist/production/src/model/commands/idp/UpdateIdpCommand.js.map +1 -1
  744. package/dist/production/src/model/commands/idp/UpdateIdpSessionCommand.cjs +2 -1
  745. package/dist/production/src/model/commands/idp/UpdateIdpSessionCommand.cjs.map +1 -1
  746. package/dist/production/src/model/commands/idp/UpdateIdpSessionCommand.js +3 -2
  747. package/dist/production/src/model/commands/idp/UpdateIdpSessionCommand.js.map +1 -1
  748. package/dist/production/src/model/commands/membership/{RemoveProjectMembershipsCommand.cjs → RemoveProjectMembershipCommand.cjs} +1 -1
  749. package/dist/production/src/model/commands/membership/RemoveProjectMembershipCommand.cjs.map +1 -0
  750. package/dist/production/src/model/commands/membership/{RemoveProjectMembershipsCommand.js → RemoveProjectMembershipCommand.js} +1 -1
  751. package/dist/production/src/model/commands/membership/RemoveProjectMembershipCommand.js.map +1 -0
  752. package/dist/production/src/model/commands/membership/UpdateProjectMemberCommand.cjs +2 -2
  753. package/dist/production/src/model/commands/membership/UpdateProjectMemberCommand.cjs.map +1 -1
  754. package/dist/production/src/model/commands/membership/UpdateProjectMemberCommand.js +1 -1
  755. package/dist/production/src/model/commands/membership/UpdateProjectMemberCommand.js.map +1 -1
  756. package/dist/production/src/model/commands/person/CreatePersonCommand.cjs +1 -0
  757. package/dist/production/src/model/commands/person/CreatePersonCommand.cjs.map +1 -1
  758. package/dist/production/src/model/commands/person/CreatePersonCommand.js +1 -0
  759. package/dist/production/src/model/commands/person/CreatePersonCommand.js.map +1 -1
  760. package/dist/production/src/model/commands/person/EnablePersonCommand.cjs +17 -0
  761. package/dist/production/src/model/commands/person/EnablePersonCommand.cjs.map +1 -0
  762. package/dist/production/src/model/commands/person/EnablePersonCommand.js +17 -0
  763. package/dist/production/src/model/commands/person/EnablePersonCommand.js.map +1 -0
  764. package/dist/production/src/model/commands/person/SetMfaGraceUntilCommand.cjs +3 -3
  765. package/dist/production/src/model/commands/person/SetMfaGraceUntilCommand.cjs.map +1 -1
  766. package/dist/production/src/model/commands/person/SetMfaGraceUntilCommand.js +4 -4
  767. package/dist/production/src/model/commands/person/SetMfaGraceUntilCommand.js.map +1 -1
  768. package/dist/production/src/model/commands/personToken/ResetPasswordCommand.cjs +2 -3
  769. package/dist/production/src/model/commands/personToken/ResetPasswordCommand.cjs.map +1 -1
  770. package/dist/production/src/model/commands/personToken/ResetPasswordCommand.js +2 -3
  771. package/dist/production/src/model/commands/personToken/ResetPasswordCommand.js.map +1 -1
  772. package/dist/production/src/model/commands/personToken/SaveEmailOtpTokenCommand.cjs +3 -3
  773. package/dist/production/src/model/commands/personToken/SaveEmailOtpTokenCommand.cjs.map +1 -1
  774. package/dist/production/src/model/commands/personToken/SaveEmailOtpTokenCommand.js +4 -4
  775. package/dist/production/src/model/commands/personToken/SaveEmailOtpTokenCommand.js.map +1 -1
  776. package/dist/production/src/model/commands/personToken/SavePersonTokenCommand.cjs +12 -6
  777. package/dist/production/src/model/commands/personToken/SavePersonTokenCommand.cjs.map +1 -1
  778. package/dist/production/src/model/commands/personToken/SavePersonTokenCommand.js +13 -7
  779. package/dist/production/src/model/commands/personToken/SavePersonTokenCommand.js.map +1 -1
  780. package/dist/production/src/model/commands/rateLimit/RecordRateLimitEventCommand.cjs +1 -2
  781. package/dist/production/src/model/commands/rateLimit/RecordRateLimitEventCommand.cjs.map +1 -1
  782. package/dist/production/src/model/commands/rateLimit/RecordRateLimitEventCommand.js +1 -2
  783. package/dist/production/src/model/commands/rateLimit/RecordRateLimitEventCommand.js.map +1 -1
  784. package/dist/production/src/model/mailing/UserMailer.cjs +2 -1
  785. package/dist/production/src/model/mailing/UserMailer.cjs.map +1 -1
  786. package/dist/production/src/model/mailing/UserMailer.js +2 -1
  787. package/dist/production/src/model/mailing/UserMailer.js.map +1 -1
  788. package/dist/production/src/model/queries/apiKey/ApiKeyQuery.cjs +8 -1
  789. package/dist/production/src/model/queries/apiKey/ApiKeyQuery.cjs.map +1 -1
  790. package/dist/production/src/model/queries/apiKey/ApiKeyQuery.js +9 -2
  791. package/dist/production/src/model/queries/apiKey/ApiKeyQuery.js.map +1 -1
  792. package/dist/production/src/model/queries/apiKey/ApiKeySessionsQuery.cjs +2 -3
  793. package/dist/production/src/model/queries/apiKey/ApiKeySessionsQuery.cjs.map +1 -1
  794. package/dist/production/src/model/queries/apiKey/ApiKeySessionsQuery.js +2 -3
  795. package/dist/production/src/model/queries/apiKey/ApiKeySessionsQuery.js.map +1 -1
  796. package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.cjs +12 -10
  797. package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.cjs.map +1 -1
  798. package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.js +12 -10
  799. package/dist/production/src/model/queries/authLog/NextLoginAttemptQuery.js.map +1 -1
  800. package/dist/production/src/model/queries/authLog/NextMailAttemptQuery.cjs +10 -8
  801. package/dist/production/src/model/queries/authLog/NextMailAttemptQuery.cjs.map +1 -1
  802. package/dist/production/src/model/queries/authLog/NextMailAttemptQuery.js +10 -8
  803. package/dist/production/src/model/queries/authLog/NextMailAttemptQuery.js.map +1 -1
  804. package/dist/production/src/model/queries/configuration/ConfigurationQuery.cjs +4 -0
  805. package/dist/production/src/model/queries/configuration/ConfigurationQuery.cjs.map +1 -1
  806. package/dist/production/src/model/queries/configuration/ConfigurationQuery.js +4 -0
  807. package/dist/production/src/model/queries/configuration/ConfigurationQuery.js.map +1 -1
  808. package/dist/production/src/model/queries/customRole/CustomRolesQuery.cjs +23 -0
  809. package/dist/production/src/model/queries/customRole/CustomRolesQuery.cjs.map +1 -0
  810. package/dist/production/src/model/queries/customRole/CustomRolesQuery.js +23 -0
  811. package/dist/production/src/model/queries/customRole/CustomRolesQuery.js.map +1 -0
  812. package/dist/production/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.cjs +15 -0
  813. package/dist/production/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.cjs.map +1 -0
  814. package/dist/production/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.js +15 -0
  815. package/dist/production/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.js.map +1 -0
  816. package/dist/production/src/model/queries/identity/IdentityQuery.cjs +7 -2
  817. package/dist/production/src/model/queries/identity/IdentityQuery.cjs.map +1 -1
  818. package/dist/production/src/model/queries/identity/IdentityQuery.js +7 -2
  819. package/dist/production/src/model/queries/identity/IdentityQuery.js.map +1 -1
  820. package/dist/production/src/model/queries/idp/LocalAuthDisablingIdpsQuery.cjs +21 -0
  821. package/dist/production/src/model/queries/idp/LocalAuthDisablingIdpsQuery.cjs.map +1 -0
  822. package/dist/production/src/model/queries/idp/LocalAuthDisablingIdpsQuery.js +21 -0
  823. package/dist/production/src/model/queries/idp/LocalAuthDisablingIdpsQuery.js.map +1 -0
  824. package/dist/production/src/model/queries/idp/PersonIdentityProvidersQuery.cjs +1 -1
  825. package/dist/production/src/model/queries/idp/PersonIdentityProvidersQuery.cjs.map +1 -1
  826. package/dist/production/src/model/queries/idp/PersonIdentityProvidersQuery.js +1 -1
  827. package/dist/production/src/model/queries/idp/PersonIdentityProvidersQuery.js.map +1 -1
  828. package/dist/production/src/model/queries/idp/helpers.cjs +3 -3
  829. package/dist/production/src/model/queries/idp/helpers.cjs.map +1 -1
  830. package/dist/production/src/model/queries/idp/helpers.js +3 -3
  831. package/dist/production/src/model/queries/idp/helpers.js.map +1 -1
  832. package/dist/production/src/model/queries/membership/IdentityHasProjectMembershipsQuery.cjs +15 -0
  833. package/dist/production/src/model/queries/membership/IdentityHasProjectMembershipsQuery.cjs.map +1 -0
  834. package/dist/production/src/model/queries/membership/IdentityHasProjectMembershipsQuery.js +15 -0
  835. package/dist/production/src/model/queries/membership/IdentityHasProjectMembershipsQuery.js.map +1 -0
  836. package/dist/production/src/model/queries/membership/ProjectMembersQuery.cjs +1 -1
  837. package/dist/production/src/model/queries/membership/ProjectMembersQuery.cjs.map +1 -1
  838. package/dist/production/src/model/queries/membership/ProjectMembersQuery.js +1 -1
  839. package/dist/production/src/model/queries/membership/ProjectMembersQuery.js.map +1 -1
  840. package/dist/production/src/model/queries/person/PersonQueryBuilderFactory.cjs +2 -2
  841. package/dist/production/src/model/queries/person/PersonQueryBuilderFactory.cjs.map +1 -1
  842. package/dist/production/src/model/queries/person/PersonQueryBuilderFactory.js +2 -2
  843. package/dist/production/src/model/queries/person/PersonQueryBuilderFactory.js.map +1 -1
  844. package/dist/production/src/model/queries/personToken/PersonTokenQuery.cjs +1 -1
  845. package/dist/production/src/model/queries/personToken/PersonTokenQuery.cjs.map +1 -1
  846. package/dist/production/src/model/queries/personToken/PersonTokenQuery.js +1 -1
  847. package/dist/production/src/model/queries/personToken/PersonTokenQuery.js.map +1 -1
  848. package/dist/production/src/model/queries/project/ProjectsByIdentityQuery.cjs +4 -1
  849. package/dist/production/src/model/queries/project/ProjectsByIdentityQuery.cjs.map +1 -1
  850. package/dist/production/src/model/queries/project/ProjectsByIdentityQuery.js +4 -1
  851. package/dist/production/src/model/queries/project/ProjectsByIdentityQuery.js.map +1 -1
  852. package/dist/production/src/model/queries/rateLimit/RateLimitCountQuery.cjs +3 -3
  853. package/dist/production/src/model/queries/rateLimit/RateLimitCountQuery.cjs.map +1 -1
  854. package/dist/production/src/model/queries/rateLimit/RateLimitCountQuery.js +3 -3
  855. package/dist/production/src/model/queries/rateLimit/RateLimitCountQuery.js.map +1 -1
  856. package/dist/production/src/model/service/AuthLogService.cjs +8 -2
  857. package/dist/production/src/model/service/AuthLogService.cjs.map +1 -1
  858. package/dist/production/src/model/service/AuthLogService.js +8 -2
  859. package/dist/production/src/model/service/AuthLogService.js.map +1 -1
  860. package/dist/production/src/model/service/AuthPolicyManager.cjs +2 -1
  861. package/dist/production/src/model/service/AuthPolicyManager.cjs.map +1 -1
  862. package/dist/production/src/model/service/AuthPolicyManager.js +2 -1
  863. package/dist/production/src/model/service/AuthPolicyManager.js.map +1 -1
  864. package/dist/production/src/model/service/AuthPolicyResolver.cjs +2 -1
  865. package/dist/production/src/model/service/AuthPolicyResolver.cjs.map +1 -1
  866. package/dist/production/src/model/service/AuthPolicyResolver.js +2 -1
  867. package/dist/production/src/model/service/AuthPolicyResolver.js.map +1 -1
  868. package/dist/production/src/model/service/CustomRoleManager.cjs +170 -0
  869. package/dist/production/src/model/service/CustomRoleManager.cjs.map +1 -0
  870. package/dist/production/src/model/service/CustomRoleManager.js +170 -0
  871. package/dist/production/src/model/service/CustomRoleManager.js.map +1 -0
  872. package/dist/production/src/model/service/EmailChangeManager.cjs +5 -4
  873. package/dist/production/src/model/service/EmailChangeManager.cjs.map +1 -1
  874. package/dist/production/src/model/service/EmailChangeManager.js +5 -4
  875. package/dist/production/src/model/service/EmailChangeManager.js.map +1 -1
  876. package/dist/production/src/model/service/EmailOtpManager.cjs +0 -1
  877. package/dist/production/src/model/service/EmailOtpManager.cjs.map +1 -1
  878. package/dist/production/src/model/service/EmailOtpManager.js +0 -1
  879. package/dist/production/src/model/service/EmailOtpManager.js.map +1 -1
  880. package/dist/production/src/model/service/EmailValidator.cjs +2 -1
  881. package/dist/production/src/model/service/EmailValidator.cjs.map +1 -1
  882. package/dist/production/src/model/service/EmailValidator.js +2 -1
  883. package/dist/production/src/model/service/EmailValidator.js.map +1 -1
  884. package/dist/production/src/model/service/EmailVerificationManager.cjs +5 -4
  885. package/dist/production/src/model/service/EmailVerificationManager.cjs.map +1 -1
  886. package/dist/production/src/model/service/EmailVerificationManager.js +5 -4
  887. package/dist/production/src/model/service/EmailVerificationManager.js.map +1 -1
  888. package/dist/production/src/model/service/GlobalRoleValidator.cjs +35 -0
  889. package/dist/production/src/model/service/GlobalRoleValidator.cjs.map +1 -0
  890. package/dist/production/src/model/service/GlobalRoleValidator.js +35 -0
  891. package/dist/production/src/model/service/GlobalRoleValidator.js.map +1 -0
  892. package/dist/production/src/model/service/IDPSignInManager.cjs +52 -16
  893. package/dist/production/src/model/service/IDPSignInManager.cjs.map +1 -1
  894. package/dist/production/src/model/service/IDPSignInManager.js +52 -16
  895. package/dist/production/src/model/service/IDPSignInManager.js.map +1 -1
  896. package/dist/production/src/model/service/InviteManager.cjs +2 -1
  897. package/dist/production/src/model/service/InviteManager.cjs.map +1 -1
  898. package/dist/production/src/model/service/InviteManager.js +2 -1
  899. package/dist/production/src/model/service/InviteManager.js.map +1 -1
  900. package/dist/production/src/model/service/PanelAccessResolver.cjs +32 -0
  901. package/dist/production/src/model/service/PanelAccessResolver.cjs.map +1 -0
  902. package/dist/production/src/model/service/PanelAccessResolver.js +32 -0
  903. package/dist/production/src/model/service/PanelAccessResolver.js.map +1 -0
  904. package/dist/production/src/model/service/PasswordChangeManager.cjs +2 -1
  905. package/dist/production/src/model/service/PasswordChangeManager.cjs.map +1 -1
  906. package/dist/production/src/model/service/PasswordChangeManager.js +2 -1
  907. package/dist/production/src/model/service/PasswordChangeManager.js.map +1 -1
  908. package/dist/production/src/model/service/PasswordResetManager.cjs +9 -3
  909. package/dist/production/src/model/service/PasswordResetManager.cjs.map +1 -1
  910. package/dist/production/src/model/service/PasswordResetManager.js +9 -3
  911. package/dist/production/src/model/service/PasswordResetManager.js.map +1 -1
  912. package/dist/production/src/model/service/PasswordlessSignInManager.cjs +24 -6
  913. package/dist/production/src/model/service/PasswordlessSignInManager.cjs.map +1 -1
  914. package/dist/production/src/model/service/PasswordlessSignInManager.js +24 -6
  915. package/dist/production/src/model/service/PasswordlessSignInManager.js.map +1 -1
  916. package/dist/production/src/model/service/PersonAccessManager.cjs +10 -2
  917. package/dist/production/src/model/service/PersonAccessManager.cjs.map +1 -1
  918. package/dist/production/src/model/service/PersonAccessManager.js +10 -2
  919. package/dist/production/src/model/service/PersonAccessManager.js.map +1 -1
  920. package/dist/production/src/model/service/PersonManager.cjs +2 -1
  921. package/dist/production/src/model/service/PersonManager.cjs.map +1 -1
  922. package/dist/production/src/model/service/PersonManager.js +2 -1
  923. package/dist/production/src/model/service/PersonManager.js.map +1 -1
  924. package/dist/production/src/model/service/ProjectMemberManager.cjs +2 -1
  925. package/dist/production/src/model/service/ProjectMemberManager.cjs.map +1 -1
  926. package/dist/production/src/model/service/ProjectMemberManager.js +2 -1
  927. package/dist/production/src/model/service/ProjectMemberManager.js.map +1 -1
  928. package/dist/production/src/model/service/RateLimiter.cjs +1 -2
  929. package/dist/production/src/model/service/RateLimiter.cjs.map +1 -1
  930. package/dist/production/src/model/service/RateLimiter.js +1 -2
  931. package/dist/production/src/model/service/RateLimiter.js.map +1 -1
  932. package/dist/production/src/model/service/RolesManager.cjs +17 -18
  933. package/dist/production/src/model/service/RolesManager.cjs.map +1 -1
  934. package/dist/production/src/model/service/RolesManager.js +18 -19
  935. package/dist/production/src/model/service/RolesManager.js.map +1 -1
  936. package/dist/production/src/model/service/SecretsManager.cjs +2 -1
  937. package/dist/production/src/model/service/SecretsManager.cjs.map +1 -1
  938. package/dist/production/src/model/service/SecretsManager.js +2 -1
  939. package/dist/production/src/model/service/SecretsManager.js.map +1 -1
  940. package/dist/production/src/model/service/SignInManager.cjs +9 -5
  941. package/dist/production/src/model/service/SignInManager.cjs.map +1 -1
  942. package/dist/production/src/model/service/SignInManager.js +9 -5
  943. package/dist/production/src/model/service/SignInManager.js.map +1 -1
  944. package/dist/production/src/model/service/SignOutManager.cjs +2 -1
  945. package/dist/production/src/model/service/SignOutManager.cjs.map +1 -1
  946. package/dist/production/src/model/service/SignOutManager.js +2 -1
  947. package/dist/production/src/model/service/SignOutManager.js.map +1 -1
  948. package/dist/production/src/model/service/SignUpManager.cjs +15 -7
  949. package/dist/production/src/model/service/SignUpManager.cjs.map +1 -1
  950. package/dist/production/src/model/service/SignUpManager.js +15 -7
  951. package/dist/production/src/model/service/SignUpManager.js.map +1 -1
  952. package/dist/production/src/model/service/apiKey/ApiKeyManager.cjs +56 -40
  953. package/dist/production/src/model/service/apiKey/ApiKeyManager.cjs.map +1 -1
  954. package/dist/production/src/model/service/apiKey/ApiKeyManager.js +57 -41
  955. package/dist/production/src/model/service/apiKey/ApiKeyManager.js.map +1 -1
  956. package/dist/production/src/model/service/apiKey/ApiKeyService.cjs.map +1 -1
  957. package/dist/production/src/model/service/apiKey/ApiKeyService.js.map +1 -1
  958. package/dist/production/src/model/service/apiKey/UnpersistedApiKeyManager.cjs +10 -1
  959. package/dist/production/src/model/service/apiKey/UnpersistedApiKeyManager.cjs.map +1 -1
  960. package/dist/production/src/model/service/apiKey/UnpersistedApiKeyManager.js +11 -2
  961. package/dist/production/src/model/service/apiKey/UnpersistedApiKeyManager.js.map +1 -1
  962. package/dist/production/src/model/service/idp/ClaimMapping.cjs +187 -0
  963. package/dist/production/src/model/service/idp/ClaimMapping.cjs.map +1 -0
  964. package/dist/production/src/model/service/idp/ClaimMapping.js +170 -0
  965. package/dist/production/src/model/service/idp/ClaimMapping.js.map +1 -0
  966. package/dist/production/src/model/service/idp/ClaimMappingEvaluator.cjs +155 -0
  967. package/dist/production/src/model/service/idp/ClaimMappingEvaluator.cjs.map +1 -0
  968. package/dist/production/src/model/service/idp/ClaimMappingEvaluator.js +155 -0
  969. package/dist/production/src/model/service/idp/ClaimMappingEvaluator.js.map +1 -0
  970. package/dist/production/src/model/service/idp/ClaimMappingValidation.cjs +83 -0
  971. package/dist/production/src/model/service/idp/ClaimMappingValidation.cjs.map +1 -0
  972. package/dist/production/src/model/service/idp/ClaimMappingValidation.js +83 -0
  973. package/dist/production/src/model/service/idp/ClaimMappingValidation.js.map +1 -0
  974. package/dist/production/src/model/service/idp/IDPClaimSyncService.cjs +261 -0
  975. package/dist/production/src/model/service/idp/IDPClaimSyncService.cjs.map +1 -0
  976. package/dist/production/src/model/service/idp/IDPClaimSyncService.js +261 -0
  977. package/dist/production/src/model/service/idp/IDPClaimSyncService.js.map +1 -0
  978. package/dist/production/src/model/service/idp/IDPManager.cjs +98 -21
  979. package/dist/production/src/model/service/idp/IDPManager.cjs.map +1 -1
  980. package/dist/production/src/model/service/idp/IDPManager.js +98 -21
  981. package/dist/production/src/model/service/idp/IDPManager.js.map +1 -1
  982. package/dist/production/src/model/service/idp/IdpSessionRevalidator.cjs +93 -28
  983. package/dist/production/src/model/service/idp/IdpSessionRevalidator.cjs.map +1 -1
  984. package/dist/production/src/model/service/idp/IdpSessionRevalidator.js +93 -28
  985. package/dist/production/src/model/service/idp/IdpSessionRevalidator.js.map +1 -1
  986. package/dist/production/src/model/service/idp/PersonIdentityProviderManager.cjs +8 -1
  987. package/dist/production/src/model/service/idp/PersonIdentityProviderManager.cjs.map +1 -1
  988. package/dist/production/src/model/service/idp/PersonIdentityProviderManager.js +8 -1
  989. package/dist/production/src/model/service/idp/PersonIdentityProviderManager.js.map +1 -1
  990. package/dist/production/src/model/service/idp/providers/OIDCHelpers.cjs +69 -33
  991. package/dist/production/src/model/service/idp/providers/OIDCHelpers.cjs.map +1 -1
  992. package/dist/production/src/model/service/idp/providers/OIDCHelpers.js +69 -33
  993. package/dist/production/src/model/service/idp/providers/OIDCHelpers.js.map +1 -1
  994. package/dist/production/src/model/service/idp/providers/OIDCProvider.cjs +4 -1
  995. package/dist/production/src/model/service/idp/providers/OIDCProvider.cjs.map +1 -1
  996. package/dist/production/src/model/service/idp/providers/OIDCProvider.js +4 -1
  997. package/dist/production/src/model/service/idp/providers/OIDCProvider.js.map +1 -1
  998. package/dist/production/src/model/utils/DatabaseContext.cjs +10 -3
  999. package/dist/production/src/model/utils/DatabaseContext.cjs.map +1 -1
  1000. package/dist/production/src/model/utils/DatabaseContext.js +11 -4
  1001. package/dist/production/src/model/utils/DatabaseContext.js.map +1 -1
  1002. package/dist/production/src/model/utils/token.cjs +2 -2
  1003. package/dist/production/src/model/utils/token.cjs.map +1 -1
  1004. package/dist/production/src/model/utils/token.js +2 -2
  1005. package/dist/production/src/model/utils/token.js.map +1 -1
  1006. package/dist/production/src/resolvers/ResolverFactory.cjs +12 -3
  1007. package/dist/production/src/resolvers/ResolverFactory.cjs.map +1 -1
  1008. package/dist/production/src/resolvers/ResolverFactory.js +12 -3
  1009. package/dist/production/src/resolvers/ResolverFactory.js.map +1 -1
  1010. package/dist/production/src/resolvers/TenantResolverContextFactory.cjs +4 -4
  1011. package/dist/production/src/resolvers/TenantResolverContextFactory.cjs.map +1 -1
  1012. package/dist/production/src/resolvers/TenantResolverContextFactory.js +4 -4
  1013. package/dist/production/src/resolvers/TenantResolverContextFactory.js.map +1 -1
  1014. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs +19 -9
  1015. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs.map +1 -1
  1016. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js +20 -10
  1017. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js.map +1 -1
  1018. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs +7 -5
  1019. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs.map +1 -1
  1020. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js +7 -5
  1021. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js.map +1 -1
  1022. package/dist/production/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.cjs +7 -5
  1023. package/dist/production/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.cjs.map +1 -1
  1024. package/dist/production/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.js +7 -5
  1025. package/dist/production/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.js.map +1 -1
  1026. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs +7 -5
  1027. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs.map +1 -1
  1028. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js +7 -5
  1029. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js.map +1 -1
  1030. package/dist/production/src/resolvers/mutation/customRole/CustomRoleMutationResolver.cjs +124 -0
  1031. package/dist/production/src/resolvers/mutation/customRole/CustomRoleMutationResolver.cjs.map +1 -0
  1032. package/dist/production/src/resolvers/mutation/customRole/CustomRoleMutationResolver.js +124 -0
  1033. package/dist/production/src/resolvers/mutation/customRole/CustomRoleMutationResolver.js.map +1 -0
  1034. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs +35 -11
  1035. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs.map +1 -1
  1036. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js +35 -11
  1037. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js.map +1 -1
  1038. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs +10 -7
  1039. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs.map +1 -1
  1040. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.js +10 -7
  1041. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.js.map +1 -1
  1042. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs +7 -5
  1043. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs.map +1 -1
  1044. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.js +7 -5
  1045. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.js.map +1 -1
  1046. package/dist/production/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.cjs +8 -6
  1047. package/dist/production/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.cjs.map +1 -1
  1048. package/dist/production/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.js +8 -6
  1049. package/dist/production/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.js.map +1 -1
  1050. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs +7 -5
  1051. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs.map +1 -1
  1052. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.js +7 -5
  1053. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.js.map +1 -1
  1054. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs +10 -7
  1055. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs.map +1 -1
  1056. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js +10 -7
  1057. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js.map +1 -1
  1058. package/dist/production/src/resolvers/mutation/idp/audit.cjs +1 -0
  1059. package/dist/production/src/resolvers/mutation/idp/audit.cjs.map +1 -1
  1060. package/dist/production/src/resolvers/mutation/idp/audit.js +1 -0
  1061. package/dist/production/src/resolvers/mutation/idp/audit.js.map +1 -1
  1062. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs +38 -18
  1063. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs.map +1 -1
  1064. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js +38 -18
  1065. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js.map +1 -1
  1066. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs +10 -8
  1067. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs.map +1 -1
  1068. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.js +10 -8
  1069. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.js.map +1 -1
  1070. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs +17 -11
  1071. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs.map +1 -1
  1072. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.js +17 -11
  1073. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.js.map +1 -1
  1074. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs +10 -8
  1075. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs.map +1 -1
  1076. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.js +10 -8
  1077. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.js.map +1 -1
  1078. package/dist/production/src/resolvers/mutation/person/EmailOtpMutationResolver.cjs +10 -8
  1079. package/dist/production/src/resolvers/mutation/person/EmailOtpMutationResolver.cjs.map +1 -1
  1080. package/dist/production/src/resolvers/mutation/person/EmailOtpMutationResolver.js +10 -8
  1081. package/dist/production/src/resolvers/mutation/person/EmailOtpMutationResolver.js.map +1 -1
  1082. package/dist/production/src/resolvers/mutation/person/EmailVerificationMutationResolver.cjs +10 -8
  1083. package/dist/production/src/resolvers/mutation/person/EmailVerificationMutationResolver.cjs.map +1 -1
  1084. package/dist/production/src/resolvers/mutation/person/EmailVerificationMutationResolver.js +10 -8
  1085. package/dist/production/src/resolvers/mutation/person/EmailVerificationMutationResolver.js.map +1 -1
  1086. package/dist/production/src/resolvers/mutation/person/EnablePersonMutationResolver.cjs +61 -0
  1087. package/dist/production/src/resolvers/mutation/person/EnablePersonMutationResolver.cjs.map +1 -0
  1088. package/dist/production/src/resolvers/mutation/person/EnablePersonMutationResolver.js +61 -0
  1089. package/dist/production/src/resolvers/mutation/person/EnablePersonMutationResolver.js.map +1 -0
  1090. package/dist/production/src/resolvers/mutation/person/ForceSignOutMutationResolver.cjs +8 -6
  1091. package/dist/production/src/resolvers/mutation/person/ForceSignOutMutationResolver.cjs.map +1 -1
  1092. package/dist/production/src/resolvers/mutation/person/ForceSignOutMutationResolver.js +8 -6
  1093. package/dist/production/src/resolvers/mutation/person/ForceSignOutMutationResolver.js.map +1 -1
  1094. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.cjs +32 -5
  1095. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.cjs.map +1 -1
  1096. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.js +32 -5
  1097. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.js.map +1 -1
  1098. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.cjs +7 -5
  1099. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.cjs.map +1 -1
  1100. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.js +7 -5
  1101. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.js.map +1 -1
  1102. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.cjs +9 -7
  1103. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.cjs.map +1 -1
  1104. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.js +9 -7
  1105. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.js.map +1 -1
  1106. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs +12 -6
  1107. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs.map +1 -1
  1108. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.js +12 -6
  1109. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.js.map +1 -1
  1110. package/dist/production/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.cjs +9 -7
  1111. package/dist/production/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.cjs.map +1 -1
  1112. package/dist/production/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.js +9 -7
  1113. package/dist/production/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.js.map +1 -1
  1114. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs +10 -8
  1115. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs.map +1 -1
  1116. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.js +10 -8
  1117. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.js.map +1 -1
  1118. package/dist/production/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.cjs +8 -6
  1119. package/dist/production/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.cjs.map +1 -1
  1120. package/dist/production/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.js +8 -6
  1121. package/dist/production/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.js.map +1 -1
  1122. package/dist/production/src/resolvers/mutation/person/RevokeSessionMutationResolver.cjs +8 -6
  1123. package/dist/production/src/resolvers/mutation/person/RevokeSessionMutationResolver.cjs.map +1 -1
  1124. package/dist/production/src/resolvers/mutation/person/RevokeSessionMutationResolver.js +8 -6
  1125. package/dist/production/src/resolvers/mutation/person/RevokeSessionMutationResolver.js.map +1 -1
  1126. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.cjs +22 -14
  1127. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.cjs.map +1 -1
  1128. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.js +22 -14
  1129. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.js.map +1 -1
  1130. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.cjs +7 -5
  1131. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.cjs.map +1 -1
  1132. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.js +7 -5
  1133. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.js.map +1 -1
  1134. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.cjs +10 -8
  1135. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.cjs.map +1 -1
  1136. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.js +10 -8
  1137. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.js.map +1 -1
  1138. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs +9 -7
  1139. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs.map +1 -1
  1140. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js +9 -7
  1141. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js.map +1 -1
  1142. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs +7 -5
  1143. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs.map +1 -1
  1144. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.js +7 -5
  1145. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.js.map +1 -1
  1146. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs +7 -5
  1147. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs.map +1 -1
  1148. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js +7 -5
  1149. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js.map +1 -1
  1150. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs +7 -5
  1151. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs.map +1 -1
  1152. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.js +7 -5
  1153. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.js.map +1 -1
  1154. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs +7 -5
  1155. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs.map +1 -1
  1156. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js +7 -5
  1157. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js.map +1 -1
  1158. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs +8 -6
  1159. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs.map +1 -1
  1160. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js +8 -6
  1161. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js.map +1 -1
  1162. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs +8 -6
  1163. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs.map +1 -1
  1164. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js +8 -6
  1165. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js.map +1 -1
  1166. package/dist/production/src/resolvers/mutation/projectMember/audit.cjs +2 -1
  1167. package/dist/production/src/resolvers/mutation/projectMember/audit.cjs.map +1 -1
  1168. package/dist/production/src/resolvers/mutation/projectMember/audit.js +2 -1
  1169. package/dist/production/src/resolvers/mutation/projectMember/audit.js.map +1 -1
  1170. package/dist/production/src/resolvers/query/ApiKeyQueryResolver.cjs +8 -6
  1171. package/dist/production/src/resolvers/query/ApiKeyQueryResolver.cjs.map +1 -1
  1172. package/dist/production/src/resolvers/query/ApiKeyQueryResolver.js +8 -6
  1173. package/dist/production/src/resolvers/query/ApiKeyQueryResolver.js.map +1 -1
  1174. package/dist/production/src/resolvers/query/AuthLogQueryResolver.cjs +7 -5
  1175. package/dist/production/src/resolvers/query/AuthLogQueryResolver.cjs.map +1 -1
  1176. package/dist/production/src/resolvers/query/AuthLogQueryResolver.js +7 -5
  1177. package/dist/production/src/resolvers/query/AuthLogQueryResolver.js.map +1 -1
  1178. package/dist/production/src/resolvers/query/AuthPolicyQueryResolver.cjs +8 -6
  1179. package/dist/production/src/resolvers/query/AuthPolicyQueryResolver.cjs.map +1 -1
  1180. package/dist/production/src/resolvers/query/AuthPolicyQueryResolver.js +8 -6
  1181. package/dist/production/src/resolvers/query/AuthPolicyQueryResolver.js.map +1 -1
  1182. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.cjs +8 -6
  1183. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.cjs.map +1 -1
  1184. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.js +8 -6
  1185. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.js.map +1 -1
  1186. package/dist/production/src/resolvers/query/CustomRoleQueryResolver.cjs +55 -0
  1187. package/dist/production/src/resolvers/query/CustomRoleQueryResolver.cjs.map +1 -0
  1188. package/dist/production/src/resolvers/query/CustomRoleQueryResolver.js +55 -0
  1189. package/dist/production/src/resolvers/query/CustomRoleQueryResolver.js.map +1 -0
  1190. package/dist/production/src/resolvers/query/IDPQueryResolver.cjs +7 -5
  1191. package/dist/production/src/resolvers/query/IDPQueryResolver.cjs.map +1 -1
  1192. package/dist/production/src/resolvers/query/IDPQueryResolver.js +7 -5
  1193. package/dist/production/src/resolvers/query/IDPQueryResolver.js.map +1 -1
  1194. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.cjs +21 -14
  1195. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.cjs.map +1 -1
  1196. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.js +21 -14
  1197. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.js.map +1 -1
  1198. package/dist/production/src/resolvers/query/PersonQueryResolver.cjs +7 -5
  1199. package/dist/production/src/resolvers/query/PersonQueryResolver.cjs.map +1 -1
  1200. package/dist/production/src/resolvers/query/PersonQueryResolver.js +7 -5
  1201. package/dist/production/src/resolvers/query/PersonQueryResolver.js.map +1 -1
  1202. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.cjs +7 -5
  1203. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.cjs.map +1 -1
  1204. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.js +7 -5
  1205. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.js.map +1 -1
  1206. package/dist/production/src/resolvers/query/ProjectQueryResolver.cjs +10 -7
  1207. package/dist/production/src/resolvers/query/ProjectQueryResolver.cjs.map +1 -1
  1208. package/dist/production/src/resolvers/query/ProjectQueryResolver.js +10 -7
  1209. package/dist/production/src/resolvers/query/ProjectQueryResolver.js.map +1 -1
  1210. package/dist/production/src/resolvers/responseHelpers/ApiKeyResponseFactory.cjs +7 -5
  1211. package/dist/production/src/resolvers/responseHelpers/ApiKeyResponseFactory.cjs.map +1 -1
  1212. package/dist/production/src/resolvers/responseHelpers/ApiKeyResponseFactory.js +7 -5
  1213. package/dist/production/src/resolvers/responseHelpers/ApiKeyResponseFactory.js.map +1 -1
  1214. package/dist/production/src/resolvers/responseHelpers/PersonResponseFactory.cjs +5 -0
  1215. package/dist/production/src/resolvers/responseHelpers/PersonResponseFactory.cjs.map +1 -1
  1216. package/dist/production/src/resolvers/responseHelpers/PersonResponseFactory.js +5 -0
  1217. package/dist/production/src/resolvers/responseHelpers/PersonResponseFactory.js.map +1 -1
  1218. package/dist/production/src/resolvers/responseHelpers/ProjectResponseFactory.cjs +23 -0
  1219. package/dist/production/src/resolvers/responseHelpers/ProjectResponseFactory.cjs.map +1 -0
  1220. package/dist/production/src/resolvers/responseHelpers/ProjectResponseFactory.js +23 -0
  1221. package/dist/production/src/resolvers/responseHelpers/ProjectResponseFactory.js.map +1 -0
  1222. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.cjs +8 -6
  1223. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.cjs.map +1 -1
  1224. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.js +8 -6
  1225. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.js.map +1 -1
  1226. package/dist/production/src/resolvers/types/IdentityTypeResolver.cjs +50 -18
  1227. package/dist/production/src/resolvers/types/IdentityTypeResolver.cjs.map +1 -1
  1228. package/dist/production/src/resolvers/types/IdentityTypeResolver.js +50 -18
  1229. package/dist/production/src/resolvers/types/IdentityTypeResolver.js.map +1 -1
  1230. package/dist/production/src/resolvers/types/PersonTypeResolver.cjs +38 -8
  1231. package/dist/production/src/resolvers/types/PersonTypeResolver.cjs.map +1 -1
  1232. package/dist/production/src/resolvers/types/PersonTypeResolver.js +38 -8
  1233. package/dist/production/src/resolvers/types/PersonTypeResolver.js.map +1 -1
  1234. package/dist/production/src/resolvers/types/ProjectTypeResolver.cjs +31 -6
  1235. package/dist/production/src/resolvers/types/ProjectTypeResolver.cjs.map +1 -1
  1236. package/dist/production/src/resolvers/types/ProjectTypeResolver.js +31 -6
  1237. package/dist/production/src/resolvers/types/ProjectTypeResolver.js.map +1 -1
  1238. package/dist/production/src/schema/tenant.graphql.cjs +275 -15
  1239. package/dist/production/src/schema/tenant.graphql.cjs.map +1 -1
  1240. package/dist/production/src/schema/tenant.graphql.js +275 -15
  1241. package/dist/production/src/schema/tenant.graphql.js.map +1 -1
  1242. package/dist/tests/cases/integration/database/dbClock.test.d.ts +2 -0
  1243. package/dist/tests/cases/integration/database/dbClock.test.d.ts.map +1 -0
  1244. package/dist/tests/cases/integration/mocked/configurationPanel.test.d.ts +2 -0
  1245. package/dist/tests/cases/integration/mocked/configurationPanel.test.d.ts.map +1 -0
  1246. package/dist/tests/cases/integration/mocked/customRoleCrud.test.d.ts +2 -0
  1247. package/dist/tests/cases/integration/mocked/customRoleCrud.test.d.ts.map +1 -0
  1248. package/dist/tests/cases/integration/mocked/disablePersonMutation.test.d.ts +2 -0
  1249. package/dist/tests/cases/integration/mocked/disablePersonMutation.test.d.ts.map +1 -0
  1250. package/dist/tests/cases/integration/mocked/enablePersonMutation.test.d.ts +2 -0
  1251. package/dist/tests/cases/integration/mocked/enablePersonMutation.test.d.ts.map +1 -0
  1252. package/dist/tests/cases/integration/mocked/gql/addProjectMember.d.ts.map +1 -1
  1253. package/dist/tests/cases/integration/mocked/gql/changeMyPassword.d.ts.map +1 -1
  1254. package/dist/tests/cases/integration/mocked/gql/changeMyProfile.d.ts.map +1 -1
  1255. package/dist/tests/cases/integration/mocked/gql/changePassword.d.ts.map +1 -1
  1256. package/dist/tests/cases/integration/mocked/gql/changeProfile.d.ts.map +1 -1
  1257. package/dist/tests/cases/integration/mocked/gql/confirmOtp.d.ts.map +1 -1
  1258. package/dist/tests/cases/integration/mocked/gql/createApiKey.d.ts.map +1 -1
  1259. package/dist/tests/cases/integration/mocked/gql/createResetPasswordRequest.d.ts.map +1 -1
  1260. package/dist/tests/cases/integration/mocked/gql/createSessionToken.d.ts.map +1 -1
  1261. package/dist/tests/cases/integration/mocked/gql/emailOtp.d.ts.map +1 -1
  1262. package/dist/tests/cases/integration/mocked/gql/emailVerification.d.ts.map +1 -1
  1263. package/dist/tests/cases/integration/mocked/gql/invite.d.ts.map +1 -1
  1264. package/dist/tests/cases/integration/mocked/gql/myIdentityProviders.d.ts.map +1 -1
  1265. package/dist/tests/cases/integration/mocked/gql/passwordless.d.ts +4 -1
  1266. package/dist/tests/cases/integration/mocked/gql/passwordless.d.ts.map +1 -1
  1267. package/dist/tests/cases/integration/mocked/gql/prepareOtp.d.ts.map +1 -1
  1268. package/dist/tests/cases/integration/mocked/gql/resetPassword.d.ts.map +1 -1
  1269. package/dist/tests/cases/integration/mocked/gql/signIn.d.ts.map +1 -1
  1270. package/dist/tests/cases/integration/mocked/gql/signInIdp.d.ts.map +1 -1
  1271. package/dist/tests/cases/integration/mocked/gql/signUp.d.ts.map +1 -1
  1272. package/dist/tests/cases/integration/mocked/gql/unmanagedInvite.d.ts.map +1 -1
  1273. package/dist/tests/cases/integration/mocked/gql/updateProjectMember.d.ts.map +1 -1
  1274. package/dist/tests/cases/integration/mocked/idpClaimMappingConfig.test.d.ts +2 -0
  1275. package/dist/tests/cases/integration/mocked/idpClaimMappingConfig.test.d.ts.map +1 -0
  1276. package/dist/tests/cases/integration/mocked/localAuthenticationDisabled.test.d.ts +2 -0
  1277. package/dist/tests/cases/integration/mocked/localAuthenticationDisabled.test.d.ts.map +1 -0
  1278. package/dist/tests/cases/integration/mocked/mailTemplateScope.test.d.ts +2 -0
  1279. package/dist/tests/cases/integration/mocked/mailTemplateScope.test.d.ts.map +1 -0
  1280. package/dist/tests/cases/integration/mocked/permissionsQuery.test.d.ts +2 -0
  1281. package/dist/tests/cases/integration/mocked/permissionsQuery.test.d.ts.map +1 -0
  1282. package/dist/tests/cases/integration/mocked/signInIdpClaimMapping.test.d.ts +2 -0
  1283. package/dist/tests/cases/integration/mocked/signInIdpClaimMapping.test.d.ts.map +1 -0
  1284. package/dist/tests/cases/integration/mocked/signInIdpClaimMappingFixes.test.d.ts +2 -0
  1285. package/dist/tests/cases/integration/mocked/signInIdpClaimMappingFixes.test.d.ts.map +1 -0
  1286. package/dist/tests/cases/integration/mocked/signInIdpClaimMappingSafety.test.d.ts +2 -0
  1287. package/dist/tests/cases/integration/mocked/signInIdpClaimMappingSafety.test.d.ts.map +1 -0
  1288. package/dist/tests/cases/integration/mocked/sql/authLogSql.d.ts.map +1 -1
  1289. package/dist/tests/cases/integration/mocked/sql/authPolicySql.d.ts.map +1 -1
  1290. package/dist/tests/cases/integration/mocked/sql/consumeBackupCodeSql.d.ts.map +1 -1
  1291. package/dist/tests/cases/integration/mocked/sql/createApiKeySql.d.ts.map +1 -1
  1292. package/dist/tests/cases/integration/mocked/sql/createIdentitySql.d.ts.map +1 -1
  1293. package/dist/tests/cases/integration/mocked/sql/createMembershipSql.d.ts.map +1 -1
  1294. package/dist/tests/cases/integration/mocked/sql/createMembershipVariableSql.d.ts.map +1 -1
  1295. package/dist/tests/cases/integration/mocked/sql/createPersonSql.d.ts.map +1 -1
  1296. package/dist/tests/cases/integration/mocked/sql/createPersonTokenSql.d.ts.map +1 -1
  1297. package/dist/tests/cases/integration/mocked/sql/createSessionKeySql.d.ts.map +1 -1
  1298. package/dist/tests/cases/integration/mocked/sql/disableApiKeySql.d.ts.map +1 -1
  1299. package/dist/tests/cases/integration/mocked/sql/disableOneOffKeySql.d.ts.map +1 -1
  1300. package/dist/tests/cases/integration/mocked/sql/emailOtpSql.d.ts.map +1 -1
  1301. package/dist/tests/cases/integration/mocked/sql/generateBackupCodesSql.d.ts.map +1 -1
  1302. package/dist/tests/cases/integration/mocked/sql/getApiKeySql.d.ts.map +1 -1
  1303. package/dist/tests/cases/integration/mocked/sql/getConfigSql.d.ts.map +1 -1
  1304. package/dist/tests/cases/integration/mocked/sql/getCustomRolesSql.d.ts +18 -0
  1305. package/dist/tests/cases/integration/mocked/sql/getCustomRolesSql.d.ts.map +1 -0
  1306. package/dist/tests/cases/integration/mocked/sql/getIdentityByIdSql.d.ts.map +1 -1
  1307. package/dist/tests/cases/integration/mocked/sql/getIdentityProjectMembershipPresenceSql.d.ts +3 -0
  1308. package/dist/tests/cases/integration/mocked/sql/getIdentityProjectMembershipPresenceSql.d.ts.map +1 -0
  1309. package/dist/tests/cases/integration/mocked/sql/getIdentityProjectsSql.d.ts.map +1 -1
  1310. package/dist/tests/cases/integration/mocked/sql/getIdpBySlugSql.d.ts.map +1 -1
  1311. package/dist/tests/cases/integration/mocked/sql/getIdpSessionByApiKeySql.d.ts.map +1 -1
  1312. package/dist/tests/cases/integration/mocked/sql/getMailTemplateSql.d.ts.map +1 -1
  1313. package/dist/tests/cases/integration/mocked/sql/getNextLoginAttemptSql.d.ts.map +1 -1
  1314. package/dist/tests/cases/integration/mocked/sql/getNextMailAttemptSql.d.ts +1 -1
  1315. package/dist/tests/cases/integration/mocked/sql/getNextMailAttemptSql.d.ts.map +1 -1
  1316. package/dist/tests/cases/integration/mocked/sql/getPersonByEmailSql.d.ts +1 -0
  1317. package/dist/tests/cases/integration/mocked/sql/getPersonByEmailSql.d.ts.map +1 -1
  1318. package/dist/tests/cases/integration/mocked/sql/getPersonByIdSql.d.ts.map +1 -1
  1319. package/dist/tests/cases/integration/mocked/sql/getPersonByIdentity.d.ts.map +1 -1
  1320. package/dist/tests/cases/integration/mocked/sql/getPersonByIdpSql.d.ts.map +1 -1
  1321. package/dist/tests/cases/integration/mocked/sql/getPersonsByIdentitySql.d.ts.map +1 -1
  1322. package/dist/tests/cases/integration/mocked/sql/getProjectBySlugSql.d.ts +1 -1
  1323. package/dist/tests/cases/integration/mocked/sql/getProjectBySlugSql.d.ts.map +1 -1
  1324. package/dist/tests/cases/integration/mocked/sql/getProjectMembershipSql.d.ts.map +1 -1
  1325. package/dist/tests/cases/integration/mocked/sql/listApiKeysSql.d.ts.map +1 -1
  1326. package/dist/tests/cases/integration/mocked/sql/listPersonsSql.d.ts +2 -0
  1327. package/dist/tests/cases/integration/mocked/sql/listPersonsSql.d.ts.map +1 -1
  1328. package/dist/tests/cases/integration/mocked/sql/listProjectSecretsSql.d.ts.map +1 -1
  1329. package/dist/tests/cases/integration/mocked/sql/listSessionsSql.d.ts +1 -1
  1330. package/dist/tests/cases/integration/mocked/sql/listSessionsSql.d.ts.map +1 -1
  1331. package/dist/tests/cases/integration/mocked/sql/localAuthDisablingIdpsSql.d.ts +10 -0
  1332. package/dist/tests/cases/integration/mocked/sql/localAuthDisablingIdpsSql.d.ts.map +1 -0
  1333. package/dist/tests/cases/integration/mocked/sql/loginHistorySql.d.ts.map +1 -1
  1334. package/dist/tests/cases/integration/mocked/sql/patchVariablesSql.d.ts.map +1 -1
  1335. package/dist/tests/cases/integration/mocked/sql/personIdentityProvidersSql.d.ts +1 -0
  1336. package/dist/tests/cases/integration/mocked/sql/personIdentityProvidersSql.d.ts.map +1 -1
  1337. package/dist/tests/cases/integration/mocked/sql/removeMembershipSql.d.ts +8 -0
  1338. package/dist/tests/cases/integration/mocked/sql/removeMembershipSql.d.ts.map +1 -0
  1339. package/dist/tests/cases/integration/mocked/sql/selectMembershipsSql.d.ts.map +1 -1
  1340. package/dist/tests/cases/integration/mocked/sql/setEmailOtpEnabledSql.d.ts.map +1 -1
  1341. package/dist/tests/cases/integration/mocked/sql/sqlTransaction.d.ts +6 -0
  1342. package/dist/tests/cases/integration/mocked/sql/sqlTransaction.d.ts.map +1 -1
  1343. package/dist/tests/cases/integration/mocked/sql/updatePesonNameSql.d.ts.map +1 -1
  1344. package/dist/tests/cases/integration/mocked/sql/updatePesonPasswordSql.d.ts.map +1 -1
  1345. package/dist/tests/cases/unit/apiKey/verifyAndProlongReplica.test.d.ts +2 -0
  1346. package/dist/tests/cases/unit/apiKey/verifyAndProlongReplica.test.d.ts.map +1 -0
  1347. package/dist/tests/cases/unit/customRoleAuthorizator.test.d.ts +2 -0
  1348. package/dist/tests/cases/unit/customRoleAuthorizator.test.d.ts.map +1 -0
  1349. package/dist/tests/cases/unit/customRolePermissions.test.d.ts +2 -0
  1350. package/dist/tests/cases/unit/customRolePermissions.test.d.ts.map +1 -0
  1351. package/dist/tests/cases/unit/databaseContextRetry.test.d.ts +2 -0
  1352. package/dist/tests/cases/unit/databaseContextRetry.test.d.ts.map +1 -0
  1353. package/dist/tests/cases/unit/idp/claimIdpRevalidation.test.d.ts +2 -0
  1354. package/dist/tests/cases/unit/idp/claimIdpRevalidation.test.d.ts.map +1 -0
  1355. package/dist/tests/cases/unit/idp/claimMappingEvaluator.test.d.ts +2 -0
  1356. package/dist/tests/cases/unit/idp/claimMappingEvaluator.test.d.ts.map +1 -0
  1357. package/dist/tests/cases/unit/idp/claimMappingValidation.test.d.ts +2 -0
  1358. package/dist/tests/cases/unit/idp/claimMappingValidation.test.d.ts.map +1 -0
  1359. package/dist/tests/cases/unit/idp/idpManagerConfigMerge.test.d.ts +2 -0
  1360. package/dist/tests/cases/unit/idp/idpManagerConfigMerge.test.d.ts.map +1 -0
  1361. package/dist/tests/cases/unit/idp/idpManagerUnknownConfigKeys.test.d.ts +2 -0
  1362. package/dist/tests/cases/unit/idp/idpManagerUnknownConfigKeys.test.d.ts.map +1 -0
  1363. package/dist/tests/cases/unit/idp/oidcClaims.test.d.ts +2 -0
  1364. package/dist/tests/cases/unit/idp/oidcClaims.test.d.ts.map +1 -0
  1365. package/dist/tests/cases/unit/panelAccessResolver.test.d.ts +2 -0
  1366. package/dist/tests/cases/unit/panelAccessResolver.test.d.ts.map +1 -0
  1367. package/dist/tests/cases/unit/savePersonTokenCommand.test.d.ts +2 -0
  1368. package/dist/tests/cases/unit/savePersonTokenCommand.test.d.ts.map +1 -0
  1369. package/dist/tests/cases/unit/updateConfigurationCommand.test.d.ts +2 -0
  1370. package/dist/tests/cases/unit/updateConfigurationCommand.test.d.ts.map +1 -0
  1371. package/dist/tests/src/IdPMock.d.ts.map +1 -1
  1372. package/dist/tests/src/dbUtils.d.ts.map +1 -1
  1373. package/dist/tests/src/tags.d.ts.map +1 -1
  1374. package/dist/tests/src/testGraphql.d.ts.map +1 -1
  1375. package/dist/tests/src/testTenant.d.ts +16 -4
  1376. package/dist/tests/src/testTenant.d.ts.map +1 -1
  1377. package/dist/tests/src/testUuid.d.ts.map +1 -1
  1378. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  1379. package/dist/types/TenantContainer.d.ts +36 -13
  1380. package/dist/types/TenantContainer.d.ts.map +1 -1
  1381. package/dist/types/bridges/system/IdentityFetcher.d.ts +2 -2
  1382. package/dist/types/bridges/system/IdentityFetcher.d.ts.map +1 -1
  1383. package/dist/types/exceptions.d.ts.map +1 -1
  1384. package/dist/types/migrations/2026-06-18-120000-idp-claim-mapping.d.ts +3 -0
  1385. package/dist/types/migrations/2026-06-18-120000-idp-claim-mapping.d.ts.map +1 -0
  1386. package/dist/types/migrations/2026-08-03-120000-person-enable-auth-log.d.ts +3 -0
  1387. package/dist/types/migrations/2026-08-03-120000-person-enable-auth-log.d.ts.map +1 -0
  1388. package/dist/types/migrations/2026-08-04-120000-config-panel.d.ts +3 -0
  1389. package/dist/types/migrations/2026-08-04-120000-config-panel.d.ts.map +1 -0
  1390. package/dist/types/migrations/2026-09-04-120000-idp-disable-local-authentication.d.ts +3 -0
  1391. package/dist/types/migrations/2026-09-04-120000-idp-disable-local-authentication.d.ts.map +1 -0
  1392. package/dist/types/migrations/2026-09-11-120000-custom-role.d.ts +3 -0
  1393. package/dist/types/migrations/2026-09-11-120000-custom-role.d.ts.map +1 -0
  1394. package/dist/types/migrations/runner.d.ts.map +1 -1
  1395. package/dist/types/migrations/snapshot-factory.d.ts.map +1 -1
  1396. package/dist/types/migrations/snapshot.d.ts.map +1 -1
  1397. package/dist/types/migrations/tenantCredentials.d.ts.map +1 -1
  1398. package/dist/types/model/authorization/AclSchemaAccessNodeFactory.d.ts.map +1 -1
  1399. package/dist/types/model/authorization/CustomRoleAuthorizator.d.ts +29 -0
  1400. package/dist/types/model/authorization/CustomRoleAuthorizator.d.ts.map +1 -0
  1401. package/dist/types/model/authorization/CustomRolePermissions.d.ts +45 -0
  1402. package/dist/types/model/authorization/CustomRolePermissions.d.ts.map +1 -0
  1403. package/dist/types/model/authorization/DirectPermissionsAccessNode.d.ts.map +1 -1
  1404. package/dist/types/model/authorization/Identity.d.ts.map +1 -1
  1405. package/dist/types/model/authorization/IdentityFactory.d.ts.map +1 -1
  1406. package/dist/types/model/authorization/IdentityScope.d.ts.map +1 -1
  1407. package/dist/types/model/authorization/MembershipMatcher.d.ts.map +1 -1
  1408. package/dist/types/model/authorization/PermissionActions.d.ts +104 -37
  1409. package/dist/types/model/authorization/PermissionActions.d.ts.map +1 -1
  1410. package/dist/types/model/authorization/PermissionContext.d.ts.map +1 -1
  1411. package/dist/types/model/authorization/PermissionContextFactory.d.ts +13 -2
  1412. package/dist/types/model/authorization/PermissionContextFactory.d.ts.map +1 -1
  1413. package/dist/types/model/authorization/PermissionsFactory.d.ts.map +1 -1
  1414. package/dist/types/model/authorization/ProjectScope.d.ts.map +1 -1
  1415. package/dist/types/model/authorization/ProjectScopeFactory.d.ts.map +1 -1
  1416. package/dist/types/model/authorization/Roles.d.ts +8 -0
  1417. package/dist/types/model/authorization/Roles.d.ts.map +1 -1
  1418. package/dist/types/model/authorization/TargetIdentityPermission.d.ts +15 -0
  1419. package/dist/types/model/authorization/TargetIdentityPermission.d.ts.map +1 -0
  1420. package/dist/types/model/authorization/index.d.ts +3 -0
  1421. package/dist/types/model/authorization/index.d.ts.map +1 -1
  1422. package/dist/types/model/commands/CommandBus.d.ts.map +1 -1
  1423. package/dist/types/model/commands/apiKey/ApiKeyHelper.d.ts +15 -0
  1424. package/dist/types/model/commands/apiKey/ApiKeyHelper.d.ts.map +1 -1
  1425. package/dist/types/model/commands/apiKey/CreateApiKeyCommand.d.ts +5 -1
  1426. package/dist/types/model/commands/apiKey/CreateApiKeyCommand.d.ts.map +1 -1
  1427. package/dist/types/model/commands/apiKey/DisableApiKeyCommand.d.ts.map +1 -1
  1428. package/dist/types/model/commands/apiKey/DisableIdentityApiKeysCommand.d.ts.map +1 -1
  1429. package/dist/types/model/commands/apiKey/DisableOneOffApiKeyCommand.d.ts.map +1 -1
  1430. package/dist/types/model/commands/apiKey/ProlongApiKeyCommand.d.ts +6 -4
  1431. package/dist/types/model/commands/apiKey/ProlongApiKeyCommand.d.ts.map +1 -1
  1432. package/dist/types/model/commands/authLog/CreateAuthLogEntryCommand.d.ts +1 -0
  1433. package/dist/types/model/commands/authLog/CreateAuthLogEntryCommand.d.ts.map +1 -1
  1434. package/dist/types/model/commands/authPolicy/CreateAuthPolicyCommand.d.ts.map +1 -1
  1435. package/dist/types/model/commands/authPolicy/DeleteAuthPolicyCommand.d.ts.map +1 -1
  1436. package/dist/types/model/commands/authPolicy/UpdateAuthPolicyCommand.d.ts.map +1 -1
  1437. package/dist/types/model/commands/backupCode/ConsumeBackupCodeCommand.d.ts.map +1 -1
  1438. package/dist/types/model/commands/backupCode/CreateBackupCodeCommand.d.ts.map +1 -1
  1439. package/dist/types/model/commands/backupCode/DeleteBackupCodesCommand.d.ts.map +1 -1
  1440. package/dist/types/model/commands/configuration/UpdateConfigurationCommand.d.ts.map +1 -1
  1441. package/dist/types/model/commands/customRole/CreateCustomRoleCommand.d.ts +12 -0
  1442. package/dist/types/model/commands/customRole/CreateCustomRoleCommand.d.ts.map +1 -0
  1443. package/dist/types/model/commands/customRole/DeleteCustomRoleCommand.d.ts +13 -0
  1444. package/dist/types/model/commands/customRole/DeleteCustomRoleCommand.d.ts.map +1 -0
  1445. package/dist/types/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.d.ts +8 -0
  1446. package/dist/types/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.d.ts.map +1 -0
  1447. package/dist/types/model/commands/customRole/UpdateCustomRoleCommand.d.ts +16 -0
  1448. package/dist/types/model/commands/customRole/UpdateCustomRoleCommand.d.ts.map +1 -0
  1449. package/dist/types/model/commands/customRole/index.d.ts +5 -0
  1450. package/dist/types/model/commands/customRole/index.d.ts.map +1 -0
  1451. package/dist/types/model/commands/identity/CreateIdentityCommand.d.ts.map +1 -1
  1452. package/dist/types/model/commands/identity/PatchIdentityGlobalRoles.d.ts.map +1 -1
  1453. package/dist/types/model/commands/idp/ClaimIdpRevalidationCommand.d.ts.map +1 -1
  1454. package/dist/types/model/commands/idp/CreateIdpCommand.d.ts.map +1 -1
  1455. package/dist/types/model/commands/idp/CreateIdpSessionCommand.d.ts.map +1 -1
  1456. package/dist/types/model/commands/idp/DisableIdpCommand.d.ts.map +1 -1
  1457. package/dist/types/model/commands/idp/DisconnectPersonIdentityProviderCommand.d.ts.map +1 -1
  1458. package/dist/types/model/commands/idp/EnableIdpCommand.d.ts.map +1 -1
  1459. package/dist/types/model/commands/idp/UpdateIdpCommand.d.ts.map +1 -1
  1460. package/dist/types/model/commands/idp/UpdateIdpSessionCommand.d.ts.map +1 -1
  1461. package/dist/types/model/commands/index.d.ts +1 -0
  1462. package/dist/types/model/commands/index.d.ts.map +1 -1
  1463. package/dist/types/model/commands/mailTemplate/AddMailTemplateCommand.d.ts.map +1 -1
  1464. package/dist/types/model/commands/mailTemplate/RemoveMailTemplateCommand.d.ts.map +1 -1
  1465. package/dist/types/model/commands/membership/AddProjectMemberCommand.d.ts.map +1 -1
  1466. package/dist/types/model/commands/membership/CreateOrUpdateProjectMembershipCommand.d.ts.map +1 -1
  1467. package/dist/types/model/commands/membership/RemoveProjectMemberCommand.d.ts.map +1 -1
  1468. package/dist/types/model/commands/membership/{RemoveProjectMembershipsCommand.d.ts → RemoveProjectMembershipCommand.d.ts} +1 -1
  1469. package/dist/types/model/commands/membership/RemoveProjectMembershipCommand.d.ts.map +1 -0
  1470. package/dist/types/model/commands/membership/UpdateProjectMemberCommand.d.ts.map +1 -1
  1471. package/dist/types/model/commands/membership/index.d.ts +2 -1
  1472. package/dist/types/model/commands/membership/index.d.ts.map +1 -1
  1473. package/dist/types/model/commands/membership/variables/PatchProjectMembershipVariableValuesCommand.d.ts.map +1 -1
  1474. package/dist/types/model/commands/membership/variables/PatchProjectMembershipVariablesCommand.d.ts.map +1 -1
  1475. package/dist/types/model/commands/membership/variables/SetProjectMembershipVariableValuesCommand.d.ts.map +1 -1
  1476. package/dist/types/model/commands/membership/variables/index.d.ts +1 -0
  1477. package/dist/types/model/commands/membership/variables/index.d.ts.map +1 -1
  1478. package/dist/types/model/commands/otp/ConfirmOtpCommand.d.ts.map +1 -1
  1479. package/dist/types/model/commands/otp/DisableOtpCommand.d.ts.map +1 -1
  1480. package/dist/types/model/commands/otp/PrepareOtpCommand.d.ts.map +1 -1
  1481. package/dist/types/model/commands/otp/ReEncryptOtpSecretCommand.d.ts.map +1 -1
  1482. package/dist/types/model/commands/otp/SetEmailOtpEnabledCommand.d.ts.map +1 -1
  1483. package/dist/types/model/commands/person/ChangePasswordCommand.d.ts.map +1 -1
  1484. package/dist/types/model/commands/person/ChangeProfileCommand.d.ts.map +1 -1
  1485. package/dist/types/model/commands/person/CreatePersonCommand.d.ts.map +1 -1
  1486. package/dist/types/model/commands/person/CreatePersonIdentityProviderIdentifierCommand.d.ts.map +1 -1
  1487. package/dist/types/model/commands/person/DisablePersonCommand.d.ts.map +1 -1
  1488. package/dist/types/model/commands/person/EnablePersonCommand.d.ts +7 -0
  1489. package/dist/types/model/commands/person/EnablePersonCommand.d.ts.map +1 -0
  1490. package/dist/types/model/commands/person/MarkEmailVerifiedCommand.d.ts.map +1 -1
  1491. package/dist/types/model/commands/person/ResetPersonMfaCommand.d.ts.map +1 -1
  1492. package/dist/types/model/commands/person/SetMfaGraceUntilCommand.d.ts +8 -3
  1493. package/dist/types/model/commands/person/SetMfaGraceUntilCommand.d.ts.map +1 -1
  1494. package/dist/types/model/commands/person/TogglePersonPasswordlessCommand.d.ts.map +1 -1
  1495. package/dist/types/model/commands/personToken/ActivateOtpCommand.d.ts.map +1 -1
  1496. package/dist/types/model/commands/personToken/ClaimOtpAttemptCommand.d.ts.map +1 -1
  1497. package/dist/types/model/commands/personToken/CreatePersonTokenCommand.d.ts.map +1 -1
  1498. package/dist/types/model/commands/personToken/IncreaseOtpAttemptCommand.d.ts.map +1 -1
  1499. package/dist/types/model/commands/personToken/InvalidateEmailOtpTokensCommand.d.ts.map +1 -1
  1500. package/dist/types/model/commands/personToken/InvalidateTokenCommand.d.ts.map +1 -1
  1501. package/dist/types/model/commands/personToken/ResetPasswordCommand.d.ts +1 -1
  1502. package/dist/types/model/commands/personToken/ResetPasswordCommand.d.ts.map +1 -1
  1503. package/dist/types/model/commands/personToken/SaveEmailOtpTokenCommand.d.ts.map +1 -1
  1504. package/dist/types/model/commands/personToken/SavePersonTokenCommand.d.ts.map +1 -1
  1505. package/dist/types/model/commands/project/CreateProjectCommand.d.ts.map +1 -1
  1506. package/dist/types/model/commands/project/SetProjectSecretCommand.d.ts.map +1 -1
  1507. package/dist/types/model/commands/project/UpdateProjectCommand.d.ts.map +1 -1
  1508. package/dist/types/model/commands/rateLimit/RecordRateLimitEventCommand.d.ts.map +1 -1
  1509. package/dist/types/model/dtos/Password.d.ts.map +1 -1
  1510. package/dist/types/model/mailing/UserMailer.d.ts.map +1 -1
  1511. package/dist/types/model/mailing/templates/BackupCodesExhausted.mustache.d.ts.map +1 -1
  1512. package/dist/types/model/mailing/templates/EmailChangeNotify.mustache.d.ts.map +1 -1
  1513. package/dist/types/model/mailing/templates/EmailChangeVerify.mustache.d.ts.map +1 -1
  1514. package/dist/types/model/mailing/templates/EmailOtp.mustache.d.ts.map +1 -1
  1515. package/dist/types/model/mailing/templates/EmailVerification.mustache.d.ts.map +1 -1
  1516. package/dist/types/model/mailing/templates/ExistingUserInvited.mustache.d.ts.map +1 -1
  1517. package/dist/types/model/mailing/templates/ForcedSignOut.mustache.d.ts.map +1 -1
  1518. package/dist/types/model/mailing/templates/Layout.mustache.d.ts.map +1 -1
  1519. package/dist/types/model/mailing/templates/NewUserInvited.mustache.d.ts.map +1 -1
  1520. package/dist/types/model/mailing/templates/PasswordReset.mustache.d.ts.map +1 -1
  1521. package/dist/types/model/mailing/templates/PasswordlessSignIn.mustache.d.ts.map +1 -1
  1522. package/dist/types/model/mailing/templates/UnusualLogin.mustache.d.ts.map +1 -1
  1523. package/dist/types/model/mailing/type.d.ts.map +1 -1
  1524. package/dist/types/model/queries/apiKey/ApiKeyListQuery.d.ts.map +1 -1
  1525. package/dist/types/model/queries/apiKey/ApiKeyQuery.d.ts +4 -0
  1526. package/dist/types/model/queries/apiKey/ApiKeyQuery.d.ts.map +1 -1
  1527. package/dist/types/model/queries/apiKey/ApiKeySessionsQuery.d.ts +1 -4
  1528. package/dist/types/model/queries/apiKey/ApiKeySessionsQuery.d.ts.map +1 -1
  1529. package/dist/types/model/queries/authLog/AuthLogQuery.d.ts.map +1 -1
  1530. package/dist/types/model/queries/authLog/NextLoginAttemptQuery.d.ts +2 -2
  1531. package/dist/types/model/queries/authLog/NextLoginAttemptQuery.d.ts.map +1 -1
  1532. package/dist/types/model/queries/authLog/NextMailAttemptQuery.d.ts +2 -2
  1533. package/dist/types/model/queries/authLog/NextMailAttemptQuery.d.ts.map +1 -1
  1534. package/dist/types/model/queries/authPolicy/AuthPoliciesQuery.d.ts.map +1 -1
  1535. package/dist/types/model/queries/configuration/ConfigurationQuery.d.ts.map +1 -1
  1536. package/dist/types/model/queries/customRole/CustomRolesQuery.d.ts +12 -0
  1537. package/dist/types/model/queries/customRole/CustomRolesQuery.d.ts.map +1 -0
  1538. package/dist/types/model/queries/customRole/index.d.ts +2 -0
  1539. package/dist/types/model/queries/customRole/index.d.ts.map +1 -0
  1540. package/dist/types/model/queries/identity/IdentitiesHoldingRoleCountQuery.d.ts +8 -0
  1541. package/dist/types/model/queries/identity/IdentitiesHoldingRoleCountQuery.d.ts.map +1 -0
  1542. package/dist/types/model/queries/identity/IdentityQuery.d.ts +3 -2
  1543. package/dist/types/model/queries/identity/IdentityQuery.d.ts.map +1 -1
  1544. package/dist/types/model/queries/identity/index.d.ts +1 -0
  1545. package/dist/types/model/queries/identity/index.d.ts.map +1 -1
  1546. package/dist/types/model/queries/idp/IdentityProviderBySlugQuery.d.ts.map +1 -1
  1547. package/dist/types/model/queries/idp/IdentityProvidersQuery.d.ts.map +1 -1
  1548. package/dist/types/model/queries/idp/IdpSessionByApiKeyQuery.d.ts.map +1 -1
  1549. package/dist/types/model/queries/idp/IdpSessionsBySidQuery.d.ts.map +1 -1
  1550. package/dist/types/model/queries/idp/IdpSessionsBySubQuery.d.ts.map +1 -1
  1551. package/dist/types/model/queries/idp/LocalAuthDisablingIdpsQuery.d.ts +18 -0
  1552. package/dist/types/model/queries/idp/LocalAuthDisablingIdpsQuery.d.ts.map +1 -0
  1553. package/dist/types/model/queries/idp/PersonIdentityProvidersQuery.d.ts +1 -0
  1554. package/dist/types/model/queries/idp/PersonIdentityProvidersQuery.d.ts.map +1 -1
  1555. package/dist/types/model/queries/idp/helpers.d.ts +1 -1
  1556. package/dist/types/model/queries/idp/helpers.d.ts.map +1 -1
  1557. package/dist/types/model/queries/idp/index.d.ts +1 -0
  1558. package/dist/types/model/queries/idp/index.d.ts.map +1 -1
  1559. package/dist/types/model/queries/idp/types.d.ts +1 -0
  1560. package/dist/types/model/queries/idp/types.d.ts.map +1 -1
  1561. package/dist/types/model/queries/index.d.ts +1 -0
  1562. package/dist/types/model/queries/index.d.ts.map +1 -1
  1563. package/dist/types/model/queries/mailTemplate/MailTemplateListQuery.d.ts.map +1 -1
  1564. package/dist/types/model/queries/mailTemplate/MailTemplateQuery.d.ts.map +1 -1
  1565. package/dist/types/model/queries/membership/AllProjectRolesByIdentityQuery.d.ts.map +1 -1
  1566. package/dist/types/model/queries/membership/IdentityHasProjectMembershipsQuery.d.ts +7 -0
  1567. package/dist/types/model/queries/membership/IdentityHasProjectMembershipsQuery.d.ts.map +1 -0
  1568. package/dist/types/model/queries/membership/ProjectMembersQuery.d.ts.map +1 -1
  1569. package/dist/types/model/queries/membership/ProjectMembershipByIdentityQuery.d.ts.map +1 -1
  1570. package/dist/types/model/queries/membership/ProjectRolesByIdentityQuery.d.ts.map +1 -1
  1571. package/dist/types/model/queries/membership/ProjectSlugSpecification.d.ts.map +1 -1
  1572. package/dist/types/model/queries/membership/index.d.ts +1 -0
  1573. package/dist/types/model/queries/membership/index.d.ts.map +1 -1
  1574. package/dist/types/model/queries/person/PersonByIdPQuery.d.ts.map +1 -1
  1575. package/dist/types/model/queries/person/PersonByIdentityBatchQuery.d.ts.map +1 -1
  1576. package/dist/types/model/queries/person/PersonQuery.d.ts.map +1 -1
  1577. package/dist/types/model/queries/person/PersonQueryBuilderFactory.d.ts.map +1 -1
  1578. package/dist/types/model/queries/person/PersonsQuery.d.ts.map +1 -1
  1579. package/dist/types/model/queries/person/types.d.ts +3 -0
  1580. package/dist/types/model/queries/person/types.d.ts.map +1 -1
  1581. package/dist/types/model/queries/personToken/PersonTokenQuery.d.ts.map +1 -1
  1582. package/dist/types/model/queries/project/ProjectBySlugQuery.d.ts.map +1 -1
  1583. package/dist/types/model/queries/project/ProjectSecretKeysQuery.d.ts.map +1 -1
  1584. package/dist/types/model/queries/project/ProjectSecretsQuery.d.ts.map +1 -1
  1585. package/dist/types/model/queries/project/ProjectUpdateTimestampQuery.d.ts.map +1 -1
  1586. package/dist/types/model/queries/project/ProjectsByIdentityQuery.d.ts.map +1 -1
  1587. package/dist/types/model/queries/project/ProjectsQuery.d.ts.map +1 -1
  1588. package/dist/types/model/queries/rateLimit/RateLimitCountQuery.d.ts +2 -2
  1589. package/dist/types/model/queries/rateLimit/RateLimitCountQuery.d.ts.map +1 -1
  1590. package/dist/types/model/service/AuthLogService.d.ts.map +1 -1
  1591. package/dist/types/model/service/AuthPolicyManager.d.ts.map +1 -1
  1592. package/dist/types/model/service/AuthPolicyResolver.d.ts.map +1 -1
  1593. package/dist/types/model/service/BackupCodeManager.d.ts.map +1 -1
  1594. package/dist/types/model/service/ConfigurationManager.d.ts.map +1 -1
  1595. package/dist/types/model/service/CustomRoleManager.d.ts +46 -0
  1596. package/dist/types/model/service/CustomRoleManager.d.ts.map +1 -0
  1597. package/dist/types/model/service/EmailChangeManager.d.ts.map +1 -1
  1598. package/dist/types/model/service/EmailOtpManager.d.ts.map +1 -1
  1599. package/dist/types/model/service/EmailValidator.d.ts.map +1 -1
  1600. package/dist/types/model/service/EmailVerificationManager.d.ts.map +1 -1
  1601. package/dist/types/model/service/GlobalRoleValidator.d.ts +5 -0
  1602. package/dist/types/model/service/GlobalRoleValidator.d.ts.map +1 -0
  1603. package/dist/types/model/service/HibpChecker.d.ts.map +1 -1
  1604. package/dist/types/model/service/IDPSignInManager.d.ts +13 -1
  1605. package/dist/types/model/service/IDPSignInManager.d.ts.map +1 -1
  1606. package/dist/types/model/service/InviteManager.d.ts.map +1 -1
  1607. package/dist/types/model/service/LoginRiskAnalyzer.d.ts +1 -1
  1608. package/dist/types/model/service/LoginRiskAnalyzer.d.ts.map +1 -1
  1609. package/dist/types/model/service/MailTemplateManager.d.ts.map +1 -1
  1610. package/dist/types/model/service/MembershipValidator.d.ts.map +1 -1
  1611. package/dist/types/model/service/OtpAuthenticator.d.ts.map +1 -1
  1612. package/dist/types/model/service/OtpManager.d.ts.map +1 -1
  1613. package/dist/types/model/service/PanelAccessResolver.d.ts +19 -0
  1614. package/dist/types/model/service/PanelAccessResolver.d.ts.map +1 -0
  1615. package/dist/types/model/service/PasswordChangeManager.d.ts.map +1 -1
  1616. package/dist/types/model/service/PasswordResetManager.d.ts.map +1 -1
  1617. package/dist/types/model/service/PasswordStrengthValidator.d.ts.map +1 -1
  1618. package/dist/types/model/service/PasswordlessSignInManager.d.ts.map +1 -1
  1619. package/dist/types/model/service/PersonAccessManager.d.ts +5 -2
  1620. package/dist/types/model/service/PersonAccessManager.d.ts.map +1 -1
  1621. package/dist/types/model/service/PersonManager.d.ts.map +1 -1
  1622. package/dist/types/model/service/ProjectManager.d.ts.map +1 -1
  1623. package/dist/types/model/service/ProjectMemberManager.d.ts.map +1 -1
  1624. package/dist/types/model/service/RateLimiter.d.ts +1 -1
  1625. package/dist/types/model/service/RateLimiter.d.ts.map +1 -1
  1626. package/dist/types/model/service/RolesManager.d.ts +6 -1
  1627. package/dist/types/model/service/RolesManager.d.ts.map +1 -1
  1628. package/dist/types/model/service/SecretsManager.d.ts.map +1 -1
  1629. package/dist/types/model/service/SignInManager.d.ts.map +1 -1
  1630. package/dist/types/model/service/SignOutManager.d.ts.map +1 -1
  1631. package/dist/types/model/service/SignUpManager.d.ts +3 -1
  1632. package/dist/types/model/service/SignUpManager.d.ts.map +1 -1
  1633. package/dist/types/model/service/apiKey/ApiKeyManager.d.ts +4 -1
  1634. package/dist/types/model/service/apiKey/ApiKeyManager.d.ts.map +1 -1
  1635. package/dist/types/model/service/apiKey/ApiKeyService.d.ts +2 -2
  1636. package/dist/types/model/service/apiKey/ApiKeyService.d.ts.map +1 -1
  1637. package/dist/types/model/service/apiKey/UnpersistedApiKeyManager.d.ts +18 -0
  1638. package/dist/types/model/service/apiKey/UnpersistedApiKeyManager.d.ts.map +1 -1
  1639. package/dist/types/model/service/captcha/CaptchaValidator.d.ts.map +1 -1
  1640. package/dist/types/model/service/captcha/HCaptchaProvider.d.ts.map +1 -1
  1641. package/dist/types/model/service/captcha/RecaptchaV3Provider.d.ts.map +1 -1
  1642. package/dist/types/model/service/captcha/TurnstileProvider.d.ts.map +1 -1
  1643. package/dist/types/model/service/helpers/getPreferredProject.d.ts.map +1 -1
  1644. package/dist/types/model/service/helpers/isPasswordlessEnabled.d.ts.map +1 -1
  1645. package/dist/types/model/service/idp/BackchannelLogoutManager.d.ts.map +1 -1
  1646. package/dist/types/model/service/idp/ClaimMapping.d.ts +330 -0
  1647. package/dist/types/model/service/idp/ClaimMapping.d.ts.map +1 -0
  1648. package/dist/types/model/service/idp/ClaimMappingEvaluator.d.ts +30 -0
  1649. package/dist/types/model/service/idp/ClaimMappingEvaluator.d.ts.map +1 -0
  1650. package/dist/types/model/service/idp/ClaimMappingValidation.d.ts +55 -0
  1651. package/dist/types/model/service/idp/ClaimMappingValidation.d.ts.map +1 -0
  1652. package/dist/types/model/service/idp/IDPClaimSyncService.d.ts +113 -0
  1653. package/dist/types/model/service/idp/IDPClaimSyncService.d.ts.map +1 -0
  1654. package/dist/types/model/service/idp/IDPHandlerRegistry.d.ts.map +1 -1
  1655. package/dist/types/model/service/idp/IDPManager.d.ts +31 -1
  1656. package/dist/types/model/service/idp/IDPManager.d.ts.map +1 -1
  1657. package/dist/types/model/service/idp/IdentityProviderHandler.d.ts +7 -0
  1658. package/dist/types/model/service/idp/IdentityProviderHandler.d.ts.map +1 -1
  1659. package/dist/types/model/service/idp/IdpSessionRevalidator.d.ts +15 -1
  1660. package/dist/types/model/service/idp/IdpSessionRevalidator.d.ts.map +1 -1
  1661. package/dist/types/model/service/idp/PersonIdentityProviderManager.d.ts.map +1 -1
  1662. package/dist/types/model/service/idp/index.d.ts +4 -0
  1663. package/dist/types/model/service/idp/index.d.ts.map +1 -1
  1664. package/dist/types/model/service/idp/providers/AppleProvider.d.ts +2 -2
  1665. package/dist/types/model/service/idp/providers/AppleProvider.d.ts.map +1 -1
  1666. package/dist/types/model/service/idp/providers/FacebookProvider.d.ts +2 -2
  1667. package/dist/types/model/service/idp/providers/FacebookProvider.d.ts.map +1 -1
  1668. package/dist/types/model/service/idp/providers/OIDCHelpers.d.ts +13 -1
  1669. package/dist/types/model/service/idp/providers/OIDCHelpers.d.ts.map +1 -1
  1670. package/dist/types/model/service/idp/providers/OIDCProvider.d.ts +1 -1
  1671. package/dist/types/model/service/idp/providers/OIDCProvider.d.ts.map +1 -1
  1672. package/dist/types/model/service/idp/providers/OIDCTypes.d.ts +5 -5
  1673. package/dist/types/model/service/idp/providers/helpers.d.ts.map +1 -1
  1674. package/dist/types/model/service/index.d.ts +3 -0
  1675. package/dist/types/model/service/index.d.ts.map +1 -1
  1676. package/dist/types/model/service/membershipUtils.d.ts.map +1 -1
  1677. package/dist/types/model/type/AuthLog.d.ts +1 -1
  1678. package/dist/types/model/type/AuthLog.d.ts.map +1 -1
  1679. package/dist/types/model/type/Config.d.ts +2 -0
  1680. package/dist/types/model/type/Config.d.ts.map +1 -1
  1681. package/dist/types/model/type/CustomRole.d.ts +9 -0
  1682. package/dist/types/model/type/CustomRole.d.ts.map +1 -0
  1683. package/dist/types/model/type/IdentityProvider.d.ts +2 -0
  1684. package/dist/types/model/type/IdentityProvider.d.ts.map +1 -1
  1685. package/dist/types/model/type/PersonToken.d.ts +2 -0
  1686. package/dist/types/model/type/PersonToken.d.ts.map +1 -1
  1687. package/dist/types/model/type/RateLimit.d.ts +6 -6
  1688. package/dist/types/model/type/RateLimit.d.ts.map +1 -1
  1689. package/dist/types/model/type/index.d.ts +1 -0
  1690. package/dist/types/model/type/index.d.ts.map +1 -1
  1691. package/dist/types/model/utils/DatabaseContext.d.ts +15 -1
  1692. package/dist/types/model/utils/DatabaseContext.d.ts.map +1 -1
  1693. package/dist/types/model/utils/Response.d.ts.map +1 -1
  1694. package/dist/types/model/utils/email.d.ts.map +1 -1
  1695. package/dist/types/model/utils/hex.d.ts.map +1 -1
  1696. package/dist/types/model/utils/interval.d.ts.map +1 -1
  1697. package/dist/types/model/utils/time.d.ts.map +1 -1
  1698. package/dist/types/model/utils/token.d.ts +1 -2
  1699. package/dist/types/model/utils/token.d.ts.map +1 -1
  1700. package/dist/types/resolvers/ResolverFactory.d.ts +6 -0
  1701. package/dist/types/resolvers/ResolverFactory.d.ts.map +1 -1
  1702. package/dist/types/resolvers/TenantResolverContext.d.ts +1 -1
  1703. package/dist/types/resolvers/TenantResolverContext.d.ts.map +1 -1
  1704. package/dist/types/resolvers/TenantResolverContextFactory.d.ts +1 -1
  1705. package/dist/types/resolvers/TenantResolverContextFactory.d.ts.map +1 -1
  1706. package/dist/types/resolvers/errorUtils.d.ts.map +1 -1
  1707. package/dist/types/resolvers/membershipUtils.d.ts.map +1 -1
  1708. package/dist/types/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.d.ts.map +1 -1
  1709. package/dist/types/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.d.ts.map +1 -1
  1710. package/dist/types/resolvers/mutation/configuration/AuthPolicyMutationResolver.d.ts.map +1 -1
  1711. package/dist/types/resolvers/mutation/configuration/ConfigurationMutationResolver.d.ts.map +1 -1
  1712. package/dist/types/resolvers/mutation/customRole/CustomRoleMutationResolver.d.ts +16 -0
  1713. package/dist/types/resolvers/mutation/customRole/CustomRoleMutationResolver.d.ts.map +1 -0
  1714. package/dist/types/resolvers/mutation/identity/GlobalRolesMutationResolver.d.ts.map +1 -1
  1715. package/dist/types/resolvers/mutation/idp/AddIDPMutationResolver.d.ts.map +1 -1
  1716. package/dist/types/resolvers/mutation/idp/DisableIDPMutationResolver.d.ts.map +1 -1
  1717. package/dist/types/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.d.ts.map +1 -1
  1718. package/dist/types/resolvers/mutation/idp/EnableIDPMutationResolver.d.ts.map +1 -1
  1719. package/dist/types/resolvers/mutation/idp/UpdateIDPMutationResolver.d.ts.map +1 -1
  1720. package/dist/types/resolvers/mutation/idp/audit.d.ts.map +1 -1
  1721. package/dist/types/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.d.ts +2 -0
  1722. package/dist/types/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.d.ts.map +1 -1
  1723. package/dist/types/resolvers/mutation/person/ChangePasswordMutationResolver.d.ts.map +1 -1
  1724. package/dist/types/resolvers/mutation/person/ChangeProfileMutationResolver.d.ts.map +1 -1
  1725. package/dist/types/resolvers/mutation/person/DisablePersonMutationResolver.d.ts +1 -1
  1726. package/dist/types/resolvers/mutation/person/DisablePersonMutationResolver.d.ts.map +1 -1
  1727. package/dist/types/resolvers/mutation/person/EmailOtpMutationResolver.d.ts.map +1 -1
  1728. package/dist/types/resolvers/mutation/person/EmailVerificationMutationResolver.d.ts.map +1 -1
  1729. package/dist/types/resolvers/mutation/person/EnablePersonMutationResolver.d.ts +11 -0
  1730. package/dist/types/resolvers/mutation/person/EnablePersonMutationResolver.d.ts.map +1 -0
  1731. package/dist/types/resolvers/mutation/person/ForceSignOutMutationResolver.d.ts.map +1 -1
  1732. package/dist/types/resolvers/mutation/person/IDPMutationResolver.d.ts.map +1 -1
  1733. package/dist/types/resolvers/mutation/person/InviteMutationResolver.d.ts.map +1 -1
  1734. package/dist/types/resolvers/mutation/person/OtpMutationResolver.d.ts.map +1 -1
  1735. package/dist/types/resolvers/mutation/person/PasswordlessMutationResolver.d.ts.map +1 -1
  1736. package/dist/types/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.d.ts.map +1 -1
  1737. package/dist/types/resolvers/mutation/person/ResetPasswordMutationResolver.d.ts.map +1 -1
  1738. package/dist/types/resolvers/mutation/person/ResetPersonMfaMutationResolver.d.ts.map +1 -1
  1739. package/dist/types/resolvers/mutation/person/RevokeSessionMutationResolver.d.ts.map +1 -1
  1740. package/dist/types/resolvers/mutation/person/SignInMutationResolver.d.ts.map +1 -1
  1741. package/dist/types/resolvers/mutation/person/SignOutMutationResolver.d.ts.map +1 -1
  1742. package/dist/types/resolvers/mutation/person/SignUpMutationResolver.d.ts.map +1 -1
  1743. package/dist/types/resolvers/mutation/person/TogglePasswordlessMutationResolver.d.ts.map +1 -1
  1744. package/dist/types/resolvers/mutation/project/CreateProjectMutationResolver.d.ts.map +1 -1
  1745. package/dist/types/resolvers/mutation/project/SetProjectSecretMutationResolver.d.ts.map +1 -1
  1746. package/dist/types/resolvers/mutation/project/UpdateProjectMutationResolver.d.ts.map +1 -1
  1747. package/dist/types/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.d.ts.map +1 -1
  1748. package/dist/types/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.d.ts.map +1 -1
  1749. package/dist/types/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.d.ts.map +1 -1
  1750. package/dist/types/resolvers/mutation/projectMember/audit.d.ts +1 -1
  1751. package/dist/types/resolvers/mutation/projectMember/audit.d.ts.map +1 -1
  1752. package/dist/types/resolvers/query/ApiKeyQueryResolver.d.ts.map +1 -1
  1753. package/dist/types/resolvers/query/AuthLogQueryResolver.d.ts.map +1 -1
  1754. package/dist/types/resolvers/query/AuthPolicyQueryResolver.d.ts.map +1 -1
  1755. package/dist/types/resolvers/query/ConfigurationQueryResolver.d.ts.map +1 -1
  1756. package/dist/types/resolvers/query/CustomRoleQueryResolver.d.ts +11 -0
  1757. package/dist/types/resolvers/query/CustomRoleQueryResolver.d.ts.map +1 -0
  1758. package/dist/types/resolvers/query/IDPQueryResolver.d.ts.map +1 -1
  1759. package/dist/types/resolvers/query/MailTemplateQueryResolver.d.ts +1 -0
  1760. package/dist/types/resolvers/query/MailTemplateQueryResolver.d.ts.map +1 -1
  1761. package/dist/types/resolvers/query/MeQueryResolver.d.ts.map +1 -1
  1762. package/dist/types/resolvers/query/PersonQueryResolver.d.ts.map +1 -1
  1763. package/dist/types/resolvers/query/ProjectMembersQueryResolver.d.ts.map +1 -1
  1764. package/dist/types/resolvers/query/ProjectQueryResolver.d.ts.map +1 -1
  1765. package/dist/types/resolvers/responseHelpers/ApiKeyResponseFactory.d.ts.map +1 -1
  1766. package/dist/types/resolvers/responseHelpers/PersonResponseFactory.d.ts.map +1 -1
  1767. package/dist/types/resolvers/responseHelpers/ProjectResponseFactory.d.ts +10 -0
  1768. package/dist/types/resolvers/responseHelpers/ProjectResponseFactory.d.ts.map +1 -0
  1769. package/dist/types/resolvers/responseHelpers/SignInResponseFactory.d.ts.map +1 -1
  1770. package/dist/types/resolvers/types/IdentityTypeResolver.d.ts.map +1 -1
  1771. package/dist/types/resolvers/types/PersonTypeResolver.d.ts +15 -1
  1772. package/dist/types/resolvers/types/PersonTypeResolver.d.ts.map +1 -1
  1773. package/dist/types/resolvers/types/ProjectTypeResolver.d.ts +15 -6
  1774. package/dist/types/resolvers/types/ProjectTypeResolver.d.ts.map +1 -1
  1775. package/dist/types/schema/index.d.ts +381 -21
  1776. package/dist/types/schema/index.d.ts.map +1 -1
  1777. package/dist/types/schema/tenant.graphql.d.ts.map +1 -1
  1778. package/dist/types/schema/types.d.ts +2 -2
  1779. package/dist/types/schema/types.d.ts.map +1 -1
  1780. package/dist/types/tsconfig.tsbuildinfo +1 -1
  1781. package/dist/types/utils/Mailer.d.ts.map +1 -1
  1782. package/dist/types/utils/TemplateRenderer.d.ts.map +1 -1
  1783. package/dist/types/utils/array.d.ts.map +1 -1
  1784. package/dist/types/utils/batchQuery.d.ts.map +1 -1
  1785. package/package.json +12 -12
  1786. package/readme.md +56 -0
  1787. package/src/TenantContainer.ts +46 -8
  1788. package/src/migrations/2026-06-18-120000-idp-claim-mapping.ts +15 -0
  1789. package/src/migrations/2026-08-03-120000-person-enable-auth-log.ts +12 -0
  1790. package/src/migrations/2026-08-04-120000-config-panel.ts +13 -0
  1791. package/src/migrations/2026-09-04-120000-idp-disable-local-authentication.ts +18 -0
  1792. package/src/migrations/2026-09-11-120000-custom-role.ts +19 -0
  1793. package/src/migrations/runner.ts +10 -0
  1794. package/src/migrations/snapshot.ts +22 -2
  1795. package/src/model/authorization/CustomRoleAuthorizator.ts +72 -0
  1796. package/src/model/authorization/CustomRolePermissions.ts +558 -0
  1797. package/src/model/authorization/PermissionActions.ts +74 -17
  1798. package/src/model/authorization/PermissionContextFactory.ts +39 -3
  1799. package/src/model/authorization/PermissionsFactory.ts +65 -31
  1800. package/src/model/authorization/Roles.ts +13 -0
  1801. package/src/model/authorization/TargetIdentityPermission.ts +37 -0
  1802. package/src/model/authorization/index.ts +3 -0
  1803. package/src/model/commands/apiKey/ApiKeyHelper.ts +23 -0
  1804. package/src/model/commands/apiKey/CreateApiKeyCommand.ts +12 -5
  1805. package/src/model/commands/apiKey/ProlongApiKeyCommand.ts +22 -14
  1806. package/src/model/commands/authLog/CreateAuthLogEntryCommand.ts +1 -0
  1807. package/src/model/commands/configuration/UpdateConfigurationCommand.ts +5 -4
  1808. package/src/model/commands/customRole/CreateCustomRoleCommand.ts +30 -0
  1809. package/src/model/commands/customRole/DeleteCustomRoleCommand.ts +20 -0
  1810. package/src/model/commands/customRole/RemoveCustomRoleAssignmentsCommand.ts +20 -0
  1811. package/src/model/commands/customRole/UpdateCustomRoleCommand.ts +30 -0
  1812. package/src/model/commands/customRole/index.ts +4 -0
  1813. package/src/model/commands/identity/PatchIdentityGlobalRoles.ts +1 -1
  1814. package/src/model/commands/idp/ClaimIdpRevalidationCommand.ts +8 -7
  1815. package/src/model/commands/idp/CreateIdpCommand.ts +7 -1
  1816. package/src/model/commands/idp/CreateIdpSessionCommand.ts +5 -2
  1817. package/src/model/commands/idp/UpdateIdpCommand.ts +5 -1
  1818. package/src/model/commands/idp/UpdateIdpSessionCommand.ts +3 -2
  1819. package/src/model/commands/index.ts +1 -0
  1820. package/src/model/commands/membership/UpdateProjectMemberCommand.ts +1 -1
  1821. package/src/model/commands/membership/index.ts +2 -1
  1822. package/src/model/commands/membership/variables/index.ts +1 -0
  1823. package/src/model/commands/person/CreatePersonCommand.ts +1 -0
  1824. package/src/model/commands/person/EnablePersonCommand.ts +18 -0
  1825. package/src/model/commands/person/SetMfaGraceUntilCommand.ts +9 -4
  1826. package/src/model/commands/personToken/ResetPasswordCommand.ts +2 -3
  1827. package/src/model/commands/personToken/SaveEmailOtpTokenCommand.ts +5 -4
  1828. package/src/model/commands/personToken/SavePersonTokenCommand.ts +13 -7
  1829. package/src/model/commands/rateLimit/RecordRateLimitEventCommand.ts +3 -1
  1830. package/src/model/queries/apiKey/ApiKeyQuery.ts +17 -1
  1831. package/src/model/queries/apiKey/ApiKeySessionsQuery.ts +2 -2
  1832. package/src/model/queries/authLog/NextLoginAttemptQuery.ts +14 -12
  1833. package/src/model/queries/authLog/NextMailAttemptQuery.ts +12 -10
  1834. package/src/model/queries/configuration/ConfigurationQuery.ts +4 -0
  1835. package/src/model/queries/customRole/CustomRolesQuery.ts +30 -0
  1836. package/src/model/queries/customRole/index.ts +1 -0
  1837. package/src/model/queries/identity/IdentitiesHoldingRoleCountQuery.ts +17 -0
  1838. package/src/model/queries/identity/IdentityQuery.ts +10 -4
  1839. package/src/model/queries/identity/index.ts +1 -0
  1840. package/src/model/queries/idp/LocalAuthDisablingIdpsQuery.ts +41 -0
  1841. package/src/model/queries/idp/PersonIdentityProvidersQuery.ts +2 -0
  1842. package/src/model/queries/idp/helpers.ts +3 -2
  1843. package/src/model/queries/idp/index.ts +1 -0
  1844. package/src/model/queries/idp/types.ts +1 -0
  1845. package/src/model/queries/index.ts +1 -0
  1846. package/src/model/queries/membership/IdentityHasProjectMembershipsQuery.ts +17 -0
  1847. package/src/model/queries/membership/ProjectMembersQuery.ts +1 -0
  1848. package/src/model/queries/membership/index.ts +1 -0
  1849. package/src/model/queries/person/PersonQueryBuilderFactory.ts +4 -0
  1850. package/src/model/queries/person/types.ts +3 -0
  1851. package/src/model/queries/personToken/PersonTokenQuery.ts +4 -0
  1852. package/src/model/queries/rateLimit/RateLimitCountQuery.ts +5 -2
  1853. package/src/model/service/AuthLogService.ts +18 -2
  1854. package/src/model/service/CustomRoleManager.ts +221 -0
  1855. package/src/model/service/EmailChangeManager.ts +3 -3
  1856. package/src/model/service/EmailOtpManager.ts +0 -1
  1857. package/src/model/service/EmailVerificationManager.ts +3 -3
  1858. package/src/model/service/GlobalRoleValidator.ts +30 -0
  1859. package/src/model/service/IDPSignInManager.ts +74 -14
  1860. package/src/model/service/PanelAccessResolver.ts +32 -0
  1861. package/src/model/service/PasswordResetManager.ts +11 -3
  1862. package/src/model/service/PasswordlessSignInManager.ts +26 -6
  1863. package/src/model/service/PersonAccessManager.ts +19 -3
  1864. package/src/model/service/RateLimiter.ts +2 -3
  1865. package/src/model/service/RolesManager.ts +28 -14
  1866. package/src/model/service/SignInManager.ts +16 -8
  1867. package/src/model/service/SignUpManager.ts +12 -4
  1868. package/src/model/service/apiKey/ApiKeyManager.ts +75 -53
  1869. package/src/model/service/apiKey/ApiKeyService.ts +2 -2
  1870. package/src/model/service/apiKey/UnpersistedApiKeyManager.ts +24 -0
  1871. package/src/model/service/idp/ClaimMapping.ts +283 -0
  1872. package/src/model/service/idp/ClaimMappingEvaluator.ts +226 -0
  1873. package/src/model/service/idp/ClaimMappingValidation.ts +158 -0
  1874. package/src/model/service/idp/IDPClaimSyncService.ts +401 -0
  1875. package/src/model/service/idp/IDPManager.ts +126 -21
  1876. package/src/model/service/idp/IdentityProviderHandler.ts +7 -0
  1877. package/src/model/service/idp/IdpSessionRevalidator.ts +130 -25
  1878. package/src/model/service/idp/PersonIdentityProviderManager.ts +8 -0
  1879. package/src/model/service/idp/index.ts +4 -0
  1880. package/src/model/service/idp/providers/OIDCHelpers.ts +161 -53
  1881. package/src/model/service/idp/providers/OIDCProvider.ts +4 -1
  1882. package/src/model/service/index.ts +3 -0
  1883. package/src/model/type/AuthLog.ts +4 -0
  1884. package/src/model/type/Config.ts +3 -0
  1885. package/src/model/type/CustomRole.ts +8 -0
  1886. package/src/model/type/IdentityProvider.ts +2 -0
  1887. package/src/model/type/PersonToken.ts +2 -0
  1888. package/src/model/type/index.ts +1 -0
  1889. package/src/model/utils/DatabaseContext.ts +30 -6
  1890. package/src/model/utils/token.ts +2 -3
  1891. package/src/resolvers/ResolverFactory.ts +17 -0
  1892. package/src/resolvers/TenantResolverContext.ts +1 -1
  1893. package/src/resolvers/TenantResolverContextFactory.ts +5 -5
  1894. package/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.ts +13 -5
  1895. package/src/resolvers/mutation/customRole/CustomRoleMutationResolver.ts +125 -0
  1896. package/src/resolvers/mutation/identity/GlobalRolesMutationResolver.ts +30 -7
  1897. package/src/resolvers/mutation/idp/AddIDPMutationResolver.ts +1 -0
  1898. package/src/resolvers/mutation/idp/UpdateIDPMutationResolver.ts +1 -0
  1899. package/src/resolvers/mutation/idp/audit.ts +1 -0
  1900. package/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.ts +48 -14
  1901. package/src/resolvers/mutation/person/ChangePasswordMutationResolver.ts +2 -2
  1902. package/src/resolvers/mutation/person/ChangeProfileMutationResolver.ts +9 -3
  1903. package/src/resolvers/mutation/person/DisablePersonMutationResolver.ts +5 -5
  1904. package/src/resolvers/mutation/person/EmailVerificationMutationResolver.ts +1 -1
  1905. package/src/resolvers/mutation/person/EnablePersonMutationResolver.ts +50 -0
  1906. package/src/resolvers/mutation/person/ForceSignOutMutationResolver.ts +2 -2
  1907. package/src/resolvers/mutation/person/IDPMutationResolver.ts +31 -0
  1908. package/src/resolvers/mutation/person/PasswordlessMutationResolver.ts +7 -0
  1909. package/src/resolvers/mutation/person/ResetPasswordMutationResolver.ts +1 -1
  1910. package/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.ts +2 -2
  1911. package/src/resolvers/mutation/person/SignInMutationResolver.ts +22 -9
  1912. package/src/resolvers/mutation/person/SignUpMutationResolver.ts +1 -1
  1913. package/src/resolvers/query/CustomRoleQueryResolver.ts +41 -0
  1914. package/src/resolvers/query/MailTemplateQueryResolver.ts +13 -8
  1915. package/src/resolvers/query/PersonQueryResolver.ts +3 -1
  1916. package/src/resolvers/query/ProjectQueryResolver.ts +3 -2
  1917. package/src/resolvers/responseHelpers/PersonResponseFactory.ts +5 -0
  1918. package/src/resolvers/responseHelpers/ProjectResponseFactory.ts +24 -0
  1919. package/src/resolvers/responseHelpers/SignInResponseFactory.ts +1 -1
  1920. package/src/resolvers/types/IdentityTypeResolver.ts +50 -14
  1921. package/src/resolvers/types/PersonTypeResolver.ts +45 -4
  1922. package/src/resolvers/types/ProjectTypeResolver.ts +33 -1
  1923. package/src/schema/index.ts +483 -15
  1924. package/src/schema/tenant.graphql.ts +275 -15
  1925. package/tests/cases/integration/database/dbClock.test.ts +171 -0
  1926. package/tests/cases/integration/mocked/antiAbuseSignUp.test.ts +2 -2
  1927. package/tests/cases/integration/mocked/changeMyProfileEmailVerificationMutation.test.ts +10 -11
  1928. package/tests/cases/integration/mocked/changePasswordMutation.test.ts +43 -0
  1929. package/tests/cases/integration/mocked/changeProfileMutation.test.ts +2 -0
  1930. package/tests/cases/integration/mocked/configurationPanel.test.ts +105 -0
  1931. package/tests/cases/integration/mocked/confirmEmailChangeMutation.test.ts +4 -2
  1932. package/tests/cases/integration/mocked/createSessionKeyMutation.test.ts +33 -0
  1933. package/tests/cases/integration/mocked/customRoleCrud.test.ts +442 -0
  1934. package/tests/cases/integration/mocked/disablePersonMutation.test.ts +92 -0
  1935. package/tests/cases/integration/mocked/enablePersonMutation.test.ts +137 -0
  1936. package/tests/cases/integration/mocked/forceSignOutPersonMutation.test.ts +3 -1
  1937. package/tests/cases/integration/mocked/globalIdentityRolesMutation.test.ts +169 -3
  1938. package/tests/cases/integration/mocked/gql/passwordless.ts +10 -0
  1939. package/tests/cases/integration/mocked/idpClaimMappingConfig.test.ts +332 -0
  1940. package/tests/cases/integration/mocked/listProjectMembersQuery.test.ts +8 -3
  1941. package/tests/cases/integration/mocked/localAuthenticationDisabled.test.ts +182 -0
  1942. package/tests/cases/integration/mocked/mailTemplateScope.test.ts +95 -0
  1943. package/tests/cases/integration/mocked/permissionsQuery.test.ts +153 -0
  1944. package/tests/cases/integration/mocked/personByIdQuery.test.ts +59 -1
  1945. package/tests/cases/integration/mocked/personIdentityProviders.test.ts +67 -0
  1946. package/tests/cases/integration/mocked/personsQuery.test.ts +38 -5
  1947. package/tests/cases/integration/mocked/requestEmailVerificationMutation.test.ts +15 -6
  1948. package/tests/cases/integration/mocked/resetPersonMfaMutation.test.ts +5 -3
  1949. package/tests/cases/integration/mocked/signInAnomalyDetection.test.ts +13 -2
  1950. package/tests/cases/integration/mocked/signInIdpClaimMapping.test.ts +1258 -0
  1951. package/tests/cases/integration/mocked/signInIdpClaimMappingFixes.test.ts +344 -0
  1952. package/tests/cases/integration/mocked/signInIdpClaimMappingSafety.test.ts +531 -0
  1953. package/tests/cases/integration/mocked/signInIdpMutation.test.ts +105 -1
  1954. package/tests/cases/integration/mocked/signInMfaEnforcement.test.ts +20 -5
  1955. package/tests/cases/integration/mocked/signInMutation.test.ts +14 -0
  1956. package/tests/cases/integration/mocked/signInPasswordlessMutation.test.ts +38 -1
  1957. package/tests/cases/integration/mocked/signUpMutation.test.ts +62 -3
  1958. package/tests/cases/integration/mocked/sql/createPersonTokenSql.ts +4 -3
  1959. package/tests/cases/integration/mocked/sql/createSessionKeySql.ts +2 -2
  1960. package/tests/cases/integration/mocked/sql/emailOtpSql.ts +10 -8
  1961. package/tests/cases/integration/mocked/sql/getApiKeySql.ts +2 -2
  1962. package/tests/cases/integration/mocked/sql/getConfigSql.ts +3 -0
  1963. package/tests/cases/integration/mocked/sql/getCustomRolesSql.ts +25 -0
  1964. package/tests/cases/integration/mocked/sql/getIdentityProjectMembershipPresenceSql.ts +11 -0
  1965. package/tests/cases/integration/mocked/sql/getIdpBySlugSql.ts +1 -1
  1966. package/tests/cases/integration/mocked/sql/getNextLoginAttemptSql.ts +15 -11
  1967. package/tests/cases/integration/mocked/sql/getNextMailAttemptSql.ts +12 -13
  1968. package/tests/cases/integration/mocked/sql/getPersonByEmailSql.ts +5 -2
  1969. package/tests/cases/integration/mocked/sql/getPersonByIdSql.ts +1 -1
  1970. package/tests/cases/integration/mocked/sql/getPersonByIdentity.ts +1 -1
  1971. package/tests/cases/integration/mocked/sql/getPersonByIdpSql.ts +1 -1
  1972. package/tests/cases/integration/mocked/sql/getPersonsByIdentitySql.ts +1 -1
  1973. package/tests/cases/integration/mocked/sql/getProjectBySlugSql.ts +1 -1
  1974. package/tests/cases/integration/mocked/sql/listPersonsSql.ts +5 -2
  1975. package/tests/cases/integration/mocked/sql/listSessionsSql.ts +3 -3
  1976. package/tests/cases/integration/mocked/sql/localAuthDisablingIdpsSql.ts +21 -0
  1977. package/tests/cases/integration/mocked/sql/personIdentityProvidersSql.ts +4 -2
  1978. package/tests/cases/integration/mocked/sql/removeMembershipSql.ts +14 -0
  1979. package/tests/cases/integration/mocked/sql/sqlTransaction.ts +28 -0
  1980. package/tests/cases/integration/mocked/trustForwardedClientInfo.test.ts +60 -3
  1981. package/tests/cases/integration/mocked/verifyEmailMutation.test.ts +9 -5
  1982. package/tests/cases/unit/apiKey/createSessionApiKeyPolicy.test.ts +9 -6
  1983. package/tests/cases/unit/apiKey/prolongApiKeyCommand.test.ts +29 -19
  1984. package/tests/cases/unit/apiKey/unpersistedApiKeyManager.test.ts +4 -5
  1985. package/tests/cases/unit/apiKey/verifyAndProlongIdle.test.ts +16 -6
  1986. package/tests/cases/unit/apiKey/verifyAndProlongReplica.test.ts +173 -0
  1987. package/tests/cases/unit/authLogBaselineWrite.test.ts +26 -3
  1988. package/tests/cases/unit/backupCodeManager.test.ts +1 -0
  1989. package/tests/cases/unit/customRoleAuthorizator.test.ts +149 -0
  1990. package/tests/cases/unit/customRolePermissions.test.ts +583 -0
  1991. package/tests/cases/unit/databaseContextRetry.test.ts +81 -0
  1992. package/tests/cases/unit/emailOtpManager.test.ts +10 -8
  1993. package/tests/cases/unit/idp/claimIdpRevalidation.test.ts +50 -0
  1994. package/tests/cases/unit/idp/claimMappingEvaluator.test.ts +554 -0
  1995. package/tests/cases/unit/idp/claimMappingValidation.test.ts +134 -0
  1996. package/tests/cases/unit/idp/idpManagerConfigMerge.test.ts +97 -0
  1997. package/tests/cases/unit/idp/idpManagerUnknownConfigKeys.test.ts +108 -0
  1998. package/tests/cases/unit/idp/idpSessionRevalidator.test.ts +261 -26
  1999. package/tests/cases/unit/idp/oidcClaims.test.ts +29 -0
  2000. package/tests/cases/unit/idp/oidcResponse.test.ts +54 -0
  2001. package/tests/cases/unit/idp/oidcRevalidate.test.ts +94 -2
  2002. package/tests/cases/unit/otpManager.test.ts +1 -0
  2003. package/tests/cases/unit/panelAccessResolver.test.ts +57 -0
  2004. package/tests/cases/unit/rateLimiter.test.ts +7 -7
  2005. package/tests/cases/unit/savePersonTokenCommand.test.ts +40 -0
  2006. package/tests/cases/unit/updateConfigurationCommand.test.ts +63 -0
  2007. package/tests/src/IdPMock.ts +6 -0
  2008. package/tests/src/testTenant.ts +60 -12
  2009. package/dist/development/src/model/commands/membership/RemoveProjectMembershipsCommand.cjs.map +0 -1
  2010. package/dist/development/src/model/commands/membership/RemoveProjectMembershipsCommand.js.map +0 -1
  2011. package/dist/production/src/model/commands/membership/RemoveProjectMembershipsCommand.cjs.map +0 -1
  2012. package/dist/production/src/model/commands/membership/RemoveProjectMembershipsCommand.js.map +0 -1
  2013. package/dist/types/model/commands/membership/RemoveProjectMembershipsCommand.d.ts.map +0 -1
  2014. /package/src/model/commands/membership/{RemoveProjectMembershipsCommand.ts → RemoveProjectMembershipCommand.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectMemberManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/ProjectMemberManager.ts"],"sourcesContent":["import {\n\tAddProjectMemberCommand,\n\tMembershipUpdateInput,\n\tRemoveProjectMemberCommand,\n\tRemoveProjectMemberResponse,\n\tUpdateProjectMemberCommand,\n\tUpdateProjectMemberResponse,\n} from '../commands/index.js'\nimport { ProjectMembershipByIdentityQuery, ProjectMembersQuery } from '../queries/index.js'\nimport { AddProjectMemberErrorCode, ProjectMembersInput } from '../../schema/index.js'\nimport { AccessVerifier, PermissionActions, TenantRole } from '../authorization/index.js'\nimport { indexListBy, notEmpty } from '../../utils/array.js'\nimport { createSetMembershipVariables } from './membershipUtils.js'\nimport { Acl, ProjectRole } from '@contember/schema'\nimport { Response } from '../utils/Response.js'\nimport { DatabaseContext } from '../utils/index.js'\n\nexport class ProjectMemberManager {\n\tasync addProjectMember(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\tidentityId: string,\n\t\tmemberships: readonly Acl.Membership[],\n\t): Promise<AddProjectMemberResponse> {\n\t\treturn await dbContext.transaction(async db => {\n\t\t\treturn await db.commandBus.execute(\n\t\t\t\tnew AddProjectMemberCommand(projectId, identityId, createSetMembershipVariables(memberships)),\n\t\t\t)\n\t\t})\n\t}\n\n\tasync updateProjectMember(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\tidentityId: string,\n\t\tmemberships: readonly MembershipUpdateInput[],\n\t): Promise<UpdateProjectMemberResponse> {\n\t\treturn await dbContext.transaction(\n\t\t\tasync db => await db.commandBus.execute(new UpdateProjectMemberCommand(projectId, identityId, memberships)),\n\t\t)\n\t}\n\n\tasync removeProjectMember(dbContext: DatabaseContext, projectId: string, identityId: string): Promise<RemoveProjectMemberResponse> {\n\t\treturn await dbContext.transaction(\n\t\t\tasync db => await db.commandBus.execute(new RemoveProjectMemberCommand(projectId, identityId)),\n\t\t)\n\t}\n\n\tasync getAllProjectMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string; roles?: readonly string[] },\n\t\tverifier: AccessVerifier | undefined,\n\t): Promise<readonly Acl.Membership[]> {\n\t\treturn [\n\t\t\t...this.getImplicitProjectMemberships(identity),\n\t\t\t...await this.getStoredProjectsMemberships(dbContext, project, identity, verifier),\n\t\t]\n\t}\n\n\tasync getEffectiveProjectMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string; roles?: readonly string[] },\n\t): Promise<readonly Acl.Membership[]> {\n\t\tconst implicit = this.getImplicitProjectMemberships(identity)\n\t\tif (implicit.length > 0) {\n\t\t\treturn implicit\n\t\t}\n\t\treturn await this.getStoredProjectsMemberships(dbContext, project, identity, undefined)\n\t}\n\n\tasync getStoredProjectsMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string },\n\t\tverifier: AccessVerifier | undefined,\n\t): Promise<readonly Acl.Membership[]> {\n\t\tconst memberships = await dbContext.queryHandler.fetch(\n\t\t\tnew ProjectMembershipByIdentityQuery(project, [identity.id]),\n\t\t)\n\t\tif (verifier === undefined) {\n\t\t\treturn memberships\n\t\t}\n\t\treturn await this.filterMemberships(memberships, verifier)\n\t}\n\n\tprivate getImplicitProjectMemberships(identity: { id: string; roles?: readonly string[] }): readonly Acl.Membership[] {\n\t\tif (identity.roles?.includes(TenantRole.SUPER_ADMIN) || identity.roles?.includes(TenantRole.PROJECT_ADMIN)) {\n\t\t\treturn [{ role: ProjectRole.ADMIN, variables: [] }]\n\t\t}\n\t\treturn []\n\t}\n\n\tasync getProjectMembers(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\taccessVerifier: AccessVerifier,\n\t\tinput: ProjectMembersInput,\n\t): Promise<GetProjectMembersResponse> {\n\t\treturn dbContext.transaction(async db => {\n\t\t\tconst members = await db.queryHandler.fetch(new ProjectMembersQuery(projectId, input))\n\t\t\tconst memberships = await db.queryHandler.fetch(\n\t\t\t\tnew ProjectMembershipByIdentityQuery(\n\t\t\t\t\t{ id: projectId },\n\t\t\t\t\tmembers.map(it => it.id),\n\t\t\t\t),\n\t\t\t)\n\t\t\tconst filteredMemberships = await this.filterMemberships(memberships, accessVerifier)\n\t\t\tconst byIdentity = indexListBy(filteredMemberships, 'identityId')\n\t\t\treturn members\n\t\t\t\t.map(it => (byIdentity[it.id] ? { identity: it, memberships: byIdentity[it.id] } : null))\n\t\t\t\t.filter(notEmpty)\n\t\t})\n\t}\n\n\tprivate async filterMemberships<T extends Acl.Membership>(\n\t\tmemberships: readonly T[],\n\t\tverifier: AccessVerifier,\n\t): Promise<T[]> {\n\t\tconst filteredMemberships: T[] = []\n\t\tnextMembership: for (const membership of memberships) {\n\t\t\tif (!(await verifier(PermissionActions.PROJECT_VIEW_MEMBER([{ role: membership.role, variables: [] }])))) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst variables: { values: Acl.MembershipVariable['values']; name: string }[] = []\n\t\t\tfor (const variable of membership.variables) {\n\t\t\t\tconst values = await this.filterProjectMembershipVariableValues(membership, variable, verifier)\n\t\t\t\tif (values.length === 0) {\n\t\t\t\t\tcontinue nextMembership\n\t\t\t\t}\n\t\t\t\tvariables.push({ name: variable.name, values })\n\t\t\t}\n\t\t\tfilteredMemberships.push({ ...membership, variables })\n\t\t}\n\n\t\treturn filteredMemberships\n\t}\n\n\tprivate async filterProjectMembershipVariableValues(\n\t\tmembership: Acl.Membership,\n\t\tvariable: Acl.MembershipVariable,\n\t\tverifier: AccessVerifier,\n\t): Promise<Acl.MembershipVariable['values']> {\n\t\tconst values = await Promise.all(\n\t\t\tvariable.values.map(async (value): Promise<string | null> => {\n\t\t\t\tconst subMembership = {\n\t\t\t\t\trole: membership.role,\n\t\t\t\t\tvariables: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: variable.name,\n\t\t\t\t\t\t\tvalues: [value],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t}\n\n\t\t\t\tif (!(await verifier(PermissionActions.PROJECT_VIEW_MEMBER([subMembership])))) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\treturn value\n\t\t\t}),\n\t\t)\n\t\treturn values.filter(notEmpty)\n\t}\n}\n\nexport type AddProjectMemberResponse = Response<null, AddProjectMemberErrorCode>\n\nexport type GetProjectMembersResponse = {\n\tidentity: { id: string }\n\tmemberships: readonly Acl.Membership[]\n}[]\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProjectMemberManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/ProjectMemberManager.ts"],"sourcesContent":["import {\n\tAddProjectMemberCommand,\n\tMembershipUpdateInput,\n\tRemoveProjectMemberCommand,\n\tRemoveProjectMemberResponse,\n\tUpdateProjectMemberCommand,\n\tUpdateProjectMemberResponse,\n} from '../commands/index.js'\nimport { ProjectMembershipByIdentityQuery, ProjectMembersQuery } from '../queries/index.js'\nimport { AddProjectMemberErrorCode, ProjectMembersInput } from '../../schema/index.js'\nimport { AccessVerifier, PermissionActions, TenantRole } from '../authorization/index.js'\nimport { indexListBy, notEmpty } from '../../utils/array.js'\nimport { createSetMembershipVariables } from './membershipUtils.js'\nimport { Acl, ProjectRole } from '@contember/schema'\nimport { Response } from '../utils/Response.js'\nimport { DatabaseContext } from '../utils/index.js'\n\nexport class ProjectMemberManager {\n\tasync addProjectMember(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\tidentityId: string,\n\t\tmemberships: readonly Acl.Membership[],\n\t): Promise<AddProjectMemberResponse> {\n\t\treturn await dbContext.transaction(async db => {\n\t\t\treturn await db.commandBus.execute(\n\t\t\t\tnew AddProjectMemberCommand(projectId, identityId, createSetMembershipVariables(memberships)),\n\t\t\t)\n\t\t})\n\t}\n\n\tasync updateProjectMember(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\tidentityId: string,\n\t\tmemberships: readonly MembershipUpdateInput[],\n\t): Promise<UpdateProjectMemberResponse> {\n\t\treturn await dbContext.transaction(\n\t\t\tasync db => await db.commandBus.execute(new UpdateProjectMemberCommand(projectId, identityId, memberships)),\n\t\t)\n\t}\n\n\tasync removeProjectMember(dbContext: DatabaseContext, projectId: string, identityId: string): Promise<RemoveProjectMemberResponse> {\n\t\treturn await dbContext.transaction(\n\t\t\tasync db => await db.commandBus.execute(new RemoveProjectMemberCommand(projectId, identityId)),\n\t\t)\n\t}\n\n\tasync getAllProjectMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string; roles?: readonly string[] },\n\t\tverifier: AccessVerifier | undefined,\n\t): Promise<readonly Acl.Membership[]> {\n\t\treturn [\n\t\t\t...this.getImplicitProjectMemberships(identity),\n\t\t\t...await this.getStoredProjectsMemberships(dbContext, project, identity, verifier),\n\t\t]\n\t}\n\n\tasync getEffectiveProjectMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string; roles?: readonly string[] },\n\t): Promise<readonly Acl.Membership[]> {\n\t\tconst implicit = this.getImplicitProjectMemberships(identity)\n\t\tif (implicit.length > 0) {\n\t\t\treturn implicit\n\t\t}\n\t\treturn await this.getStoredProjectsMemberships(dbContext, project, identity, undefined)\n\t}\n\n\tasync getStoredProjectsMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string },\n\t\tverifier: AccessVerifier | undefined,\n\t): Promise<readonly Acl.Membership[]> {\n\t\tconst memberships = await dbContext.queryHandler.fetch(\n\t\t\tnew ProjectMembershipByIdentityQuery(project, [identity.id]),\n\t\t)\n\t\tif (verifier === undefined) {\n\t\t\treturn memberships\n\t\t}\n\t\treturn await this.filterMemberships(memberships, verifier)\n\t}\n\n\tprivate getImplicitProjectMemberships(identity: { id: string; roles?: readonly string[] }): readonly Acl.Membership[] {\n\t\tif (identity.roles?.includes(TenantRole.SUPER_ADMIN) || identity.roles?.includes(TenantRole.PROJECT_ADMIN)) {\n\t\t\treturn [{ role: ProjectRole.ADMIN, variables: [] }]\n\t\t}\n\t\treturn []\n\t}\n\n\tasync getProjectMembers(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\taccessVerifier: AccessVerifier,\n\t\tinput: ProjectMembersInput,\n\t): Promise<GetProjectMembersResponse> {\n\t\treturn dbContext.transaction(async db => {\n\t\t\tconst members = await db.queryHandler.fetch(new ProjectMembersQuery(projectId, input))\n\t\t\tconst memberships = await db.queryHandler.fetch(\n\t\t\t\tnew ProjectMembershipByIdentityQuery(\n\t\t\t\t\t{ id: projectId },\n\t\t\t\t\tmembers.map(it => it.id),\n\t\t\t\t),\n\t\t\t)\n\t\t\tconst filteredMemberships = await this.filterMemberships(memberships, accessVerifier)\n\t\t\tconst byIdentity = indexListBy(filteredMemberships, 'identityId')\n\t\t\treturn members\n\t\t\t\t.map(it => (byIdentity[it.id] ? { identity: it, memberships: byIdentity[it.id] } : null))\n\t\t\t\t.filter(notEmpty)\n\t\t})\n\t}\n\n\tprivate async filterMemberships<T extends Acl.Membership>(\n\t\tmemberships: readonly T[],\n\t\tverifier: AccessVerifier,\n\t): Promise<T[]> {\n\t\tconst filteredMemberships: T[] = []\n\t\tnextMembership: for (const membership of memberships) {\n\t\t\tif (!(await verifier(PermissionActions.PROJECT_VIEW_MEMBER([{ role: membership.role, variables: [] }])))) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst variables: { values: Acl.MembershipVariable['values']; name: string }[] = []\n\t\t\tfor (const variable of membership.variables) {\n\t\t\t\tconst values = await this.filterProjectMembershipVariableValues(membership, variable, verifier)\n\t\t\t\tif (values.length === 0) {\n\t\t\t\t\tcontinue nextMembership\n\t\t\t\t}\n\t\t\t\tvariables.push({ name: variable.name, values })\n\t\t\t}\n\t\t\tfilteredMemberships.push({ ...membership, variables })\n\t\t}\n\n\t\treturn filteredMemberships\n\t}\n\n\tprivate async filterProjectMembershipVariableValues(\n\t\tmembership: Acl.Membership,\n\t\tvariable: Acl.MembershipVariable,\n\t\tverifier: AccessVerifier,\n\t): Promise<Acl.MembershipVariable['values']> {\n\t\tconst values = await Promise.all(\n\t\t\tvariable.values.map(async (value): Promise<string | null> => {\n\t\t\t\tconst subMembership = {\n\t\t\t\t\trole: membership.role,\n\t\t\t\t\tvariables: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: variable.name,\n\t\t\t\t\t\t\tvalues: [value],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t}\n\n\t\t\t\tif (!(await verifier(PermissionActions.PROJECT_VIEW_MEMBER([subMembership])))) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\treturn value\n\t\t\t}),\n\t\t)\n\t\treturn values.filter(notEmpty)\n\t}\n}\n\nexport type AddProjectMemberResponse = Response<null, AddProjectMemberErrorCode>\n\nexport type GetProjectMembersResponse = {\n\tidentity: { id: string }\n\tmemberships: readonly Acl.Membership[]\n}[]\n"],"names":[],"mappings":"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"}
@@ -36,8 +36,7 @@ class RateLimiter {
36
36
  if (limit <= 0 || windowSeconds <= 0) {
37
37
  return { ok: true };
38
38
  }
39
- const windowStart = new Date(this.providers.now().getTime() - windowSeconds * 1e3);
40
- const count = await db.queryHandler.fetch(new RateLimitCountQuery.RateLimitCountQuery(scope, this.hashKey(key), windowStart));
39
+ const count = await db.queryHandler.fetch(new RateLimitCountQuery.RateLimitCountQuery(scope, this.hashKey(key), windowSeconds));
41
40
  if (count < limit) {
42
41
  return { ok: true };
43
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RateLimiter.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/RateLimiter.ts"],"sourcesContent":["import { DatabaseContext } from '../utils/index.js'\nimport { Providers } from '../providers.js'\nimport { Config } from '../type/Config.js'\nimport { RateLimitCountQuery } from '../queries/rateLimit/RateLimitCountQuery.js'\nimport { RecordRateLimitEventCommand } from '../commands/rateLimit/RecordRateLimitEventCommand.js'\nimport { RateLimitScope } from '../type/RateLimit.js'\nimport { intervalToSeconds } from '../utils/interval.js'\n\nexport interface RateLimitWindow {\n\treadonly limit: number\n\treadonly window: {/* IPostgresInterval shape */}\n}\n\nexport interface RateLimitDecision {\n\treadonly ok: boolean\n\treadonly retryAfterSeconds?: number\n}\n\n/**\n * Sliding-window rate limiter backed by the `rate_limit_event` table.\n *\n * Cost: one COUNT(*) and (on success) one INSERT per check. The event row is\n * recorded only when the call passes — denied calls do not extend the window,\n * matching the spec's \"max N successful attempts per window\".\n *\n * The raw key (IP, email, ...) is hashed with the configured provider so the\n * raw value is not stored at rest. Note this is pseudonymization, not strong\n * anonymization: an unsalted SHA-256 of a low-entropy input (e.g. an IPv4\n * address) is recoverable by brute force, so treat key_hash as sensitive.\n */\nexport class RateLimiter {\n\tconstructor(\n\t\tprivate readonly providers: Pick<Providers, 'hash' | 'now'>,\n\t) {}\n\n\tprivate hashKey(key: string): Buffer {\n\t\treturn this.providers.hash(key, 'sha256')\n\t}\n\n\tprivate resolveWindow(scope: RateLimitScope, config: Config): { limit: number; windowSeconds: number } {\n\t\tconst r = config.rateLimits\n\t\tswitch (scope) {\n\t\t\tcase 'sign_up_per_ip':\n\t\t\t\treturn { limit: r.signUpPerIp.limit, windowSeconds: intervalToSeconds(r.signUpPerIp.window as any) }\n\t\t\tcase 'login_per_ip':\n\t\t\t\treturn { limit: r.loginPerIp.limit, windowSeconds: intervalToSeconds(r.loginPerIp.window as any) }\n\t\t\tcase 'password_reset_per_ip':\n\t\t\t\treturn { limit: r.passwordResetPerIp.limit, windowSeconds: intervalToSeconds(r.passwordResetPerIp.window as any) }\n\t\t\tcase 'passwordless_init_per_ip':\n\t\t\t\treturn { limit: r.passwordlessInitPerIp.limit, windowSeconds: intervalToSeconds(r.passwordlessInitPerIp.window as any) }\n\t\t\tcase 'email_otp_per_person':\n\t\t\t\treturn { limit: r.emailOtpPerPerson.limit, windowSeconds: intervalToSeconds(r.emailOtpPerPerson.window as any) }\n\t\t\tcase 'email_verification_per_ip':\n\t\t\t\treturn { limit: r.emailVerificationPerIp.limit, windowSeconds: intervalToSeconds(r.emailVerificationPerIp.window as any) }\n\t\t}\n\t}\n\n\t/**\n\t * Check whether the next attempt fits within the configured window without\n\t * recording it. Use {@link record} after a successful gating decision.\n\t */\n\tasync check(db: DatabaseContext, scope: RateLimitScope, key: string, config: Config): Promise<RateLimitDecision> {\n\t\tconst { limit, windowSeconds } = this.resolveWindow(scope, config)\n\t\tif (limit <= 0 || windowSeconds <= 0) {\n\t\t\treturn { ok: true }\n\t\t}\n\t\tconst windowStart = new Date(this.providers.now().getTime() - windowSeconds * 1000)\n\t\tconst count = await db.queryHandler.fetch(new RateLimitCountQuery(scope, this.hashKey(key), windowStart))\n\t\tif (count < limit) {\n\t\t\treturn { ok: true }\n\t\t}\n\t\treturn { ok: false, retryAfterSeconds: windowSeconds }\n\t}\n\n\tasync record(db: DatabaseContext, scope: RateLimitScope, key: string): Promise<void> {\n\t\tawait db.commandBus.execute(new RecordRateLimitEventCommand(scope, this.hashKey(key)))\n\t}\n\n\t/**\n\t * Combined check + record. Returns the decision; only records on success.\n\t *\n\t * Not atomic: the COUNT and the INSERT are separate statements, so under\n\t * concurrent requests for the same key a few attempts beyond the limit can\n\t * slip through (the window is a soft ceiling). That is acceptable for abuse\n\t * mitigation — do not rely on it as a hard quota.\n\t */\n\tasync consume(db: DatabaseContext, scope: RateLimitScope, key: string | null | undefined, config: Config): Promise<RateLimitDecision> {\n\t\tif (!key) {\n\t\t\treturn { ok: true }\n\t\t}\n\t\tconst decision = await this.check(db, scope, key, config)\n\t\tif (decision.ok) {\n\t\t\tawait this.record(db, scope, key)\n\t\t}\n\t\treturn decision\n\t}\n}\n"],"names":["intervalToSeconds","RateLimitCountQuery","RecordRateLimitEventCommand"],"mappings":";;;;;AA8BO,MAAM,YAAY;AAAA,EACxB,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EACf;AAAA,EAEK,QAAQ,KAAqB;AACpC,WAAO,KAAK,UAAU,KAAK,KAAK,QAAQ;AAAA,EACzC;AAAA,EAEQ,cAAc,OAAuB,QAA0D;AACtG,UAAM,IAAI,OAAO;AACjB,YAAQ,OAAA;AAAA,MACP,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,YAAY,OAAO,eAAeA,SAAAA,kBAAkB,EAAE,YAAY,MAAa,EAAA;AAAA,MAClG,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,WAAW,OAAO,eAAeA,SAAAA,kBAAkB,EAAE,WAAW,MAAa,EAAA;AAAA,MAChG,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,mBAAmB,OAAO,eAAeA,SAAAA,kBAAkB,EAAE,mBAAmB,MAAa,EAAA;AAAA,MAChH,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,sBAAsB,OAAO,eAAeA,SAAAA,kBAAkB,EAAE,sBAAsB,MAAa,EAAA;AAAA,MACtH,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,kBAAkB,OAAO,eAAeA,SAAAA,kBAAkB,EAAE,kBAAkB,MAAa,EAAA;AAAA,MAC9G,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,uBAAuB,OAAO,eAAeA,SAAAA,kBAAkB,EAAE,uBAAuB,MAAa,EAAA;AAAA,IAAE;AAAA,EAE5H;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,IAAqB,OAAuB,KAAa,QAA4C;AAChH,UAAM,EAAE,OAAO,cAAA,IAAkB,KAAK,cAAc,OAAO,MAAM;AACjE,QAAI,SAAS,KAAK,iBAAiB,GAAG;AACrC,aAAO,EAAE,IAAI,KAAA;AAAA,IACd;AACA,UAAM,cAAc,IAAI,KAAK,KAAK,UAAU,MAAM,QAAA,IAAY,gBAAgB,GAAI;AAClF,UAAM,QAAQ,MAAM,GAAG,aAAa,MAAM,IAAIC,oBAAAA,oBAAoB,OAAO,KAAK,QAAQ,GAAG,GAAG,WAAW,CAAC;AACxG,QAAI,QAAQ,OAAO;AAClB,aAAO,EAAE,IAAI,KAAA;AAAA,IACd;AACA,WAAO,EAAE,IAAI,OAAO,mBAAmB,cAAA;AAAA,EACxC;AAAA,EAEA,MAAM,OAAO,IAAqB,OAAuB,KAA4B;AACpF,UAAM,GAAG,WAAW,QAAQ,IAAIC,4BAAAA,4BAA4B,OAAO,KAAK,QAAQ,GAAG,CAAC,CAAC;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,QAAQ,IAAqB,OAAuB,KAAgC,QAA4C;AACrI,QAAI,CAAC,KAAK;AACT,aAAO,EAAE,IAAI,KAAA;AAAA,IACd;AACA,UAAM,WAAW,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM;AACxD,QAAI,SAAS,IAAI;AAChB,YAAM,KAAK,OAAO,IAAI,OAAO,GAAG;AAAA,IACjC;AACA,WAAO;AAAA,EACR;AACD;;"}
1
+ {"version":3,"file":"RateLimiter.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/RateLimiter.ts"],"sourcesContent":["import { DatabaseContext } from '../utils/index.js'\nimport { Providers } from '../providers.js'\nimport { Config } from '../type/Config.js'\nimport { RateLimitCountQuery } from '../queries/rateLimit/RateLimitCountQuery.js'\nimport { RecordRateLimitEventCommand } from '../commands/rateLimit/RecordRateLimitEventCommand.js'\nimport { RateLimitScope } from '../type/RateLimit.js'\nimport { intervalToSeconds } from '../utils/interval.js'\n\nexport interface RateLimitWindow {\n\treadonly limit: number\n\treadonly window: {/* IPostgresInterval shape */}\n}\n\nexport interface RateLimitDecision {\n\treadonly ok: boolean\n\treadonly retryAfterSeconds?: number\n}\n\n/**\n * Sliding-window rate limiter backed by the `rate_limit_event` table.\n *\n * Cost: one COUNT(*) and (on success) one INSERT per check. The event row is\n * recorded only when the call passes — denied calls do not extend the window,\n * matching the spec's \"max N successful attempts per window\".\n *\n * The raw key (IP, email, ...) is hashed with the configured provider so the\n * raw value is not stored at rest. Note this is pseudonymization, not strong\n * anonymization: an unsalted SHA-256 of a low-entropy input (e.g. an IPv4\n * address) is recoverable by brute force, so treat key_hash as sensitive.\n */\nexport class RateLimiter {\n\tconstructor(\n\t\tprivate readonly providers: Pick<Providers, 'hash'>,\n\t) {}\n\n\tprivate hashKey(key: string): Buffer {\n\t\treturn this.providers.hash(key, 'sha256')\n\t}\n\n\tprivate resolveWindow(scope: RateLimitScope, config: Config): { limit: number; windowSeconds: number } {\n\t\tconst r = config.rateLimits\n\t\tswitch (scope) {\n\t\t\tcase 'sign_up_per_ip':\n\t\t\t\treturn { limit: r.signUpPerIp.limit, windowSeconds: intervalToSeconds(r.signUpPerIp.window as any) }\n\t\t\tcase 'login_per_ip':\n\t\t\t\treturn { limit: r.loginPerIp.limit, windowSeconds: intervalToSeconds(r.loginPerIp.window as any) }\n\t\t\tcase 'password_reset_per_ip':\n\t\t\t\treturn { limit: r.passwordResetPerIp.limit, windowSeconds: intervalToSeconds(r.passwordResetPerIp.window as any) }\n\t\t\tcase 'passwordless_init_per_ip':\n\t\t\t\treturn { limit: r.passwordlessInitPerIp.limit, windowSeconds: intervalToSeconds(r.passwordlessInitPerIp.window as any) }\n\t\t\tcase 'email_otp_per_person':\n\t\t\t\treturn { limit: r.emailOtpPerPerson.limit, windowSeconds: intervalToSeconds(r.emailOtpPerPerson.window as any) }\n\t\t\tcase 'email_verification_per_ip':\n\t\t\t\treturn { limit: r.emailVerificationPerIp.limit, windowSeconds: intervalToSeconds(r.emailVerificationPerIp.window as any) }\n\t\t}\n\t}\n\n\t/**\n\t * Check whether the next attempt fits within the configured window without\n\t * recording it. Use {@link record} after a successful gating decision.\n\t */\n\tasync check(db: DatabaseContext, scope: RateLimitScope, key: string, config: Config): Promise<RateLimitDecision> {\n\t\tconst { limit, windowSeconds } = this.resolveWindow(scope, config)\n\t\tif (limit <= 0 || windowSeconds <= 0) {\n\t\t\treturn { ok: true }\n\t\t}\n\t\tconst count = await db.queryHandler.fetch(new RateLimitCountQuery(scope, this.hashKey(key), windowSeconds))\n\t\tif (count < limit) {\n\t\t\treturn { ok: true }\n\t\t}\n\t\treturn { ok: false, retryAfterSeconds: windowSeconds }\n\t}\n\n\tasync record(db: DatabaseContext, scope: RateLimitScope, key: string): Promise<void> {\n\t\tawait db.commandBus.execute(new RecordRateLimitEventCommand(scope, this.hashKey(key)))\n\t}\n\n\t/**\n\t * Combined check + record. Returns the decision; only records on success.\n\t *\n\t * Not atomic: the COUNT and the INSERT are separate statements, so under\n\t * concurrent requests for the same key a few attempts beyond the limit can\n\t * slip through (the window is a soft ceiling). That is acceptable for abuse\n\t * mitigation — do not rely on it as a hard quota.\n\t */\n\tasync consume(db: DatabaseContext, scope: RateLimitScope, key: string | null | undefined, config: Config): Promise<RateLimitDecision> {\n\t\tif (!key) {\n\t\t\treturn { ok: true }\n\t\t}\n\t\tconst decision = await this.check(db, scope, key, config)\n\t\tif (decision.ok) {\n\t\t\tawait this.record(db, scope, key)\n\t\t}\n\t\treturn decision\n\t}\n}\n"],"names":["intervalToSeconds","RateLimitCountQuery","RecordRateLimitEventCommand"],"mappings":";;;;;AA8BO,MAAM,YAAY;AAAA,EACxB,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EACf;AAAA,EAEK,QAAQ,KAAqB;AACpC,WAAO,KAAK,UAAU,KAAK,KAAK,QAAQ;AAAA,EACzC;AAAA,EAEQ,cAAc,OAAuB,QAA0D;AACtG,UAAM,IAAI,OAAO;AACjB,YAAQ,OAAA;AAAA,MACP,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,YAAY,OAAO,eAAeA,SAAAA,kBAAkB,EAAE,YAAY,MAAa,EAAA;AAAA,MAClG,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,WAAW,OAAO,eAAeA,SAAAA,kBAAkB,EAAE,WAAW,MAAa,EAAA;AAAA,MAChG,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,mBAAmB,OAAO,eAAeA,SAAAA,kBAAkB,EAAE,mBAAmB,MAAa,EAAA;AAAA,MAChH,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,sBAAsB,OAAO,eAAeA,SAAAA,kBAAkB,EAAE,sBAAsB,MAAa,EAAA;AAAA,MACtH,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,kBAAkB,OAAO,eAAeA,SAAAA,kBAAkB,EAAE,kBAAkB,MAAa,EAAA;AAAA,MAC9G,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,uBAAuB,OAAO,eAAeA,SAAAA,kBAAkB,EAAE,uBAAuB,MAAa,EAAA;AAAA,IAAE;AAAA,EAE5H;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,IAAqB,OAAuB,KAAa,QAA4C;AAChH,UAAM,EAAE,OAAO,cAAA,IAAkB,KAAK,cAAc,OAAO,MAAM;AACjE,QAAI,SAAS,KAAK,iBAAiB,GAAG;AACrC,aAAO,EAAE,IAAI,KAAA;AAAA,IACd;AACA,UAAM,QAAQ,MAAM,GAAG,aAAa,MAAM,IAAIC,oBAAAA,oBAAoB,OAAO,KAAK,QAAQ,GAAG,GAAG,aAAa,CAAC;AAC1G,QAAI,QAAQ,OAAO;AAClB,aAAO,EAAE,IAAI,KAAA;AAAA,IACd;AACA,WAAO,EAAE,IAAI,OAAO,mBAAmB,cAAA;AAAA,EACxC;AAAA,EAEA,MAAM,OAAO,IAAqB,OAAuB,KAA4B;AACpF,UAAM,GAAG,WAAW,QAAQ,IAAIC,4BAAAA,4BAA4B,OAAO,KAAK,QAAQ,GAAG,CAAC,CAAC;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,QAAQ,IAAqB,OAAuB,KAAgC,QAA4C;AACrI,QAAI,CAAC,KAAK;AACT,aAAO,EAAE,IAAI,KAAA;AAAA,IACd;AACA,UAAM,WAAW,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM;AACxD,QAAI,SAAS,IAAI;AAChB,YAAM,KAAK,OAAO,IAAI,OAAO,GAAG;AAAA,IACjC;AACA,WAAO;AAAA,EACR;AACD;;"}
@@ -34,8 +34,7 @@ class RateLimiter {
34
34
  if (limit <= 0 || windowSeconds <= 0) {
35
35
  return { ok: true };
36
36
  }
37
- const windowStart = new Date(this.providers.now().getTime() - windowSeconds * 1e3);
38
- const count = await db.queryHandler.fetch(new RateLimitCountQuery(scope, this.hashKey(key), windowStart));
37
+ const count = await db.queryHandler.fetch(new RateLimitCountQuery(scope, this.hashKey(key), windowSeconds));
39
38
  if (count < limit) {
40
39
  return { ok: true };
41
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RateLimiter.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/RateLimiter.ts"],"sourcesContent":["import { DatabaseContext } from '../utils/index.js'\nimport { Providers } from '../providers.js'\nimport { Config } from '../type/Config.js'\nimport { RateLimitCountQuery } from '../queries/rateLimit/RateLimitCountQuery.js'\nimport { RecordRateLimitEventCommand } from '../commands/rateLimit/RecordRateLimitEventCommand.js'\nimport { RateLimitScope } from '../type/RateLimit.js'\nimport { intervalToSeconds } from '../utils/interval.js'\n\nexport interface RateLimitWindow {\n\treadonly limit: number\n\treadonly window: {/* IPostgresInterval shape */}\n}\n\nexport interface RateLimitDecision {\n\treadonly ok: boolean\n\treadonly retryAfterSeconds?: number\n}\n\n/**\n * Sliding-window rate limiter backed by the `rate_limit_event` table.\n *\n * Cost: one COUNT(*) and (on success) one INSERT per check. The event row is\n * recorded only when the call passes — denied calls do not extend the window,\n * matching the spec's \"max N successful attempts per window\".\n *\n * The raw key (IP, email, ...) is hashed with the configured provider so the\n * raw value is not stored at rest. Note this is pseudonymization, not strong\n * anonymization: an unsalted SHA-256 of a low-entropy input (e.g. an IPv4\n * address) is recoverable by brute force, so treat key_hash as sensitive.\n */\nexport class RateLimiter {\n\tconstructor(\n\t\tprivate readonly providers: Pick<Providers, 'hash' | 'now'>,\n\t) {}\n\n\tprivate hashKey(key: string): Buffer {\n\t\treturn this.providers.hash(key, 'sha256')\n\t}\n\n\tprivate resolveWindow(scope: RateLimitScope, config: Config): { limit: number; windowSeconds: number } {\n\t\tconst r = config.rateLimits\n\t\tswitch (scope) {\n\t\t\tcase 'sign_up_per_ip':\n\t\t\t\treturn { limit: r.signUpPerIp.limit, windowSeconds: intervalToSeconds(r.signUpPerIp.window as any) }\n\t\t\tcase 'login_per_ip':\n\t\t\t\treturn { limit: r.loginPerIp.limit, windowSeconds: intervalToSeconds(r.loginPerIp.window as any) }\n\t\t\tcase 'password_reset_per_ip':\n\t\t\t\treturn { limit: r.passwordResetPerIp.limit, windowSeconds: intervalToSeconds(r.passwordResetPerIp.window as any) }\n\t\t\tcase 'passwordless_init_per_ip':\n\t\t\t\treturn { limit: r.passwordlessInitPerIp.limit, windowSeconds: intervalToSeconds(r.passwordlessInitPerIp.window as any) }\n\t\t\tcase 'email_otp_per_person':\n\t\t\t\treturn { limit: r.emailOtpPerPerson.limit, windowSeconds: intervalToSeconds(r.emailOtpPerPerson.window as any) }\n\t\t\tcase 'email_verification_per_ip':\n\t\t\t\treturn { limit: r.emailVerificationPerIp.limit, windowSeconds: intervalToSeconds(r.emailVerificationPerIp.window as any) }\n\t\t}\n\t}\n\n\t/**\n\t * Check whether the next attempt fits within the configured window without\n\t * recording it. Use {@link record} after a successful gating decision.\n\t */\n\tasync check(db: DatabaseContext, scope: RateLimitScope, key: string, config: Config): Promise<RateLimitDecision> {\n\t\tconst { limit, windowSeconds } = this.resolveWindow(scope, config)\n\t\tif (limit <= 0 || windowSeconds <= 0) {\n\t\t\treturn { ok: true }\n\t\t}\n\t\tconst windowStart = new Date(this.providers.now().getTime() - windowSeconds * 1000)\n\t\tconst count = await db.queryHandler.fetch(new RateLimitCountQuery(scope, this.hashKey(key), windowStart))\n\t\tif (count < limit) {\n\t\t\treturn { ok: true }\n\t\t}\n\t\treturn { ok: false, retryAfterSeconds: windowSeconds }\n\t}\n\n\tasync record(db: DatabaseContext, scope: RateLimitScope, key: string): Promise<void> {\n\t\tawait db.commandBus.execute(new RecordRateLimitEventCommand(scope, this.hashKey(key)))\n\t}\n\n\t/**\n\t * Combined check + record. Returns the decision; only records on success.\n\t *\n\t * Not atomic: the COUNT and the INSERT are separate statements, so under\n\t * concurrent requests for the same key a few attempts beyond the limit can\n\t * slip through (the window is a soft ceiling). That is acceptable for abuse\n\t * mitigation — do not rely on it as a hard quota.\n\t */\n\tasync consume(db: DatabaseContext, scope: RateLimitScope, key: string | null | undefined, config: Config): Promise<RateLimitDecision> {\n\t\tif (!key) {\n\t\t\treturn { ok: true }\n\t\t}\n\t\tconst decision = await this.check(db, scope, key, config)\n\t\tif (decision.ok) {\n\t\t\tawait this.record(db, scope, key)\n\t\t}\n\t\treturn decision\n\t}\n}\n"],"names":[],"mappings":";;;AA8BO,MAAM,YAAY;AAAA,EACxB,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EACf;AAAA,EAEK,QAAQ,KAAqB;AACpC,WAAO,KAAK,UAAU,KAAK,KAAK,QAAQ;AAAA,EACzC;AAAA,EAEQ,cAAc,OAAuB,QAA0D;AACtG,UAAM,IAAI,OAAO;AACjB,YAAQ,OAAA;AAAA,MACP,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,YAAY,OAAO,eAAe,kBAAkB,EAAE,YAAY,MAAa,EAAA;AAAA,MAClG,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,WAAW,OAAO,eAAe,kBAAkB,EAAE,WAAW,MAAa,EAAA;AAAA,MAChG,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,mBAAmB,OAAO,eAAe,kBAAkB,EAAE,mBAAmB,MAAa,EAAA;AAAA,MAChH,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,sBAAsB,OAAO,eAAe,kBAAkB,EAAE,sBAAsB,MAAa,EAAA;AAAA,MACtH,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,kBAAkB,OAAO,eAAe,kBAAkB,EAAE,kBAAkB,MAAa,EAAA;AAAA,MAC9G,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,uBAAuB,OAAO,eAAe,kBAAkB,EAAE,uBAAuB,MAAa,EAAA;AAAA,IAAE;AAAA,EAE5H;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,IAAqB,OAAuB,KAAa,QAA4C;AAChH,UAAM,EAAE,OAAO,cAAA,IAAkB,KAAK,cAAc,OAAO,MAAM;AACjE,QAAI,SAAS,KAAK,iBAAiB,GAAG;AACrC,aAAO,EAAE,IAAI,KAAA;AAAA,IACd;AACA,UAAM,cAAc,IAAI,KAAK,KAAK,UAAU,MAAM,QAAA,IAAY,gBAAgB,GAAI;AAClF,UAAM,QAAQ,MAAM,GAAG,aAAa,MAAM,IAAI,oBAAoB,OAAO,KAAK,QAAQ,GAAG,GAAG,WAAW,CAAC;AACxG,QAAI,QAAQ,OAAO;AAClB,aAAO,EAAE,IAAI,KAAA;AAAA,IACd;AACA,WAAO,EAAE,IAAI,OAAO,mBAAmB,cAAA;AAAA,EACxC;AAAA,EAEA,MAAM,OAAO,IAAqB,OAAuB,KAA4B;AACpF,UAAM,GAAG,WAAW,QAAQ,IAAI,4BAA4B,OAAO,KAAK,QAAQ,GAAG,CAAC,CAAC;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,QAAQ,IAAqB,OAAuB,KAAgC,QAA4C;AACrI,QAAI,CAAC,KAAK;AACT,aAAO,EAAE,IAAI,KAAA;AAAA,IACd;AACA,UAAM,WAAW,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM;AACxD,QAAI,SAAS,IAAI;AAChB,YAAM,KAAK,OAAO,IAAI,OAAO,GAAG;AAAA,IACjC;AACA,WAAO;AAAA,EACR;AACD;"}
1
+ {"version":3,"file":"RateLimiter.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/RateLimiter.ts"],"sourcesContent":["import { DatabaseContext } from '../utils/index.js'\nimport { Providers } from '../providers.js'\nimport { Config } from '../type/Config.js'\nimport { RateLimitCountQuery } from '../queries/rateLimit/RateLimitCountQuery.js'\nimport { RecordRateLimitEventCommand } from '../commands/rateLimit/RecordRateLimitEventCommand.js'\nimport { RateLimitScope } from '../type/RateLimit.js'\nimport { intervalToSeconds } from '../utils/interval.js'\n\nexport interface RateLimitWindow {\n\treadonly limit: number\n\treadonly window: {/* IPostgresInterval shape */}\n}\n\nexport interface RateLimitDecision {\n\treadonly ok: boolean\n\treadonly retryAfterSeconds?: number\n}\n\n/**\n * Sliding-window rate limiter backed by the `rate_limit_event` table.\n *\n * Cost: one COUNT(*) and (on success) one INSERT per check. The event row is\n * recorded only when the call passes — denied calls do not extend the window,\n * matching the spec's \"max N successful attempts per window\".\n *\n * The raw key (IP, email, ...) is hashed with the configured provider so the\n * raw value is not stored at rest. Note this is pseudonymization, not strong\n * anonymization: an unsalted SHA-256 of a low-entropy input (e.g. an IPv4\n * address) is recoverable by brute force, so treat key_hash as sensitive.\n */\nexport class RateLimiter {\n\tconstructor(\n\t\tprivate readonly providers: Pick<Providers, 'hash'>,\n\t) {}\n\n\tprivate hashKey(key: string): Buffer {\n\t\treturn this.providers.hash(key, 'sha256')\n\t}\n\n\tprivate resolveWindow(scope: RateLimitScope, config: Config): { limit: number; windowSeconds: number } {\n\t\tconst r = config.rateLimits\n\t\tswitch (scope) {\n\t\t\tcase 'sign_up_per_ip':\n\t\t\t\treturn { limit: r.signUpPerIp.limit, windowSeconds: intervalToSeconds(r.signUpPerIp.window as any) }\n\t\t\tcase 'login_per_ip':\n\t\t\t\treturn { limit: r.loginPerIp.limit, windowSeconds: intervalToSeconds(r.loginPerIp.window as any) }\n\t\t\tcase 'password_reset_per_ip':\n\t\t\t\treturn { limit: r.passwordResetPerIp.limit, windowSeconds: intervalToSeconds(r.passwordResetPerIp.window as any) }\n\t\t\tcase 'passwordless_init_per_ip':\n\t\t\t\treturn { limit: r.passwordlessInitPerIp.limit, windowSeconds: intervalToSeconds(r.passwordlessInitPerIp.window as any) }\n\t\t\tcase 'email_otp_per_person':\n\t\t\t\treturn { limit: r.emailOtpPerPerson.limit, windowSeconds: intervalToSeconds(r.emailOtpPerPerson.window as any) }\n\t\t\tcase 'email_verification_per_ip':\n\t\t\t\treturn { limit: r.emailVerificationPerIp.limit, windowSeconds: intervalToSeconds(r.emailVerificationPerIp.window as any) }\n\t\t}\n\t}\n\n\t/**\n\t * Check whether the next attempt fits within the configured window without\n\t * recording it. Use {@link record} after a successful gating decision.\n\t */\n\tasync check(db: DatabaseContext, scope: RateLimitScope, key: string, config: Config): Promise<RateLimitDecision> {\n\t\tconst { limit, windowSeconds } = this.resolveWindow(scope, config)\n\t\tif (limit <= 0 || windowSeconds <= 0) {\n\t\t\treturn { ok: true }\n\t\t}\n\t\tconst count = await db.queryHandler.fetch(new RateLimitCountQuery(scope, this.hashKey(key), windowSeconds))\n\t\tif (count < limit) {\n\t\t\treturn { ok: true }\n\t\t}\n\t\treturn { ok: false, retryAfterSeconds: windowSeconds }\n\t}\n\n\tasync record(db: DatabaseContext, scope: RateLimitScope, key: string): Promise<void> {\n\t\tawait db.commandBus.execute(new RecordRateLimitEventCommand(scope, this.hashKey(key)))\n\t}\n\n\t/**\n\t * Combined check + record. Returns the decision; only records on success.\n\t *\n\t * Not atomic: the COUNT and the INSERT are separate statements, so under\n\t * concurrent requests for the same key a few attempts beyond the limit can\n\t * slip through (the window is a soft ceiling). That is acceptable for abuse\n\t * mitigation — do not rely on it as a hard quota.\n\t */\n\tasync consume(db: DatabaseContext, scope: RateLimitScope, key: string | null | undefined, config: Config): Promise<RateLimitDecision> {\n\t\tif (!key) {\n\t\t\treturn { ok: true }\n\t\t}\n\t\tconst decision = await this.check(db, scope, key, config)\n\t\tif (decision.ok) {\n\t\t\tawait this.record(db, scope, key)\n\t\t}\n\t\treturn decision\n\t}\n}\n"],"names":[],"mappings":";;;AA8BO,MAAM,YAAY;AAAA,EACxB,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EACf;AAAA,EAEK,QAAQ,KAAqB;AACpC,WAAO,KAAK,UAAU,KAAK,KAAK,QAAQ;AAAA,EACzC;AAAA,EAEQ,cAAc,OAAuB,QAA0D;AACtG,UAAM,IAAI,OAAO;AACjB,YAAQ,OAAA;AAAA,MACP,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,YAAY,OAAO,eAAe,kBAAkB,EAAE,YAAY,MAAa,EAAA;AAAA,MAClG,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,WAAW,OAAO,eAAe,kBAAkB,EAAE,WAAW,MAAa,EAAA;AAAA,MAChG,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,mBAAmB,OAAO,eAAe,kBAAkB,EAAE,mBAAmB,MAAa,EAAA;AAAA,MAChH,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,sBAAsB,OAAO,eAAe,kBAAkB,EAAE,sBAAsB,MAAa,EAAA;AAAA,MACtH,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,kBAAkB,OAAO,eAAe,kBAAkB,EAAE,kBAAkB,MAAa,EAAA;AAAA,MAC9G,KAAK;AACJ,eAAO,EAAE,OAAO,EAAE,uBAAuB,OAAO,eAAe,kBAAkB,EAAE,uBAAuB,MAAa,EAAA;AAAA,IAAE;AAAA,EAE5H;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,IAAqB,OAAuB,KAAa,QAA4C;AAChH,UAAM,EAAE,OAAO,cAAA,IAAkB,KAAK,cAAc,OAAO,MAAM;AACjE,QAAI,SAAS,KAAK,iBAAiB,GAAG;AACrC,aAAO,EAAE,IAAI,KAAA;AAAA,IACd;AACA,UAAM,QAAQ,MAAM,GAAG,aAAa,MAAM,IAAI,oBAAoB,OAAO,KAAK,QAAQ,GAAG,GAAG,aAAa,CAAC;AAC1G,QAAI,QAAQ,OAAO;AAClB,aAAO,EAAE,IAAI,KAAA;AAAA,IACd;AACA,WAAO,EAAE,IAAI,OAAO,mBAAmB,cAAA;AAAA,EACxC;AAAA,EAEA,MAAM,OAAO,IAAqB,OAAuB,KAA4B;AACpF,UAAM,GAAG,WAAW,QAAQ,IAAI,4BAA4B,OAAO,KAAK,QAAQ,GAAG,CAAC,CAAC;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,QAAQ,IAAqB,OAAuB,KAAgC,QAA4C;AACrI,QAAI,CAAC,KAAK;AACT,aAAO,EAAE,IAAI,KAAA;AAAA,IACd;AACA,UAAM,WAAW,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM;AACxD,QAAI,SAAS,IAAI;AAChB,YAAM,KAAK,OAAO,IAAI,OAAO,GAAG;AAAA,IACjC;AACA,WAAO;AAAA,EACR;AACD;"}
@@ -5,38 +5,37 @@ require("@contember/database");
5
5
  require("node:crypto");
6
6
  const Response = require("../utils/Response.cjs");
7
7
  const PatchIdentityGlobalRoles = require("../commands/identity/PatchIdentityGlobalRoles.cjs");
8
- require("../authorization/PermissionActions.cjs");
9
- require("@contember/authorization");
10
- const Roles = require("../authorization/Roles.cjs");
11
- require("../authorization/PermissionContext.cjs");
12
- require("../authorization/PermissionsFactory.cjs");
13
- require("@contember/schema");
8
+ const GlobalRoleValidator = require("./GlobalRoleValidator.cjs");
14
9
  class RolesManager {
10
+ constructor(globalRoleValidator = new GlobalRoleValidator.GlobalRoleValidator()) {
11
+ this.globalRoleValidator = globalRoleValidator;
12
+ }
15
13
  async addGlobalRoles(dbContext, identityId, roles) {
14
+ return await dbContext.transaction(async (db) => {
15
+ const validation = await this.validateAddedGlobalRoles(db, roles);
16
+ if (!validation.ok) {
17
+ return validation;
18
+ }
19
+ return await this.addValidatedGlobalRoles(db, identityId, roles);
20
+ }, { isolation: "readCommitted" });
21
+ }
22
+ async addValidatedGlobalRoles(dbContext, identityId, roles) {
16
23
  return this.patchGlobalRoles(dbContext, identityId, roles, []);
17
24
  }
25
+ async validateAddedGlobalRoles(dbContext, roles) {
26
+ const invalidRole = await this.globalRoleValidator.findInvalidRole(dbContext, roles);
27
+ return invalidRole === null ? new Response.ResponseOk(null) : new Response.ResponseError("INVALID_ROLE", `Role ${invalidRole} is not valid or globally assignable`);
28
+ }
18
29
  async removeGlobalRoles(dbContext, identityId, roles) {
19
30
  return this.patchGlobalRoles(dbContext, identityId, [], roles);
20
31
  }
21
32
  async patchGlobalRoles(dbContext, identityId, addRoles, removeRoles) {
22
- const rolesValidationError = this.validateRoles([...addRoles, ...removeRoles]);
23
- if (rolesValidationError) {
24
- return rolesValidationError;
25
- }
26
33
  const result = await dbContext.commandBus.execute(new PatchIdentityGlobalRoles.PatchIdentityGlobalRoles(identityId, addRoles, removeRoles));
27
34
  if (!result) {
28
35
  return new Response.ResponseError("IDENTITY_NOT_FOUND", `Identity ${identityId} not found`);
29
36
  }
30
37
  return new Response.ResponseOk(null);
31
38
  }
32
- validateRoles(roles) {
33
- for (const role of roles) {
34
- if (!Object.values(Roles.TenantRole).includes(role)) {
35
- return new Response.ResponseError("INVALID_ROLE", `Role ${role} is not valid`);
36
- }
37
- }
38
- return null;
39
- }
40
39
  }
41
40
  exports.RolesManager = RolesManager;
42
41
  //# sourceMappingURL=RolesManager.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RolesManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/RolesManager.ts"],"sourcesContent":["import { DatabaseContext } from '../utils/index.js'\nimport { PatchIdentityGlobalRoles } from '../commands/index.js'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response.js'\nimport { TenantRole } from '../authorization/index.js'\n\nexport class RolesManager {\n\tasync addGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, roles, [])\n\t}\n\n\tasync removeGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, [], roles)\n\t}\n\n\tprivate async patchGlobalRoles(\n\t\tdbContext: DatabaseContext,\n\t\tidentityId: string,\n\t\taddRoles: readonly string[],\n\t\tremoveRoles: readonly string[],\n\t): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\tconst rolesValidationError = this.validateRoles([...addRoles, ...removeRoles])\n\t\tif (rolesValidationError) {\n\t\t\treturn rolesValidationError\n\t\t}\n\t\tconst result = await dbContext.commandBus.execute(new PatchIdentityGlobalRoles(identityId, addRoles, removeRoles))\n\t\tif (!result) {\n\t\t\treturn new ResponseError('IDENTITY_NOT_FOUND', `Identity ${identityId} not found`)\n\t\t}\n\t\treturn new ResponseOk(null)\n\t}\n\n\tprivate validateRoles(roles: string[]): Response<null, GlobalRolesErrorCode> | null {\n\t\tfor (const role of roles) {\n\t\t\tif (!Object.values(TenantRole).includes(role as TenantRole)) {\n\t\t\t\treturn new ResponseError('INVALID_ROLE', `Role ${role} is not valid`)\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n}\n\ntype GlobalRolesErrorCode =\n\t| 'IDENTITY_NOT_FOUND'\n\t| 'INVALID_ROLE'\n"],"names":["PatchIdentityGlobalRoles","ResponseError","ResponseOk","TenantRole"],"mappings":";;;;;;;;;;;;;AAKO,MAAM,aAAa;AAAA,EACzB,MAAM,eAAe,WAA4B,YAAoB,OAAyE;AAC7I,WAAO,KAAK,iBAAiB,WAAW,YAAY,OAAO,CAAA,CAAE;AAAA,EAC9D;AAAA,EAEA,MAAM,kBAAkB,WAA4B,YAAoB,OAAyE;AAChJ,WAAO,KAAK,iBAAiB,WAAW,YAAY,CAAA,GAAI,KAAK;AAAA,EAC9D;AAAA,EAEA,MAAc,iBACb,WACA,YACA,UACA,aACgD;AAChD,UAAM,uBAAuB,KAAK,cAAc,CAAC,GAAG,UAAU,GAAG,WAAW,CAAC;AAC7E,QAAI,sBAAsB;AACzB,aAAO;AAAA,IACR;AACA,UAAM,SAAS,MAAM,UAAU,WAAW,QAAQ,IAAIA,yBAAAA,yBAAyB,YAAY,UAAU,WAAW,CAAC;AACjH,QAAI,CAAC,QAAQ;AACZ,aAAO,IAAIC,SAAAA,cAAc,sBAAsB,YAAY,UAAU,YAAY;AAAA,IAClF;AACA,WAAO,IAAIC,SAAAA,WAAW,IAAI;AAAA,EAC3B;AAAA,EAEQ,cAAc,OAA8D;AACnF,eAAW,QAAQ,OAAO;AACzB,UAAI,CAAC,OAAO,OAAOC,MAAAA,UAAU,EAAE,SAAS,IAAkB,GAAG;AAC5D,eAAO,IAAIF,SAAAA,cAAc,gBAAgB,QAAQ,IAAI,eAAe;AAAA,MACrE;AAAA,IACD;AACA,WAAO;AAAA,EACR;AACD;;"}
1
+ {"version":3,"file":"RolesManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/RolesManager.ts"],"sourcesContent":["import { DatabaseContext } from '../utils/index.js'\nimport { PatchIdentityGlobalRoles } from '../commands/index.js'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response.js'\nimport { GlobalRoleValidator } from './GlobalRoleValidator.js'\nimport { Connection } from '@contember/database'\n\nexport class RolesManager {\n\tconstructor(\n\t\tprivate readonly globalRoleValidator: GlobalRoleValidator = new GlobalRoleValidator(),\n\t) {\n\t}\n\n\tasync addGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn await dbContext.transaction(async db => {\n\t\t\tconst validation = await this.validateAddedGlobalRoles(db, roles)\n\t\t\tif (!validation.ok) {\n\t\t\t\treturn validation\n\t\t\t}\n\t\t\treturn await this.addValidatedGlobalRoles(db, identityId, roles)\n\t\t}, { isolation: 'readCommitted' })\n\t}\n\n\tasync addValidatedGlobalRoles(\n\t\tdbContext: DatabaseContext<Connection.TransactionLike>,\n\t\tidentityId: string,\n\t\troles: readonly string[],\n\t): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, roles, [])\n\t}\n\n\tasync validateAddedGlobalRoles(dbContext: DatabaseContext, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\tconst invalidRole = await this.globalRoleValidator.findInvalidRole(dbContext, roles)\n\t\treturn invalidRole === null\n\t\t\t? new ResponseOk(null)\n\t\t\t: new ResponseError('INVALID_ROLE', `Role ${invalidRole} is not valid or globally assignable`)\n\t}\n\n\tasync removeGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, [], roles)\n\t}\n\n\tprivate async patchGlobalRoles(\n\t\tdbContext: DatabaseContext,\n\t\tidentityId: string,\n\t\taddRoles: readonly string[],\n\t\tremoveRoles: readonly string[],\n\t): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\tconst result = await dbContext.commandBus.execute(new PatchIdentityGlobalRoles(identityId, addRoles, removeRoles))\n\t\tif (!result) {\n\t\t\treturn new ResponseError('IDENTITY_NOT_FOUND', `Identity ${identityId} not found`)\n\t\t}\n\t\treturn new ResponseOk(null)\n\t}\n}\n\ntype GlobalRolesErrorCode =\n\t| 'IDENTITY_NOT_FOUND'\n\t| 'INVALID_ROLE'\n"],"names":["GlobalRoleValidator","ResponseOk","ResponseError","PatchIdentityGlobalRoles"],"mappings":";;;;;;;;AAMO,MAAM,aAAa;AAAA,EACzB,YACkB,sBAA2C,IAAIA,oBAAAA,uBAC/D;AADgB,SAAA,sBAAA;AAAA,EAElB;AAAA,EAEA,MAAM,eAAe,WAA4B,YAAoB,OAAyE;AAC7I,WAAO,MAAM,UAAU,YAAY,OAAM,OAAM;AAC9C,YAAM,aAAa,MAAM,KAAK,yBAAyB,IAAI,KAAK;AAChE,UAAI,CAAC,WAAW,IAAI;AACnB,eAAO;AAAA,MACR;AACA,aAAO,MAAM,KAAK,wBAAwB,IAAI,YAAY,KAAK;AAAA,IAChE,GAAG,EAAE,WAAW,iBAAiB;AAAA,EAClC;AAAA,EAEA,MAAM,wBACL,WACA,YACA,OACgD;AAChD,WAAO,KAAK,iBAAiB,WAAW,YAAY,OAAO,CAAA,CAAE;AAAA,EAC9D;AAAA,EAEA,MAAM,yBAAyB,WAA4B,OAAyE;AACnI,UAAM,cAAc,MAAM,KAAK,oBAAoB,gBAAgB,WAAW,KAAK;AACnF,WAAO,gBAAgB,OACpB,IAAIC,SAAAA,WAAW,IAAI,IACnB,IAAIC,SAAAA,cAAc,gBAAgB,QAAQ,WAAW,sCAAsC;AAAA,EAC/F;AAAA,EAEA,MAAM,kBAAkB,WAA4B,YAAoB,OAAyE;AAChJ,WAAO,KAAK,iBAAiB,WAAW,YAAY,CAAA,GAAI,KAAK;AAAA,EAC9D;AAAA,EAEA,MAAc,iBACb,WACA,YACA,UACA,aACgD;AAChD,UAAM,SAAS,MAAM,UAAU,WAAW,QAAQ,IAAIC,yBAAAA,yBAAyB,YAAY,UAAU,WAAW,CAAC;AACjH,QAAI,CAAC,QAAQ;AACZ,aAAO,IAAID,SAAAA,cAAc,sBAAsB,YAAY,UAAU,YAAY;AAAA,IAClF;AACA,WAAO,IAAID,SAAAA,WAAW,IAAI;AAAA,EAC3B;AACD;;"}
@@ -1,40 +1,39 @@
1
1
  import "../type/ApiKey.js";
2
2
  import "@contember/database";
3
3
  import "node:crypto";
4
- import { ResponseError, ResponseOk } from "../utils/Response.js";
4
+ import { ResponseOk, ResponseError } from "../utils/Response.js";
5
5
  import { PatchIdentityGlobalRoles } from "../commands/identity/PatchIdentityGlobalRoles.js";
6
- import "../authorization/PermissionActions.js";
7
- import "@contember/authorization";
8
- import { TenantRole } from "../authorization/Roles.js";
9
- import "../authorization/PermissionContext.js";
10
- import "../authorization/PermissionsFactory.js";
11
- import "@contember/schema";
6
+ import { GlobalRoleValidator } from "./GlobalRoleValidator.js";
12
7
  class RolesManager {
8
+ constructor(globalRoleValidator = new GlobalRoleValidator()) {
9
+ this.globalRoleValidator = globalRoleValidator;
10
+ }
13
11
  async addGlobalRoles(dbContext, identityId, roles) {
12
+ return await dbContext.transaction(async (db) => {
13
+ const validation = await this.validateAddedGlobalRoles(db, roles);
14
+ if (!validation.ok) {
15
+ return validation;
16
+ }
17
+ return await this.addValidatedGlobalRoles(db, identityId, roles);
18
+ }, { isolation: "readCommitted" });
19
+ }
20
+ async addValidatedGlobalRoles(dbContext, identityId, roles) {
14
21
  return this.patchGlobalRoles(dbContext, identityId, roles, []);
15
22
  }
23
+ async validateAddedGlobalRoles(dbContext, roles) {
24
+ const invalidRole = await this.globalRoleValidator.findInvalidRole(dbContext, roles);
25
+ return invalidRole === null ? new ResponseOk(null) : new ResponseError("INVALID_ROLE", `Role ${invalidRole} is not valid or globally assignable`);
26
+ }
16
27
  async removeGlobalRoles(dbContext, identityId, roles) {
17
28
  return this.patchGlobalRoles(dbContext, identityId, [], roles);
18
29
  }
19
30
  async patchGlobalRoles(dbContext, identityId, addRoles, removeRoles) {
20
- const rolesValidationError = this.validateRoles([...addRoles, ...removeRoles]);
21
- if (rolesValidationError) {
22
- return rolesValidationError;
23
- }
24
31
  const result = await dbContext.commandBus.execute(new PatchIdentityGlobalRoles(identityId, addRoles, removeRoles));
25
32
  if (!result) {
26
33
  return new ResponseError("IDENTITY_NOT_FOUND", `Identity ${identityId} not found`);
27
34
  }
28
35
  return new ResponseOk(null);
29
36
  }
30
- validateRoles(roles) {
31
- for (const role of roles) {
32
- if (!Object.values(TenantRole).includes(role)) {
33
- return new ResponseError("INVALID_ROLE", `Role ${role} is not valid`);
34
- }
35
- }
36
- return null;
37
- }
38
37
  }
39
38
  export {
40
39
  RolesManager
@@ -1 +1 @@
1
- {"version":3,"file":"RolesManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/RolesManager.ts"],"sourcesContent":["import { DatabaseContext } from '../utils/index.js'\nimport { PatchIdentityGlobalRoles } from '../commands/index.js'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response.js'\nimport { TenantRole } from '../authorization/index.js'\n\nexport class RolesManager {\n\tasync addGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, roles, [])\n\t}\n\n\tasync removeGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, [], roles)\n\t}\n\n\tprivate async patchGlobalRoles(\n\t\tdbContext: DatabaseContext,\n\t\tidentityId: string,\n\t\taddRoles: readonly string[],\n\t\tremoveRoles: readonly string[],\n\t): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\tconst rolesValidationError = this.validateRoles([...addRoles, ...removeRoles])\n\t\tif (rolesValidationError) {\n\t\t\treturn rolesValidationError\n\t\t}\n\t\tconst result = await dbContext.commandBus.execute(new PatchIdentityGlobalRoles(identityId, addRoles, removeRoles))\n\t\tif (!result) {\n\t\t\treturn new ResponseError('IDENTITY_NOT_FOUND', `Identity ${identityId} not found`)\n\t\t}\n\t\treturn new ResponseOk(null)\n\t}\n\n\tprivate validateRoles(roles: string[]): Response<null, GlobalRolesErrorCode> | null {\n\t\tfor (const role of roles) {\n\t\t\tif (!Object.values(TenantRole).includes(role as TenantRole)) {\n\t\t\t\treturn new ResponseError('INVALID_ROLE', `Role ${role} is not valid`)\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n}\n\ntype GlobalRolesErrorCode =\n\t| 'IDENTITY_NOT_FOUND'\n\t| 'INVALID_ROLE'\n"],"names":[],"mappings":";;;;;;;;;;;AAKO,MAAM,aAAa;AAAA,EACzB,MAAM,eAAe,WAA4B,YAAoB,OAAyE;AAC7I,WAAO,KAAK,iBAAiB,WAAW,YAAY,OAAO,CAAA,CAAE;AAAA,EAC9D;AAAA,EAEA,MAAM,kBAAkB,WAA4B,YAAoB,OAAyE;AAChJ,WAAO,KAAK,iBAAiB,WAAW,YAAY,CAAA,GAAI,KAAK;AAAA,EAC9D;AAAA,EAEA,MAAc,iBACb,WACA,YACA,UACA,aACgD;AAChD,UAAM,uBAAuB,KAAK,cAAc,CAAC,GAAG,UAAU,GAAG,WAAW,CAAC;AAC7E,QAAI,sBAAsB;AACzB,aAAO;AAAA,IACR;AACA,UAAM,SAAS,MAAM,UAAU,WAAW,QAAQ,IAAI,yBAAyB,YAAY,UAAU,WAAW,CAAC;AACjH,QAAI,CAAC,QAAQ;AACZ,aAAO,IAAI,cAAc,sBAAsB,YAAY,UAAU,YAAY;AAAA,IAClF;AACA,WAAO,IAAI,WAAW,IAAI;AAAA,EAC3B;AAAA,EAEQ,cAAc,OAA8D;AACnF,eAAW,QAAQ,OAAO;AACzB,UAAI,CAAC,OAAO,OAAO,UAAU,EAAE,SAAS,IAAkB,GAAG;AAC5D,eAAO,IAAI,cAAc,gBAAgB,QAAQ,IAAI,eAAe;AAAA,MACrE;AAAA,IACD;AACA,WAAO;AAAA,EACR;AACD;"}
1
+ {"version":3,"file":"RolesManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/RolesManager.ts"],"sourcesContent":["import { DatabaseContext } from '../utils/index.js'\nimport { PatchIdentityGlobalRoles } from '../commands/index.js'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response.js'\nimport { GlobalRoleValidator } from './GlobalRoleValidator.js'\nimport { Connection } from '@contember/database'\n\nexport class RolesManager {\n\tconstructor(\n\t\tprivate readonly globalRoleValidator: GlobalRoleValidator = new GlobalRoleValidator(),\n\t) {\n\t}\n\n\tasync addGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn await dbContext.transaction(async db => {\n\t\t\tconst validation = await this.validateAddedGlobalRoles(db, roles)\n\t\t\tif (!validation.ok) {\n\t\t\t\treturn validation\n\t\t\t}\n\t\t\treturn await this.addValidatedGlobalRoles(db, identityId, roles)\n\t\t}, { isolation: 'readCommitted' })\n\t}\n\n\tasync addValidatedGlobalRoles(\n\t\tdbContext: DatabaseContext<Connection.TransactionLike>,\n\t\tidentityId: string,\n\t\troles: readonly string[],\n\t): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, roles, [])\n\t}\n\n\tasync validateAddedGlobalRoles(dbContext: DatabaseContext, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\tconst invalidRole = await this.globalRoleValidator.findInvalidRole(dbContext, roles)\n\t\treturn invalidRole === null\n\t\t\t? new ResponseOk(null)\n\t\t\t: new ResponseError('INVALID_ROLE', `Role ${invalidRole} is not valid or globally assignable`)\n\t}\n\n\tasync removeGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, [], roles)\n\t}\n\n\tprivate async patchGlobalRoles(\n\t\tdbContext: DatabaseContext,\n\t\tidentityId: string,\n\t\taddRoles: readonly string[],\n\t\tremoveRoles: readonly string[],\n\t): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\tconst result = await dbContext.commandBus.execute(new PatchIdentityGlobalRoles(identityId, addRoles, removeRoles))\n\t\tif (!result) {\n\t\t\treturn new ResponseError('IDENTITY_NOT_FOUND', `Identity ${identityId} not found`)\n\t\t}\n\t\treturn new ResponseOk(null)\n\t}\n}\n\ntype GlobalRolesErrorCode =\n\t| 'IDENTITY_NOT_FOUND'\n\t| 'INVALID_ROLE'\n"],"names":[],"mappings":";;;;;;AAMO,MAAM,aAAa;AAAA,EACzB,YACkB,sBAA2C,IAAI,uBAC/D;AADgB,SAAA,sBAAA;AAAA,EAElB;AAAA,EAEA,MAAM,eAAe,WAA4B,YAAoB,OAAyE;AAC7I,WAAO,MAAM,UAAU,YAAY,OAAM,OAAM;AAC9C,YAAM,aAAa,MAAM,KAAK,yBAAyB,IAAI,KAAK;AAChE,UAAI,CAAC,WAAW,IAAI;AACnB,eAAO;AAAA,MACR;AACA,aAAO,MAAM,KAAK,wBAAwB,IAAI,YAAY,KAAK;AAAA,IAChE,GAAG,EAAE,WAAW,iBAAiB;AAAA,EAClC;AAAA,EAEA,MAAM,wBACL,WACA,YACA,OACgD;AAChD,WAAO,KAAK,iBAAiB,WAAW,YAAY,OAAO,CAAA,CAAE;AAAA,EAC9D;AAAA,EAEA,MAAM,yBAAyB,WAA4B,OAAyE;AACnI,UAAM,cAAc,MAAM,KAAK,oBAAoB,gBAAgB,WAAW,KAAK;AACnF,WAAO,gBAAgB,OACpB,IAAI,WAAW,IAAI,IACnB,IAAI,cAAc,gBAAgB,QAAQ,WAAW,sCAAsC;AAAA,EAC/F;AAAA,EAEA,MAAM,kBAAkB,WAA4B,YAAoB,OAAyE;AAChJ,WAAO,KAAK,iBAAiB,WAAW,YAAY,CAAA,GAAI,KAAK;AAAA,EAC9D;AAAA,EAEA,MAAc,iBACb,WACA,YACA,UACA,aACgD;AAChD,UAAM,SAAS,MAAM,UAAU,WAAW,QAAQ,IAAI,yBAAyB,YAAY,UAAU,WAAW,CAAC;AACjH,QAAI,CAAC,QAAQ;AACZ,aAAO,IAAI,cAAc,sBAAsB,YAAY,UAAU,YAAY;AAAA,IAClF;AACA,WAAO,IAAI,WAAW,IAAI;AAAA,EAC3B;AACD;"}
@@ -10,8 +10,9 @@ const ProjectSecretsQuery = require("../queries/project/ProjectSecretsQuery.cjs"
10
10
  const ProjectSecretKeysQuery = require("../queries/project/ProjectSecretKeysQuery.cjs");
11
11
  require("../authorization/PermissionActions.cjs");
12
12
  require("@contember/authorization");
13
+ require("../authorization/CustomRolePermissions.cjs");
13
14
  require("../authorization/PermissionContext.cjs");
14
- require("../authorization/PermissionsFactory.cjs");
15
+ require("../authorization/TargetIdentityPermission.cjs");
15
16
  require("@contember/schema");
16
17
  class SecretsManager {
17
18
  constructor(providers) {
@@ -1 +1 @@
1
- {"version":3,"file":"SecretsManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/SecretsManager.ts"],"sourcesContent":["import { SetProjectSecretCommand, UpdateProjectCommand } from '../commands/index.js'\nimport { Providers } from '../providers.js'\nimport { ProjectSecretInfoRow, ProjectSecretKeysQuery, ProjectSecretsQuery } from '../queries/index.js'\nimport { DatabaseContext } from '../utils/index.js'\n\nexport class SecretsManager {\n\tconstructor(private providers: Providers) {}\n\n\tpublic async setSecret(dbContext: DatabaseContext, projectId: string, key: string, value: string): Promise<void> {\n\t\tawait this.setSecrets(dbContext, projectId, [{ key, value: Buffer.from(value) }])\n\t}\n\n\t/** Lists secret keys (with timestamps) without decrypting any values. */\n\tpublic async listSecretKeys(dbContext: DatabaseContext, projectId: string): Promise<ProjectSecretInfoRow[]> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectSecretKeysQuery(projectId))\n\t}\n\n\tpublic async readSecrets(dbContext: DatabaseContext, projectId: string): Promise<Record<string, string>> {\n\t\tconst result = await dbContext.queryHandler.fetch(new ProjectSecretsQuery(projectId, this.providers))\n\t\tconst forUpdate = result.filter(it => it.needsReEncrypt)\n\t\tawait this.setSecrets(dbContext, projectId, forUpdate)\n\t\treturn Object.fromEntries(result.map(it => [it.key, it.value.toString()]))\n\t}\n\n\tprivate async setSecrets(dbContext: DatabaseContext, projectId: string, secrets: { key: string; value: Buffer }[]): Promise<void> {\n\t\tif (secrets.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tawait dbContext.transaction(async db => {\n\t\t\tfor (const { key, value } of secrets) {\n\t\t\t\tawait db.commandBus.execute(new SetProjectSecretCommand(projectId, key, Buffer.from(value)))\n\t\t\t}\n\t\t\tawait db.commandBus.execute(new UpdateProjectCommand(projectId, {}))\n\t\t})\n\t}\n}\n"],"names":["ProjectSecretKeysQuery","ProjectSecretsQuery","SetProjectSecretCommand","UpdateProjectCommand"],"mappings":";;;;;;;;;;;;;;;AAKO,MAAM,eAAe;AAAA,EAC3B,YAAoB,WAAsB;AAAtB,SAAA,YAAA;AAAA,EAAuB;AAAA,EAE3C,MAAa,UAAU,WAA4B,WAAmB,KAAa,OAA8B;AAChH,UAAM,KAAK,WAAW,WAAW,WAAW,CAAC,EAAE,KAAK,OAAO,OAAO,KAAK,KAAK,EAAA,CAAG,CAAC;AAAA,EACjF;AAAA;AAAA,EAGA,MAAa,eAAe,WAA4B,WAAoD;AAC3G,WAAO,MAAM,UAAU,aAAa,MAAM,IAAIA,uBAAAA,uBAAuB,SAAS,CAAC;AAAA,EAChF;AAAA,EAEA,MAAa,YAAY,WAA4B,WAAoD;AACxG,UAAM,SAAS,MAAM,UAAU,aAAa,MAAM,IAAIC,oBAAAA,oBAAoB,WAAW,KAAK,SAAS,CAAC;AACpG,UAAM,YAAY,OAAO,OAAO,CAAA,OAAM,GAAG,cAAc;AACvD,UAAM,KAAK,WAAW,WAAW,WAAW,SAAS;AACrD,WAAO,OAAO,YAAY,OAAO,IAAI,CAAA,OAAM,CAAC,GAAG,KAAK,GAAG,MAAM,SAAA,CAAU,CAAC,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAc,WAAW,WAA4B,WAAmB,SAA0D;AACjI,QAAI,QAAQ,WAAW,GAAG;AACzB;AAAA,IACD;AACA,UAAM,UAAU,YAAY,OAAM,OAAM;AACvC,iBAAW,EAAE,KAAK,MAAA,KAAW,SAAS;AACrC,cAAM,GAAG,WAAW,QAAQ,IAAIC,wBAAAA,wBAAwB,WAAW,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC;AAAA,MAC5F;AACA,YAAM,GAAG,WAAW,QAAQ,IAAIC,qBAAAA,qBAAqB,WAAW,CAAA,CAAE,CAAC;AAAA,IACpE,CAAC;AAAA,EACF;AACD;;"}
1
+ {"version":3,"file":"SecretsManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/SecretsManager.ts"],"sourcesContent":["import { SetProjectSecretCommand, UpdateProjectCommand } from '../commands/index.js'\nimport { Providers } from '../providers.js'\nimport { ProjectSecretInfoRow, ProjectSecretKeysQuery, ProjectSecretsQuery } from '../queries/index.js'\nimport { DatabaseContext } from '../utils/index.js'\n\nexport class SecretsManager {\n\tconstructor(private providers: Providers) {}\n\n\tpublic async setSecret(dbContext: DatabaseContext, projectId: string, key: string, value: string): Promise<void> {\n\t\tawait this.setSecrets(dbContext, projectId, [{ key, value: Buffer.from(value) }])\n\t}\n\n\t/** Lists secret keys (with timestamps) without decrypting any values. */\n\tpublic async listSecretKeys(dbContext: DatabaseContext, projectId: string): Promise<ProjectSecretInfoRow[]> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectSecretKeysQuery(projectId))\n\t}\n\n\tpublic async readSecrets(dbContext: DatabaseContext, projectId: string): Promise<Record<string, string>> {\n\t\tconst result = await dbContext.queryHandler.fetch(new ProjectSecretsQuery(projectId, this.providers))\n\t\tconst forUpdate = result.filter(it => it.needsReEncrypt)\n\t\tawait this.setSecrets(dbContext, projectId, forUpdate)\n\t\treturn Object.fromEntries(result.map(it => [it.key, it.value.toString()]))\n\t}\n\n\tprivate async setSecrets(dbContext: DatabaseContext, projectId: string, secrets: { key: string; value: Buffer }[]): Promise<void> {\n\t\tif (secrets.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tawait dbContext.transaction(async db => {\n\t\t\tfor (const { key, value } of secrets) {\n\t\t\t\tawait db.commandBus.execute(new SetProjectSecretCommand(projectId, key, Buffer.from(value)))\n\t\t\t}\n\t\t\tawait db.commandBus.execute(new UpdateProjectCommand(projectId, {}))\n\t\t})\n\t}\n}\n"],"names":["ProjectSecretKeysQuery","ProjectSecretsQuery","SetProjectSecretCommand","UpdateProjectCommand"],"mappings":";;;;;;;;;;;;;;;;AAKO,MAAM,eAAe;AAAA,EAC3B,YAAoB,WAAsB;AAAtB,SAAA,YAAA;AAAA,EAAuB;AAAA,EAE3C,MAAa,UAAU,WAA4B,WAAmB,KAAa,OAA8B;AAChH,UAAM,KAAK,WAAW,WAAW,WAAW,CAAC,EAAE,KAAK,OAAO,OAAO,KAAK,KAAK,EAAA,CAAG,CAAC;AAAA,EACjF;AAAA;AAAA,EAGA,MAAa,eAAe,WAA4B,WAAoD;AAC3G,WAAO,MAAM,UAAU,aAAa,MAAM,IAAIA,uBAAAA,uBAAuB,SAAS,CAAC;AAAA,EAChF;AAAA,EAEA,MAAa,YAAY,WAA4B,WAAoD;AACxG,UAAM,SAAS,MAAM,UAAU,aAAa,MAAM,IAAIC,oBAAAA,oBAAoB,WAAW,KAAK,SAAS,CAAC;AACpG,UAAM,YAAY,OAAO,OAAO,CAAA,OAAM,GAAG,cAAc;AACvD,UAAM,KAAK,WAAW,WAAW,WAAW,SAAS;AACrD,WAAO,OAAO,YAAY,OAAO,IAAI,CAAA,OAAM,CAAC,GAAG,KAAK,GAAG,MAAM,SAAA,CAAU,CAAC,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAc,WAAW,WAA4B,WAAmB,SAA0D;AACjI,QAAI,QAAQ,WAAW,GAAG;AACzB;AAAA,IACD;AACA,UAAM,UAAU,YAAY,OAAM,OAAM;AACvC,iBAAW,EAAE,KAAK,MAAA,KAAW,SAAS;AACrC,cAAM,GAAG,WAAW,QAAQ,IAAIC,wBAAAA,wBAAwB,WAAW,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC;AAAA,MAC5F;AACA,YAAM,GAAG,WAAW,QAAQ,IAAIC,qBAAAA,qBAAqB,WAAW,CAAA,CAAE,CAAC;AAAA,IACpE,CAAC;AAAA,EACF;AACD;;"}
@@ -8,8 +8,9 @@ import { ProjectSecretsQuery } from "../queries/project/ProjectSecretsQuery.js";
8
8
  import { ProjectSecretKeysQuery } from "../queries/project/ProjectSecretKeysQuery.js";
9
9
  import "../authorization/PermissionActions.js";
10
10
  import "@contember/authorization";
11
+ import "../authorization/CustomRolePermissions.js";
11
12
  import "../authorization/PermissionContext.js";
12
- import "../authorization/PermissionsFactory.js";
13
+ import "../authorization/TargetIdentityPermission.js";
13
14
  import "@contember/schema";
14
15
  class SecretsManager {
15
16
  constructor(providers) {
@@ -1 +1 @@
1
- {"version":3,"file":"SecretsManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/SecretsManager.ts"],"sourcesContent":["import { SetProjectSecretCommand, UpdateProjectCommand } from '../commands/index.js'\nimport { Providers } from '../providers.js'\nimport { ProjectSecretInfoRow, ProjectSecretKeysQuery, ProjectSecretsQuery } from '../queries/index.js'\nimport { DatabaseContext } from '../utils/index.js'\n\nexport class SecretsManager {\n\tconstructor(private providers: Providers) {}\n\n\tpublic async setSecret(dbContext: DatabaseContext, projectId: string, key: string, value: string): Promise<void> {\n\t\tawait this.setSecrets(dbContext, projectId, [{ key, value: Buffer.from(value) }])\n\t}\n\n\t/** Lists secret keys (with timestamps) without decrypting any values. */\n\tpublic async listSecretKeys(dbContext: DatabaseContext, projectId: string): Promise<ProjectSecretInfoRow[]> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectSecretKeysQuery(projectId))\n\t}\n\n\tpublic async readSecrets(dbContext: DatabaseContext, projectId: string): Promise<Record<string, string>> {\n\t\tconst result = await dbContext.queryHandler.fetch(new ProjectSecretsQuery(projectId, this.providers))\n\t\tconst forUpdate = result.filter(it => it.needsReEncrypt)\n\t\tawait this.setSecrets(dbContext, projectId, forUpdate)\n\t\treturn Object.fromEntries(result.map(it => [it.key, it.value.toString()]))\n\t}\n\n\tprivate async setSecrets(dbContext: DatabaseContext, projectId: string, secrets: { key: string; value: Buffer }[]): Promise<void> {\n\t\tif (secrets.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tawait dbContext.transaction(async db => {\n\t\t\tfor (const { key, value } of secrets) {\n\t\t\t\tawait db.commandBus.execute(new SetProjectSecretCommand(projectId, key, Buffer.from(value)))\n\t\t\t}\n\t\t\tawait db.commandBus.execute(new UpdateProjectCommand(projectId, {}))\n\t\t})\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAKO,MAAM,eAAe;AAAA,EAC3B,YAAoB,WAAsB;AAAtB,SAAA,YAAA;AAAA,EAAuB;AAAA,EAE3C,MAAa,UAAU,WAA4B,WAAmB,KAAa,OAA8B;AAChH,UAAM,KAAK,WAAW,WAAW,WAAW,CAAC,EAAE,KAAK,OAAO,OAAO,KAAK,KAAK,EAAA,CAAG,CAAC;AAAA,EACjF;AAAA;AAAA,EAGA,MAAa,eAAe,WAA4B,WAAoD;AAC3G,WAAO,MAAM,UAAU,aAAa,MAAM,IAAI,uBAAuB,SAAS,CAAC;AAAA,EAChF;AAAA,EAEA,MAAa,YAAY,WAA4B,WAAoD;AACxG,UAAM,SAAS,MAAM,UAAU,aAAa,MAAM,IAAI,oBAAoB,WAAW,KAAK,SAAS,CAAC;AACpG,UAAM,YAAY,OAAO,OAAO,CAAA,OAAM,GAAG,cAAc;AACvD,UAAM,KAAK,WAAW,WAAW,WAAW,SAAS;AACrD,WAAO,OAAO,YAAY,OAAO,IAAI,CAAA,OAAM,CAAC,GAAG,KAAK,GAAG,MAAM,SAAA,CAAU,CAAC,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAc,WAAW,WAA4B,WAAmB,SAA0D;AACjI,QAAI,QAAQ,WAAW,GAAG;AACzB;AAAA,IACD;AACA,UAAM,UAAU,YAAY,OAAM,OAAM;AACvC,iBAAW,EAAE,KAAK,MAAA,KAAW,SAAS;AACrC,cAAM,GAAG,WAAW,QAAQ,IAAI,wBAAwB,WAAW,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC;AAAA,MAC5F;AACA,YAAM,GAAG,WAAW,QAAQ,IAAI,qBAAqB,WAAW,CAAA,CAAE,CAAC;AAAA,IACpE,CAAC;AAAA,EACF;AACD;"}
1
+ {"version":3,"file":"SecretsManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/SecretsManager.ts"],"sourcesContent":["import { SetProjectSecretCommand, UpdateProjectCommand } from '../commands/index.js'\nimport { Providers } from '../providers.js'\nimport { ProjectSecretInfoRow, ProjectSecretKeysQuery, ProjectSecretsQuery } from '../queries/index.js'\nimport { DatabaseContext } from '../utils/index.js'\n\nexport class SecretsManager {\n\tconstructor(private providers: Providers) {}\n\n\tpublic async setSecret(dbContext: DatabaseContext, projectId: string, key: string, value: string): Promise<void> {\n\t\tawait this.setSecrets(dbContext, projectId, [{ key, value: Buffer.from(value) }])\n\t}\n\n\t/** Lists secret keys (with timestamps) without decrypting any values. */\n\tpublic async listSecretKeys(dbContext: DatabaseContext, projectId: string): Promise<ProjectSecretInfoRow[]> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectSecretKeysQuery(projectId))\n\t}\n\n\tpublic async readSecrets(dbContext: DatabaseContext, projectId: string): Promise<Record<string, string>> {\n\t\tconst result = await dbContext.queryHandler.fetch(new ProjectSecretsQuery(projectId, this.providers))\n\t\tconst forUpdate = result.filter(it => it.needsReEncrypt)\n\t\tawait this.setSecrets(dbContext, projectId, forUpdate)\n\t\treturn Object.fromEntries(result.map(it => [it.key, it.value.toString()]))\n\t}\n\n\tprivate async setSecrets(dbContext: DatabaseContext, projectId: string, secrets: { key: string; value: Buffer }[]): Promise<void> {\n\t\tif (secrets.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tawait dbContext.transaction(async db => {\n\t\t\tfor (const { key, value } of secrets) {\n\t\t\t\tawait db.commandBus.execute(new SetProjectSecretCommand(projectId, key, Buffer.from(value)))\n\t\t\t}\n\t\t\tawait db.commandBus.execute(new UpdateProjectCommand(projectId, {}))\n\t\t})\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAKO,MAAM,eAAe;AAAA,EAC3B,YAAoB,WAAsB;AAAtB,SAAA,YAAA;AAAA,EAAuB;AAAA,EAE3C,MAAa,UAAU,WAA4B,WAAmB,KAAa,OAA8B;AAChH,UAAM,KAAK,WAAW,WAAW,WAAW,CAAC,EAAE,KAAK,OAAO,OAAO,KAAK,KAAK,EAAA,CAAG,CAAC;AAAA,EACjF;AAAA;AAAA,EAGA,MAAa,eAAe,WAA4B,WAAoD;AAC3G,WAAO,MAAM,UAAU,aAAa,MAAM,IAAI,uBAAuB,SAAS,CAAC;AAAA,EAChF;AAAA,EAEA,MAAa,YAAY,WAA4B,WAAoD;AACxG,UAAM,SAAS,MAAM,UAAU,aAAa,MAAM,IAAI,oBAAoB,WAAW,KAAK,SAAS,CAAC;AACpG,UAAM,YAAY,OAAO,OAAO,CAAA,OAAM,GAAG,cAAc;AACvD,UAAM,KAAK,WAAW,WAAW,WAAW,SAAS;AACrD,WAAO,OAAO,YAAY,OAAO,IAAI,CAAA,OAAM,CAAC,GAAG,KAAK,GAAG,MAAM,SAAA,CAAU,CAAC,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAc,WAAW,WAA4B,WAAmB,SAA0D;AACjI,QAAI,QAAQ,WAAW,GAAG;AACzB;AAAA,IACD;AACA,UAAM,UAAU,YAAY,OAAM,OAAM;AACvC,iBAAW,EAAE,KAAK,MAAA,KAAW,SAAS;AACrC,cAAM,GAAG,WAAW,QAAQ,IAAI,wBAAwB,WAAW,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC;AAAA,MAC5F;AACA,YAAM,GAAG,WAAW,QAAQ,IAAI,qBAAqB,WAAW,CAAA,CAAE,CAAC;AAAA,IACpE,CAAC;AAAA,EACF;AACD;"}
@@ -6,10 +6,12 @@ require("../type/ApiKey.cjs");
6
6
  const ConfigurationQuery = require("../queries/configuration/ConfigurationQuery.cjs");
7
7
  const exceptions = require("../../exceptions.cjs");
8
8
  const PersonQuery = require("../queries/person/PersonQuery.cjs");
9
+ const LocalAuthDisablingIdpsQuery = require("../queries/idp/LocalAuthDisablingIdpsQuery.cjs");
9
10
  require("../authorization/PermissionActions.cjs");
10
11
  require("@contember/authorization");
12
+ require("../authorization/CustomRolePermissions.cjs");
11
13
  require("../authorization/PermissionContext.cjs");
12
- require("../authorization/PermissionsFactory.cjs");
14
+ require("../authorization/TargetIdentityPermission.cjs");
13
15
  require("@contember/schema");
14
16
  const Response = require("../utils/Response.cjs");
15
17
  const AuthLogService = require("./AuthLogService.cjs");
@@ -42,6 +44,10 @@ class SignInManager {
42
44
  personId: person.id
43
45
  })
44
46
  };
47
+ const exclusiveIdps = await dbContext.queryHandler.fetch(new LocalAuthDisablingIdpsQuery.LocalAuthDisablingIdpsQuery(person.id));
48
+ if (exclusiveIdps.length > 0) {
49
+ return new Response.ResponseError("IDP_REQUIRED", `Sign in using ${exclusiveIdps.join(" or ")}`, authLogData);
50
+ }
45
51
  if (!person.password_hash) {
46
52
  return new Response.ResponseError("NO_PASSWORD_SET", `No password set`, authLogData);
47
53
  }
@@ -230,7 +236,6 @@ class SignInManager {
230
236
  if (!policy.mfaRequired) {
231
237
  return null;
232
238
  }
233
- const now = this.providers.now();
234
239
  let graceSeconds;
235
240
  if (policy.graceDuration !== null) {
236
241
  graceSeconds = interval.intervalToSeconds(policy.graceDuration);
@@ -239,12 +244,11 @@ class SignInManager {
239
244
  graceSeconds = interval.intervalToSeconds(config.login.mfaGraceDuration);
240
245
  }
241
246
  if (person.mfa_grace_until !== null) {
242
- if (person.mfa_grace_until.getTime() > now.getTime()) {
247
+ if (person.is_in_grace) {
243
248
  return null;
244
249
  }
245
250
  } else if (graceSeconds > 0) {
246
- const graceUntil = new Date(now.getTime() + graceSeconds * 1e3);
247
- await dbContext.commandBus.execute(new SetMfaGraceUntilCommand.SetMfaGraceUntilCommand(person.id, graceUntil));
251
+ await dbContext.commandBus.execute(new SetMfaGraceUntilCommand.SetMfaGraceUntilCommand(person.id, graceSeconds));
248
252
  return null;
249
253
  }
250
254
  if (otpCode && person.otp_pending_secret) {
@@ -1 +1 @@
1
- {"version":3,"file":"SignInManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/SignInManager.ts"],"sourcesContent":["import { CreateSessionTokenErrorCode, MfaEnrollment, SignInErrorCode } from '../../schema/index.js'\nimport { ApiKeyManager, AuthPolicyResolver, BackupCodeManager, EmailOtpManager, LoginRiskAnalyzer, OtpManager } from '../service/index.js'\nimport { ConfigurationQuery, PersonQuery, PersonRow, PersonUniqueIdentifier } from '../queries/index.js'\nimport { Config } from '../type/Config.js'\nimport { Providers } from '../providers.js'\nimport { DatabaseContext } from '../utils/index.js'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response.js'\nimport { ImplementationException } from '../../exceptions.js'\nimport { AuthLogService } from './AuthLogService.js'\nimport { UserMailer } from '../mailing/index.js'\nimport { ApiKeyRequestInfo, SetMfaGraceUntilCommand } from '../commands/index.js'\nimport { intervalToSeconds } from '../utils/interval.js'\n\nclass SignInManager {\n\tconstructor(\n\t\tprivate readonly apiKeyManager: ApiKeyManager,\n\t\tprivate readonly providers: Providers,\n\t\tprivate readonly otpManager: OtpManager,\n\t\tprivate readonly backupCodeManager: BackupCodeManager,\n\t\tprivate readonly emailOtpManager: EmailOtpManager,\n\t\tprivate readonly authPolicyResolver: AuthPolicyResolver,\n\t\tprivate readonly loginRiskAnalyzer: LoginRiskAnalyzer,\n\t\tprivate readonly userMailer: UserMailer,\n\t) {}\n\n\tasync signIn(\n\t\tdbContext: DatabaseContext,\n\t\temail: string,\n\t\tpassword: string,\n\t\texpiration?: number,\n\t\totpCode?: string,\n\t\trequestInfo?: ApiKeyRequestInfo,\n\t\ttrustForwardedInfo?: boolean,\n\t\tbackupCode?: string,\n\t\tconfig?: Config,\n\t\tgeoCountry?: string,\n\t): Promise<SignInResponse> {\n\t\tconst person = await dbContext.queryHandler.fetch(PersonQuery.byEmail(email))\n\n\t\tif (person === null) {\n\t\t\treturn new ResponseError('UNKNOWN_EMAIL', `Person with email ${email} not found`, {\n\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\tpersonInput: email,\n\t\t\t\t}),\n\t\t\t})\n\t\t}\n\n\t\tconst authLogData = {\n\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\tpersonInput: email,\n\t\t\t\tpersonId: person.id,\n\t\t\t}),\n\t\t}\n\t\tif (!person.password_hash) {\n\t\t\treturn new ResponseError('NO_PASSWORD_SET', `No password set`, authLogData)\n\t\t}\n\n\t\tif (person.disabled_at !== null) {\n\t\t\treturn new ResponseError('PERSON_DISABLED', `Person is disabled`, authLogData)\n\t\t}\n\n\t\tconst passwordValid = await this.providers.bcryptCompare(password, person.password_hash)\n\n\t\tif (!passwordValid) {\n\t\t\treturn new ResponseError('INVALID_PASSWORD', `Password does not match`, authLogData)\n\t\t}\n\n\t\t// Block sign-in for accounts that were created while email verification\n\t\t// was required but never proved ownership. Accounts predating the\n\t\t// requirement carry email_verification_required = false and pass through.\n\t\tif (person.email_verification_required && person.email_verified_at === null) {\n\t\t\treturn new ResponseError('EMAIL_NOT_VERIFIED', `E-mail address has not been verified`, authLogData)\n\t\t}\n\n\t\tlet usedBackupCode = false\n\t\t// Whether a second factor was actively proven in THIS request. Anomaly\n\t\t// step-up (A03) reuses this: a login that already cleared a second factor\n\t\t// is not asked to step up again.\n\t\tlet mfaSatisfiedThisRequest = false\n\t\tconst hasActiveTotp = Boolean(person.otp_secret && person.otp_activated_at)\n\t\tif (hasActiveTotp) {\n\t\t\t// Active TOTP takes precedence (A07 path, unchanged).\n\t\t\tif (otpCode) {\n\t\t\t\tif (!await this.otpManager.verifyOtp(dbContext, person, otpCode)) {\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed', authLogData)\n\t\t\t\t}\n\t\t\t\tmfaSatisfiedThisRequest = true\n\t\t\t} else if (backupCode) {\n\t\t\t\tif (!await this.backupCodeManager.verifyAndConsume(dbContext, person, backupCode)) {\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed', authLogData)\n\t\t\t\t}\n\t\t\t\tusedBackupCode = true\n\t\t\t\tmfaSatisfiedThisRequest = true\n\t\t\t} else {\n\t\t\t\treturn new ResponseError('OTP_REQUIRED', `2FA is enabled. OTP token is required`, authLogData)\n\t\t\t}\n\t\t} else if (person.email_otp_enabled) {\n\t\t\t// No active TOTP, but email OTP is enabled (A05).\n\t\t\tif (otpCode) {\n\t\t\t\tif (!await this.emailOtpManager.verifyAndConsume(dbContext, person, otpCode)) {\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed', authLogData)\n\t\t\t\t}\n\t\t\t\tmfaSatisfiedThisRequest = true\n\t\t\t} else if (backupCode) {\n\t\t\t\tif (!await this.backupCodeManager.verifyAndConsume(dbContext, person, backupCode)) {\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed', authLogData)\n\t\t\t\t}\n\t\t\t\tusedBackupCode = true\n\t\t\t\tmfaSatisfiedThisRequest = true\n\t\t\t} else {\n\t\t\t\t// Dispatch a fresh code and ask the client to retry with otpToken. Reuses\n\t\t\t\t// the existing OTP_REQUIRED contract so clients that already handle it work.\n\t\t\t\t// The send is rate-limited per person; when throttled nothing is emailed\n\t\t\t\t// (emailOtpSent: false) but a previously emailed code stays valid.\n\t\t\t\t// Independent fetch (not the passed-in `config`): the email-OTP send is\n\t\t\t\t// rate-limited by the live config and this branch never reaches the\n\t\t\t\t// anomaly analyzer, so query shape stays as before A03.\n\t\t\t\tconst emailOtpConfig = await dbContext.queryHandler.fetch(new ConfigurationQuery(dbContext.providers))\n\t\t\t\tconst decision = await this.emailOtpManager.sendCode(dbContext, person, emailOtpConfig)\n\t\t\t\treturn new ResponseError('OTP_REQUIRED', `2FA is enabled. OTP token is required`, {\n\t\t\t\t\temailOtpSent: decision.ok,\n\t\t\t\t\t...authLogData,\n\t\t\t\t})\n\t\t\t}\n\t\t} else {\n\t\t\t// No active factor at all (A06). Enforce MFA if a matching auth_policy\n\t\t\t// requires it. With no policy rows configured this resolves to\n\t\t\t// mfaRequired=false and sign-in proceeds exactly as before.\n\t\t\tconst enforcement = await this.enforceMfaEnrollment(dbContext, person, otpCode, authLogData)\n\t\t\tif (enforcement !== null) {\n\t\t\t\tif ('error' in enforcement) {\n\t\t\t\t\treturn enforcement\n\t\t\t\t}\n\t\t\t\t// Enrollment completed in this request (pending TOTP promoted to active),\n\t\t\t\t// so MFA is definitively satisfied — anomaly step-up cannot apply.\n\t\t\t\tconst riskHandled = await this.applyRiskPolicy(dbContext, person, {\n\t\t\t\t\tconfig,\n\t\t\t\t\tgeoCountry,\n\t\t\t\t\trequestInfo,\n\t\t\t\t\totpCode,\n\t\t\t\t\tmfaSatisfiedThisRequest: true,\n\t\t\t\t\tauthLogData,\n\t\t\t\t})\n\t\t\t\tif (riskHandled !== null && 'error' in riskHandled) {\n\t\t\t\t\treturn riskHandled\n\t\t\t\t}\n\t\t\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(\n\t\t\t\t\tdbContext,\n\t\t\t\t\tperson.identity_id,\n\t\t\t\t\texpiration,\n\t\t\t\t\trequestInfo,\n\t\t\t\t\ttrustForwardedInfo,\n\t\t\t\t)\n\t\t\t\treturn new ResponseOk({\n\t\t\t\t\tperson,\n\t\t\t\t\ttoken: sessionToken,\n\t\t\t\t\tbackupCodes: enforcement.backupCodes,\n\t\t\t\t\tunusualLoginDetected: riskHandled?.unusualLoginDetected || undefined,\n\t\t\t\t\trisk: riskHandled?.risk,\n\t\t\t\t\t...authLogData,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst riskHandled = await this.applyRiskPolicy(dbContext, person, {\n\t\t\tconfig,\n\t\t\tgeoCountry,\n\t\t\trequestInfo,\n\t\t\totpCode,\n\t\t\tmfaSatisfiedThisRequest,\n\t\t\tauthLogData,\n\t\t})\n\t\tif (riskHandled !== null && 'error' in riskHandled) {\n\t\t\treturn riskHandled\n\t\t}\n\n\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(dbContext, person.identity_id, expiration, requestInfo, trustForwardedInfo)\n\n\t\treturn new ResponseOk({\n\t\t\tperson,\n\t\t\ttoken: sessionToken,\n\t\t\tusedBackupCode,\n\t\t\tunusualLoginDetected: riskHandled?.unusualLoginDetected || undefined,\n\t\t\trisk: riskHandled?.risk,\n\t\t\t...authLogData,\n\t\t})\n\t}\n\n\t/**\n\t * A03 — evaluate the sign-in risk score and act per policy. Returns:\n\t * - `null` when anomaly detection is off or no `config` was supplied (the\n\t * default): no DB work, sign-in proceeds unchanged.\n\t * - `{ unusualLoginDetected: true }` when an informational UNUSUAL_LOGIN email\n\t * was sent (best-effort) but the session may still be issued.\n\t * - a `ResponseError('OTP_REQUIRED')` when step-up is required and no code was\n\t * supplied — reuses the email-OTP step-up channel (dispatches a code).\n\t * - a `ResponseError('INVALID_OTP_TOKEN')` when a step-up code was supplied but\n\t * did not verify. A valid code consumes the token and the session is issued.\n\t * - `{ unusualLoginDetected: false }` when the score was below every threshold.\n\t *\n\t * The audit entries (`unusual_login_detected`, `step_up_required`) are emitted\n\t * by the resolver from the response metadata, matching the project convention.\n\t */\n\tprivate async applyRiskPolicy(\n\t\tdbContext: DatabaseContext,\n\t\tperson: PersonRow,\n\t\targs: {\n\t\t\tconfig?: Config\n\t\t\tgeoCountry?: string\n\t\t\trequestInfo?: ApiKeyRequestInfo\n\t\t\totpCode?: string\n\t\t\tmfaSatisfiedThisRequest: boolean\n\t\t\tauthLogData: { [AuthLogService.Key]: AuthLogService.Bag }\n\t\t},\n\t): Promise<RiskPolicyOutcome> {\n\t\tconst { config, geoCountry, requestInfo, otpCode, mfaSatisfiedThisRequest, authLogData } = args\n\t\tconst policy = config?.login.anomalyDetection\n\t\tif (!config || !policy?.enabled) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst assessment = await this.loginRiskAnalyzer.analyze(dbContext, person.id, {\n\t\t\tgeoCountry: geoCountry ?? null,\n\t\t\tdeviceFingerprint: this.loginRiskAnalyzer.fingerprint(requestInfo?.userAgent),\n\t\t\tip: requestInfo?.ip ?? null,\n\t\t}, policy)\n\n\t\tif (assessment.action === 'allow') {\n\t\t\treturn { unusualLoginDetected: false }\n\t\t}\n\n\t\tconst riskMeta = { score: assessment.score, reasons: assessment.reasons }\n\n\t\tif (assessment.action === 'stepUp' && !mfaSatisfiedThisRequest) {\n\t\t\t// Reuse the existing email-OTP step-up channel. This is independent of\n\t\t\t// `person.email_otp_enabled`, which gates email OTP only as the *primary*\n\t\t\t// second factor (A05); the step-up challenge stands on its own, so a person\n\t\t\t// with no standing MFA can still complete it. Without consuming the code\n\t\t\t// here, such a person would never satisfy the step-up and would loop on\n\t\t\t// OTP_REQUIRED forever (the score is unchanged on every retry).\n\t\t\tif (otpCode) {\n\t\t\t\t// Retry leg: the client resent the emailed code as otpToken. Mirror the\n\t\t\t\t// A05 contract — an invalid code is rejected (not re-sent); the per-code\n\t\t\t\t// 3-attempt cap still applies, and a fresh code is issued only when the\n\t\t\t\t// client retries without a code.\n\t\t\t\tif (!await this.emailOtpManager.verifyAndConsume(dbContext, person, otpCode)) {\n\t\t\t\t\t// A failed *forced* second factor is itself an anomaly signal — carry the\n\t\t\t\t\t// step-up/risk metadata so the resolver still emits unusual_login_detected\n\t\t\t\t\t// + step_up_required with the score/reasons, rather than logging it as an\n\t\t\t\t\t// ordinary mistyped-OTP login indistinguishable from a normal 2FA typo.\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed', {\n\t\t\t\t\t\tstepUpRequired: true,\n\t\t\t\t\t\tunusualLoginDetected: true,\n\t\t\t\t\t\trisk: riskMeta,\n\t\t\t\t\t\t...authLogData,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\t// Step-up satisfied this request — fall through to notify + allow below.\n\t\t\t} else {\n\t\t\t\t// First leg: dispatch a code and ask the client to retry with otpToken.\n\t\t\t\t// Rate-limited per person; a previously emailed code stays valid when throttled.\n\t\t\t\tconst decision = await this.emailOtpManager.sendCode(dbContext, person, config)\n\t\t\t\treturn new ResponseError('OTP_REQUIRED', 'Additional verification is required for this sign-in', {\n\t\t\t\t\temailOtpSent: decision.ok,\n\t\t\t\t\tstepUpRequired: true,\n\t\t\t\t\tunusualLoginDetected: true,\n\t\t\t\t\trisk: riskMeta,\n\t\t\t\t\t...authLogData,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// action === 'email', or step-up satisfied (already this request, or just now\n\t\t// via the emailed code): notify the person of the unusual sign-in. A failed\n\t\t// email must never block sign-in.\n\t\tawait this.sendUnusualLoginEmail(dbContext, person, geoCountry ?? null, requestInfo?.ip ?? null)\n\t\treturn { unusualLoginDetected: true, risk: riskMeta }\n\t}\n\n\tprivate async sendUnusualLoginEmail(dbContext: DatabaseContext, person: PersonRow, geoCountry: string | null, ip: string | null): Promise<void> {\n\t\tif (!person.email) {\n\t\t\t// No address to notify (e.g. an IDP-only person) — nothing to send.\n\t\t\treturn\n\t\t}\n\t\ttry {\n\t\t\tawait this.userMailer.sendUnusualLoginEmail(dbContext, {\n\t\t\t\temail: person.email,\n\t\t\t\tgeoCountry,\n\t\t\t\tipAddress: ip,\n\t\t\t}, { projectId: null, variant: '' })\n\t\t} catch {\n\t\t\t// ignore — informational only\n\t\t}\n\t}\n\n\t/**\n\t * A06 enforcement for the no-active-factor case. Returns:\n\t * - `null` when MFA is not required, or grace currently allows sign-in\n\t * (caller proceeds to issue a session as normal). With zero auth_policy\n\t * rows this is always the outcome — no behavior change.\n\t * - a `ResponseError` (MFA_ENROLLMENT_REQUIRED with the pending secret to\n\t * enroll, or INVALID_OTP_TOKEN) when sign-in must be blocked.\n\t * - `{ ok: true, backupCodes }` when enrollment just completed (pending TOTP\n\t * promoted to active); caller issues the session.\n\t */\n\tprivate async enforceMfaEnrollment(\n\t\tdbContext: DatabaseContext,\n\t\tperson: PersonRow,\n\t\totpCode: string | undefined,\n\t\tauthLogData: { [AuthLogService.Key]: AuthLogService.Bag },\n\t): Promise<\n\t\t| null\n\t\t| ResponseError<SignInErrorCode, {\n\t\t\temailOtpSent?: boolean\n\t\t\tmfaEnrollmentRequired?: boolean\n\t\t\tmfaEnrollment?: MfaEnrollment\n\t\t\t[AuthLogService.Key]: AuthLogService.Bag\n\t\t}>\n\t\t| { backupCodes: string[] }\n\t> {\n\t\tconst policy = await this.authPolicyResolver.resolveForIdentity(dbContext, person.identity_id, person.roles)\n\t\tif (!policy.mfaRequired) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst now = this.providers.now()\n\n\t\t// Resolve the effective grace duration (seconds). A per-policy override\n\t\t// wins; otherwise we fall back to the global config default. Only fetch the\n\t\t// config when the override is absent, to keep query shapes minimal.\n\t\tlet graceSeconds: number\n\t\tif (policy.graceDuration !== null) {\n\t\t\tgraceSeconds = intervalToSeconds(policy.graceDuration)\n\t\t} else {\n\t\t\tconst config = await dbContext.queryHandler.fetch(new ConfigurationQuery(dbContext.providers))\n\t\t\tgraceSeconds = intervalToSeconds(config.login.mfaGraceDuration)\n\t\t}\n\n\t\t// Grace handling. Default grace duration is 0 (immediate enforcement), so\n\t\t// by default neither branch below opens a window.\n\t\tif (person.mfa_grace_until !== null) {\n\t\t\tif (person.mfa_grace_until.getTime() > now.getTime()) {\n\t\t\t\t// Still inside an open grace window — allow sign-in.\n\t\t\t\treturn null\n\t\t\t}\n\t\t\t// Grace expired → fall through to enforcement.\n\t\t} else if (graceSeconds > 0) {\n\t\t\t// Open the grace window now and allow this sign-in.\n\t\t\tconst graceUntil = new Date(now.getTime() + graceSeconds * 1000)\n\t\t\tawait dbContext.commandBus.execute(new SetMfaGraceUntilCommand(person.id, graceUntil))\n\t\t\treturn null\n\t\t}\n\n\t\t// Enforce.\n\t\tif (otpCode && person.otp_pending_secret) {\n\t\t\t// Enrollment completion: verify against the pending secret, then promote.\n\t\t\tif (!await this.otpManager.verifyPendingOtp(person, otpCode)) {\n\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed', authLogData)\n\t\t\t}\n\t\t\tconst promoted = await this.otpManager.confirmOtp(dbContext, person)\n\t\t\tif (!promoted) {\n\t\t\t\t// Lost a concurrent enrollment-completion race: the pending secret was\n\t\t\t\t// already promoted by the other request (which issued the backup codes).\n\t\t\t\t// Don't regenerate here — that would invalidate the codes already\n\t\t\t\t// returned. TOTP is now active, so a retry signs in via the normal path.\n\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed', authLogData)\n\t\t\t}\n\t\t\tconst backupCodes = await this.backupCodeManager.generate(dbContext, person.id)\n\t\t\treturn { backupCodes }\n\t\t}\n\n\t\t// Provision a fresh pending TOTP secret and ask the client to enroll.\n\t\tconst otp = await this.otpManager.prepareOtp(dbContext, person, 'Contember')\n\t\tconst mfaEnrollment: MfaEnrollment = { otpUri: otp.uri, otpSecret: otp.secret }\n\t\treturn new ResponseError('MFA_ENROLLMENT_REQUIRED', 'MFA enrollment is required', {\n\t\t\tmfaEnrollmentRequired: true,\n\t\t\tmfaEnrollment,\n\t\t\t...authLogData,\n\t\t})\n\t}\n\n\tasync createSessionToken(\n\t\tdbContext: DatabaseContext,\n\t\tpersonIdentifier: PersonUniqueIdentifier,\n\t\texpiration?: number,\n\t\tverifier?: (person: PersonRow) => Promise<void>,\n\t\trequestInfo?: ApiKeyRequestInfo,\n\t\ttrustForwardedInfo?: boolean,\n\t): Promise<CreateSessionTokenResponse> {\n\t\tconst person = await dbContext.queryHandler.fetch(PersonQuery.byUniqueIdentifier(personIdentifier))\n\n\t\tif (person === null) {\n\t\t\tif (personIdentifier.type === 'email') {\n\t\t\t\treturn new ResponseError('UNKNOWN_EMAIL', `Person with email ${personIdentifier.email} not found`, {\n\t\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\t\tpersonInput: personIdentifier.email,\n\t\t\t\t\t}),\n\t\t\t\t})\n\t\t\t} else if (personIdentifier.type === 'id') {\n\t\t\t\treturn new ResponseError('UNKNOWN_PERSON_ID', `Person with id ${personIdentifier.id} not found`, {\n\t\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\t\tpersonInput: personIdentifier.id,\n\t\t\t\t\t}),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\tconst inputValue = personIdentifier.type === 'email' ? personIdentifier.email : personIdentifier.id\n\t\tif (person.disabled_at !== null) {\n\t\t\treturn new ResponseError('PERSON_DISABLED', `Person with id ${person.id} is disabled`, {\n\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\tpersonId: person.id,\n\t\t\t\t\tpersonInput: inputValue,\n\t\t\t\t}),\n\t\t\t})\n\t\t}\n\n\t\tawait verifier?.(person)\n\n\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(dbContext, person.identity_id, expiration, requestInfo, trustForwardedInfo)\n\t\treturn new ResponseOk({\n\t\t\tperson,\n\t\t\ttoken: sessionToken,\n\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\tpersonId: person.id,\n\t\t\t\tpersonInput: inputValue,\n\t\t\t}),\n\t\t})\n\t}\n}\n\n/** A03: greppable payload describing why a sign-in scored as unusual. */\nexport interface RiskMeta {\n\treadonly score: number\n\treadonly reasons: readonly string[]\n}\n\n/**\n * Result of {@link SignInManager.applyRiskPolicy}: `null` = feature off / no\n * config; a metadata object when the session may still be issued; a\n * `ResponseError` when step-up blocks the session.\n */\ntype RiskPolicyOutcome =\n\t| null\n\t| { unusualLoginDetected: boolean; risk?: RiskMeta }\n\t| ResponseError<SignInErrorCode, {\n\t\temailOtpSent?: boolean\n\t\tstepUpRequired?: boolean\n\t\tunusualLoginDetected?: boolean\n\t\trisk?: RiskMeta\n\t\t[AuthLogService.Key]: AuthLogService.Bag\n\t}>\n\nexport interface SignInResult {\n\treadonly person: PersonRow\n\treadonly token: string\n\t/** True when MFA was satisfied by consuming a backup code (instead of a TOTP token). */\n\treadonly usedBackupCode?: boolean\n\t/** Set when sign-in completed an MFA enrollment (A06): the freshly issued backup codes, shown once. */\n\treadonly backupCodes?: string[]\n\t/** A03: true when this sign-in scored as unusual and an UNUSUAL_LOGIN email was sent. */\n\treadonly unusualLoginDetected?: boolean\n\t/** A03: the risk score + reasons, recorded in the `unusual_login_detected` audit `event_data`. */\n\treadonly risk?: RiskMeta\n\t[AuthLogService.Key]: AuthLogService.Bag\n}\n\nexport type SignInResponse = Response<SignInResult, SignInErrorCode, {\n\t/** Set on an OTP_REQUIRED error when an email-OTP code was just dispatched (A05). */\n\temailOtpSent?: boolean\n\t/** Set on a MFA_ENROLLMENT_REQUIRED error (A06): triggers the `mfa_enrollment_required` audit. */\n\tmfaEnrollmentRequired?: boolean\n\t/** Set on a MFA_ENROLLMENT_REQUIRED error (A06): the pending secret the client must enroll. */\n\tmfaEnrollment?: MfaEnrollment\n\t/** Set on an OTP_REQUIRED error raised by A03 anomaly step-up: triggers the `step_up_required` audit. */\n\tstepUpRequired?: boolean\n\t/** A03: true when the sign-in scored as unusual (triggers the `unusual_login_detected` audit). */\n\tunusualLoginDetected?: boolean\n\t/** A03: the risk score + reasons, recorded in the audit `event_data`. */\n\trisk?: RiskMeta\n\t[AuthLogService.Key]: AuthLogService.Bag\n}>\nexport type CreateSessionTokenResponse = Response<SignInResult, CreateSessionTokenErrorCode, {\n\t[AuthLogService.Key]: AuthLogService.Bag\n}>\n\nexport { SignInManager }\n"],"names":["PersonQuery","ResponseError","AuthLogService","ConfigurationQuery","riskHandled","sessionToken","ResponseOk","intervalToSeconds","SetMfaGraceUntilCommand","ImplementationException"],"mappings":"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"}
1
+ {"version":3,"file":"SignInManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/SignInManager.ts"],"sourcesContent":["import { CreateSessionTokenErrorCode, MfaEnrollment, SignInErrorCode } from '../../schema/index.js'\nimport { ApiKeyManager, AuthPolicyResolver, BackupCodeManager, EmailOtpManager, LoginRiskAnalyzer, OtpManager } from '../service/index.js'\nimport { ConfigurationQuery, LocalAuthDisablingIdpsQuery, PersonQuery, PersonRow, PersonUniqueIdentifier } from '../queries/index.js'\nimport { Config } from '../type/Config.js'\nimport { Providers } from '../providers.js'\nimport { DatabaseContext } from '../utils/index.js'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response.js'\nimport { ImplementationException } from '../../exceptions.js'\nimport { AuthLogService } from './AuthLogService.js'\nimport { UserMailer } from '../mailing/index.js'\nimport { ApiKeyRequestInfo, SetMfaGraceUntilCommand } from '../commands/index.js'\nimport { intervalToSeconds } from '../utils/interval.js'\n\nclass SignInManager {\n\tconstructor(\n\t\tprivate readonly apiKeyManager: ApiKeyManager,\n\t\tprivate readonly providers: Providers,\n\t\tprivate readonly otpManager: OtpManager,\n\t\tprivate readonly backupCodeManager: BackupCodeManager,\n\t\tprivate readonly emailOtpManager: EmailOtpManager,\n\t\tprivate readonly authPolicyResolver: AuthPolicyResolver,\n\t\tprivate readonly loginRiskAnalyzer: LoginRiskAnalyzer,\n\t\tprivate readonly userMailer: UserMailer,\n\t) {}\n\n\tasync signIn(\n\t\tdbContext: DatabaseContext,\n\t\temail: string,\n\t\tpassword: string,\n\t\texpiration?: number,\n\t\totpCode?: string,\n\t\trequestInfo?: ApiKeyRequestInfo,\n\t\ttrustForwardedInfo?: boolean,\n\t\tbackupCode?: string,\n\t\tconfig?: Config,\n\t\tgeoCountry?: string,\n\t): Promise<SignInResponse> {\n\t\tconst person = await dbContext.queryHandler.fetch(PersonQuery.byEmail(email))\n\n\t\tif (person === null) {\n\t\t\treturn new ResponseError('UNKNOWN_EMAIL', `Person with email ${email} not found`, {\n\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\tpersonInput: email,\n\t\t\t\t}),\n\t\t\t})\n\t\t}\n\n\t\tconst authLogData = {\n\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\tpersonInput: email,\n\t\t\t\tpersonId: person.id,\n\t\t\t}),\n\t\t}\n\t\t// Refused before the password is even looked at: for a person federated\n\t\t// through a provider with `disableLocalAuthentication`, a password is not a\n\t\t// credential this tenant accepts, however it got set.\n\t\tconst exclusiveIdps = await dbContext.queryHandler.fetch(new LocalAuthDisablingIdpsQuery(person.id))\n\t\tif (exclusiveIdps.length > 0) {\n\t\t\treturn new ResponseError('IDP_REQUIRED', `Sign in using ${exclusiveIdps.join(' or ')}`, authLogData)\n\t\t}\n\n\t\tif (!person.password_hash) {\n\t\t\treturn new ResponseError('NO_PASSWORD_SET', `No password set`, authLogData)\n\t\t}\n\n\t\tif (person.disabled_at !== null) {\n\t\t\treturn new ResponseError('PERSON_DISABLED', `Person is disabled`, authLogData)\n\t\t}\n\n\t\tconst passwordValid = await this.providers.bcryptCompare(password, person.password_hash)\n\n\t\tif (!passwordValid) {\n\t\t\treturn new ResponseError('INVALID_PASSWORD', `Password does not match`, authLogData)\n\t\t}\n\n\t\t// Block sign-in for accounts that were created while email verification\n\t\t// was required but never proved ownership. Accounts predating the\n\t\t// requirement carry email_verification_required = false and pass through.\n\t\tif (person.email_verification_required && person.email_verified_at === null) {\n\t\t\treturn new ResponseError('EMAIL_NOT_VERIFIED', `E-mail address has not been verified`, authLogData)\n\t\t}\n\n\t\tlet usedBackupCode = false\n\t\t// Whether a second factor was actively proven in THIS request. Anomaly\n\t\t// step-up (A03) reuses this: a login that already cleared a second factor\n\t\t// is not asked to step up again.\n\t\tlet mfaSatisfiedThisRequest = false\n\t\tconst hasActiveTotp = Boolean(person.otp_secret && person.otp_activated_at)\n\t\tif (hasActiveTotp) {\n\t\t\t// Active TOTP takes precedence (A07 path, unchanged).\n\t\t\tif (otpCode) {\n\t\t\t\tif (!await this.otpManager.verifyOtp(dbContext, person, otpCode)) {\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed', authLogData)\n\t\t\t\t}\n\t\t\t\tmfaSatisfiedThisRequest = true\n\t\t\t} else if (backupCode) {\n\t\t\t\tif (!await this.backupCodeManager.verifyAndConsume(dbContext, person, backupCode)) {\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed', authLogData)\n\t\t\t\t}\n\t\t\t\tusedBackupCode = true\n\t\t\t\tmfaSatisfiedThisRequest = true\n\t\t\t} else {\n\t\t\t\treturn new ResponseError('OTP_REQUIRED', `2FA is enabled. OTP token is required`, authLogData)\n\t\t\t}\n\t\t} else if (person.email_otp_enabled) {\n\t\t\t// No active TOTP, but email OTP is enabled (A05).\n\t\t\tif (otpCode) {\n\t\t\t\tif (!await this.emailOtpManager.verifyAndConsume(dbContext, person, otpCode)) {\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed', authLogData)\n\t\t\t\t}\n\t\t\t\tmfaSatisfiedThisRequest = true\n\t\t\t} else if (backupCode) {\n\t\t\t\tif (!await this.backupCodeManager.verifyAndConsume(dbContext, person, backupCode)) {\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed', authLogData)\n\t\t\t\t}\n\t\t\t\tusedBackupCode = true\n\t\t\t\tmfaSatisfiedThisRequest = true\n\t\t\t} else {\n\t\t\t\t// Dispatch a fresh code and ask the client to retry with otpToken. Reuses\n\t\t\t\t// the existing OTP_REQUIRED contract so clients that already handle it work.\n\t\t\t\t// The send is rate-limited per person; when throttled nothing is emailed\n\t\t\t\t// (emailOtpSent: false) but a previously emailed code stays valid.\n\t\t\t\t// Independent fetch (not the passed-in `config`): the email-OTP send is\n\t\t\t\t// rate-limited by the live config and this branch never reaches the\n\t\t\t\t// anomaly analyzer, so query shape stays as before A03.\n\t\t\t\tconst emailOtpConfig = await dbContext.queryHandler.fetch(new ConfigurationQuery(dbContext.providers))\n\t\t\t\tconst decision = await this.emailOtpManager.sendCode(dbContext, person, emailOtpConfig)\n\t\t\t\treturn new ResponseError('OTP_REQUIRED', `2FA is enabled. OTP token is required`, {\n\t\t\t\t\temailOtpSent: decision.ok,\n\t\t\t\t\t...authLogData,\n\t\t\t\t})\n\t\t\t}\n\t\t} else {\n\t\t\t// No active factor at all (A06). Enforce MFA if a matching auth_policy\n\t\t\t// requires it. With no policy rows configured this resolves to\n\t\t\t// mfaRequired=false and sign-in proceeds exactly as before.\n\t\t\tconst enforcement = await this.enforceMfaEnrollment(dbContext, person, otpCode, authLogData)\n\t\t\tif (enforcement !== null) {\n\t\t\t\tif ('error' in enforcement) {\n\t\t\t\t\treturn enforcement\n\t\t\t\t}\n\t\t\t\t// Enrollment completed in this request (pending TOTP promoted to active),\n\t\t\t\t// so MFA is definitively satisfied — anomaly step-up cannot apply.\n\t\t\t\tconst riskHandled = await this.applyRiskPolicy(dbContext, person, {\n\t\t\t\t\tconfig,\n\t\t\t\t\tgeoCountry,\n\t\t\t\t\trequestInfo,\n\t\t\t\t\totpCode,\n\t\t\t\t\tmfaSatisfiedThisRequest: true,\n\t\t\t\t\tauthLogData,\n\t\t\t\t})\n\t\t\t\tif (riskHandled !== null && 'error' in riskHandled) {\n\t\t\t\t\treturn riskHandled\n\t\t\t\t}\n\t\t\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(\n\t\t\t\t\tdbContext,\n\t\t\t\t\tperson.identity_id,\n\t\t\t\t\texpiration,\n\t\t\t\t\trequestInfo,\n\t\t\t\t\ttrustForwardedInfo,\n\t\t\t\t)\n\t\t\t\treturn new ResponseOk({\n\t\t\t\t\tperson,\n\t\t\t\t\ttoken: sessionToken,\n\t\t\t\t\tbackupCodes: enforcement.backupCodes,\n\t\t\t\t\tunusualLoginDetected: riskHandled?.unusualLoginDetected || undefined,\n\t\t\t\t\trisk: riskHandled?.risk,\n\t\t\t\t\t...authLogData,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst riskHandled = await this.applyRiskPolicy(dbContext, person, {\n\t\t\tconfig,\n\t\t\tgeoCountry,\n\t\t\trequestInfo,\n\t\t\totpCode,\n\t\t\tmfaSatisfiedThisRequest,\n\t\t\tauthLogData,\n\t\t})\n\t\tif (riskHandled !== null && 'error' in riskHandled) {\n\t\t\treturn riskHandled\n\t\t}\n\n\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(dbContext, person.identity_id, expiration, requestInfo, trustForwardedInfo)\n\n\t\treturn new ResponseOk({\n\t\t\tperson,\n\t\t\ttoken: sessionToken,\n\t\t\tusedBackupCode,\n\t\t\tunusualLoginDetected: riskHandled?.unusualLoginDetected || undefined,\n\t\t\trisk: riskHandled?.risk,\n\t\t\t...authLogData,\n\t\t})\n\t}\n\n\t/**\n\t * A03 — evaluate the sign-in risk score and act per policy. Returns:\n\t * - `null` when anomaly detection is off or no `config` was supplied (the\n\t * default): no DB work, sign-in proceeds unchanged.\n\t * - `{ unusualLoginDetected: true }` when an informational UNUSUAL_LOGIN email\n\t * was sent (best-effort) but the session may still be issued.\n\t * - a `ResponseError('OTP_REQUIRED')` when step-up is required and no code was\n\t * supplied — reuses the email-OTP step-up channel (dispatches a code).\n\t * - a `ResponseError('INVALID_OTP_TOKEN')` when a step-up code was supplied but\n\t * did not verify. A valid code consumes the token and the session is issued.\n\t * - `{ unusualLoginDetected: false }` when the score was below every threshold.\n\t *\n\t * The audit entries (`unusual_login_detected`, `step_up_required`) are emitted\n\t * by the resolver from the response metadata, matching the project convention.\n\t */\n\tprivate async applyRiskPolicy(\n\t\tdbContext: DatabaseContext,\n\t\tperson: PersonRow,\n\t\targs: {\n\t\t\tconfig?: Config\n\t\t\tgeoCountry?: string\n\t\t\trequestInfo?: ApiKeyRequestInfo\n\t\t\totpCode?: string\n\t\t\tmfaSatisfiedThisRequest: boolean\n\t\t\tauthLogData: { [AuthLogService.Key]: AuthLogService.Bag }\n\t\t},\n\t): Promise<RiskPolicyOutcome> {\n\t\tconst { config, geoCountry, requestInfo, otpCode, mfaSatisfiedThisRequest, authLogData } = args\n\t\tconst policy = config?.login.anomalyDetection\n\t\tif (!config || !policy?.enabled) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst assessment = await this.loginRiskAnalyzer.analyze(dbContext, person.id, {\n\t\t\tgeoCountry: geoCountry ?? null,\n\t\t\tdeviceFingerprint: this.loginRiskAnalyzer.fingerprint(requestInfo?.userAgent),\n\t\t\tip: requestInfo?.ip ?? null,\n\t\t}, policy)\n\n\t\tif (assessment.action === 'allow') {\n\t\t\treturn { unusualLoginDetected: false }\n\t\t}\n\n\t\tconst riskMeta = { score: assessment.score, reasons: assessment.reasons }\n\n\t\tif (assessment.action === 'stepUp' && !mfaSatisfiedThisRequest) {\n\t\t\t// Reuse the existing email-OTP step-up channel. This is independent of\n\t\t\t// `person.email_otp_enabled`, which gates email OTP only as the *primary*\n\t\t\t// second factor (A05); the step-up challenge stands on its own, so a person\n\t\t\t// with no standing MFA can still complete it. Without consuming the code\n\t\t\t// here, such a person would never satisfy the step-up and would loop on\n\t\t\t// OTP_REQUIRED forever (the score is unchanged on every retry).\n\t\t\tif (otpCode) {\n\t\t\t\t// Retry leg: the client resent the emailed code as otpToken. Mirror the\n\t\t\t\t// A05 contract — an invalid code is rejected (not re-sent); the per-code\n\t\t\t\t// 3-attempt cap still applies, and a fresh code is issued only when the\n\t\t\t\t// client retries without a code.\n\t\t\t\tif (!await this.emailOtpManager.verifyAndConsume(dbContext, person, otpCode)) {\n\t\t\t\t\t// A failed *forced* second factor is itself an anomaly signal — carry the\n\t\t\t\t\t// step-up/risk metadata so the resolver still emits unusual_login_detected\n\t\t\t\t\t// + step_up_required with the score/reasons, rather than logging it as an\n\t\t\t\t\t// ordinary mistyped-OTP login indistinguishable from a normal 2FA typo.\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed', {\n\t\t\t\t\t\tstepUpRequired: true,\n\t\t\t\t\t\tunusualLoginDetected: true,\n\t\t\t\t\t\trisk: riskMeta,\n\t\t\t\t\t\t...authLogData,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\t// Step-up satisfied this request — fall through to notify + allow below.\n\t\t\t} else {\n\t\t\t\t// First leg: dispatch a code and ask the client to retry with otpToken.\n\t\t\t\t// Rate-limited per person; a previously emailed code stays valid when throttled.\n\t\t\t\tconst decision = await this.emailOtpManager.sendCode(dbContext, person, config)\n\t\t\t\treturn new ResponseError('OTP_REQUIRED', 'Additional verification is required for this sign-in', {\n\t\t\t\t\temailOtpSent: decision.ok,\n\t\t\t\t\tstepUpRequired: true,\n\t\t\t\t\tunusualLoginDetected: true,\n\t\t\t\t\trisk: riskMeta,\n\t\t\t\t\t...authLogData,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// action === 'email', or step-up satisfied (already this request, or just now\n\t\t// via the emailed code): notify the person of the unusual sign-in. A failed\n\t\t// email must never block sign-in.\n\t\tawait this.sendUnusualLoginEmail(dbContext, person, geoCountry ?? null, requestInfo?.ip ?? null)\n\t\treturn { unusualLoginDetected: true, risk: riskMeta }\n\t}\n\n\tprivate async sendUnusualLoginEmail(dbContext: DatabaseContext, person: PersonRow, geoCountry: string | null, ip: string | null): Promise<void> {\n\t\tif (!person.email) {\n\t\t\t// No address to notify (e.g. an IDP-only person) — nothing to send.\n\t\t\treturn\n\t\t}\n\t\ttry {\n\t\t\tawait this.userMailer.sendUnusualLoginEmail(dbContext, {\n\t\t\t\temail: person.email,\n\t\t\t\tgeoCountry,\n\t\t\t\tipAddress: ip,\n\t\t\t}, { projectId: null, variant: '' })\n\t\t} catch {\n\t\t\t// ignore — informational only\n\t\t}\n\t}\n\n\t/**\n\t * A06 enforcement for the no-active-factor case. Returns:\n\t * - `null` when MFA is not required, or grace currently allows sign-in\n\t * (caller proceeds to issue a session as normal). With zero auth_policy\n\t * rows this is always the outcome — no behavior change.\n\t * - a `ResponseError` (MFA_ENROLLMENT_REQUIRED with the pending secret to\n\t * enroll, or INVALID_OTP_TOKEN) when sign-in must be blocked.\n\t * - `{ ok: true, backupCodes }` when enrollment just completed (pending TOTP\n\t * promoted to active); caller issues the session.\n\t */\n\tprivate async enforceMfaEnrollment(\n\t\tdbContext: DatabaseContext,\n\t\tperson: PersonRow,\n\t\totpCode: string | undefined,\n\t\tauthLogData: { [AuthLogService.Key]: AuthLogService.Bag },\n\t): Promise<\n\t\t| null\n\t\t| ResponseError<SignInErrorCode, {\n\t\t\temailOtpSent?: boolean\n\t\t\tmfaEnrollmentRequired?: boolean\n\t\t\tmfaEnrollment?: MfaEnrollment\n\t\t\t[AuthLogService.Key]: AuthLogService.Bag\n\t\t}>\n\t\t| { backupCodes: string[] }\n\t> {\n\t\tconst policy = await this.authPolicyResolver.resolveForIdentity(dbContext, person.identity_id, person.roles)\n\t\tif (!policy.mfaRequired) {\n\t\t\treturn null\n\t\t}\n\n\t\t// Resolve the effective grace duration (seconds). A per-policy override\n\t\t// wins; otherwise we fall back to the global config default. Only fetch the\n\t\t// config when the override is absent, to keep query shapes minimal.\n\t\tlet graceSeconds: number\n\t\tif (policy.graceDuration !== null) {\n\t\t\tgraceSeconds = intervalToSeconds(policy.graceDuration)\n\t\t} else {\n\t\t\tconst config = await dbContext.queryHandler.fetch(new ConfigurationQuery(dbContext.providers))\n\t\t\tgraceSeconds = intervalToSeconds(config.login.mfaGraceDuration)\n\t\t}\n\n\t\t// Grace handling. Default grace duration is 0 (immediate enforcement), so\n\t\t// by default neither branch below opens a window. Whether we're still inside\n\t\t// an open window is decided on the DB clock (PersonRow.is_in_grace, evaluated\n\t\t// against now()); the null check below only distinguishes \"never opened\" from\n\t\t// \"opened (and possibly expired)\". See engine-tenant-api/CLAUDE.md.\n\t\tif (person.mfa_grace_until !== null) {\n\t\t\tif (person.is_in_grace) {\n\t\t\t\t// Still inside an open grace window — allow sign-in.\n\t\t\t\treturn null\n\t\t\t}\n\t\t\t// Grace expired → fall through to enforcement.\n\t\t} else if (graceSeconds > 0) {\n\t\t\t// Open the grace window (now() + graceSeconds on the DB clock) and allow this sign-in.\n\t\t\tawait dbContext.commandBus.execute(new SetMfaGraceUntilCommand(person.id, graceSeconds))\n\t\t\treturn null\n\t\t}\n\n\t\t// Enforce.\n\t\tif (otpCode && person.otp_pending_secret) {\n\t\t\t// Enrollment completion: verify against the pending secret, then promote.\n\t\t\tif (!await this.otpManager.verifyPendingOtp(person, otpCode)) {\n\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed', authLogData)\n\t\t\t}\n\t\t\tconst promoted = await this.otpManager.confirmOtp(dbContext, person)\n\t\t\tif (!promoted) {\n\t\t\t\t// Lost a concurrent enrollment-completion race: the pending secret was\n\t\t\t\t// already promoted by the other request (which issued the backup codes).\n\t\t\t\t// Don't regenerate here — that would invalidate the codes already\n\t\t\t\t// returned. TOTP is now active, so a retry signs in via the normal path.\n\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed', authLogData)\n\t\t\t}\n\t\t\tconst backupCodes = await this.backupCodeManager.generate(dbContext, person.id)\n\t\t\treturn { backupCodes }\n\t\t}\n\n\t\t// Provision a fresh pending TOTP secret and ask the client to enroll.\n\t\tconst otp = await this.otpManager.prepareOtp(dbContext, person, 'Contember')\n\t\tconst mfaEnrollment: MfaEnrollment = { otpUri: otp.uri, otpSecret: otp.secret }\n\t\treturn new ResponseError('MFA_ENROLLMENT_REQUIRED', 'MFA enrollment is required', {\n\t\t\tmfaEnrollmentRequired: true,\n\t\t\tmfaEnrollment,\n\t\t\t...authLogData,\n\t\t})\n\t}\n\n\tasync createSessionToken(\n\t\tdbContext: DatabaseContext,\n\t\tpersonIdentifier: PersonUniqueIdentifier,\n\t\texpiration?: number,\n\t\tverifier?: (person: PersonRow) => Promise<void>,\n\t\trequestInfo?: ApiKeyRequestInfo,\n\t\ttrustForwardedInfo?: boolean,\n\t): Promise<CreateSessionTokenResponse> {\n\t\tconst person = await dbContext.queryHandler.fetch(PersonQuery.byUniqueIdentifier(personIdentifier))\n\n\t\tif (person === null) {\n\t\t\tif (personIdentifier.type === 'email') {\n\t\t\t\treturn new ResponseError('UNKNOWN_EMAIL', `Person with email ${personIdentifier.email} not found`, {\n\t\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\t\tpersonInput: personIdentifier.email,\n\t\t\t\t\t}),\n\t\t\t\t})\n\t\t\t} else if (personIdentifier.type === 'id') {\n\t\t\t\treturn new ResponseError('UNKNOWN_PERSON_ID', `Person with id ${personIdentifier.id} not found`, {\n\t\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\t\tpersonInput: personIdentifier.id,\n\t\t\t\t\t}),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\tconst inputValue = personIdentifier.type === 'email' ? personIdentifier.email : personIdentifier.id\n\t\tif (person.disabled_at !== null) {\n\t\t\treturn new ResponseError('PERSON_DISABLED', `Person with id ${person.id} is disabled`, {\n\t\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\t\tpersonId: person.id,\n\t\t\t\t\tpersonInput: inputValue,\n\t\t\t\t}),\n\t\t\t})\n\t\t}\n\n\t\tawait verifier?.(person)\n\n\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(dbContext, person.identity_id, expiration, requestInfo, trustForwardedInfo)\n\t\treturn new ResponseOk({\n\t\t\tperson,\n\t\t\ttoken: sessionToken,\n\t\t\t[AuthLogService.Key]: new AuthLogService.Bag({\n\t\t\t\tpersonId: person.id,\n\t\t\t\tpersonInput: inputValue,\n\t\t\t}),\n\t\t})\n\t}\n}\n\n/** A03: greppable payload describing why a sign-in scored as unusual. */\nexport interface RiskMeta {\n\treadonly score: number\n\treadonly reasons: readonly string[]\n}\n\n/**\n * Result of {@link SignInManager.applyRiskPolicy}: `null` = feature off / no\n * config; a metadata object when the session may still be issued; a\n * `ResponseError` when step-up blocks the session.\n */\ntype RiskPolicyOutcome =\n\t| null\n\t| { unusualLoginDetected: boolean; risk?: RiskMeta }\n\t| ResponseError<SignInErrorCode, {\n\t\temailOtpSent?: boolean\n\t\tstepUpRequired?: boolean\n\t\tunusualLoginDetected?: boolean\n\t\trisk?: RiskMeta\n\t\t[AuthLogService.Key]: AuthLogService.Bag\n\t}>\n\nexport interface SignInResult {\n\treadonly person: PersonRow\n\treadonly token: string\n\t/** True when MFA was satisfied by consuming a backup code (instead of a TOTP token). */\n\treadonly usedBackupCode?: boolean\n\t/** Set when sign-in completed an MFA enrollment (A06): the freshly issued backup codes, shown once. */\n\treadonly backupCodes?: string[]\n\t/** A03: true when this sign-in scored as unusual and an UNUSUAL_LOGIN email was sent. */\n\treadonly unusualLoginDetected?: boolean\n\t/** A03: the risk score + reasons, recorded in the `unusual_login_detected` audit `event_data`. */\n\treadonly risk?: RiskMeta\n\t[AuthLogService.Key]: AuthLogService.Bag\n}\n\nexport type SignInResponse = Response<SignInResult, SignInErrorCode, {\n\t/** Set on an OTP_REQUIRED error when an email-OTP code was just dispatched (A05). */\n\temailOtpSent?: boolean\n\t/** Set on a MFA_ENROLLMENT_REQUIRED error (A06): triggers the `mfa_enrollment_required` audit. */\n\tmfaEnrollmentRequired?: boolean\n\t/** Set on a MFA_ENROLLMENT_REQUIRED error (A06): the pending secret the client must enroll. */\n\tmfaEnrollment?: MfaEnrollment\n\t/** Set on an OTP_REQUIRED error raised by A03 anomaly step-up: triggers the `step_up_required` audit. */\n\tstepUpRequired?: boolean\n\t/** A03: true when the sign-in scored as unusual (triggers the `unusual_login_detected` audit). */\n\tunusualLoginDetected?: boolean\n\t/** A03: the risk score + reasons, recorded in the audit `event_data`. */\n\trisk?: RiskMeta\n\t[AuthLogService.Key]: AuthLogService.Bag\n}>\nexport type CreateSessionTokenResponse = Response<SignInResult, CreateSessionTokenErrorCode, {\n\t[AuthLogService.Key]: AuthLogService.Bag\n}>\n\nexport { SignInManager }\n"],"names":["PersonQuery","ResponseError","AuthLogService","LocalAuthDisablingIdpsQuery","ConfigurationQuery","riskHandled","sessionToken","ResponseOk","intervalToSeconds","SetMfaGraceUntilCommand","ImplementationException"],"mappings":"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"}
@@ -4,10 +4,12 @@ import "../type/ApiKey.js";
4
4
  import { ConfigurationQuery } from "../queries/configuration/ConfigurationQuery.js";
5
5
  import { ImplementationException } from "../../exceptions.js";
6
6
  import { PersonQuery } from "../queries/person/PersonQuery.js";
7
+ import { LocalAuthDisablingIdpsQuery } from "../queries/idp/LocalAuthDisablingIdpsQuery.js";
7
8
  import "../authorization/PermissionActions.js";
8
9
  import "@contember/authorization";
10
+ import "../authorization/CustomRolePermissions.js";
9
11
  import "../authorization/PermissionContext.js";
10
- import "../authorization/PermissionsFactory.js";
12
+ import "../authorization/TargetIdentityPermission.js";
11
13
  import "@contember/schema";
12
14
  import { ResponseError, ResponseOk } from "../utils/Response.js";
13
15
  import { AuthLogService } from "./AuthLogService.js";
@@ -40,6 +42,10 @@ class SignInManager {
40
42
  personId: person.id
41
43
  })
42
44
  };
45
+ const exclusiveIdps = await dbContext.queryHandler.fetch(new LocalAuthDisablingIdpsQuery(person.id));
46
+ if (exclusiveIdps.length > 0) {
47
+ return new ResponseError("IDP_REQUIRED", `Sign in using ${exclusiveIdps.join(" or ")}`, authLogData);
48
+ }
43
49
  if (!person.password_hash) {
44
50
  return new ResponseError("NO_PASSWORD_SET", `No password set`, authLogData);
45
51
  }
@@ -228,7 +234,6 @@ class SignInManager {
228
234
  if (!policy.mfaRequired) {
229
235
  return null;
230
236
  }
231
- const now = this.providers.now();
232
237
  let graceSeconds;
233
238
  if (policy.graceDuration !== null) {
234
239
  graceSeconds = intervalToSeconds(policy.graceDuration);
@@ -237,12 +242,11 @@ class SignInManager {
237
242
  graceSeconds = intervalToSeconds(config.login.mfaGraceDuration);
238
243
  }
239
244
  if (person.mfa_grace_until !== null) {
240
- if (person.mfa_grace_until.getTime() > now.getTime()) {
245
+ if (person.is_in_grace) {
241
246
  return null;
242
247
  }
243
248
  } else if (graceSeconds > 0) {
244
- const graceUntil = new Date(now.getTime() + graceSeconds * 1e3);
245
- await dbContext.commandBus.execute(new SetMfaGraceUntilCommand(person.id, graceUntil));
249
+ await dbContext.commandBus.execute(new SetMfaGraceUntilCommand(person.id, graceSeconds));
246
250
  return null;
247
251
  }
248
252
  if (otpCode && person.otp_pending_secret) {