@hed-hog/core 0.0.387 → 0.0.393

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 (935) hide show
  1. package/README.md +51 -11
  2. package/dist/access-log/access-log.controller.d.ts.map +1 -1
  3. package/dist/access-log/access-log.controller.js +1 -1
  4. package/dist/access-log/access-log.controller.js.map +1 -1
  5. package/dist/access-log/access-log.interceptor.d.ts.map +1 -1
  6. package/dist/access-log/access-log.interceptor.js +11 -6
  7. package/dist/access-log/access-log.interceptor.js.map +1 -1
  8. package/dist/access-log/access-log.service.d.ts +4 -0
  9. package/dist/access-log/access-log.service.d.ts.map +1 -1
  10. package/dist/access-log/access-log.service.js +31 -4
  11. package/dist/access-log/access-log.service.js.map +1 -1
  12. package/dist/access-log/dto/query-access-log.dto.d.ts +2 -0
  13. package/dist/access-log/dto/query-access-log.dto.d.ts.map +1 -1
  14. package/dist/access-log/dto/query-access-log.dto.js +5 -0
  15. package/dist/access-log/dto/query-access-log.dto.js.map +1 -1
  16. package/dist/ai/ai-attachment.fragments.d.ts +23 -0
  17. package/dist/ai/ai-attachment.fragments.d.ts.map +1 -0
  18. package/dist/ai/ai-attachment.fragments.js +34 -0
  19. package/dist/ai/ai-attachment.fragments.js.map +1 -0
  20. package/dist/ai/ai.controller.d.ts +12 -17
  21. package/dist/ai/ai.controller.d.ts.map +1 -1
  22. package/dist/ai/ai.controller.js +17 -2
  23. package/dist/ai/ai.controller.js.map +1 -1
  24. package/dist/ai/ai.module.d.ts.map +1 -1
  25. package/dist/ai/ai.module.js +3 -2
  26. package/dist/ai/ai.module.js.map +1 -1
  27. package/dist/ai/ai.prompts.d.ts +16 -0
  28. package/dist/ai/ai.prompts.d.ts.map +1 -0
  29. package/dist/ai/ai.prompts.js +37 -0
  30. package/dist/ai/ai.prompts.js.map +1 -0
  31. package/dist/ai/ai.service.d.ts +92 -12
  32. package/dist/ai/ai.service.d.ts.map +1 -1
  33. package/dist/ai/ai.service.js +309 -88
  34. package/dist/ai/ai.service.js.map +1 -1
  35. package/dist/ai/dto/chat.dto.d.ts +4 -1
  36. package/dist/ai/dto/chat.dto.d.ts.map +1 -1
  37. package/dist/ai/dto/chat.dto.js +23 -1
  38. package/dist/ai/dto/chat.dto.js.map +1 -1
  39. package/dist/ai/dto/create-agent.dto.d.ts +1 -1
  40. package/dist/ai/dto/create-agent.dto.d.ts.map +1 -1
  41. package/dist/ai/dto/create-agent.dto.js +1 -1
  42. package/dist/ai/dto/create-agent.dto.js.map +1 -1
  43. package/dist/ai/dto/richtext-edit-html.dto.d.ts +5 -0
  44. package/dist/ai/dto/richtext-edit-html.dto.d.ts.map +1 -0
  45. package/dist/ai/dto/richtext-edit-html.dto.js +27 -0
  46. package/dist/ai/dto/richtext-edit-html.dto.js.map +1 -0
  47. package/dist/ai/dto/update-agent.dto.d.ts +1 -1
  48. package/dist/ai/dto/update-agent.dto.d.ts.map +1 -1
  49. package/dist/ai/dto/update-agent.dto.js +1 -1
  50. package/dist/ai/dto/update-agent.dto.js.map +1 -1
  51. package/dist/ai/richtext-ai.prompts.d.ts +5 -0
  52. package/dist/ai/richtext-ai.prompts.d.ts.map +1 -0
  53. package/dist/ai/richtext-ai.prompts.js +57 -0
  54. package/dist/ai/richtext-ai.prompts.js.map +1 -0
  55. package/dist/ai/richtext-ai.service.d.ts +34 -0
  56. package/dist/ai/richtext-ai.service.d.ts.map +1 -0
  57. package/dist/ai/richtext-ai.service.js +95 -0
  58. package/dist/ai/richtext-ai.service.js.map +1 -0
  59. package/dist/ai-instruction/ai-instruction.controller.d.ts +59 -5
  60. package/dist/ai-instruction/ai-instruction.controller.d.ts.map +1 -1
  61. package/dist/ai-instruction/ai-instruction.controller.js +63 -20
  62. package/dist/ai-instruction/ai-instruction.controller.js.map +1 -1
  63. package/dist/ai-instruction/ai-instruction.module.d.ts.map +1 -1
  64. package/dist/ai-instruction/ai-instruction.module.js +13 -2
  65. package/dist/ai-instruction/ai-instruction.module.js.map +1 -1
  66. package/dist/ai-instruction/ai-instruction.service.d.ts +131 -6
  67. package/dist/ai-instruction/ai-instruction.service.d.ts.map +1 -1
  68. package/dist/ai-instruction/ai-instruction.service.js +533 -60
  69. package/dist/ai-instruction/ai-instruction.service.js.map +1 -1
  70. package/dist/ai-instruction/ai-prompt-builder.service.d.ts +8 -0
  71. package/dist/ai-instruction/ai-prompt-builder.service.d.ts.map +1 -1
  72. package/dist/ai-instruction/ai-prompt-builder.service.js +10 -1
  73. package/dist/ai-instruction/ai-prompt-builder.service.js.map +1 -1
  74. package/dist/ai-instruction/ai-prompt-registry.d.ts +45 -0
  75. package/dist/ai-instruction/ai-prompt-registry.d.ts.map +1 -0
  76. package/dist/ai-instruction/ai-prompt-registry.js +49 -0
  77. package/dist/ai-instruction/ai-prompt-registry.js.map +1 -0
  78. package/dist/ai-instruction/ai-prompt-resolver.service.d.ts +89 -0
  79. package/dist/ai-instruction/ai-prompt-resolver.service.d.ts.map +1 -0
  80. package/dist/ai-instruction/ai-prompt-resolver.service.js +222 -0
  81. package/dist/ai-instruction/ai-prompt-resolver.service.js.map +1 -0
  82. package/dist/ai-instruction/ai-prompt-template.util.d.ts +70 -0
  83. package/dist/ai-instruction/ai-prompt-template.util.d.ts.map +1 -0
  84. package/dist/ai-instruction/ai-prompt-template.util.js +154 -0
  85. package/dist/ai-instruction/ai-prompt-template.util.js.map +1 -0
  86. package/dist/ai-instruction/dto/create-ai-instruction.dto.d.ts +5 -0
  87. package/dist/ai-instruction/dto/create-ai-instruction.dto.d.ts.map +1 -1
  88. package/dist/ai-instruction/dto/create-ai-instruction.dto.js +27 -1
  89. package/dist/ai-instruction/dto/create-ai-instruction.dto.js.map +1 -1
  90. package/dist/ai-instruction/dto/preview-ai-instruction.dto.d.ts +14 -0
  91. package/dist/ai-instruction/dto/preview-ai-instruction.dto.d.ts.map +1 -0
  92. package/dist/ai-instruction/dto/preview-ai-instruction.dto.js +42 -0
  93. package/dist/ai-instruction/dto/preview-ai-instruction.dto.js.map +1 -0
  94. package/dist/ai-instruction/dto/update-ai-instruction.dto.d.ts +11 -0
  95. package/dist/ai-instruction/dto/update-ai-instruction.dto.d.ts.map +1 -1
  96. package/dist/ai-instruction/dto/update-ai-instruction.dto.js +34 -0
  97. package/dist/ai-instruction/dto/update-ai-instruction.dto.js.map +1 -1
  98. package/dist/ai-instruction/types/ai-instruction.types.d.ts +13 -1
  99. package/dist/ai-instruction/types/ai-instruction.types.d.ts.map +1 -1
  100. package/dist/ai-instruction/types/ai-instruction.types.js +10 -0
  101. package/dist/ai-instruction/types/ai-instruction.types.js.map +1 -1
  102. package/dist/auth/auth.controller.d.ts +89 -15
  103. package/dist/auth/auth.controller.d.ts.map +1 -1
  104. package/dist/auth/auth.controller.js +116 -44
  105. package/dist/auth/auth.controller.js.map +1 -1
  106. package/dist/auth/auth.module.d.ts.map +1 -1
  107. package/dist/auth/auth.module.js +2 -0
  108. package/dist/auth/auth.module.js.map +1 -1
  109. package/dist/auth/auth.service.d.ts +169 -12
  110. package/dist/auth/auth.service.d.ts.map +1 -1
  111. package/dist/auth/auth.service.js +314 -67
  112. package/dist/auth/auth.service.js.map +1 -1
  113. package/dist/auth/dto/confirm-email.dto.d.ts +4 -0
  114. package/dist/auth/dto/confirm-email.dto.d.ts.map +1 -0
  115. package/dist/auth/dto/confirm-email.dto.js +22 -0
  116. package/dist/auth/dto/confirm-email.dto.js.map +1 -0
  117. package/dist/auth/dto/resend-confirmation.dto.d.ts +8 -0
  118. package/dist/auth/dto/resend-confirmation.dto.d.ts.map +1 -0
  119. package/dist/auth/dto/resend-confirmation.dto.js +36 -0
  120. package/dist/auth/dto/resend-confirmation.dto.js.map +1 -0
  121. package/dist/authorize/authorize.controller.d.ts +1 -1
  122. package/dist/authorize/authorize.controller.d.ts.map +1 -1
  123. package/dist/authorize/authorize.controller.js +4 -2
  124. package/dist/authorize/authorize.controller.js.map +1 -1
  125. package/dist/authorize/authorize.service.d.ts +7 -0
  126. package/dist/authorize/authorize.service.d.ts.map +1 -1
  127. package/dist/authorize/authorize.service.js +1 -1
  128. package/dist/authorize/authorize.service.js.map +1 -1
  129. package/dist/captcha/captcha.module.d.ts +3 -0
  130. package/dist/captcha/captcha.module.d.ts.map +1 -0
  131. package/dist/captcha/captcha.module.js +23 -0
  132. package/dist/captcha/captcha.module.js.map +1 -0
  133. package/dist/captcha/captcha.service.d.ts +38 -0
  134. package/dist/captcha/captcha.service.d.ts.map +1 -0
  135. package/dist/captcha/captcha.service.js +144 -0
  136. package/dist/captcha/captcha.service.js.map +1 -0
  137. package/dist/challenge/challenge.service.d.ts +31 -9
  138. package/dist/challenge/challenge.service.d.ts.map +1 -1
  139. package/dist/challenge/challenge.service.js +111 -16
  140. package/dist/challenge/challenge.service.js.map +1 -1
  141. package/dist/core.module.d.ts +3 -1
  142. package/dist/core.module.d.ts.map +1 -1
  143. package/dist/core.module.js +46 -2
  144. package/dist/core.module.js.map +1 -1
  145. package/dist/dashboard/dashboard/dashboard.controller.d.ts +21 -21
  146. package/dist/dashboard/dashboard/dashboard.service.d.ts +21 -21
  147. package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +10 -10
  148. package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +10 -10
  149. package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +20 -20
  150. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +20 -20
  151. package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts +3 -3
  152. package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +3 -3
  153. package/dist/dashboard/dashboard-item/dashboard-item.controller.d.ts +2 -2
  154. package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts +2 -2
  155. package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +13 -13
  156. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +13 -13
  157. package/dist/file/file.controller.d.ts +8 -1
  158. package/dist/file/file.controller.d.ts.map +1 -1
  159. package/dist/file/file.controller.js +45 -7
  160. package/dist/file/file.controller.js.map +1 -1
  161. package/dist/file/file.service.d.ts +134 -1
  162. package/dist/file/file.service.d.ts.map +1 -1
  163. package/dist/file/file.service.js +363 -12
  164. package/dist/file/file.service.js.map +1 -1
  165. package/dist/file/image-optimization.service.d.ts +43 -0
  166. package/dist/file/image-optimization.service.d.ts.map +1 -1
  167. package/dist/file/image-optimization.service.js +154 -0
  168. package/dist/file/image-optimization.service.js.map +1 -1
  169. package/dist/file/provider/abstract.provider.d.ts +16 -0
  170. package/dist/file/provider/abstract.provider.d.ts.map +1 -1
  171. package/dist/file/provider/abstract.provider.js +4 -0
  172. package/dist/file/provider/abstract.provider.js.map +1 -1
  173. package/dist/file/provider/gcs.provider.d.ts +2 -0
  174. package/dist/file/provider/gcs.provider.d.ts.map +1 -1
  175. package/dist/file/provider/gcs.provider.js +10 -0
  176. package/dist/file/provider/gcs.provider.js.map +1 -1
  177. package/dist/file/provider/local.provider.d.ts +1 -0
  178. package/dist/file/provider/local.provider.d.ts.map +1 -1
  179. package/dist/file/provider/local.provider.js +13 -0
  180. package/dist/file/provider/local.provider.js.map +1 -1
  181. package/dist/file/provider/s3.provider.d.ts +5 -0
  182. package/dist/file/provider/s3.provider.d.ts.map +1 -1
  183. package/dist/file/provider/s3.provider.js +15 -0
  184. package/dist/file/provider/s3.provider.js.map +1 -1
  185. package/dist/file/provider/spaces.provider.d.ts +5 -0
  186. package/dist/file/provider/spaces.provider.d.ts.map +1 -1
  187. package/dist/file/provider/spaces.provider.js +16 -0
  188. package/dist/file/provider/spaces.provider.js.map +1 -1
  189. package/dist/impersonation/dto/redeem-impersonation.dto.d.ts +4 -0
  190. package/dist/impersonation/dto/redeem-impersonation.dto.d.ts.map +1 -0
  191. package/dist/impersonation/dto/redeem-impersonation.dto.js +23 -0
  192. package/dist/impersonation/dto/redeem-impersonation.dto.js.map +1 -0
  193. package/dist/impersonation/dto/start-impersonation.dto.d.ts +7 -0
  194. package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -0
  195. package/dist/impersonation/dto/start-impersonation.dto.js +27 -0
  196. package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -0
  197. package/dist/impersonation/impersonation-restrictions.d.ts +26 -0
  198. package/dist/impersonation/impersonation-restrictions.d.ts.map +1 -0
  199. package/dist/impersonation/impersonation-restrictions.js +76 -0
  200. package/dist/impersonation/impersonation-restrictions.js.map +1 -0
  201. package/dist/impersonation/impersonation.controller.d.ts +90 -0
  202. package/dist/impersonation/impersonation.controller.d.ts.map +1 -0
  203. package/dist/impersonation/impersonation.controller.js +135 -0
  204. package/dist/impersonation/impersonation.controller.js.map +1 -0
  205. package/dist/impersonation/impersonation.module.d.ts +8 -0
  206. package/dist/impersonation/impersonation.module.d.ts.map +1 -0
  207. package/dist/impersonation/impersonation.module.js +44 -0
  208. package/dist/impersonation/impersonation.module.js.map +1 -0
  209. package/dist/impersonation/impersonation.service.d.ts +164 -0
  210. package/dist/impersonation/impersonation.service.d.ts.map +1 -0
  211. package/dist/impersonation/impersonation.service.js +408 -0
  212. package/dist/impersonation/impersonation.service.js.map +1 -0
  213. package/dist/incident/incident-notifier.service.d.ts +36 -0
  214. package/dist/incident/incident-notifier.service.d.ts.map +1 -0
  215. package/dist/incident/incident-notifier.service.js +208 -0
  216. package/dist/incident/incident-notifier.service.js.map +1 -0
  217. package/dist/incident/incident.controller.d.ts +23 -0
  218. package/dist/incident/incident.controller.d.ts.map +1 -0
  219. package/dist/incident/incident.controller.js +75 -0
  220. package/dist/incident/incident.controller.js.map +1 -0
  221. package/dist/incident/incident.module.d.ts +7 -0
  222. package/dist/incident/incident.module.d.ts.map +1 -0
  223. package/dist/incident/incident.module.js +32 -0
  224. package/dist/incident/incident.module.js.map +1 -0
  225. package/dist/incident/incident.service.d.ts +72 -0
  226. package/dist/incident/incident.service.d.ts.map +1 -0
  227. package/dist/incident/incident.service.js +184 -0
  228. package/dist/incident/incident.service.js.map +1 -0
  229. package/dist/index.d.ts +43 -0
  230. package/dist/index.d.ts.map +1 -1
  231. package/dist/index.js +49 -0
  232. package/dist/index.js.map +1 -1
  233. package/dist/integration/services/outbox-polling.coordinator.d.ts +2 -0
  234. package/dist/integration/services/outbox-polling.coordinator.d.ts.map +1 -1
  235. package/dist/integration/services/outbox-polling.coordinator.js +50 -30
  236. package/dist/integration/services/outbox-polling.coordinator.js.map +1 -1
  237. package/dist/integration/services/outbox.service.d.ts.map +1 -1
  238. package/dist/integration/services/outbox.service.js +5 -1
  239. package/dist/integration/services/outbox.service.js.map +1 -1
  240. package/dist/integration-profile/dto/test.dto.d.ts +13 -0
  241. package/dist/integration-profile/dto/test.dto.d.ts.map +1 -0
  242. package/dist/integration-profile/dto/test.dto.js +26 -0
  243. package/dist/integration-profile/dto/test.dto.js.map +1 -0
  244. package/dist/integration-profile/integration-profile.controller.d.ts +12 -1
  245. package/dist/integration-profile/integration-profile.controller.d.ts.map +1 -1
  246. package/dist/integration-profile/integration-profile.controller.js +9 -1
  247. package/dist/integration-profile/integration-profile.controller.js.map +1 -1
  248. package/dist/integration-profile/integration-profile.module.d.ts +6 -1
  249. package/dist/integration-profile/integration-profile.module.d.ts.map +1 -1
  250. package/dist/integration-profile/integration-profile.module.js +26 -3
  251. package/dist/integration-profile/integration-profile.module.js.map +1 -1
  252. package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
  253. package/dist/integration-profile/integration-profile.secrets.js +12 -1
  254. package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
  255. package/dist/integration-profile/integration-profile.service.d.ts +26 -7
  256. package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
  257. package/dist/integration-profile/integration-profile.service.js +94 -91
  258. package/dist/integration-profile/integration-profile.service.js.map +1 -1
  259. package/dist/integration-profile/integration-profile.utils.d.ts +27 -1
  260. package/dist/integration-profile/integration-profile.utils.d.ts.map +1 -1
  261. package/dist/integration-profile/integration-profile.utils.js +46 -5
  262. package/dist/integration-profile/integration-profile.utils.js.map +1 -1
  263. package/dist/integration-profile/testers/ai.testers.d.ts +3 -0
  264. package/dist/integration-profile/testers/ai.testers.d.ts.map +1 -0
  265. package/dist/integration-profile/testers/ai.testers.js +125 -0
  266. package/dist/integration-profile/testers/ai.testers.js.map +1 -0
  267. package/dist/integration-profile/testers/captcha.testers.d.ts +3 -0
  268. package/dist/integration-profile/testers/captcha.testers.d.ts.map +1 -0
  269. package/dist/integration-profile/testers/captcha.testers.js +121 -0
  270. package/dist/integration-profile/testers/captcha.testers.js.map +1 -0
  271. package/dist/integration-profile/testers/email.testers.d.ts +3 -0
  272. package/dist/integration-profile/testers/email.testers.d.ts.map +1 -0
  273. package/dist/integration-profile/testers/email.testers.js +156 -0
  274. package/dist/integration-profile/testers/email.testers.js.map +1 -0
  275. package/dist/integration-profile/testers/http-probe.d.ts +57 -0
  276. package/dist/integration-profile/testers/http-probe.d.ts.map +1 -0
  277. package/dist/integration-profile/testers/http-probe.js +140 -0
  278. package/dist/integration-profile/testers/http-probe.js.map +1 -0
  279. package/dist/integration-profile/testers/index.d.ts +12 -0
  280. package/dist/integration-profile/testers/index.d.ts.map +1 -0
  281. package/dist/integration-profile/testers/index.js +45 -0
  282. package/dist/integration-profile/testers/index.js.map +1 -0
  283. package/dist/integration-profile/testers/infrastructure.testers.d.ts +3 -0
  284. package/dist/integration-profile/testers/infrastructure.testers.d.ts.map +1 -0
  285. package/dist/integration-profile/testers/infrastructure.testers.js +105 -0
  286. package/dist/integration-profile/testers/infrastructure.testers.js.map +1 -0
  287. package/dist/integration-profile/testers/integration-tester.registry.d.ts +17 -0
  288. package/dist/integration-profile/testers/integration-tester.registry.d.ts.map +1 -0
  289. package/dist/integration-profile/testers/integration-tester.registry.js +52 -0
  290. package/dist/integration-profile/testers/integration-tester.registry.js.map +1 -0
  291. package/dist/integration-profile/testers/integration-tester.types.d.ts +55 -0
  292. package/dist/integration-profile/testers/integration-tester.types.d.ts.map +1 -0
  293. package/dist/integration-profile/testers/integration-tester.types.js +16 -0
  294. package/dist/integration-profile/testers/integration-tester.types.js.map +1 -0
  295. package/dist/integration-profile/testers/messaging.testers.d.ts +3 -0
  296. package/dist/integration-profile/testers/messaging.testers.d.ts.map +1 -0
  297. package/dist/integration-profile/testers/messaging.testers.js +70 -0
  298. package/dist/integration-profile/testers/messaging.testers.js.map +1 -0
  299. package/dist/integration-profile/testers/oauth.testers.d.ts +3 -0
  300. package/dist/integration-profile/testers/oauth.testers.d.ts.map +1 -0
  301. package/dist/integration-profile/testers/oauth.testers.js +285 -0
  302. package/dist/integration-profile/testers/oauth.testers.js.map +1 -0
  303. package/dist/integration-profile/testers/payment.testers.d.ts +3 -0
  304. package/dist/integration-profile/testers/payment.testers.d.ts.map +1 -0
  305. package/dist/integration-profile/testers/payment.testers.js +169 -0
  306. package/dist/integration-profile/testers/payment.testers.js.map +1 -0
  307. package/dist/integration-profile/testers/storage.testers.d.ts +3 -0
  308. package/dist/integration-profile/testers/storage.testers.d.ts.map +1 -0
  309. package/dist/integration-profile/testers/storage.testers.js +208 -0
  310. package/dist/integration-profile/testers/storage.testers.js.map +1 -0
  311. package/dist/language/en.json +15 -2
  312. package/dist/language/pt.json +15 -2
  313. package/dist/leaked-password/leaked-password.controller.d.ts +24 -0
  314. package/dist/leaked-password/leaked-password.controller.d.ts.map +1 -0
  315. package/dist/leaked-password/leaked-password.controller.js +78 -0
  316. package/dist/leaked-password/leaked-password.controller.js.map +1 -0
  317. package/dist/leaked-password/leaked-password.module.d.ts +8 -0
  318. package/dist/leaked-password/leaked-password.module.d.ts.map +1 -0
  319. package/dist/leaked-password/leaked-password.module.js +31 -0
  320. package/dist/leaked-password/leaked-password.module.js.map +1 -0
  321. package/dist/leaked-password/leaked-password.service.d.ts +64 -0
  322. package/dist/leaked-password/leaked-password.service.d.ts.map +1 -0
  323. package/dist/leaked-password/leaked-password.service.js +218 -0
  324. package/dist/leaked-password/leaked-password.service.js.map +1 -0
  325. package/dist/locale/locale.controller.d.ts +1 -1
  326. package/dist/locale/locale.service.d.ts +1 -1
  327. package/dist/mail/dto/preview.dto.d.ts +18 -0
  328. package/dist/mail/dto/preview.dto.d.ts.map +1 -0
  329. package/dist/mail/dto/preview.dto.js +66 -0
  330. package/dist/mail/dto/preview.dto.js.map +1 -0
  331. package/dist/mail/dto/send.dto.d.ts +44 -0
  332. package/dist/mail/dto/send.dto.d.ts.map +1 -1
  333. package/dist/mail/dto/send.dto.js +20 -0
  334. package/dist/mail/dto/send.dto.js.map +1 -1
  335. package/dist/mail/mail.controller.d.ts +5 -0
  336. package/dist/mail/mail.controller.d.ts.map +1 -1
  337. package/dist/mail/mail.controller.js +16 -2
  338. package/dist/mail/mail.controller.js.map +1 -1
  339. package/dist/mail/mail.module.d.ts.map +1 -1
  340. package/dist/mail/mail.module.js +2 -0
  341. package/dist/mail/mail.module.js.map +1 -1
  342. package/dist/mail/mail.service.d.ts +69 -4
  343. package/dist/mail/mail.service.d.ts.map +1 -1
  344. package/dist/mail/mail.service.js +278 -37
  345. package/dist/mail/mail.service.js.map +1 -1
  346. package/dist/mail-delivery/mail-delivery-provision.service.d.ts +21 -0
  347. package/dist/mail-delivery/mail-delivery-provision.service.d.ts.map +1 -0
  348. package/dist/mail-delivery/mail-delivery-provision.service.js +64 -0
  349. package/dist/mail-delivery/mail-delivery-provision.service.js.map +1 -0
  350. package/dist/mail-delivery/mail-delivery.constants.d.ts +17 -0
  351. package/dist/mail-delivery/mail-delivery.constants.d.ts.map +1 -0
  352. package/dist/mail-delivery/mail-delivery.constants.js +31 -0
  353. package/dist/mail-delivery/mail-delivery.constants.js.map +1 -0
  354. package/dist/mail-delivery/mail-delivery.controller.d.ts +19 -0
  355. package/dist/mail-delivery/mail-delivery.controller.d.ts.map +1 -0
  356. package/dist/mail-delivery/mail-delivery.controller.js +53 -0
  357. package/dist/mail-delivery/mail-delivery.controller.js.map +1 -0
  358. package/dist/mail-delivery/mail-delivery.module.d.ts +7 -0
  359. package/dist/mail-delivery/mail-delivery.module.d.ts.map +1 -0
  360. package/dist/mail-delivery/mail-delivery.module.js +36 -0
  361. package/dist/mail-delivery/mail-delivery.module.js.map +1 -0
  362. package/dist/mail-delivery/mail-delivery.service.d.ts +38 -0
  363. package/dist/mail-delivery/mail-delivery.service.d.ts.map +1 -0
  364. package/dist/mail-delivery/mail-delivery.service.js +140 -0
  365. package/dist/mail-delivery/mail-delivery.service.js.map +1 -0
  366. package/dist/mail-delivery/ses-event.parser.d.ts +27 -0
  367. package/dist/mail-delivery/ses-event.parser.d.ts.map +1 -0
  368. package/dist/mail-delivery/ses-event.parser.js +131 -0
  369. package/dist/mail-delivery/ses-event.parser.js.map +1 -0
  370. package/dist/mail-delivery/ses-webhook.service.d.ts +58 -0
  371. package/dist/mail-delivery/ses-webhook.service.d.ts.map +1 -0
  372. package/dist/mail-delivery/ses-webhook.service.js +214 -0
  373. package/dist/mail-delivery/ses-webhook.service.js.map +1 -0
  374. package/dist/mail-delivery/sns-message.util.d.ts +38 -0
  375. package/dist/mail-delivery/sns-message.util.d.ts.map +1 -0
  376. package/dist/mail-delivery/sns-message.util.js +109 -0
  377. package/dist/mail-delivery/sns-message.util.js.map +1 -0
  378. package/dist/mail-layout/dto/update.dto.d.ts +17 -0
  379. package/dist/mail-layout/dto/update.dto.d.ts.map +1 -0
  380. package/dist/mail-layout/dto/update.dto.js +27 -0
  381. package/dist/mail-layout/dto/update.dto.js.map +1 -0
  382. package/dist/mail-layout/mail-layout.controller.d.ts +15 -0
  383. package/dist/mail-layout/mail-layout.controller.d.ts.map +1 -0
  384. package/dist/mail-layout/mail-layout.controller.js +71 -0
  385. package/dist/mail-layout/mail-layout.controller.js.map +1 -0
  386. package/dist/mail-layout/mail-layout.module.d.ts +3 -0
  387. package/dist/mail-layout/mail-layout.module.d.ts.map +1 -0
  388. package/dist/mail-layout/mail-layout.module.js +35 -0
  389. package/dist/mail-layout/mail-layout.module.js.map +1 -0
  390. package/dist/mail-layout/mail-layout.service.d.ts +27 -0
  391. package/dist/mail-layout/mail-layout.service.d.ts.map +1 -0
  392. package/dist/mail-layout/mail-layout.service.js +80 -0
  393. package/dist/mail-layout/mail-layout.service.js.map +1 -0
  394. package/dist/mail-sent/dto/query-mail-sent-list.dto.d.ts +5 -0
  395. package/dist/mail-sent/dto/query-mail-sent-list.dto.d.ts.map +1 -1
  396. package/dist/mail-sent/dto/query-mail-sent-list.dto.js +6 -0
  397. package/dist/mail-sent/dto/query-mail-sent-list.dto.js.map +1 -1
  398. package/dist/mail-sent/mail-sent.controller.d.ts +39 -0
  399. package/dist/mail-sent/mail-sent.controller.d.ts.map +1 -1
  400. package/dist/mail-sent/mail-sent.service.d.ts +39 -0
  401. package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
  402. package/dist/mail-sent/mail-sent.service.js +45 -4
  403. package/dist/mail-sent/mail-sent.service.js.map +1 -1
  404. package/dist/mailbox/mailbox-fetcher.registry.d.ts +100 -0
  405. package/dist/mailbox/mailbox-fetcher.registry.d.ts.map +1 -0
  406. package/dist/mailbox/mailbox-fetcher.registry.js +59 -0
  407. package/dist/mailbox/mailbox-fetcher.registry.js.map +1 -0
  408. package/dist/mailbox/mailbox.module.d.ts +8 -0
  409. package/dist/mailbox/mailbox.module.d.ts.map +1 -0
  410. package/dist/mailbox/mailbox.module.js +27 -0
  411. package/dist/mailbox/mailbox.module.js.map +1 -0
  412. package/dist/mcp-chat/mcp-chat.controller.d.ts +2 -2
  413. package/dist/mcp-chat/mcp-chat.service.d.ts +24 -2
  414. package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
  415. package/dist/mcp-chat/mcp-chat.service.js +80 -24
  416. package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
  417. package/dist/meeting/meeting-provider.registry.d.ts +155 -0
  418. package/dist/meeting/meeting-provider.registry.d.ts.map +1 -0
  419. package/dist/meeting/meeting-provider.registry.js +53 -0
  420. package/dist/meeting/meeting-provider.registry.js.map +1 -0
  421. package/dist/meeting/meeting.constants.d.ts +47 -0
  422. package/dist/meeting/meeting.constants.d.ts.map +1 -0
  423. package/dist/meeting/meeting.constants.js +21 -0
  424. package/dist/meeting/meeting.constants.js.map +1 -0
  425. package/dist/meeting/meeting.module.d.ts +7 -0
  426. package/dist/meeting/meeting.module.d.ts.map +1 -0
  427. package/dist/meeting/meeting.module.js +26 -0
  428. package/dist/meeting/meeting.module.js.map +1 -0
  429. package/dist/menu/menu.controller.d.ts +3 -3
  430. package/dist/menu/menu.service.d.ts +3 -3
  431. package/dist/middlewares/locale-injection.middleware.d.ts +12 -0
  432. package/dist/middlewares/locale-injection.middleware.d.ts.map +1 -1
  433. package/dist/middlewares/locale-injection.middleware.js +20 -4
  434. package/dist/middlewares/locale-injection.middleware.js.map +1 -1
  435. package/dist/notification/notification.controller.d.ts +12 -12
  436. package/dist/notification/notification.service.d.ts +12 -12
  437. package/dist/oauth/oauth-token-broker.service.d.ts +72 -0
  438. package/dist/oauth/oauth-token-broker.service.d.ts.map +1 -0
  439. package/dist/oauth/oauth-token-broker.service.js +258 -0
  440. package/dist/oauth/oauth-token-broker.service.js.map +1 -0
  441. package/dist/oauth/oauth.module.d.ts.map +1 -1
  442. package/dist/oauth/oauth.module.js +3 -1
  443. package/dist/oauth/oauth.module.js.map +1 -1
  444. package/dist/oauth/oauth.service.d.ts +2 -0
  445. package/dist/oauth/oauth.service.d.ts.map +1 -1
  446. package/dist/oauth/oauth.service.js +6 -3
  447. package/dist/oauth/oauth.service.js.map +1 -1
  448. package/dist/oauth/providers/google.provider.d.ts +7 -0
  449. package/dist/oauth/providers/google.provider.d.ts.map +1 -1
  450. package/dist/oauth/providers/google.provider.js +43 -13
  451. package/dist/oauth/providers/google.provider.js.map +1 -1
  452. package/dist/observability/monitored-cron.d.ts +34 -0
  453. package/dist/observability/monitored-cron.d.ts.map +1 -0
  454. package/dist/observability/monitored-cron.js +118 -0
  455. package/dist/observability/monitored-cron.js.map +1 -0
  456. package/dist/pairing/dto/approve-reverse-pairing.dto.d.ts +12 -0
  457. package/dist/pairing/dto/approve-reverse-pairing.dto.d.ts.map +1 -0
  458. package/dist/pairing/dto/approve-reverse-pairing.dto.js +30 -0
  459. package/dist/pairing/dto/approve-reverse-pairing.dto.js.map +1 -0
  460. package/dist/pairing/dto/claim-pairing.dto.d.ts +11 -0
  461. package/dist/pairing/dto/claim-pairing.dto.d.ts.map +1 -0
  462. package/dist/pairing/dto/claim-pairing.dto.js +35 -0
  463. package/dist/pairing/dto/claim-pairing.dto.js.map +1 -0
  464. package/dist/pairing/dto/confirm-pairing.dto.d.ts +10 -0
  465. package/dist/pairing/dto/confirm-pairing.dto.d.ts.map +1 -0
  466. package/dist/pairing/dto/confirm-pairing.dto.js +24 -0
  467. package/dist/pairing/dto/confirm-pairing.dto.js.map +1 -0
  468. package/dist/pairing/dto/poll-reverse-pairing.dto.d.ts +5 -0
  469. package/dist/pairing/dto/poll-reverse-pairing.dto.d.ts.map +1 -0
  470. package/dist/pairing/dto/poll-reverse-pairing.dto.js +24 -0
  471. package/dist/pairing/dto/poll-reverse-pairing.dto.js.map +1 -0
  472. package/dist/pairing/dto/start-pairing.dto.d.ts +11 -0
  473. package/dist/pairing/dto/start-pairing.dto.d.ts.map +1 -0
  474. package/dist/pairing/dto/start-pairing.dto.js +30 -0
  475. package/dist/pairing/dto/start-pairing.dto.js.map +1 -0
  476. package/dist/pairing/dto/start-reverse-pairing.dto.d.ts +24 -0
  477. package/dist/pairing/dto/start-reverse-pairing.dto.d.ts.map +1 -0
  478. package/dist/pairing/dto/start-reverse-pairing.dto.js +47 -0
  479. package/dist/pairing/dto/start-reverse-pairing.dto.js.map +1 -0
  480. package/dist/pairing/pairing.controller.d.ts +118 -0
  481. package/dist/pairing/pairing.controller.d.ts.map +1 -0
  482. package/dist/pairing/pairing.controller.js +296 -0
  483. package/dist/pairing/pairing.controller.js.map +1 -0
  484. package/dist/pairing/pairing.module.d.ts +10 -0
  485. package/dist/pairing/pairing.module.d.ts.map +1 -0
  486. package/dist/pairing/pairing.module.js +40 -0
  487. package/dist/pairing/pairing.module.js.map +1 -0
  488. package/dist/pairing/pairing.service.d.ts +238 -0
  489. package/dist/pairing/pairing.service.d.ts.map +1 -0
  490. package/dist/pairing/pairing.service.js +495 -0
  491. package/dist/pairing/pairing.service.js.map +1 -0
  492. package/dist/pdf/pdf.service.d.ts +11 -6
  493. package/dist/pdf/pdf.service.d.ts.map +1 -1
  494. package/dist/pdf/pdf.service.js +60 -20
  495. package/dist/pdf/pdf.service.js.map +1 -1
  496. package/dist/presence/presence.controller.d.ts +16 -0
  497. package/dist/presence/presence.controller.d.ts.map +1 -0
  498. package/dist/presence/presence.controller.js +60 -0
  499. package/dist/presence/presence.controller.js.map +1 -0
  500. package/dist/presence/presence.listener.d.ts +29 -0
  501. package/dist/presence/presence.listener.d.ts.map +1 -0
  502. package/dist/presence/presence.listener.js +82 -0
  503. package/dist/presence/presence.listener.js.map +1 -0
  504. package/dist/presence/presence.module.d.ts +3 -0
  505. package/dist/presence/presence.module.d.ts.map +1 -0
  506. package/dist/presence/presence.module.js +32 -0
  507. package/dist/presence/presence.module.js.map +1 -0
  508. package/dist/presence/presence.service.d.ts +42 -0
  509. package/dist/presence/presence.service.d.ts.map +1 -0
  510. package/dist/presence/presence.service.js +147 -0
  511. package/dist/presence/presence.service.js.map +1 -0
  512. package/dist/profile/dto/delete-account.dto.d.ts +8 -0
  513. package/dist/profile/dto/delete-account.dto.d.ts.map +1 -0
  514. package/dist/profile/dto/delete-account.dto.js +22 -0
  515. package/dist/profile/dto/delete-account.dto.js.map +1 -0
  516. package/dist/profile/events/profile-account-deleted.event.d.ts +12 -0
  517. package/dist/profile/events/profile-account-deleted.event.d.ts.map +1 -0
  518. package/dist/profile/events/profile-account-deleted.event.js +17 -0
  519. package/dist/profile/events/profile-account-deleted.event.js.map +1 -0
  520. package/dist/profile/profile.controller.d.ts +32 -15
  521. package/dist/profile/profile.controller.d.ts.map +1 -1
  522. package/dist/profile/profile.controller.js +75 -46
  523. package/dist/profile/profile.controller.js.map +1 -1
  524. package/dist/profile/profile.service.d.ts +41 -18
  525. package/dist/profile/profile.service.d.ts.map +1 -1
  526. package/dist/profile/profile.service.js +133 -48
  527. package/dist/profile/profile.service.js.map +1 -1
  528. package/dist/realtime/realtime.gateway.d.ts +48 -0
  529. package/dist/realtime/realtime.gateway.d.ts.map +1 -0
  530. package/dist/realtime/realtime.gateway.js +156 -0
  531. package/dist/realtime/realtime.gateway.js.map +1 -0
  532. package/dist/realtime/realtime.module.d.ts +8 -0
  533. package/dist/realtime/realtime.module.d.ts.map +1 -0
  534. package/dist/realtime/realtime.module.js +29 -0
  535. package/dist/realtime/realtime.module.js.map +1 -0
  536. package/dist/realtime/realtime.service.d.ts +51 -0
  537. package/dist/realtime/realtime.service.d.ts.map +1 -0
  538. package/dist/realtime/realtime.service.js +177 -0
  539. package/dist/realtime/realtime.service.js.map +1 -0
  540. package/dist/redis/redis-pubsub.d.ts +27 -0
  541. package/dist/redis/redis-pubsub.d.ts.map +1 -0
  542. package/dist/redis/redis-pubsub.js +184 -0
  543. package/dist/redis/redis-pubsub.js.map +1 -0
  544. package/dist/role/guards/role.guard.d.ts +5 -0
  545. package/dist/role/guards/role.guard.d.ts.map +1 -1
  546. package/dist/role/guards/role.guard.js +41 -39
  547. package/dist/role/guards/role.guard.js.map +1 -1
  548. package/dist/role/role.controller.d.ts +3 -3
  549. package/dist/role/role.service.d.ts +3 -3
  550. package/dist/session/session.controller.d.ts +2 -0
  551. package/dist/session/session.controller.d.ts.map +1 -1
  552. package/dist/session/session.service.d.ts +39 -0
  553. package/dist/session/session.service.d.ts.map +1 -1
  554. package/dist/session/session.service.js +91 -8
  555. package/dist/session/session.service.js.map +1 -1
  556. package/dist/setting/brand-asset.service.d.ts +48 -0
  557. package/dist/setting/brand-asset.service.d.ts.map +1 -0
  558. package/dist/setting/brand-asset.service.js +130 -0
  559. package/dist/setting/brand-asset.service.js.map +1 -0
  560. package/dist/setting/dto/create.dto.d.ts.map +1 -1
  561. package/dist/setting/dto/create.dto.js +9 -2
  562. package/dist/setting/dto/create.dto.js.map +1 -1
  563. package/dist/setting/setting.controller.d.ts +5 -5
  564. package/dist/setting/setting.module.d.ts.map +1 -1
  565. package/dist/setting/setting.module.js +3 -2
  566. package/dist/setting/setting.module.js.map +1 -1
  567. package/dist/setting/setting.service.d.ts +41 -5
  568. package/dist/setting/setting.service.d.ts.map +1 -1
  569. package/dist/setting/setting.service.js +113 -1
  570. package/dist/setting/setting.service.js.map +1 -1
  571. package/dist/token/token.service.d.ts +23 -2
  572. package/dist/token/token.service.d.ts.map +1 -1
  573. package/dist/token/token.service.js +39 -4
  574. package/dist/token/token.service.js.map +1 -1
  575. package/dist/user/dto/create-with-email-and-password.dto.d.ts +2 -0
  576. package/dist/user/dto/create-with-email-and-password.dto.d.ts.map +1 -1
  577. package/dist/user/dto/create-with-email-and-password.dto.js +5 -0
  578. package/dist/user/dto/create-with-email-and-password.dto.js.map +1 -1
  579. package/dist/user/dto/query-user-mail-list.dto.d.ts +5 -0
  580. package/dist/user/dto/query-user-mail-list.dto.d.ts.map +1 -0
  581. package/dist/user/dto/query-user-mail-list.dto.js +25 -0
  582. package/dist/user/dto/query-user-mail-list.dto.js.map +1 -0
  583. package/dist/user/user-credential.util.d.ts +19 -0
  584. package/dist/user/user-credential.util.d.ts.map +1 -0
  585. package/dist/user/user-credential.util.js +32 -0
  586. package/dist/user/user-credential.util.js.map +1 -0
  587. package/dist/user/user.controller.d.ts +24 -26
  588. package/dist/user/user.controller.d.ts.map +1 -1
  589. package/dist/user/user.controller.js +18 -3
  590. package/dist/user/user.controller.js.map +1 -1
  591. package/dist/user/user.service.d.ts +71 -29
  592. package/dist/user/user.service.d.ts.map +1 -1
  593. package/dist/user/user.service.js +291 -17
  594. package/dist/user/user.service.js.map +1 -1
  595. package/dist/user-device/user-device.controller.d.ts +54 -0
  596. package/dist/user-device/user-device.controller.d.ts.map +1 -0
  597. package/dist/user-device/user-device.controller.js +103 -0
  598. package/dist/user-device/user-device.controller.js.map +1 -0
  599. package/dist/user-device/user-device.module.d.ts +3 -0
  600. package/dist/user-device/user-device.module.d.ts.map +1 -0
  601. package/dist/user-device/user-device.module.js +26 -0
  602. package/dist/user-device/user-device.module.js.map +1 -0
  603. package/dist/user-device/user-device.service.d.ts +71 -0
  604. package/dist/user-device/user-device.service.d.ts.map +1 -0
  605. package/dist/user-device/user-device.service.js +158 -0
  606. package/dist/user-device/user-device.service.js.map +1 -0
  607. package/dist/utils/device-key.d.ts +23 -0
  608. package/dist/utils/device-key.d.ts.map +1 -0
  609. package/dist/utils/device-key.js +31 -0
  610. package/dist/utils/device-key.js.map +1 -0
  611. package/dist/utils/geo-ip.d.ts +38 -0
  612. package/dist/utils/geo-ip.d.ts.map +1 -0
  613. package/dist/utils/geo-ip.js +122 -0
  614. package/dist/utils/geo-ip.js.map +1 -0
  615. package/dist/utils/locale-context.d.ts +10 -7
  616. package/dist/utils/locale-context.d.ts.map +1 -1
  617. package/dist/utils/locale-context.js +14 -8
  618. package/dist/utils/locale-context.js.map +1 -1
  619. package/dist/utils/security-event-vars.d.ts +56 -0
  620. package/dist/utils/security-event-vars.d.ts.map +1 -0
  621. package/dist/utils/security-event-vars.js +109 -0
  622. package/dist/utils/security-event-vars.js.map +1 -0
  623. package/dist/utils/user-agent.d.ts +19 -0
  624. package/dist/utils/user-agent.d.ts.map +1 -0
  625. package/dist/utils/user-agent.js +36 -0
  626. package/dist/utils/user-agent.js.map +1 -0
  627. package/dist/validators/is-strong-password-with-settings.validator.d.ts.map +1 -1
  628. package/dist/validators/is-strong-password-with-settings.validator.js +11 -0
  629. package/dist/validators/is-strong-password-with-settings.validator.js.map +1 -1
  630. package/dist/validators/service-locator.d.ts +9 -0
  631. package/dist/validators/service-locator.d.ts.map +1 -1
  632. package/dist/validators/service-locator.js +12 -0
  633. package/dist/validators/service-locator.js.map +1 -1
  634. package/dist/webhook-integration/webhook-integration.service.d.ts +5 -0
  635. package/dist/webhook-integration/webhook-integration.service.d.ts.map +1 -1
  636. package/dist/webhook-integration/webhook-integration.service.js +50 -4
  637. package/dist/webhook-integration/webhook-integration.service.js.map +1 -1
  638. package/dist/webhook-integration/webhook-protocol.registry.d.ts +6 -0
  639. package/dist/webhook-integration/webhook-protocol.registry.d.ts.map +1 -1
  640. package/dist/webhook-integration/webhook-protocol.registry.js.map +1 -1
  641. package/dist/whatsapp-sender/whatsapp-sender.module.d.ts +3 -0
  642. package/dist/whatsapp-sender/whatsapp-sender.module.d.ts.map +1 -0
  643. package/dist/whatsapp-sender/whatsapp-sender.module.js +23 -0
  644. package/dist/whatsapp-sender/whatsapp-sender.module.js.map +1 -0
  645. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +50 -0
  646. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -0
  647. package/dist/whatsapp-sender/whatsapp-sender.service.js +224 -0
  648. package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -0
  649. package/hedhog/data/integration_provider.yaml +25 -0
  650. package/hedhog/data/mail.yaml +275 -112
  651. package/hedhog/data/mail_layout.yaml +198 -0
  652. package/hedhog/data/menu.yaml +69 -3
  653. package/hedhog/data/role.yaml +16 -0
  654. package/hedhog/data/route.yaml +307 -3
  655. package/hedhog/data/setting_group.yaml +315 -1
  656. package/hedhog/data/setting_subgroup.yaml +8 -0
  657. package/hedhog/frontend/app/_lib/hooks/use-core-access.test.tsx.ejs +125 -0
  658. package/hedhog/frontend/app/_lib/hooks/use-core-access.ts.ejs +29 -0
  659. package/hedhog/frontend/app/_lib/hooks/use-impersonation-access.test.ts.ejs +71 -0
  660. package/hedhog/frontend/app/_lib/hooks/use-impersonation-access.ts.ejs +32 -0
  661. package/hedhog/frontend/app/access-log/page.tsx.ejs +96 -22
  662. package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +17 -1
  663. package/hedhog/frontend/app/account/components/known-devices.tsx.ejs +89 -0
  664. package/hedhog/frontend/app/account/components/mfa-setup-dialog.tsx.ejs +36 -0
  665. package/hedhog/frontend/app/account/components/profile-form.tsx.ejs +2 -1
  666. package/hedhog/frontend/app/account/components/two-factor-auth.tsx.ejs +2 -0
  667. package/hedhog/frontend/app/account/components/user-devices-list.tsx.ejs +186 -0
  668. package/hedhog/frontend/app/account/devices/page.tsx.ejs +5 -0
  669. package/hedhog/frontend/app/account/hooks/use-mfa-setup.ts.ejs +10 -7
  670. package/hedhog/frontend/app/account/layout.tsx.ejs +2 -0
  671. package/hedhog/frontend/app/ai_agent/page.tsx.ejs +7 -4
  672. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +580 -0
  673. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-preview.tsx.ejs +150 -0
  674. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +199 -0
  675. package/hedhog/frontend/app/ai_instruction/_components/prompt-diff.tsx.ejs +63 -0
  676. package/hedhog/frontend/app/ai_instruction/_lib/line-diff.spec.ts.ejs +59 -0
  677. package/hedhog/frontend/app/ai_instruction/_lib/line-diff.ts.ejs +72 -0
  678. package/hedhog/frontend/app/ai_instruction/_lib/prompt-template.spec.ts.ejs +170 -0
  679. package/hedhog/frontend/app/ai_instruction/_lib/prompt-template.ts.ejs +167 -0
  680. package/hedhog/frontend/app/ai_instruction/_lib/types.ts.ejs +99 -0
  681. package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +422 -0
  682. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +298 -0
  683. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +410 -1223
  684. package/hedhog/frontend/app/incidents/page.tsx.ejs +400 -0
  685. package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +153 -84
  686. package/hedhog/frontend/app/mail/layout/page.tsx.ejs +344 -0
  687. package/hedhog/frontend/app/mail/log/page.tsx.ejs +210 -3
  688. package/hedhog/frontend/app/mail/template/page.tsx.ejs +292 -200
  689. package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +129 -17
  690. package/hedhog/frontend/app/pages/_components/page-delete-dialog.tsx.ejs +343 -0
  691. package/hedhog/frontend/app/pages/_components/page-detail-sheet.tsx.ejs +438 -0
  692. package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1009 -0
  693. package/hedhog/frontend/app/pages/_components/system-page-types.ts.ejs +56 -0
  694. package/hedhog/frontend/app/pages/_components/use-system-pages.ts.ejs +171 -0
  695. package/hedhog/frontend/app/pages/page.tsx.ejs +514 -0
  696. package/hedhog/frontend/app/users/active-session.tsx.ejs +58 -11
  697. package/hedhog/frontend/app/users/page.tsx.ejs +186 -21
  698. package/hedhog/frontend/app/users/simulate-access-dialog.test.tsx.ejs +202 -0
  699. package/hedhog/frontend/app/users/simulate-access-dialog.tsx.ejs +170 -0
  700. package/hedhog/frontend/app/users/user-activity-timeline.tsx.ejs +250 -0
  701. package/hedhog/frontend/app/users/user-devices.tsx.ejs +89 -0
  702. package/hedhog/frontend/app/users/user-logs.tsx.ejs +13 -1
  703. package/hedhog/frontend/app/users/user-mails.tsx.ejs +399 -0
  704. package/hedhog/frontend/app/users/user-sheet.tsx.ejs +106 -99
  705. package/hedhog/frontend/messages/en.json +643 -49
  706. package/hedhog/frontend/messages/pt.json +643 -49
  707. package/hedhog/table/access_log.yaml +7 -0
  708. package/hedhog/table/ai_agent.yaml +1 -0
  709. package/hedhog/table/ai_instruction.yaml +15 -0
  710. package/hedhog/table/file.yaml +8 -0
  711. package/hedhog/table/leaked_password.yaml +18 -0
  712. package/hedhog/table/mail_delivery_event.yaml +76 -0
  713. package/hedhog/table/mail_layout.yaml +35 -0
  714. package/hedhog/table/mail_sent.yaml +23 -0
  715. package/hedhog/table/mail_var.yaml +4 -0
  716. package/hedhog/table/setting.yaml +1 -0
  717. package/hedhog/table/system_incident.yaml +59 -0
  718. package/hedhog/table/user_activity.yaml +9 -0
  719. package/hedhog/table/user_device.yaml +52 -0
  720. package/hedhog/table/user_presence.yaml +36 -0
  721. package/hedhog/table/user_session.yaml +20 -1
  722. package/package.json +7 -2
  723. package/src/access-log/access-log.controller.ts +1 -0
  724. package/src/access-log/access-log.interceptor.ts +9 -3
  725. package/src/access-log/access-log.service.spec.ts +33 -2
  726. package/src/access-log/access-log.service.ts +38 -0
  727. package/src/access-log/dto/query-access-log.dto.ts +5 -0
  728. package/src/ai/ai-attachment.fragments.spec.ts +319 -0
  729. package/src/ai/ai-attachment.fragments.ts +35 -0
  730. package/src/ai/ai.controller.ts +9 -0
  731. package/src/ai/ai.module.ts +3 -2
  732. package/src/ai/ai.prompts.ts +38 -0
  733. package/src/ai/ai.service.spec.ts +280 -0
  734. package/src/ai/ai.service.ts +475 -82
  735. package/src/ai/dto/chat.dto.ts +33 -3
  736. package/src/ai/dto/create-agent.dto.ts +2 -2
  737. package/src/ai/dto/richtext-edit-html.dto.ts +11 -0
  738. package/src/ai/dto/update-agent.dto.ts +2 -2
  739. package/src/ai/richtext-ai.prompts.ts +57 -0
  740. package/src/ai/richtext-ai.service.ts +109 -0
  741. package/src/ai-instruction/ai-instruction.controller.ts +40 -9
  742. package/src/ai-instruction/ai-instruction.module.ts +13 -2
  743. package/src/ai-instruction/ai-instruction.service.spec.ts +658 -0
  744. package/src/ai-instruction/ai-instruction.service.ts +661 -62
  745. package/src/ai-instruction/ai-prompt-builder.service.ts +10 -1
  746. package/src/ai-instruction/ai-prompt-registry.ts +87 -0
  747. package/src/ai-instruction/ai-prompt-resolver.service.spec.ts +375 -0
  748. package/src/ai-instruction/ai-prompt-resolver.service.ts +295 -0
  749. package/src/ai-instruction/ai-prompt-template.util.spec.ts +162 -0
  750. package/src/ai-instruction/ai-prompt-template.util.ts +199 -0
  751. package/src/ai-instruction/dto/create-ai-instruction.dto.ts +39 -3
  752. package/src/ai-instruction/dto/preview-ai-instruction.dto.ts +26 -0
  753. package/src/ai-instruction/dto/update-ai-instruction.dto.ts +42 -1
  754. package/src/ai-instruction/types/ai-instruction.types.ts +24 -1
  755. package/src/auth/auth.controller.ts +78 -13
  756. package/src/auth/auth.module.ts +2 -0
  757. package/src/auth/auth.service.spec.ts +386 -7
  758. package/src/auth/auth.service.ts +435 -81
  759. package/src/auth/dto/confirm-email.dto.ts +7 -0
  760. package/src/auth/dto/resend-confirmation.dto.ts +20 -0
  761. package/src/authorize/authorize.controller.ts +2 -0
  762. package/src/authorize/authorize.service.spec.ts +23 -0
  763. package/src/authorize/authorize.service.ts +8 -0
  764. package/src/captcha/captcha.module.ts +10 -0
  765. package/src/captcha/captcha.service.spec.ts +210 -0
  766. package/src/captcha/captcha.service.ts +191 -0
  767. package/src/challenge/challenge.service.spec.ts +112 -4
  768. package/src/challenge/challenge.service.ts +131 -17
  769. package/src/core.module.ts +46 -1
  770. package/src/file/file.controller.ts +54 -4
  771. package/src/file/file.service.spec.ts +275 -0
  772. package/src/file/file.service.ts +468 -16
  773. package/src/file/image-optimization.service.spec.ts +92 -0
  774. package/src/file/image-optimization.service.ts +202 -0
  775. package/src/file/provider/abstract.provider.ts +23 -0
  776. package/src/file/provider/gcs.provider.ts +17 -0
  777. package/src/file/provider/local.provider.ts +21 -0
  778. package/src/file/provider/s3.provider.ts +25 -0
  779. package/src/file/provider/spaces.provider.ts +26 -0
  780. package/src/impersonation/dto/redeem-impersonation.dto.ts +8 -0
  781. package/src/impersonation/dto/start-impersonation.dto.ts +13 -0
  782. package/src/impersonation/impersonation-restrictions.ts +84 -0
  783. package/src/impersonation/impersonation.controller.ts +109 -0
  784. package/src/impersonation/impersonation.module.ts +31 -0
  785. package/src/impersonation/impersonation.service.spec.ts +427 -0
  786. package/src/impersonation/impersonation.service.ts +577 -0
  787. package/src/incident/incident-notifier.service.spec.ts +205 -0
  788. package/src/incident/incident-notifier.service.ts +241 -0
  789. package/src/incident/incident.controller.ts +38 -0
  790. package/src/incident/incident.module.ts +19 -0
  791. package/src/incident/incident.service.spec.ts +150 -0
  792. package/src/incident/incident.service.ts +209 -0
  793. package/src/index.ts +58 -0
  794. package/src/integration/services/outbox-polling.coordinator.spec.ts +90 -0
  795. package/src/integration/services/outbox-polling.coordinator.ts +62 -40
  796. package/src/integration/services/outbox.service.spec.ts +8 -0
  797. package/src/integration/services/outbox.service.ts +19 -13
  798. package/src/integration-profile/dto/test.dto.ts +19 -0
  799. package/src/integration-profile/integration-profile.controller.ts +10 -1
  800. package/src/integration-profile/integration-profile.module.spec.ts +51 -0
  801. package/src/integration-profile/integration-profile.module.ts +23 -4
  802. package/src/integration-profile/integration-profile.secrets.ts +12 -1
  803. package/src/integration-profile/integration-profile.service.spec.ts +279 -0
  804. package/src/integration-profile/integration-profile.service.ts +120 -124
  805. package/src/integration-profile/integration-profile.utils.spec.ts +22 -0
  806. package/src/integration-profile/integration-profile.utils.ts +78 -3
  807. package/src/integration-profile/testers/ai.testers.ts +165 -0
  808. package/src/integration-profile/testers/captcha.testers.spec.ts +92 -0
  809. package/src/integration-profile/testers/captcha.testers.ts +139 -0
  810. package/src/integration-profile/testers/email.testers.ts +194 -0
  811. package/src/integration-profile/testers/http-probe.spec.ts +153 -0
  812. package/src/integration-profile/testers/http-probe.ts +171 -0
  813. package/src/integration-profile/testers/index.ts +30 -0
  814. package/src/integration-profile/testers/infrastructure.testers.ts +122 -0
  815. package/src/integration-profile/testers/integration-tester.registry.spec.ts +75 -0
  816. package/src/integration-profile/testers/integration-tester.registry.ts +43 -0
  817. package/src/integration-profile/testers/integration-tester.types.ts +61 -0
  818. package/src/integration-profile/testers/messaging.testers.ts +102 -0
  819. package/src/integration-profile/testers/oauth.testers.spec.ts +220 -0
  820. package/src/integration-profile/testers/oauth.testers.ts +305 -0
  821. package/src/integration-profile/testers/payment.testers.ts +185 -0
  822. package/src/integration-profile/testers/remaining.testers.spec.ts +401 -0
  823. package/src/integration-profile/testers/storage.testers.spec.ts +185 -0
  824. package/src/integration-profile/testers/storage.testers.ts +226 -0
  825. package/src/integration-profile/testers/tester-coverage.spec.ts +58 -0
  826. package/src/language/en.json +15 -2
  827. package/src/language/pt.json +15 -2
  828. package/src/leaked-password/README.md +83 -0
  829. package/src/leaked-password/leaked-password.controller.ts +52 -0
  830. package/src/leaked-password/leaked-password.module.ts +18 -0
  831. package/src/leaked-password/leaked-password.service.ts +242 -0
  832. package/src/leaked-password/seed/build-seed-sql.mjs +180 -0
  833. package/src/leaked-password/seed/common-passwords.txt +335 -0
  834. package/src/mail/dto/preview.dto.ts +50 -0
  835. package/src/mail/dto/send.dto.ts +58 -1
  836. package/src/mail/mail-template.spec.ts +274 -0
  837. package/src/mail/mail.controller.ts +9 -2
  838. package/src/mail/mail.module.ts +2 -0
  839. package/src/mail/mail.service.spec.ts +422 -6
  840. package/src/mail/mail.service.ts +337 -34
  841. package/src/mail-delivery/mail-delivery-provision.service.ts +66 -0
  842. package/src/mail-delivery/mail-delivery.constants.ts +31 -0
  843. package/src/mail-delivery/mail-delivery.controller.ts +38 -0
  844. package/src/mail-delivery/mail-delivery.module.ts +23 -0
  845. package/src/mail-delivery/mail-delivery.service.spec.ts +136 -0
  846. package/src/mail-delivery/mail-delivery.service.ts +152 -0
  847. package/src/mail-delivery/ses-event.parser.spec.ts +140 -0
  848. package/src/mail-delivery/ses-event.parser.ts +191 -0
  849. package/src/mail-delivery/ses-webhook.service.spec.ts +170 -0
  850. package/src/mail-delivery/ses-webhook.service.ts +240 -0
  851. package/src/mail-delivery/sns-message.util.spec.ts +163 -0
  852. package/src/mail-delivery/sns-message.util.ts +125 -0
  853. package/src/mail-layout/dto/update.dto.ts +19 -0
  854. package/src/mail-layout/mail-layout.controller.ts +47 -0
  855. package/src/mail-layout/mail-layout.module.ts +22 -0
  856. package/src/mail-layout/mail-layout.service.ts +94 -0
  857. package/src/mail-sent/dto/query-mail-sent-list.dto.ts +15 -0
  858. package/src/mail-sent/mail-sent.service.ts +46 -2
  859. package/src/mailbox/mailbox-fetcher.registry.ts +132 -0
  860. package/src/mailbox/mailbox.module.ts +14 -0
  861. package/src/mcp-chat/mcp-chat.service.spec.ts +236 -0
  862. package/src/mcp-chat/mcp-chat.service.ts +122 -26
  863. package/src/meeting/meeting-provider.registry.ts +193 -0
  864. package/src/meeting/meeting.constants.ts +53 -0
  865. package/src/meeting/meeting.module.ts +13 -0
  866. package/src/middlewares/locale-injection.middleware.ts +25 -6
  867. package/src/oauth/oauth-token-broker.service.spec.ts +172 -0
  868. package/src/oauth/oauth-token-broker.service.ts +363 -0
  869. package/src/oauth/oauth.module.ts +3 -1
  870. package/src/oauth/oauth.service.ts +8 -2
  871. package/src/oauth/providers/google.provider.ts +49 -15
  872. package/src/observability/monitored-cron.spec.ts +102 -0
  873. package/src/observability/monitored-cron.ts +110 -0
  874. package/src/pairing/dto/approve-reverse-pairing.dto.ts +20 -0
  875. package/src/pairing/dto/claim-pairing.dto.ts +19 -0
  876. package/src/pairing/dto/confirm-pairing.dto.ts +14 -0
  877. package/src/pairing/dto/poll-reverse-pairing.dto.ts +9 -0
  878. package/src/pairing/dto/start-pairing.dto.ts +19 -0
  879. package/src/pairing/dto/start-reverse-pairing.dto.ts +45 -0
  880. package/src/pairing/pairing.controller.ts +246 -0
  881. package/src/pairing/pairing.module.ts +27 -0
  882. package/src/pairing/pairing.service.spec.ts +462 -0
  883. package/src/pairing/pairing.service.ts +614 -0
  884. package/src/pdf/pdf.service.ts +81 -24
  885. package/src/presence/presence.controller.ts +29 -0
  886. package/src/presence/presence.listener.ts +53 -0
  887. package/src/presence/presence.module.ts +19 -0
  888. package/src/presence/presence.service.spec.ts +97 -0
  889. package/src/presence/presence.service.ts +160 -0
  890. package/src/profile/dto/delete-account.dto.ts +11 -0
  891. package/src/profile/events/profile-account-deleted.event.ts +13 -0
  892. package/src/profile/profile.controller.ts +46 -34
  893. package/src/profile/profile.service.ts +164 -46
  894. package/src/realtime/realtime.gateway.ts +138 -0
  895. package/src/realtime/realtime.module.ts +16 -0
  896. package/src/realtime/realtime.service.spec.ts +50 -0
  897. package/src/realtime/realtime.service.ts +187 -0
  898. package/src/redis/redis-pubsub.ts +190 -0
  899. package/src/role/guards/role.guard.spec.ts +75 -0
  900. package/src/role/guards/role.guard.ts +64 -46
  901. package/src/session/session.service.spec.ts +81 -0
  902. package/src/session/session.service.ts +93 -6
  903. package/src/setting/brand-asset.service.ts +137 -0
  904. package/src/setting/dto/create.dto.ts +13 -2
  905. package/src/setting/setting.module.ts +3 -2
  906. package/src/setting/setting.service.spec.ts +135 -1
  907. package/src/setting/setting.service.ts +138 -2
  908. package/src/token/token.service.spec.ts +62 -0
  909. package/src/token/token.service.ts +57 -3
  910. package/src/user/dto/create-with-email-and-password.dto.ts +6 -1
  911. package/src/user/dto/query-user-mail-list.dto.ts +10 -0
  912. package/src/user/user-credential.util.ts +35 -0
  913. package/src/user/user.controller.ts +17 -2
  914. package/src/user/user.service.spec.ts +186 -2
  915. package/src/user/user.service.ts +361 -16
  916. package/src/user-device/user-device.controller.ts +77 -0
  917. package/src/user-device/user-device.module.ts +13 -0
  918. package/src/user-device/user-device.service.spec.ts +234 -0
  919. package/src/user-device/user-device.service.ts +168 -0
  920. package/src/utils/device-key.spec.ts +57 -0
  921. package/src/utils/device-key.ts +32 -0
  922. package/src/utils/geo-ip.spec.ts +134 -0
  923. package/src/utils/geo-ip.ts +93 -0
  924. package/src/utils/locale-context.spec.ts +27 -1
  925. package/src/utils/locale-context.ts +15 -12
  926. package/src/utils/security-event-vars.spec.ts +161 -0
  927. package/src/utils/security-event-vars.ts +153 -0
  928. package/src/utils/user-agent.spec.ts +37 -0
  929. package/src/utils/user-agent.ts +46 -0
  930. package/src/validators/is-strong-password-with-settings.validator.ts +12 -0
  931. package/src/validators/service-locator.ts +15 -0
  932. package/src/webhook-integration/webhook-integration.service.ts +57 -3
  933. package/src/webhook-integration/webhook-protocol.registry.ts +6 -0
  934. package/src/whatsapp-sender/whatsapp-sender.module.ts +10 -0
  935. package/src/whatsapp-sender/whatsapp-sender.service.ts +313 -0
@@ -56,10 +56,13 @@ const security_service_1 = require("../security/security.service");
56
56
  const session_service_1 = require("../session/session.service");
57
57
  const setting_service_1 = require("../setting/setting.service");
58
58
  const token_service_1 = require("../token/token.service");
59
+ const user_device_service_1 = require("../user-device/user-device.service");
60
+ const user_credential_util_1 = require("../user/user-credential.util");
59
61
  const user_service_1 = require("../user/user.service");
62
+ const security_event_vars_1 = require("../utils/security-event-vars");
60
63
  const webauthn_origin_1 = require("../utils/webauthn-origin");
61
64
  let AuthService = AuthService_1 = class AuthService {
62
- constructor(prisma, mail, setting, security, token, session, user, challenge) {
65
+ constructor(prisma, mail, setting, security, token, session, user, challenge, userDevice) {
63
66
  this.prisma = prisma;
64
67
  this.mail = mail;
65
68
  this.setting = setting;
@@ -68,6 +71,7 @@ let AuthService = AuthService_1 = class AuthService {
68
71
  this.session = session;
69
72
  this.user = user;
70
73
  this.challenge = challenge;
74
+ this.userDevice = userDevice;
71
75
  this.logger = new common_1.Logger(AuthService_1.name);
72
76
  }
73
77
  async getAuthenticationPayload(locale, userId, ipAddress, userAgent, browserId) {
@@ -75,6 +79,15 @@ let AuthService = AuthService_1 = class AuthService {
75
79
  const payload = { sub: userId, sessionId: session.id };
76
80
  const accessToken = await this.token.createAccessToken(payload);
77
81
  await this.prisma.user.update({ where: { id: userId }, data: { last_login_at: new Date() } });
82
+ // Unico ponto por onde todo caminho de autenticacao passa (senha, MFA,
83
+ // WebAuthn, recovery code, OAuth, pairing), entao e aqui que o dispositivo
84
+ // e aprendido. Quem checa `isNewDevice` faz isso antes de chegar aqui.
85
+ await this.userDevice.remember(userId, { userAgent, browserId, ipAddress });
86
+ // O idioma e aprendido junto com o dispositivo, e pelo mesmo motivo: e o
87
+ // unico momento em que o cliente se apresenta. Fica antes do alerta de
88
+ // dispositivo desconhecido (disparado por quem chamou este metodo), entao o
89
+ // proprio e-mail do primeiro login ja sai traduzido.
90
+ await this.persistDetectedLanguage(locale, userId);
78
91
  this.logger.debug(`[AuthService] Session created userId=${userId} sessionId=${session.id}`);
79
92
  return {
80
93
  accessToken,
@@ -82,15 +95,56 @@ let AuthService = AuthService_1 = class AuthService {
82
95
  session,
83
96
  };
84
97
  }
85
- async issueDesktopToken(locale, userId, ipAddress, userAgent) {
98
+ /**
99
+ * Adota o idioma do cliente como preferencia do usuario - uma unica vez.
100
+ *
101
+ * Escrita write-once de proposito: sobrescrever a cada login faria um acesso
102
+ * de aparelho emprestado, ou de um navegador em outro idioma, apagar a
103
+ * escolha que o usuario fez na tela de preferencias.
104
+ *
105
+ * Nunca lanca. Idioma e acabamento; login que falha por causa dele seria uma
106
+ * troca pessima.
107
+ */
108
+ async persistDetectedLanguage(locale, userId) {
109
+ try {
110
+ // `detected` distingue a escolha do cliente do default do middleware.
111
+ // Sem isso, todo cliente que nao manda `Accept-Language` congelaria `en`.
112
+ if (!(0, api_locale_1.isLocaleDetectedFromContext)()) {
113
+ return;
114
+ }
115
+ const code = (0, api_locale_1.normalizeLocaleCode)((0, api_locale_1.getLocaleFromContext)());
116
+ if (!code) {
117
+ return;
118
+ }
119
+ // `setSettingUserValue` valida que a setting aceita override, mas nao o
120
+ // valor. Sem esta checagem um navegador em `de-DE` gravaria `de`, e todo
121
+ // e-mail seguinte procuraria um template inexistente.
122
+ const allowed = await this.setting.getSettingListValues('language');
123
+ if (allowed.length && !allowed.includes(code)) {
124
+ return;
125
+ }
126
+ if (await this.setting.getUserSettingValue(userId, 'language')) {
127
+ return;
128
+ }
129
+ await this.setting.setSettingUserValue(locale, userId, 'language', code);
130
+ }
131
+ catch (error) {
132
+ this.logger.warn(`[AuthService] Could not persist detected language for userId=${userId}: ${error}`);
133
+ }
134
+ }
135
+ async issueDesktopToken(locale, userId, ipAddress, userAgent, isImpersonating = false) {
136
+ // Aqui o `userId` vem de @User(), que numa simulacao e o ALVO — sem esta
137
+ // guarda, o operador cunharia para ele uma sessao completa, RENOVAVEL e de
138
+ // 30 dias, furando o teto da simulacao e saindo da trilha de auditoria. O
139
+ // RoleGuard ja bloqueia a rota; isto e a segunda barreira.
140
+ if (isImpersonating) {
141
+ throw new common_1.ForbiddenException((0, api_locale_1.getLocaleText)('impersonation.restrictedRoute', locale, 'This action is not available during an access simulation.'));
142
+ }
86
143
  const { accessToken, refreshToken } = await this.getAuthenticationPayload(locale, userId, ipAddress, userAgent);
87
144
  return { accessToken, refreshToken };
88
145
  }
89
146
  hasPendingPasswordReset(user) {
90
- var _a;
91
- return Boolean((_a = user === null || user === void 0 ? void 0 : user.user_credential) === null || _a === void 0 ? void 0 : _a.some((credential) => credential.type === 'password' &&
92
- credential.requires_reset === true &&
93
- !credential.revoked_at));
147
+ return (0, user_credential_util_1.hasPendingPasswordReset)(user);
94
148
  }
95
149
  async getRequiresPasswordResetByUserId(userId) {
96
150
  const credential = await this.prisma.user_credential.findFirst({
@@ -104,7 +158,7 @@ let AuthService = AuthService_1 = class AuthService {
104
158
  });
105
159
  return Boolean(credential === null || credential === void 0 ? void 0 : credential.id);
106
160
  }
107
- async requiresMfaForLogin(locale, email, user) {
161
+ async requiresMfaForLogin(locale, email, user, origin) {
108
162
  const settings = await this.setting.getSettingValues([
109
163
  'require-mfa',
110
164
  'require-email-verification',
@@ -164,7 +218,8 @@ let AuthService = AuthService_1 = class AuthService {
164
218
  variables: {
165
219
  code,
166
220
  name: user.name,
167
- }
221
+ },
222
+ app: await this.challenge.resolveAppKeyFromOrigin(origin),
168
223
  });
169
224
  return {
170
225
  requiresMfa: true,
@@ -174,7 +229,7 @@ let AuthService = AuthService_1 = class AuthService {
174
229
  })
175
230
  };
176
231
  }
177
- async requiresEmailVerificationForLogin(locale, email, user) {
232
+ async requiresEmailVerificationForLogin(locale, email, user, origin) {
178
233
  const settings = await this.setting.getSettingValues([
179
234
  'require-mfa',
180
235
  'require-email-verification',
@@ -210,7 +265,8 @@ let AuthService = AuthService_1 = class AuthService {
210
265
  variables: {
211
266
  code,
212
267
  name: user.name,
213
- }
268
+ },
269
+ app: await this.challenge.resolveAppKeyFromOrigin(origin),
214
270
  });
215
271
  return {
216
272
  requiresEmailVerification: true,
@@ -220,7 +276,7 @@ let AuthService = AuthService_1 = class AuthService {
220
276
  })
221
277
  };
222
278
  }
223
- async emailVerificationLoginResend(locale, token) {
279
+ async emailVerificationLoginResend(locale, token, origin) {
224
280
  var _a;
225
281
  try {
226
282
  const payload = await this.token.verify(locale, token);
@@ -238,7 +294,7 @@ let AuthService = AuthService_1 = class AuthService {
238
294
  throw new common_1.NotFoundException((0, api_locale_1.getLocaleText)('challengeNotFound', locale, 'Challenge not found.'));
239
295
  }
240
296
  const user = await this.user.findUserById(locale, challenge.user_identifier.user_id);
241
- return await this.requiresEmailVerificationForLogin(locale, payload.email, user);
297
+ return await this.requiresEmailVerificationForLogin(locale, payload.email, user, origin);
242
298
  }
243
299
  catch (error) {
244
300
  if (((_a = error.message) === null || _a === void 0 ? void 0 : _a.includes('jwt expired')) || error.name === 'TokenExpiredError') {
@@ -247,12 +303,12 @@ let AuthService = AuthService_1 = class AuthService {
247
303
  challengeIdentifierId: expiredPayload.challengeIdentifierId,
248
304
  email: expiredPayload.email
249
305
  });
250
- return this.emailVerificationLoginResend(locale, newToken);
306
+ return this.emailVerificationLoginResend(locale, newToken, origin);
251
307
  }
252
308
  throw error;
253
309
  }
254
310
  }
255
- async emailVerificationLogin(locale, token, code, ipAddress, userAgent, res, browserId) {
311
+ async emailVerificationLogin(locale, token, code, ipAddress, userAgent, res, browserId, origin) {
256
312
  try {
257
313
  const payload = await this.token.verify(locale, token);
258
314
  const challenge = await this.prisma.user_identifier_challenge.findUnique({
@@ -262,7 +318,10 @@ let AuthService = AuthService_1 = class AuthService {
262
318
  user_identifier_id: true,
263
319
  user_identifier: {
264
320
  select: {
265
- user_id: true
321
+ user_id: true,
322
+ // Destinatario do alerta de dispositivo novo: o endereco que o
323
+ // usuario de fato verificou para entrar.
324
+ value: true
266
325
  }
267
326
  }
268
327
  }
@@ -294,13 +353,50 @@ let AuthService = AuthService_1 = class AuthService {
294
353
  });
295
354
  });
296
355
  const user = await this.user.findUserById(locale, challenge.user_identifier.user_id);
297
- return this.login(locale, user, ipAddress, userAgent, res, browserId);
356
+ return this.login(locale, user, ipAddress, userAgent, res, browserId, origin, challenge.user_identifier.value);
298
357
  }
299
358
  catch (error) {
300
359
  throw error;
301
360
  }
302
361
  }
303
- async login(locale, user, ipAddress, userAgent, res, browserId) {
362
+ /**
363
+ * Dispara o alerta de acesso de dispositivo desconhecido.
364
+ *
365
+ * O `await` aqui cobre so a resolucao do app (leitura de setting memoizada);
366
+ * o envio em si continua sem await de proposito, para nao somar a latencia do
367
+ * SMTP ao tempo de resposta do login.
368
+ */
369
+ async sendNewDeviceLoginMail(locale, user, email, ipAddress, userAgent, origin) {
370
+ var _a;
371
+ // Tokens de desafio emitidos antes de o `email` passar a ser gravado no
372
+ // payload chegam aqui sem destinatario; alertar ninguem e melhor do que
373
+ // deixar o envio explodir dentro do fluxo de login.
374
+ if (!email) {
375
+ return;
376
+ }
377
+ const app = await this.challenge.resolveAppKeyFromOrigin(origin);
378
+ // As variaveis sao formatadas aqui (data e nome do pais saem do `Intl`),
379
+ // entao o idioma do destinatario tem que ser resolvido ANTES do envio -
380
+ // senao o corpo sai em portugues com a data em ingles.
381
+ const recipientLocale = await this.mail.resolveRecipientLocale(email, locale);
382
+ this.mail.sendTemplatedMail(recipientLocale, {
383
+ email,
384
+ slug: 'auth-login-new-device',
385
+ variables: Object.assign({ name: (_a = user === null || user === void 0 ? void 0 : user.name) !== null && _a !== void 0 ? _a : '' }, (0, security_event_vars_1.buildSecurityEventVars)({ ipAddress, userAgent, locale: recipientLocale })),
386
+ app,
387
+ });
388
+ }
389
+ async login(locale, user, ipAddress, userAgent, res, browserId, origin, loginEmail) {
390
+ var _a, _b;
391
+ // Conta excluída pelo próprio usuário: os identificadores já foram
392
+ // anonimizados, mas a checagem fecha qualquer caminho remanescente.
393
+ const account = await this.prisma.user.findUnique({
394
+ where: { id: user.id },
395
+ select: { deactivated_at: true },
396
+ });
397
+ if (account === null || account === void 0 ? void 0 : account.deactivated_at) {
398
+ throw new common_1.BadRequestException((0, api_locale_1.getLocaleText)('accessDenied', locale, 'Access denied.'));
399
+ }
304
400
  const emails = await this.prisma.user_identifier.findMany({
305
401
  where: {
306
402
  user_id: user.id,
@@ -311,18 +407,14 @@ let AuthService = AuthService_1 = class AuthService {
311
407
  if (!emails || emails.length === 0) {
312
408
  throw new common_1.BadRequestException((0, api_locale_1.getLocaleText)('accessDenied', locale, 'Access denied.'));
313
409
  }
410
+ const newDevice = await this.userDevice.isNewDevice(user.id, userAgent, browserId);
314
411
  const { accessToken, refreshToken, session } = await this.getAuthenticationPayload(locale, user.id, ipAddress, userAgent, browserId);
315
- for (const emailObj of emails) {
316
- this.mail.sendTemplatedMail(locale, {
317
- email: emailObj.value,
318
- slug: 'auth-login-new-device',
319
- variables: {
320
- name: user.name,
321
- ipAddress,
322
- userAgent,
323
- location: 'Unknown',
324
- }
325
- });
412
+ if (newDevice) {
413
+ // So o endereco usado para entrar. Avisar todos os identificadores
414
+ // contava, para um e-mail secundario, que o principal tinha sido usado.
415
+ const wanted = (loginEmail !== null && loginEmail !== void 0 ? loginEmail : '').trim().toLowerCase();
416
+ const recipient = (_b = (_a = emails.find((e) => { var _a; return ((_a = e.value) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === wanted; })) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : emails[0].value;
417
+ await this.sendNewDeviceLoginMail(locale, user, recipient, ipAddress, userAgent, origin);
326
418
  }
327
419
  await this.user.registerUserActivity(user.id, "login");
328
420
  await this.token.setRefreshTokenCookie(locale, res, refreshToken, session.expires_at);
@@ -332,7 +424,7 @@ let AuthService = AuthService_1 = class AuthService {
332
424
  }
333
425
  return { accessToken, requiresPasswordReset };
334
426
  }
335
- async loginWithEmailAndPassword(res, locale, ipAddress, userAgent, { email, password }, browserId) {
427
+ async loginWithEmailAndPassword(res, locale, ipAddress, userAgent, { email, password }, browserId, origin) {
336
428
  var _a, _b;
337
429
  const user = await this.user.findUserByEmail(locale, email);
338
430
  if (!user)
@@ -362,7 +454,7 @@ let AuthService = AuthService_1 = class AuthService {
362
454
  const emailMfas = mfaMethods.filter(m => m.type === 'email' && m.user_mfa_email && m.user_mfa_email.length > 0);
363
455
  if (emailMfas.length > 0) {
364
456
  const emails = emailMfas.map(mfa => mfa.user_mfa_email[0].email);
365
- await this.challenge.sendMfaCodeToMultipleEmails(locale, user.id, emails);
457
+ await this.challenge.sendMfaCodeToMultipleEmails(locale, user.id, emails, origin);
366
458
  }
367
459
  return {
368
460
  requiresMfa: true,
@@ -377,12 +469,38 @@ let AuthService = AuthService_1 = class AuthService {
377
469
  'mfa-challenge-expiration-minutes'
378
470
  ]);
379
471
  if (settings['require-mfa'] === true && mfaMethods.length === 0) {
380
- return this.requiresMfaForLogin(locale, email, user);
472
+ return this.requiresMfaForLogin(locale, email, user, origin);
381
473
  }
382
474
  else if (settings['require-email-verification'] === true && (identifier === null || identifier === void 0 ? void 0 : identifier.verified_at) === null) {
383
- return this.requiresEmailVerificationForLogin(locale, email, user);
475
+ return this.requiresEmailVerificationForLogin(locale, email, user, origin);
476
+ }
477
+ return this.login(locale, user, ipAddress, userAgent, res, browserId, origin, email);
478
+ }
479
+ /**
480
+ * Cadastro por e-mail e senha.
481
+ *
482
+ * Com `require-email-verification` desligada (o default), a conta já nasce
483
+ * utilizável e o e-mail de confirmação é apenas informativo — devolver a
484
+ * pessoa para a tela de login só a obrigaria a digitar de novo o que acabou
485
+ * de digitar, então o cadastro já termina com a sessão emitida.
486
+ *
487
+ * Com a setting ligada, `loginWithEmailAndPassword` barraria o acesso logo em
488
+ * seguida; nesse caso não emitimos sessão e devolvemos `hasChallenge` para o
489
+ * app mandar a pessoa confirmar o endereço antes.
490
+ */
491
+ async signupWithEmailAndPassword(res, locale, ipAddress, userAgent, data, browserId, origin) {
492
+ const { user } = await this.user.createWithEmailAndPassword(locale, data);
493
+ const settings = await this.setting.getSettingValues([
494
+ 'require-email-verification',
495
+ ]);
496
+ if (settings['require-email-verification'] === true) {
497
+ return { user, hasChallenge: true };
384
498
  }
385
- return this.login(locale, user, ipAddress, userAgent, res, browserId);
499
+ // `isNewDevice` retorna false quando o usuário ainda não tem dispositivo
500
+ // nenhum, então o auto-login não dispara o alerta de "novo acesso" — que
501
+ // logo após o cadastro pareceria um aviso de invasão.
502
+ const session = await this.login(locale, user, ipAddress, userAgent, res, browserId, origin, data.email);
503
+ return Object.assign({ user, hasChallenge: false }, session);
386
504
  }
387
505
  async verifyRoles(_locale, userId) {
388
506
  return this.prisma.role.findMany({
@@ -398,11 +516,39 @@ let AuthService = AuthService_1 = class AuthService {
398
516
  }
399
517
  });
400
518
  }
401
- async verifyUser(locale, userId) {
519
+ async verifyUser(locale, userId, sessionId) {
402
520
  const user = await this.user.findUserById(locale, userId);
403
521
  const requiresPasswordReset = this.hasPendingPasswordReset(user);
404
522
  delete user.user_credential;
405
- return Object.assign(Object.assign({}, user), { requires_password_reset: requiresPasswordReset });
523
+ return Object.assign(Object.assign({}, user), { requires_password_reset: requiresPasswordReset,
524
+ // Fonte de verdade do banner de simulacao no cliente: a sessionStorage do
525
+ // navegador e so cache e e gravavel por quem estiver na aba.
526
+ impersonation: await this.describeImpersonation(sessionId) });
527
+ }
528
+ async describeImpersonation(sessionId) {
529
+ if (!sessionId) {
530
+ return null;
531
+ }
532
+ const session = await this.prisma.user_session.findUnique({
533
+ where: { id: sessionId },
534
+ select: {
535
+ impersonator_user_id: true,
536
+ impersonation_reason: true,
537
+ expires_at: true,
538
+ },
539
+ });
540
+ if (!(session === null || session === void 0 ? void 0 : session.impersonator_user_id)) {
541
+ return null;
542
+ }
543
+ const operator = await this.prisma.user.findUnique({
544
+ where: { id: session.impersonator_user_id },
545
+ select: { id: true, name: true },
546
+ });
547
+ return {
548
+ by: operator !== null && operator !== void 0 ? operator : { id: session.impersonator_user_id, name: '' },
549
+ reason: session.impersonation_reason,
550
+ expires_at: session.expires_at.toISOString(),
551
+ };
406
552
  }
407
553
  async refreshAccessToken(locale, refreshToken, ipAddress, userAgent, browserId) {
408
554
  if (!refreshToken) {
@@ -426,15 +572,23 @@ let AuthService = AuthService_1 = class AuthService {
426
572
  return { success: true };
427
573
  }
428
574
  async logout(res, req, refreshToken) {
429
- var _a, _b, _c;
575
+ var _a, _b, _c, _d;
576
+ // Numa sessao simulada o cookie `rt` da mesma origem e o do OPERADOR: limpar
577
+ // e revogar por hash aqui derrubaria a sessao real dele. O RoleGuard ja
578
+ // bloqueia esta rota durante uma simulacao (impersonation-restrictions.ts);
579
+ // isto e a segunda barreira, no caso de a rota ser alcancada por outro
580
+ // caminho. Sair de uma simulacao e POST /impersonation/stop.
581
+ if (((_a = req === null || req === void 0 ? void 0 : req.auth) === null || _a === void 0 ? void 0 : _a.imp) === true) {
582
+ throw new common_1.ForbiddenException('This action is not available during an access simulation.');
583
+ }
430
584
  const result = await this.session.deleteRefreshTokenCookie(res, refreshToken);
431
- const logoutUserId = (_c = (_b = (_a = req.auth) === null || _a === void 0 ? void 0 : _a.sub) !== null && _b !== void 0 ? _b : result === null || result === void 0 ? void 0 : result.userId) !== null && _c !== void 0 ? _c : null;
585
+ const logoutUserId = (_d = (_c = (_b = req.auth) === null || _b === void 0 ? void 0 : _b.sub) !== null && _c !== void 0 ? _c : result === null || result === void 0 ? void 0 : result.userId) !== null && _d !== void 0 ? _d : null;
432
586
  if (logoutUserId) {
433
587
  await this.user.registerUserActivity(logoutUserId, 'logout');
434
588
  }
435
589
  return { success: true };
436
590
  }
437
- async forgotResetPassword(locale, password, code, ipAddress, userAgent) {
591
+ async forgotResetPassword(locale, password, code, ipAddress, userAgent, origin) {
438
592
  const challenge = await this.challenge.verifyCodePassword(locale, code);
439
593
  const userIdentifier = challenge.user_identifier;
440
594
  const passwordHash = await this.security.hashArgon2(password);
@@ -450,10 +604,11 @@ let AuthService = AuthService_1 = class AuthService {
450
604
  slug: 'auth-forget-password-confirmation',
451
605
  variables: {
452
606
  name: userIdentifier.user.name,
453
- }
607
+ },
608
+ app: await this.challenge.resolveAppKeyFromOrigin(origin),
454
609
  });
455
610
  const { accessToken, refreshToken, session } = await this.getAuthenticationPayload(locale, userIdentifier.user_id, ipAddress, userAgent);
456
- await this.user.registerUserActivity(userIdentifier.id, "resetPassword");
611
+ await this.user.registerUserActivity(userIdentifier.user_id, "resetPassword");
457
612
  return { accessToken, refreshToken, session };
458
613
  }
459
614
  /**
@@ -505,19 +660,115 @@ let AuthService = AuthService_1 = class AuthService {
505
660
  const token = await this.challenge.createAccountInviteChallenge(identifier.id);
506
661
  return { userId: targetUserId, token, hasPassword: passwordCount > 0 };
507
662
  }
663
+ /**
664
+ * Confirma o e-mail a partir do link enviado no cadastro. Não emite sessão: o
665
+ * link só prova o controle da caixa, quem quiser entrar passa pelo login.
666
+ *
667
+ * Idempotente de propósito — clientes de e-mail fazem pré-fetch do link e o
668
+ * usuário costuma clicar de novo depois, e nesses casos ver "link inválido"
669
+ * assusta mais do que ajuda.
670
+ */
671
+ async confirmEmail(locale, token) {
672
+ var _a, _b, _c, _d;
673
+ const { userIdentifierId } = await this.token.verifyEmailConfirmationToken(locale, token);
674
+ const identifier = await this.prisma.user_identifier.findUnique({
675
+ where: { id: userIdentifierId },
676
+ include: { user: { select: { id: true, name: true } } },
677
+ });
678
+ if (!identifier) {
679
+ throw new common_1.BadRequestException((0, api_locale_1.getLocaleText)('confirmEmail.invalidOrExpired', locale, 'This confirmation link is invalid or has expired.'));
680
+ }
681
+ if (identifier.verified_at) {
682
+ return {
683
+ confirmed: true,
684
+ alreadyConfirmed: true,
685
+ email: identifier.value,
686
+ name: (_b = (_a = identifier.user) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : null,
687
+ };
688
+ }
689
+ await this.prisma.user_identifier.update({
690
+ where: { id: identifier.id },
691
+ data: { verified_at: new Date(), enabled: true },
692
+ });
693
+ await this.user.registerUserActivity(identifier.user_id, 'confirmEmail');
694
+ return {
695
+ confirmed: true,
696
+ alreadyConfirmed: false,
697
+ email: identifier.value,
698
+ name: (_d = (_c = identifier.user) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : null,
699
+ };
700
+ }
701
+ /**
702
+ * Reenvia o link de confirmação do cadastro.
703
+ *
704
+ * Responde `{ sent: true }` mesmo quando o e-mail não existe ou já está
705
+ * confirmado: qualquer diferença na resposta transformaria a rota num
706
+ * oráculo para descobrir quais endereços têm conta.
707
+ */
708
+ async resendEmailConfirmation(locale, email, app, origin) {
709
+ var _a;
710
+ try {
711
+ const user = await this.user.findUserByEmail(locale, email);
712
+ if (user) {
713
+ await this.challenge.sendEmailConfirmationLink(locale, user.id, email, app, origin);
714
+ }
715
+ }
716
+ catch (error) {
717
+ // `sendEmailConfirmationLink` lança NotFound quando o endereço já está
718
+ // verificado — e uma falha de envio não pode virar erro para o cliente,
719
+ // sob pena de vazar a existência da conta.
720
+ this.logger.warn('Resend of signup confirmation email failed: ' + ((_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : error));
721
+ }
722
+ return { sent: true };
723
+ }
508
724
  /**
509
725
  * Valida (sem consumir) um token de convite de criação de conta e retorna os
510
726
  * dados básicos para pré-preencher o formulário no app de treinamentos.
727
+ * `hasAccount` diz se esse usuário já tem um jeito de entrar (senha ativa ou
728
+ * provedor externo vinculado) — usado pelo app para decidir entre mostrar o
729
+ * formulário de criação de conta ou uma tela de autorização de acesso.
511
730
  */
512
731
  async verifyAccountInvite(locale, code) {
513
732
  var _a, _b;
514
733
  const challenge = await this.challenge.verifyCodePassword(locale, code);
734
+ const userId = challenge.user_identifier.user_id;
735
+ const [passwordCount, oauthCount] = await Promise.all([
736
+ this.prisma.user_credential.count({
737
+ where: { user_id: userId, type: 'password', revoked_at: null },
738
+ }),
739
+ this.prisma.user_account.count({ where: { user_id: userId } }),
740
+ ]);
515
741
  return {
516
742
  valid: true,
517
743
  name: (_b = (_a = challenge.user_identifier.user) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : null,
518
744
  email: challenge.user_identifier.value,
745
+ hasAccount: passwordCount > 0 || oauthCount > 0,
519
746
  };
520
747
  }
748
+ /**
749
+ * Conclui um convite de acesso para quem já tem conta (senha ou provedor
750
+ * externo): não define senha nenhuma, só prova controle do e-mail (mesmo
751
+ * nível de confiança do link de reset de senha) e autentica o usuário.
752
+ */
753
+ async authorizeAccountInvite(locale, code, ipAddress, userAgent) {
754
+ var _a;
755
+ const challenge = await this.challenge.verifyCodePassword(locale, code);
756
+ const userIdentifier = challenge.user_identifier;
757
+ if (!userIdentifier.verified_at || !userIdentifier.enabled) {
758
+ await this.prisma.user_identifier.update({
759
+ where: { id: userIdentifier.id },
760
+ data: { verified_at: (_a = userIdentifier.verified_at) !== null && _a !== void 0 ? _a : new Date(), enabled: true },
761
+ });
762
+ }
763
+ // Consome o challenge para impedir reuso do link.
764
+ await this.prisma.user_identifier_challenge.updateMany({
765
+ where: { id: challenge.id },
766
+ data: { verified_at: new Date(), expires_at: new Date() },
767
+ });
768
+ const { accessToken, refreshToken, session } = await this.getAuthenticationPayload(locale, userIdentifier.user_id, ipAddress, userAgent);
769
+ await this.user.registerUserActivity(userIdentifier.user_id, 'authorizeAccountInvite');
770
+ return { accessToken, refreshToken, session };
771
+ }
521
772
  /**
522
773
  * Conclui a criação de conta a partir de um token de convite: cria/atualiza a
523
774
  * credencial de senha, marca o identificador como verificado, atualiza o nome
@@ -561,10 +812,10 @@ let AuthService = AuthService_1 = class AuthService {
561
812
  data: { verified_at: new Date(), expires_at: new Date() },
562
813
  });
563
814
  const { accessToken, refreshToken, session } = await this.getAuthenticationPayload(locale, userIdentifier.user_id, ipAddress, userAgent);
564
- await this.user.registerUserActivity(userIdentifier.id, 'completeAccount');
815
+ await this.user.registerUserActivity(userIdentifier.user_id, 'completeAccount');
565
816
  return { accessToken, refreshToken, session };
566
817
  }
567
- async verifyMfaCode(locale, mfaToken, code, ipAddress, userAgent, methodType, browserId) {
818
+ async verifyMfaCode(locale, mfaToken, code, ipAddress, userAgent, methodType, browserId, origin) {
568
819
  var _a, _b, _c, _d;
569
820
  const payload = await this.token.verifyMfaChallengeToken(mfaToken);
570
821
  const user = await this.prisma.user.findUnique({
@@ -653,22 +904,16 @@ let AuthService = AuthService_1 = class AuthService {
653
904
  if (!isValid) {
654
905
  throw new common_1.BadRequestException((0, api_locale_1.getLocaleText)('invalidMfaCode', locale, 'Invalid MFA code.'));
655
906
  }
907
+ const newDevice = await this.userDevice.isNewDevice(user.id, userAgent, browserId);
656
908
  const { accessToken, refreshToken, session } = await this.getAuthenticationPayload(locale, user.id, ipAddress, userAgent, browserId);
657
- this.mail.sendTemplatedMail(locale, {
658
- email: payload.email,
659
- slug: 'auth-login-new-device',
660
- variables: {
661
- name: user.name,
662
- ipAddress,
663
- userAgent,
664
- location: 'Unknown',
665
- }
666
- });
909
+ if (newDevice) {
910
+ await this.sendNewDeviceLoginMail(locale, user, payload.email, ipAddress, userAgent, origin);
911
+ }
667
912
  await this.user.registerUserActivity(user.id, "login");
668
913
  const requiresPasswordReset = await this.getRequiresPasswordResetByUserId(user.id);
669
914
  return { accessToken, refreshToken, session, requiresPasswordReset };
670
915
  }
671
- async verifyMfaRecoveryCode(locale, mfaToken, recoveryCode, ipAddress, userAgent, browserId) {
916
+ async verifyMfaRecoveryCode(locale, mfaToken, recoveryCode, ipAddress, userAgent, browserId, origin) {
672
917
  const payload = await this.token.verifyMfaChallengeToken(mfaToken);
673
918
  const user = await this.prisma.user.findUnique({
674
919
  where: { id: payload.userId },
@@ -692,12 +937,18 @@ let AuthService = AuthService_1 = class AuthService {
692
937
  if (!isValid) {
693
938
  throw new common_1.BadRequestException((0, api_locale_1.getLocaleText)('invalidRecoveryCode', locale, 'Invalid recovery code.'));
694
939
  }
940
+ const newDevice = await this.userDevice.isNewDevice(user.id, userAgent, browserId);
695
941
  const { accessToken, refreshToken, session } = await this.getAuthenticationPayload(locale, user.id, ipAddress, userAgent, browserId);
942
+ // Entrar por codigo de recuperacao e o caminho mais sensivel dos tres, e era
943
+ // justamente o unico que nao avisava ninguem.
944
+ if (newDevice) {
945
+ await this.sendNewDeviceLoginMail(locale, user, payload.email, ipAddress, userAgent, origin);
946
+ }
696
947
  await this.user.registerUserActivity(user.id, "login");
697
948
  const requiresPasswordReset = await this.getRequiresPasswordResetByUserId(user.id);
698
949
  return { accessToken, refreshToken, session, requiresPasswordReset };
699
950
  }
700
- async resendMfaCode(locale, mfaToken) {
951
+ async resendMfaCode(locale, mfaToken, origin) {
701
952
  const payload = await this.token.verifyMfaChallengeToken(mfaToken);
702
953
  const mfaMethods = await this.prisma.user_mfa.findMany({
703
954
  where: {
@@ -716,7 +967,7 @@ let AuthService = AuthService_1 = class AuthService {
716
967
  if (!emailMfa.user_mfa_email || emailMfa.user_mfa_email.length === 0) {
717
968
  throw new common_1.BadRequestException((0, api_locale_1.getLocaleText)('noEmailMfaFound', locale, 'No email MFA method found for this user.'));
718
969
  }
719
- await this.challenge.sendMfaCodeByEmail(locale, payload.userId, emailMfa.user_mfa_email[0].email);
970
+ await this.challenge.sendMfaCodeByEmail(locale, payload.userId, emailMfa.user_mfa_email[0].email, origin);
720
971
  return {
721
972
  success: true,
722
973
  hasEmailMfa: true
@@ -809,18 +1060,12 @@ let AuthService = AuthService_1 = class AuthService {
809
1060
  where: { id: challengeRecord.id },
810
1061
  data: { verified_at: new Date() }
811
1062
  });
1063
+ const newDevice = await this.userDevice.isNewDevice(userId, userAgent, browserId);
812
1064
  const { accessToken, refreshToken, session } = await this.getAuthenticationPayload(locale, userId, ipAddress, userAgent, browserId);
813
- const user = await this.prisma.user.findFirst({ where: { id: userId } });
814
- this.mail.sendTemplatedMail(locale, {
815
- email: payload.email,
816
- slug: 'auth-login-new-device',
817
- variables: {
818
- name: user.name,
819
- ipAddress,
820
- userAgent,
821
- location: 'Unknown',
822
- }
823
- });
1065
+ if (newDevice) {
1066
+ const user = await this.prisma.user.findFirst({ where: { id: userId } });
1067
+ await this.sendNewDeviceLoginMail(locale, user, payload.email, ipAddress, userAgent, requestOrigin);
1068
+ }
824
1069
  await this.user.registerUserActivity(userId, 'login');
825
1070
  const requiresPasswordReset = await this.getRequiresPasswordResetByUserId(userId);
826
1071
  return { accessToken, refreshToken, session, requiresPasswordReset };
@@ -837,6 +1082,7 @@ exports.AuthService = AuthService = AuthService_1 = __decorate([
837
1082
  __param(5, (0, common_1.Inject)((0, common_1.forwardRef)(() => session_service_1.SessionService))),
838
1083
  __param(6, (0, common_1.Inject)((0, common_1.forwardRef)(() => user_service_1.UserService))),
839
1084
  __param(7, (0, common_1.Inject)((0, common_1.forwardRef)(() => challenge_service_1.ChallengeService))),
1085
+ __param(8, (0, common_1.Inject)((0, common_1.forwardRef)(() => user_device_service_1.UserDeviceService))),
840
1086
  __metadata("design:paramtypes", [api_prisma_1.PrismaService,
841
1087
  mail_service_1.MailService,
842
1088
  setting_service_1.SettingService,
@@ -844,6 +1090,7 @@ exports.AuthService = AuthService = AuthService_1 = __decorate([
844
1090
  token_service_1.TokenService,
845
1091
  session_service_1.SessionService,
846
1092
  user_service_1.UserService,
847
- challenge_service_1.ChallengeService])
1093
+ challenge_service_1.ChallengeService,
1094
+ user_device_service_1.UserDeviceService])
848
1095
  ], AuthService);
849
1096
  //# sourceMappingURL=auth.service.js.map