@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.
- package/README.md +51 -11
- package/dist/access-log/access-log.controller.d.ts.map +1 -1
- package/dist/access-log/access-log.controller.js +1 -1
- package/dist/access-log/access-log.controller.js.map +1 -1
- package/dist/access-log/access-log.interceptor.d.ts.map +1 -1
- package/dist/access-log/access-log.interceptor.js +11 -6
- package/dist/access-log/access-log.interceptor.js.map +1 -1
- package/dist/access-log/access-log.service.d.ts +4 -0
- package/dist/access-log/access-log.service.d.ts.map +1 -1
- package/dist/access-log/access-log.service.js +31 -4
- package/dist/access-log/access-log.service.js.map +1 -1
- package/dist/access-log/dto/query-access-log.dto.d.ts +2 -0
- package/dist/access-log/dto/query-access-log.dto.d.ts.map +1 -1
- package/dist/access-log/dto/query-access-log.dto.js +5 -0
- package/dist/access-log/dto/query-access-log.dto.js.map +1 -1
- package/dist/ai/ai-attachment.fragments.d.ts +23 -0
- package/dist/ai/ai-attachment.fragments.d.ts.map +1 -0
- package/dist/ai/ai-attachment.fragments.js +34 -0
- package/dist/ai/ai-attachment.fragments.js.map +1 -0
- package/dist/ai/ai.controller.d.ts +12 -17
- package/dist/ai/ai.controller.d.ts.map +1 -1
- package/dist/ai/ai.controller.js +17 -2
- package/dist/ai/ai.controller.js.map +1 -1
- package/dist/ai/ai.module.d.ts.map +1 -1
- package/dist/ai/ai.module.js +3 -2
- package/dist/ai/ai.module.js.map +1 -1
- package/dist/ai/ai.prompts.d.ts +16 -0
- package/dist/ai/ai.prompts.d.ts.map +1 -0
- package/dist/ai/ai.prompts.js +37 -0
- package/dist/ai/ai.prompts.js.map +1 -0
- package/dist/ai/ai.service.d.ts +92 -12
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +309 -88
- package/dist/ai/ai.service.js.map +1 -1
- package/dist/ai/dto/chat.dto.d.ts +4 -1
- package/dist/ai/dto/chat.dto.d.ts.map +1 -1
- package/dist/ai/dto/chat.dto.js +23 -1
- package/dist/ai/dto/chat.dto.js.map +1 -1
- package/dist/ai/dto/create-agent.dto.d.ts +1 -1
- package/dist/ai/dto/create-agent.dto.d.ts.map +1 -1
- package/dist/ai/dto/create-agent.dto.js +1 -1
- package/dist/ai/dto/create-agent.dto.js.map +1 -1
- package/dist/ai/dto/richtext-edit-html.dto.d.ts +5 -0
- package/dist/ai/dto/richtext-edit-html.dto.d.ts.map +1 -0
- package/dist/ai/dto/richtext-edit-html.dto.js +27 -0
- package/dist/ai/dto/richtext-edit-html.dto.js.map +1 -0
- package/dist/ai/dto/update-agent.dto.d.ts +1 -1
- package/dist/ai/dto/update-agent.dto.d.ts.map +1 -1
- package/dist/ai/dto/update-agent.dto.js +1 -1
- package/dist/ai/dto/update-agent.dto.js.map +1 -1
- package/dist/ai/richtext-ai.prompts.d.ts +5 -0
- package/dist/ai/richtext-ai.prompts.d.ts.map +1 -0
- package/dist/ai/richtext-ai.prompts.js +57 -0
- package/dist/ai/richtext-ai.prompts.js.map +1 -0
- package/dist/ai/richtext-ai.service.d.ts +34 -0
- package/dist/ai/richtext-ai.service.d.ts.map +1 -0
- package/dist/ai/richtext-ai.service.js +95 -0
- package/dist/ai/richtext-ai.service.js.map +1 -0
- package/dist/ai-instruction/ai-instruction.controller.d.ts +59 -5
- package/dist/ai-instruction/ai-instruction.controller.d.ts.map +1 -1
- package/dist/ai-instruction/ai-instruction.controller.js +63 -20
- package/dist/ai-instruction/ai-instruction.controller.js.map +1 -1
- package/dist/ai-instruction/ai-instruction.module.d.ts.map +1 -1
- package/dist/ai-instruction/ai-instruction.module.js +13 -2
- package/dist/ai-instruction/ai-instruction.module.js.map +1 -1
- package/dist/ai-instruction/ai-instruction.service.d.ts +131 -6
- package/dist/ai-instruction/ai-instruction.service.d.ts.map +1 -1
- package/dist/ai-instruction/ai-instruction.service.js +533 -60
- package/dist/ai-instruction/ai-instruction.service.js.map +1 -1
- package/dist/ai-instruction/ai-prompt-builder.service.d.ts +8 -0
- package/dist/ai-instruction/ai-prompt-builder.service.d.ts.map +1 -1
- package/dist/ai-instruction/ai-prompt-builder.service.js +10 -1
- package/dist/ai-instruction/ai-prompt-builder.service.js.map +1 -1
- package/dist/ai-instruction/ai-prompt-registry.d.ts +45 -0
- package/dist/ai-instruction/ai-prompt-registry.d.ts.map +1 -0
- package/dist/ai-instruction/ai-prompt-registry.js +49 -0
- package/dist/ai-instruction/ai-prompt-registry.js.map +1 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts +89 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts.map +1 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.js +222 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.js.map +1 -0
- package/dist/ai-instruction/ai-prompt-template.util.d.ts +70 -0
- package/dist/ai-instruction/ai-prompt-template.util.d.ts.map +1 -0
- package/dist/ai-instruction/ai-prompt-template.util.js +154 -0
- package/dist/ai-instruction/ai-prompt-template.util.js.map +1 -0
- package/dist/ai-instruction/dto/create-ai-instruction.dto.d.ts +5 -0
- package/dist/ai-instruction/dto/create-ai-instruction.dto.d.ts.map +1 -1
- package/dist/ai-instruction/dto/create-ai-instruction.dto.js +27 -1
- package/dist/ai-instruction/dto/create-ai-instruction.dto.js.map +1 -1
- package/dist/ai-instruction/dto/preview-ai-instruction.dto.d.ts +14 -0
- package/dist/ai-instruction/dto/preview-ai-instruction.dto.d.ts.map +1 -0
- package/dist/ai-instruction/dto/preview-ai-instruction.dto.js +42 -0
- package/dist/ai-instruction/dto/preview-ai-instruction.dto.js.map +1 -0
- package/dist/ai-instruction/dto/update-ai-instruction.dto.d.ts +11 -0
- package/dist/ai-instruction/dto/update-ai-instruction.dto.d.ts.map +1 -1
- package/dist/ai-instruction/dto/update-ai-instruction.dto.js +34 -0
- package/dist/ai-instruction/dto/update-ai-instruction.dto.js.map +1 -1
- package/dist/ai-instruction/types/ai-instruction.types.d.ts +13 -1
- package/dist/ai-instruction/types/ai-instruction.types.d.ts.map +1 -1
- package/dist/ai-instruction/types/ai-instruction.types.js +10 -0
- package/dist/ai-instruction/types/ai-instruction.types.js.map +1 -1
- package/dist/auth/auth.controller.d.ts +89 -15
- package/dist/auth/auth.controller.d.ts.map +1 -1
- package/dist/auth/auth.controller.js +116 -44
- package/dist/auth/auth.controller.js.map +1 -1
- package/dist/auth/auth.module.d.ts.map +1 -1
- package/dist/auth/auth.module.js +2 -0
- package/dist/auth/auth.module.js.map +1 -1
- package/dist/auth/auth.service.d.ts +169 -12
- package/dist/auth/auth.service.d.ts.map +1 -1
- package/dist/auth/auth.service.js +314 -67
- package/dist/auth/auth.service.js.map +1 -1
- package/dist/auth/dto/confirm-email.dto.d.ts +4 -0
- package/dist/auth/dto/confirm-email.dto.d.ts.map +1 -0
- package/dist/auth/dto/confirm-email.dto.js +22 -0
- package/dist/auth/dto/confirm-email.dto.js.map +1 -0
- package/dist/auth/dto/resend-confirmation.dto.d.ts +8 -0
- package/dist/auth/dto/resend-confirmation.dto.d.ts.map +1 -0
- package/dist/auth/dto/resend-confirmation.dto.js +36 -0
- package/dist/auth/dto/resend-confirmation.dto.js.map +1 -0
- package/dist/authorize/authorize.controller.d.ts +1 -1
- package/dist/authorize/authorize.controller.d.ts.map +1 -1
- package/dist/authorize/authorize.controller.js +4 -2
- package/dist/authorize/authorize.controller.js.map +1 -1
- package/dist/authorize/authorize.service.d.ts +7 -0
- package/dist/authorize/authorize.service.d.ts.map +1 -1
- package/dist/authorize/authorize.service.js +1 -1
- package/dist/authorize/authorize.service.js.map +1 -1
- package/dist/captcha/captcha.module.d.ts +3 -0
- package/dist/captcha/captcha.module.d.ts.map +1 -0
- package/dist/captcha/captcha.module.js +23 -0
- package/dist/captcha/captcha.module.js.map +1 -0
- package/dist/captcha/captcha.service.d.ts +38 -0
- package/dist/captcha/captcha.service.d.ts.map +1 -0
- package/dist/captcha/captcha.service.js +144 -0
- package/dist/captcha/captcha.service.js.map +1 -0
- package/dist/challenge/challenge.service.d.ts +31 -9
- package/dist/challenge/challenge.service.d.ts.map +1 -1
- package/dist/challenge/challenge.service.js +111 -16
- package/dist/challenge/challenge.service.js.map +1 -1
- package/dist/core.module.d.ts +3 -1
- package/dist/core.module.d.ts.map +1 -1
- package/dist/core.module.js +46 -2
- package/dist/core.module.js.map +1 -1
- package/dist/dashboard/dashboard/dashboard.controller.d.ts +21 -21
- package/dist/dashboard/dashboard/dashboard.service.d.ts +21 -21
- package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +10 -10
- package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +10 -10
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +20 -20
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +20 -20
- package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +3 -3
- package/dist/dashboard/dashboard-item/dashboard-item.controller.d.ts +2 -2
- package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts +2 -2
- package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +13 -13
- package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +13 -13
- package/dist/file/file.controller.d.ts +8 -1
- package/dist/file/file.controller.d.ts.map +1 -1
- package/dist/file/file.controller.js +45 -7
- package/dist/file/file.controller.js.map +1 -1
- package/dist/file/file.service.d.ts +134 -1
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +363 -12
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/image-optimization.service.d.ts +43 -0
- package/dist/file/image-optimization.service.d.ts.map +1 -1
- package/dist/file/image-optimization.service.js +154 -0
- package/dist/file/image-optimization.service.js.map +1 -1
- package/dist/file/provider/abstract.provider.d.ts +16 -0
- package/dist/file/provider/abstract.provider.d.ts.map +1 -1
- package/dist/file/provider/abstract.provider.js +4 -0
- package/dist/file/provider/abstract.provider.js.map +1 -1
- package/dist/file/provider/gcs.provider.d.ts +2 -0
- package/dist/file/provider/gcs.provider.d.ts.map +1 -1
- package/dist/file/provider/gcs.provider.js +10 -0
- package/dist/file/provider/gcs.provider.js.map +1 -1
- package/dist/file/provider/local.provider.d.ts +1 -0
- package/dist/file/provider/local.provider.d.ts.map +1 -1
- package/dist/file/provider/local.provider.js +13 -0
- package/dist/file/provider/local.provider.js.map +1 -1
- package/dist/file/provider/s3.provider.d.ts +5 -0
- package/dist/file/provider/s3.provider.d.ts.map +1 -1
- package/dist/file/provider/s3.provider.js +15 -0
- package/dist/file/provider/s3.provider.js.map +1 -1
- package/dist/file/provider/spaces.provider.d.ts +5 -0
- package/dist/file/provider/spaces.provider.d.ts.map +1 -1
- package/dist/file/provider/spaces.provider.js +16 -0
- package/dist/file/provider/spaces.provider.js.map +1 -1
- package/dist/impersonation/dto/redeem-impersonation.dto.d.ts +4 -0
- package/dist/impersonation/dto/redeem-impersonation.dto.d.ts.map +1 -0
- package/dist/impersonation/dto/redeem-impersonation.dto.js +23 -0
- package/dist/impersonation/dto/redeem-impersonation.dto.js.map +1 -0
- package/dist/impersonation/dto/start-impersonation.dto.d.ts +7 -0
- package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -0
- package/dist/impersonation/dto/start-impersonation.dto.js +27 -0
- package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -0
- package/dist/impersonation/impersonation-restrictions.d.ts +26 -0
- package/dist/impersonation/impersonation-restrictions.d.ts.map +1 -0
- package/dist/impersonation/impersonation-restrictions.js +76 -0
- package/dist/impersonation/impersonation-restrictions.js.map +1 -0
- package/dist/impersonation/impersonation.controller.d.ts +90 -0
- package/dist/impersonation/impersonation.controller.d.ts.map +1 -0
- package/dist/impersonation/impersonation.controller.js +135 -0
- package/dist/impersonation/impersonation.controller.js.map +1 -0
- package/dist/impersonation/impersonation.module.d.ts +8 -0
- package/dist/impersonation/impersonation.module.d.ts.map +1 -0
- package/dist/impersonation/impersonation.module.js +44 -0
- package/dist/impersonation/impersonation.module.js.map +1 -0
- package/dist/impersonation/impersonation.service.d.ts +164 -0
- package/dist/impersonation/impersonation.service.d.ts.map +1 -0
- package/dist/impersonation/impersonation.service.js +408 -0
- package/dist/impersonation/impersonation.service.js.map +1 -0
- package/dist/incident/incident-notifier.service.d.ts +36 -0
- package/dist/incident/incident-notifier.service.d.ts.map +1 -0
- package/dist/incident/incident-notifier.service.js +208 -0
- package/dist/incident/incident-notifier.service.js.map +1 -0
- package/dist/incident/incident.controller.d.ts +23 -0
- package/dist/incident/incident.controller.d.ts.map +1 -0
- package/dist/incident/incident.controller.js +75 -0
- package/dist/incident/incident.controller.js.map +1 -0
- package/dist/incident/incident.module.d.ts +7 -0
- package/dist/incident/incident.module.d.ts.map +1 -0
- package/dist/incident/incident.module.js +32 -0
- package/dist/incident/incident.module.js.map +1 -0
- package/dist/incident/incident.service.d.ts +72 -0
- package/dist/incident/incident.service.d.ts.map +1 -0
- package/dist/incident/incident.service.js +184 -0
- package/dist/incident/incident.service.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -1
- package/dist/integration/services/outbox-polling.coordinator.d.ts +2 -0
- package/dist/integration/services/outbox-polling.coordinator.d.ts.map +1 -1
- package/dist/integration/services/outbox-polling.coordinator.js +50 -30
- package/dist/integration/services/outbox-polling.coordinator.js.map +1 -1
- package/dist/integration/services/outbox.service.d.ts.map +1 -1
- package/dist/integration/services/outbox.service.js +5 -1
- package/dist/integration/services/outbox.service.js.map +1 -1
- package/dist/integration-profile/dto/test.dto.d.ts +13 -0
- package/dist/integration-profile/dto/test.dto.d.ts.map +1 -0
- package/dist/integration-profile/dto/test.dto.js +26 -0
- package/dist/integration-profile/dto/test.dto.js.map +1 -0
- package/dist/integration-profile/integration-profile.controller.d.ts +12 -1
- package/dist/integration-profile/integration-profile.controller.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.controller.js +9 -1
- package/dist/integration-profile/integration-profile.controller.js.map +1 -1
- package/dist/integration-profile/integration-profile.module.d.ts +6 -1
- package/dist/integration-profile/integration-profile.module.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.module.js +26 -3
- package/dist/integration-profile/integration-profile.module.js.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.js +12 -1
- package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
- package/dist/integration-profile/integration-profile.service.d.ts +26 -7
- package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.service.js +94 -91
- package/dist/integration-profile/integration-profile.service.js.map +1 -1
- package/dist/integration-profile/integration-profile.utils.d.ts +27 -1
- package/dist/integration-profile/integration-profile.utils.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.utils.js +46 -5
- package/dist/integration-profile/integration-profile.utils.js.map +1 -1
- package/dist/integration-profile/testers/ai.testers.d.ts +3 -0
- package/dist/integration-profile/testers/ai.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/ai.testers.js +125 -0
- package/dist/integration-profile/testers/ai.testers.js.map +1 -0
- package/dist/integration-profile/testers/captcha.testers.d.ts +3 -0
- package/dist/integration-profile/testers/captcha.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/captcha.testers.js +121 -0
- package/dist/integration-profile/testers/captcha.testers.js.map +1 -0
- package/dist/integration-profile/testers/email.testers.d.ts +3 -0
- package/dist/integration-profile/testers/email.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/email.testers.js +156 -0
- package/dist/integration-profile/testers/email.testers.js.map +1 -0
- package/dist/integration-profile/testers/http-probe.d.ts +57 -0
- package/dist/integration-profile/testers/http-probe.d.ts.map +1 -0
- package/dist/integration-profile/testers/http-probe.js +140 -0
- package/dist/integration-profile/testers/http-probe.js.map +1 -0
- package/dist/integration-profile/testers/index.d.ts +12 -0
- package/dist/integration-profile/testers/index.d.ts.map +1 -0
- package/dist/integration-profile/testers/index.js +45 -0
- package/dist/integration-profile/testers/index.js.map +1 -0
- package/dist/integration-profile/testers/infrastructure.testers.d.ts +3 -0
- package/dist/integration-profile/testers/infrastructure.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/infrastructure.testers.js +105 -0
- package/dist/integration-profile/testers/infrastructure.testers.js.map +1 -0
- package/dist/integration-profile/testers/integration-tester.registry.d.ts +17 -0
- package/dist/integration-profile/testers/integration-tester.registry.d.ts.map +1 -0
- package/dist/integration-profile/testers/integration-tester.registry.js +52 -0
- package/dist/integration-profile/testers/integration-tester.registry.js.map +1 -0
- package/dist/integration-profile/testers/integration-tester.types.d.ts +55 -0
- package/dist/integration-profile/testers/integration-tester.types.d.ts.map +1 -0
- package/dist/integration-profile/testers/integration-tester.types.js +16 -0
- package/dist/integration-profile/testers/integration-tester.types.js.map +1 -0
- package/dist/integration-profile/testers/messaging.testers.d.ts +3 -0
- package/dist/integration-profile/testers/messaging.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/messaging.testers.js +70 -0
- package/dist/integration-profile/testers/messaging.testers.js.map +1 -0
- package/dist/integration-profile/testers/oauth.testers.d.ts +3 -0
- package/dist/integration-profile/testers/oauth.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/oauth.testers.js +285 -0
- package/dist/integration-profile/testers/oauth.testers.js.map +1 -0
- package/dist/integration-profile/testers/payment.testers.d.ts +3 -0
- package/dist/integration-profile/testers/payment.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/payment.testers.js +169 -0
- package/dist/integration-profile/testers/payment.testers.js.map +1 -0
- package/dist/integration-profile/testers/storage.testers.d.ts +3 -0
- package/dist/integration-profile/testers/storage.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/storage.testers.js +208 -0
- package/dist/integration-profile/testers/storage.testers.js.map +1 -0
- package/dist/language/en.json +15 -2
- package/dist/language/pt.json +15 -2
- package/dist/leaked-password/leaked-password.controller.d.ts +24 -0
- package/dist/leaked-password/leaked-password.controller.d.ts.map +1 -0
- package/dist/leaked-password/leaked-password.controller.js +78 -0
- package/dist/leaked-password/leaked-password.controller.js.map +1 -0
- package/dist/leaked-password/leaked-password.module.d.ts +8 -0
- package/dist/leaked-password/leaked-password.module.d.ts.map +1 -0
- package/dist/leaked-password/leaked-password.module.js +31 -0
- package/dist/leaked-password/leaked-password.module.js.map +1 -0
- package/dist/leaked-password/leaked-password.service.d.ts +64 -0
- package/dist/leaked-password/leaked-password.service.d.ts.map +1 -0
- package/dist/leaked-password/leaked-password.service.js +218 -0
- package/dist/leaked-password/leaked-password.service.js.map +1 -0
- package/dist/locale/locale.controller.d.ts +1 -1
- package/dist/locale/locale.service.d.ts +1 -1
- package/dist/mail/dto/preview.dto.d.ts +18 -0
- package/dist/mail/dto/preview.dto.d.ts.map +1 -0
- package/dist/mail/dto/preview.dto.js +66 -0
- package/dist/mail/dto/preview.dto.js.map +1 -0
- package/dist/mail/dto/send.dto.d.ts +44 -0
- package/dist/mail/dto/send.dto.d.ts.map +1 -1
- package/dist/mail/dto/send.dto.js +20 -0
- package/dist/mail/dto/send.dto.js.map +1 -1
- package/dist/mail/mail.controller.d.ts +5 -0
- package/dist/mail/mail.controller.d.ts.map +1 -1
- package/dist/mail/mail.controller.js +16 -2
- package/dist/mail/mail.controller.js.map +1 -1
- package/dist/mail/mail.module.d.ts.map +1 -1
- package/dist/mail/mail.module.js +2 -0
- package/dist/mail/mail.module.js.map +1 -1
- package/dist/mail/mail.service.d.ts +69 -4
- package/dist/mail/mail.service.d.ts.map +1 -1
- package/dist/mail/mail.service.js +278 -37
- package/dist/mail/mail.service.js.map +1 -1
- package/dist/mail-delivery/mail-delivery-provision.service.d.ts +21 -0
- package/dist/mail-delivery/mail-delivery-provision.service.d.ts.map +1 -0
- package/dist/mail-delivery/mail-delivery-provision.service.js +64 -0
- package/dist/mail-delivery/mail-delivery-provision.service.js.map +1 -0
- package/dist/mail-delivery/mail-delivery.constants.d.ts +17 -0
- package/dist/mail-delivery/mail-delivery.constants.d.ts.map +1 -0
- package/dist/mail-delivery/mail-delivery.constants.js +31 -0
- package/dist/mail-delivery/mail-delivery.constants.js.map +1 -0
- package/dist/mail-delivery/mail-delivery.controller.d.ts +19 -0
- package/dist/mail-delivery/mail-delivery.controller.d.ts.map +1 -0
- package/dist/mail-delivery/mail-delivery.controller.js +53 -0
- package/dist/mail-delivery/mail-delivery.controller.js.map +1 -0
- package/dist/mail-delivery/mail-delivery.module.d.ts +7 -0
- package/dist/mail-delivery/mail-delivery.module.d.ts.map +1 -0
- package/dist/mail-delivery/mail-delivery.module.js +36 -0
- package/dist/mail-delivery/mail-delivery.module.js.map +1 -0
- package/dist/mail-delivery/mail-delivery.service.d.ts +38 -0
- package/dist/mail-delivery/mail-delivery.service.d.ts.map +1 -0
- package/dist/mail-delivery/mail-delivery.service.js +140 -0
- package/dist/mail-delivery/mail-delivery.service.js.map +1 -0
- package/dist/mail-delivery/ses-event.parser.d.ts +27 -0
- package/dist/mail-delivery/ses-event.parser.d.ts.map +1 -0
- package/dist/mail-delivery/ses-event.parser.js +131 -0
- package/dist/mail-delivery/ses-event.parser.js.map +1 -0
- package/dist/mail-delivery/ses-webhook.service.d.ts +58 -0
- package/dist/mail-delivery/ses-webhook.service.d.ts.map +1 -0
- package/dist/mail-delivery/ses-webhook.service.js +214 -0
- package/dist/mail-delivery/ses-webhook.service.js.map +1 -0
- package/dist/mail-delivery/sns-message.util.d.ts +38 -0
- package/dist/mail-delivery/sns-message.util.d.ts.map +1 -0
- package/dist/mail-delivery/sns-message.util.js +109 -0
- package/dist/mail-delivery/sns-message.util.js.map +1 -0
- package/dist/mail-layout/dto/update.dto.d.ts +17 -0
- package/dist/mail-layout/dto/update.dto.d.ts.map +1 -0
- package/dist/mail-layout/dto/update.dto.js +27 -0
- package/dist/mail-layout/dto/update.dto.js.map +1 -0
- package/dist/mail-layout/mail-layout.controller.d.ts +15 -0
- package/dist/mail-layout/mail-layout.controller.d.ts.map +1 -0
- package/dist/mail-layout/mail-layout.controller.js +71 -0
- package/dist/mail-layout/mail-layout.controller.js.map +1 -0
- package/dist/mail-layout/mail-layout.module.d.ts +3 -0
- package/dist/mail-layout/mail-layout.module.d.ts.map +1 -0
- package/dist/mail-layout/mail-layout.module.js +35 -0
- package/dist/mail-layout/mail-layout.module.js.map +1 -0
- package/dist/mail-layout/mail-layout.service.d.ts +27 -0
- package/dist/mail-layout/mail-layout.service.d.ts.map +1 -0
- package/dist/mail-layout/mail-layout.service.js +80 -0
- package/dist/mail-layout/mail-layout.service.js.map +1 -0
- package/dist/mail-sent/dto/query-mail-sent-list.dto.d.ts +5 -0
- package/dist/mail-sent/dto/query-mail-sent-list.dto.d.ts.map +1 -1
- package/dist/mail-sent/dto/query-mail-sent-list.dto.js +6 -0
- package/dist/mail-sent/dto/query-mail-sent-list.dto.js.map +1 -1
- package/dist/mail-sent/mail-sent.controller.d.ts +39 -0
- package/dist/mail-sent/mail-sent.controller.d.ts.map +1 -1
- package/dist/mail-sent/mail-sent.service.d.ts +39 -0
- package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
- package/dist/mail-sent/mail-sent.service.js +45 -4
- package/dist/mail-sent/mail-sent.service.js.map +1 -1
- package/dist/mailbox/mailbox-fetcher.registry.d.ts +100 -0
- package/dist/mailbox/mailbox-fetcher.registry.d.ts.map +1 -0
- package/dist/mailbox/mailbox-fetcher.registry.js +59 -0
- package/dist/mailbox/mailbox-fetcher.registry.js.map +1 -0
- package/dist/mailbox/mailbox.module.d.ts +8 -0
- package/dist/mailbox/mailbox.module.d.ts.map +1 -0
- package/dist/mailbox/mailbox.module.js +27 -0
- package/dist/mailbox/mailbox.module.js.map +1 -0
- package/dist/mcp-chat/mcp-chat.controller.d.ts +2 -2
- package/dist/mcp-chat/mcp-chat.service.d.ts +24 -2
- package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
- package/dist/mcp-chat/mcp-chat.service.js +80 -24
- package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
- package/dist/meeting/meeting-provider.registry.d.ts +155 -0
- package/dist/meeting/meeting-provider.registry.d.ts.map +1 -0
- package/dist/meeting/meeting-provider.registry.js +53 -0
- package/dist/meeting/meeting-provider.registry.js.map +1 -0
- package/dist/meeting/meeting.constants.d.ts +47 -0
- package/dist/meeting/meeting.constants.d.ts.map +1 -0
- package/dist/meeting/meeting.constants.js +21 -0
- package/dist/meeting/meeting.constants.js.map +1 -0
- package/dist/meeting/meeting.module.d.ts +7 -0
- package/dist/meeting/meeting.module.d.ts.map +1 -0
- package/dist/meeting/meeting.module.js +26 -0
- package/dist/meeting/meeting.module.js.map +1 -0
- package/dist/menu/menu.controller.d.ts +3 -3
- package/dist/menu/menu.service.d.ts +3 -3
- package/dist/middlewares/locale-injection.middleware.d.ts +12 -0
- package/dist/middlewares/locale-injection.middleware.d.ts.map +1 -1
- package/dist/middlewares/locale-injection.middleware.js +20 -4
- package/dist/middlewares/locale-injection.middleware.js.map +1 -1
- package/dist/notification/notification.controller.d.ts +12 -12
- package/dist/notification/notification.service.d.ts +12 -12
- package/dist/oauth/oauth-token-broker.service.d.ts +72 -0
- package/dist/oauth/oauth-token-broker.service.d.ts.map +1 -0
- package/dist/oauth/oauth-token-broker.service.js +258 -0
- package/dist/oauth/oauth-token-broker.service.js.map +1 -0
- package/dist/oauth/oauth.module.d.ts.map +1 -1
- package/dist/oauth/oauth.module.js +3 -1
- package/dist/oauth/oauth.module.js.map +1 -1
- package/dist/oauth/oauth.service.d.ts +2 -0
- package/dist/oauth/oauth.service.d.ts.map +1 -1
- package/dist/oauth/oauth.service.js +6 -3
- package/dist/oauth/oauth.service.js.map +1 -1
- package/dist/oauth/providers/google.provider.d.ts +7 -0
- package/dist/oauth/providers/google.provider.d.ts.map +1 -1
- package/dist/oauth/providers/google.provider.js +43 -13
- package/dist/oauth/providers/google.provider.js.map +1 -1
- package/dist/observability/monitored-cron.d.ts +34 -0
- package/dist/observability/monitored-cron.d.ts.map +1 -0
- package/dist/observability/monitored-cron.js +118 -0
- package/dist/observability/monitored-cron.js.map +1 -0
- package/dist/pairing/dto/approve-reverse-pairing.dto.d.ts +12 -0
- package/dist/pairing/dto/approve-reverse-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/approve-reverse-pairing.dto.js +30 -0
- package/dist/pairing/dto/approve-reverse-pairing.dto.js.map +1 -0
- package/dist/pairing/dto/claim-pairing.dto.d.ts +11 -0
- package/dist/pairing/dto/claim-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/claim-pairing.dto.js +35 -0
- package/dist/pairing/dto/claim-pairing.dto.js.map +1 -0
- package/dist/pairing/dto/confirm-pairing.dto.d.ts +10 -0
- package/dist/pairing/dto/confirm-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/confirm-pairing.dto.js +24 -0
- package/dist/pairing/dto/confirm-pairing.dto.js.map +1 -0
- package/dist/pairing/dto/poll-reverse-pairing.dto.d.ts +5 -0
- package/dist/pairing/dto/poll-reverse-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/poll-reverse-pairing.dto.js +24 -0
- package/dist/pairing/dto/poll-reverse-pairing.dto.js.map +1 -0
- package/dist/pairing/dto/start-pairing.dto.d.ts +11 -0
- package/dist/pairing/dto/start-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/start-pairing.dto.js +30 -0
- package/dist/pairing/dto/start-pairing.dto.js.map +1 -0
- package/dist/pairing/dto/start-reverse-pairing.dto.d.ts +24 -0
- package/dist/pairing/dto/start-reverse-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/start-reverse-pairing.dto.js +47 -0
- package/dist/pairing/dto/start-reverse-pairing.dto.js.map +1 -0
- package/dist/pairing/pairing.controller.d.ts +118 -0
- package/dist/pairing/pairing.controller.d.ts.map +1 -0
- package/dist/pairing/pairing.controller.js +296 -0
- package/dist/pairing/pairing.controller.js.map +1 -0
- package/dist/pairing/pairing.module.d.ts +10 -0
- package/dist/pairing/pairing.module.d.ts.map +1 -0
- package/dist/pairing/pairing.module.js +40 -0
- package/dist/pairing/pairing.module.js.map +1 -0
- package/dist/pairing/pairing.service.d.ts +238 -0
- package/dist/pairing/pairing.service.d.ts.map +1 -0
- package/dist/pairing/pairing.service.js +495 -0
- package/dist/pairing/pairing.service.js.map +1 -0
- package/dist/pdf/pdf.service.d.ts +11 -6
- package/dist/pdf/pdf.service.d.ts.map +1 -1
- package/dist/pdf/pdf.service.js +60 -20
- package/dist/pdf/pdf.service.js.map +1 -1
- package/dist/presence/presence.controller.d.ts +16 -0
- package/dist/presence/presence.controller.d.ts.map +1 -0
- package/dist/presence/presence.controller.js +60 -0
- package/dist/presence/presence.controller.js.map +1 -0
- package/dist/presence/presence.listener.d.ts +29 -0
- package/dist/presence/presence.listener.d.ts.map +1 -0
- package/dist/presence/presence.listener.js +82 -0
- package/dist/presence/presence.listener.js.map +1 -0
- package/dist/presence/presence.module.d.ts +3 -0
- package/dist/presence/presence.module.d.ts.map +1 -0
- package/dist/presence/presence.module.js +32 -0
- package/dist/presence/presence.module.js.map +1 -0
- package/dist/presence/presence.service.d.ts +42 -0
- package/dist/presence/presence.service.d.ts.map +1 -0
- package/dist/presence/presence.service.js +147 -0
- package/dist/presence/presence.service.js.map +1 -0
- package/dist/profile/dto/delete-account.dto.d.ts +8 -0
- package/dist/profile/dto/delete-account.dto.d.ts.map +1 -0
- package/dist/profile/dto/delete-account.dto.js +22 -0
- package/dist/profile/dto/delete-account.dto.js.map +1 -0
- package/dist/profile/events/profile-account-deleted.event.d.ts +12 -0
- package/dist/profile/events/profile-account-deleted.event.d.ts.map +1 -0
- package/dist/profile/events/profile-account-deleted.event.js +17 -0
- package/dist/profile/events/profile-account-deleted.event.js.map +1 -0
- package/dist/profile/profile.controller.d.ts +32 -15
- package/dist/profile/profile.controller.d.ts.map +1 -1
- package/dist/profile/profile.controller.js +75 -46
- package/dist/profile/profile.controller.js.map +1 -1
- package/dist/profile/profile.service.d.ts +41 -18
- package/dist/profile/profile.service.d.ts.map +1 -1
- package/dist/profile/profile.service.js +133 -48
- package/dist/profile/profile.service.js.map +1 -1
- package/dist/realtime/realtime.gateway.d.ts +48 -0
- package/dist/realtime/realtime.gateway.d.ts.map +1 -0
- package/dist/realtime/realtime.gateway.js +156 -0
- package/dist/realtime/realtime.gateway.js.map +1 -0
- package/dist/realtime/realtime.module.d.ts +8 -0
- package/dist/realtime/realtime.module.d.ts.map +1 -0
- package/dist/realtime/realtime.module.js +29 -0
- package/dist/realtime/realtime.module.js.map +1 -0
- package/dist/realtime/realtime.service.d.ts +51 -0
- package/dist/realtime/realtime.service.d.ts.map +1 -0
- package/dist/realtime/realtime.service.js +177 -0
- package/dist/realtime/realtime.service.js.map +1 -0
- package/dist/redis/redis-pubsub.d.ts +27 -0
- package/dist/redis/redis-pubsub.d.ts.map +1 -0
- package/dist/redis/redis-pubsub.js +184 -0
- package/dist/redis/redis-pubsub.js.map +1 -0
- package/dist/role/guards/role.guard.d.ts +5 -0
- package/dist/role/guards/role.guard.d.ts.map +1 -1
- package/dist/role/guards/role.guard.js +41 -39
- package/dist/role/guards/role.guard.js.map +1 -1
- package/dist/role/role.controller.d.ts +3 -3
- package/dist/role/role.service.d.ts +3 -3
- package/dist/session/session.controller.d.ts +2 -0
- package/dist/session/session.controller.d.ts.map +1 -1
- package/dist/session/session.service.d.ts +39 -0
- package/dist/session/session.service.d.ts.map +1 -1
- package/dist/session/session.service.js +91 -8
- package/dist/session/session.service.js.map +1 -1
- package/dist/setting/brand-asset.service.d.ts +48 -0
- package/dist/setting/brand-asset.service.d.ts.map +1 -0
- package/dist/setting/brand-asset.service.js +130 -0
- package/dist/setting/brand-asset.service.js.map +1 -0
- package/dist/setting/dto/create.dto.d.ts.map +1 -1
- package/dist/setting/dto/create.dto.js +9 -2
- package/dist/setting/dto/create.dto.js.map +1 -1
- package/dist/setting/setting.controller.d.ts +5 -5
- package/dist/setting/setting.module.d.ts.map +1 -1
- package/dist/setting/setting.module.js +3 -2
- package/dist/setting/setting.module.js.map +1 -1
- package/dist/setting/setting.service.d.ts +41 -5
- package/dist/setting/setting.service.d.ts.map +1 -1
- package/dist/setting/setting.service.js +113 -1
- package/dist/setting/setting.service.js.map +1 -1
- package/dist/token/token.service.d.ts +23 -2
- package/dist/token/token.service.d.ts.map +1 -1
- package/dist/token/token.service.js +39 -4
- package/dist/token/token.service.js.map +1 -1
- package/dist/user/dto/create-with-email-and-password.dto.d.ts +2 -0
- package/dist/user/dto/create-with-email-and-password.dto.d.ts.map +1 -1
- package/dist/user/dto/create-with-email-and-password.dto.js +5 -0
- package/dist/user/dto/create-with-email-and-password.dto.js.map +1 -1
- package/dist/user/dto/query-user-mail-list.dto.d.ts +5 -0
- package/dist/user/dto/query-user-mail-list.dto.d.ts.map +1 -0
- package/dist/user/dto/query-user-mail-list.dto.js +25 -0
- package/dist/user/dto/query-user-mail-list.dto.js.map +1 -0
- package/dist/user/user-credential.util.d.ts +19 -0
- package/dist/user/user-credential.util.d.ts.map +1 -0
- package/dist/user/user-credential.util.js +32 -0
- package/dist/user/user-credential.util.js.map +1 -0
- package/dist/user/user.controller.d.ts +24 -26
- package/dist/user/user.controller.d.ts.map +1 -1
- package/dist/user/user.controller.js +18 -3
- package/dist/user/user.controller.js.map +1 -1
- package/dist/user/user.service.d.ts +71 -29
- package/dist/user/user.service.d.ts.map +1 -1
- package/dist/user/user.service.js +291 -17
- package/dist/user/user.service.js.map +1 -1
- package/dist/user-device/user-device.controller.d.ts +54 -0
- package/dist/user-device/user-device.controller.d.ts.map +1 -0
- package/dist/user-device/user-device.controller.js +103 -0
- package/dist/user-device/user-device.controller.js.map +1 -0
- package/dist/user-device/user-device.module.d.ts +3 -0
- package/dist/user-device/user-device.module.d.ts.map +1 -0
- package/dist/user-device/user-device.module.js +26 -0
- package/dist/user-device/user-device.module.js.map +1 -0
- package/dist/user-device/user-device.service.d.ts +71 -0
- package/dist/user-device/user-device.service.d.ts.map +1 -0
- package/dist/user-device/user-device.service.js +158 -0
- package/dist/user-device/user-device.service.js.map +1 -0
- package/dist/utils/device-key.d.ts +23 -0
- package/dist/utils/device-key.d.ts.map +1 -0
- package/dist/utils/device-key.js +31 -0
- package/dist/utils/device-key.js.map +1 -0
- package/dist/utils/geo-ip.d.ts +38 -0
- package/dist/utils/geo-ip.d.ts.map +1 -0
- package/dist/utils/geo-ip.js +122 -0
- package/dist/utils/geo-ip.js.map +1 -0
- package/dist/utils/locale-context.d.ts +10 -7
- package/dist/utils/locale-context.d.ts.map +1 -1
- package/dist/utils/locale-context.js +14 -8
- package/dist/utils/locale-context.js.map +1 -1
- package/dist/utils/security-event-vars.d.ts +56 -0
- package/dist/utils/security-event-vars.d.ts.map +1 -0
- package/dist/utils/security-event-vars.js +109 -0
- package/dist/utils/security-event-vars.js.map +1 -0
- package/dist/utils/user-agent.d.ts +19 -0
- package/dist/utils/user-agent.d.ts.map +1 -0
- package/dist/utils/user-agent.js +36 -0
- package/dist/utils/user-agent.js.map +1 -0
- package/dist/validators/is-strong-password-with-settings.validator.d.ts.map +1 -1
- package/dist/validators/is-strong-password-with-settings.validator.js +11 -0
- package/dist/validators/is-strong-password-with-settings.validator.js.map +1 -1
- package/dist/validators/service-locator.d.ts +9 -0
- package/dist/validators/service-locator.d.ts.map +1 -1
- package/dist/validators/service-locator.js +12 -0
- package/dist/validators/service-locator.js.map +1 -1
- package/dist/webhook-integration/webhook-integration.service.d.ts +5 -0
- package/dist/webhook-integration/webhook-integration.service.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-integration.service.js +50 -4
- package/dist/webhook-integration/webhook-integration.service.js.map +1 -1
- package/dist/webhook-integration/webhook-protocol.registry.d.ts +6 -0
- package/dist/webhook-integration/webhook-protocol.registry.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-protocol.registry.js.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.module.d.ts +3 -0
- package/dist/whatsapp-sender/whatsapp-sender.module.d.ts.map +1 -0
- package/dist/whatsapp-sender/whatsapp-sender.module.js +23 -0
- package/dist/whatsapp-sender/whatsapp-sender.module.js.map +1 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +50 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.js +224 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -0
- package/hedhog/data/integration_provider.yaml +25 -0
- package/hedhog/data/mail.yaml +275 -112
- package/hedhog/data/mail_layout.yaml +198 -0
- package/hedhog/data/menu.yaml +69 -3
- package/hedhog/data/role.yaml +16 -0
- package/hedhog/data/route.yaml +307 -3
- package/hedhog/data/setting_group.yaml +315 -1
- package/hedhog/data/setting_subgroup.yaml +8 -0
- package/hedhog/frontend/app/_lib/hooks/use-core-access.test.tsx.ejs +125 -0
- package/hedhog/frontend/app/_lib/hooks/use-core-access.ts.ejs +29 -0
- package/hedhog/frontend/app/_lib/hooks/use-impersonation-access.test.ts.ejs +71 -0
- package/hedhog/frontend/app/_lib/hooks/use-impersonation-access.ts.ejs +32 -0
- package/hedhog/frontend/app/access-log/page.tsx.ejs +96 -22
- package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +17 -1
- package/hedhog/frontend/app/account/components/known-devices.tsx.ejs +89 -0
- package/hedhog/frontend/app/account/components/mfa-setup-dialog.tsx.ejs +36 -0
- package/hedhog/frontend/app/account/components/profile-form.tsx.ejs +2 -1
- package/hedhog/frontend/app/account/components/two-factor-auth.tsx.ejs +2 -0
- package/hedhog/frontend/app/account/components/user-devices-list.tsx.ejs +186 -0
- package/hedhog/frontend/app/account/devices/page.tsx.ejs +5 -0
- package/hedhog/frontend/app/account/hooks/use-mfa-setup.ts.ejs +10 -7
- package/hedhog/frontend/app/account/layout.tsx.ejs +2 -0
- package/hedhog/frontend/app/ai_agent/page.tsx.ejs +7 -4
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +580 -0
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-preview.tsx.ejs +150 -0
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +199 -0
- package/hedhog/frontend/app/ai_instruction/_components/prompt-diff.tsx.ejs +63 -0
- package/hedhog/frontend/app/ai_instruction/_lib/line-diff.spec.ts.ejs +59 -0
- package/hedhog/frontend/app/ai_instruction/_lib/line-diff.ts.ejs +72 -0
- package/hedhog/frontend/app/ai_instruction/_lib/prompt-template.spec.ts.ejs +170 -0
- package/hedhog/frontend/app/ai_instruction/_lib/prompt-template.ts.ejs +167 -0
- package/hedhog/frontend/app/ai_instruction/_lib/types.ts.ejs +99 -0
- package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +422 -0
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +298 -0
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +410 -1223
- package/hedhog/frontend/app/incidents/page.tsx.ejs +400 -0
- package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +153 -84
- package/hedhog/frontend/app/mail/layout/page.tsx.ejs +344 -0
- package/hedhog/frontend/app/mail/log/page.tsx.ejs +210 -3
- package/hedhog/frontend/app/mail/template/page.tsx.ejs +292 -200
- package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +129 -17
- package/hedhog/frontend/app/pages/_components/page-delete-dialog.tsx.ejs +343 -0
- package/hedhog/frontend/app/pages/_components/page-detail-sheet.tsx.ejs +438 -0
- package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1009 -0
- package/hedhog/frontend/app/pages/_components/system-page-types.ts.ejs +56 -0
- package/hedhog/frontend/app/pages/_components/use-system-pages.ts.ejs +171 -0
- package/hedhog/frontend/app/pages/page.tsx.ejs +514 -0
- package/hedhog/frontend/app/users/active-session.tsx.ejs +58 -11
- package/hedhog/frontend/app/users/page.tsx.ejs +186 -21
- package/hedhog/frontend/app/users/simulate-access-dialog.test.tsx.ejs +202 -0
- package/hedhog/frontend/app/users/simulate-access-dialog.tsx.ejs +170 -0
- package/hedhog/frontend/app/users/user-activity-timeline.tsx.ejs +250 -0
- package/hedhog/frontend/app/users/user-devices.tsx.ejs +89 -0
- package/hedhog/frontend/app/users/user-logs.tsx.ejs +13 -1
- package/hedhog/frontend/app/users/user-mails.tsx.ejs +399 -0
- package/hedhog/frontend/app/users/user-sheet.tsx.ejs +106 -99
- package/hedhog/frontend/messages/en.json +643 -49
- package/hedhog/frontend/messages/pt.json +643 -49
- package/hedhog/table/access_log.yaml +7 -0
- package/hedhog/table/ai_agent.yaml +1 -0
- package/hedhog/table/ai_instruction.yaml +15 -0
- package/hedhog/table/file.yaml +8 -0
- package/hedhog/table/leaked_password.yaml +18 -0
- package/hedhog/table/mail_delivery_event.yaml +76 -0
- package/hedhog/table/mail_layout.yaml +35 -0
- package/hedhog/table/mail_sent.yaml +23 -0
- package/hedhog/table/mail_var.yaml +4 -0
- package/hedhog/table/setting.yaml +1 -0
- package/hedhog/table/system_incident.yaml +59 -0
- package/hedhog/table/user_activity.yaml +9 -0
- package/hedhog/table/user_device.yaml +52 -0
- package/hedhog/table/user_presence.yaml +36 -0
- package/hedhog/table/user_session.yaml +20 -1
- package/package.json +7 -2
- package/src/access-log/access-log.controller.ts +1 -0
- package/src/access-log/access-log.interceptor.ts +9 -3
- package/src/access-log/access-log.service.spec.ts +33 -2
- package/src/access-log/access-log.service.ts +38 -0
- package/src/access-log/dto/query-access-log.dto.ts +5 -0
- package/src/ai/ai-attachment.fragments.spec.ts +319 -0
- package/src/ai/ai-attachment.fragments.ts +35 -0
- package/src/ai/ai.controller.ts +9 -0
- package/src/ai/ai.module.ts +3 -2
- package/src/ai/ai.prompts.ts +38 -0
- package/src/ai/ai.service.spec.ts +280 -0
- package/src/ai/ai.service.ts +475 -82
- package/src/ai/dto/chat.dto.ts +33 -3
- package/src/ai/dto/create-agent.dto.ts +2 -2
- package/src/ai/dto/richtext-edit-html.dto.ts +11 -0
- package/src/ai/dto/update-agent.dto.ts +2 -2
- package/src/ai/richtext-ai.prompts.ts +57 -0
- package/src/ai/richtext-ai.service.ts +109 -0
- package/src/ai-instruction/ai-instruction.controller.ts +40 -9
- package/src/ai-instruction/ai-instruction.module.ts +13 -2
- package/src/ai-instruction/ai-instruction.service.spec.ts +658 -0
- package/src/ai-instruction/ai-instruction.service.ts +661 -62
- package/src/ai-instruction/ai-prompt-builder.service.ts +10 -1
- package/src/ai-instruction/ai-prompt-registry.ts +87 -0
- package/src/ai-instruction/ai-prompt-resolver.service.spec.ts +375 -0
- package/src/ai-instruction/ai-prompt-resolver.service.ts +295 -0
- package/src/ai-instruction/ai-prompt-template.util.spec.ts +162 -0
- package/src/ai-instruction/ai-prompt-template.util.ts +199 -0
- package/src/ai-instruction/dto/create-ai-instruction.dto.ts +39 -3
- package/src/ai-instruction/dto/preview-ai-instruction.dto.ts +26 -0
- package/src/ai-instruction/dto/update-ai-instruction.dto.ts +42 -1
- package/src/ai-instruction/types/ai-instruction.types.ts +24 -1
- package/src/auth/auth.controller.ts +78 -13
- package/src/auth/auth.module.ts +2 -0
- package/src/auth/auth.service.spec.ts +386 -7
- package/src/auth/auth.service.ts +435 -81
- package/src/auth/dto/confirm-email.dto.ts +7 -0
- package/src/auth/dto/resend-confirmation.dto.ts +20 -0
- package/src/authorize/authorize.controller.ts +2 -0
- package/src/authorize/authorize.service.spec.ts +23 -0
- package/src/authorize/authorize.service.ts +8 -0
- package/src/captcha/captcha.module.ts +10 -0
- package/src/captcha/captcha.service.spec.ts +210 -0
- package/src/captcha/captcha.service.ts +191 -0
- package/src/challenge/challenge.service.spec.ts +112 -4
- package/src/challenge/challenge.service.ts +131 -17
- package/src/core.module.ts +46 -1
- package/src/file/file.controller.ts +54 -4
- package/src/file/file.service.spec.ts +275 -0
- package/src/file/file.service.ts +468 -16
- package/src/file/image-optimization.service.spec.ts +92 -0
- package/src/file/image-optimization.service.ts +202 -0
- package/src/file/provider/abstract.provider.ts +23 -0
- package/src/file/provider/gcs.provider.ts +17 -0
- package/src/file/provider/local.provider.ts +21 -0
- package/src/file/provider/s3.provider.ts +25 -0
- package/src/file/provider/spaces.provider.ts +26 -0
- package/src/impersonation/dto/redeem-impersonation.dto.ts +8 -0
- package/src/impersonation/dto/start-impersonation.dto.ts +13 -0
- package/src/impersonation/impersonation-restrictions.ts +84 -0
- package/src/impersonation/impersonation.controller.ts +109 -0
- package/src/impersonation/impersonation.module.ts +31 -0
- package/src/impersonation/impersonation.service.spec.ts +427 -0
- package/src/impersonation/impersonation.service.ts +577 -0
- package/src/incident/incident-notifier.service.spec.ts +205 -0
- package/src/incident/incident-notifier.service.ts +241 -0
- package/src/incident/incident.controller.ts +38 -0
- package/src/incident/incident.module.ts +19 -0
- package/src/incident/incident.service.spec.ts +150 -0
- package/src/incident/incident.service.ts +209 -0
- package/src/index.ts +58 -0
- package/src/integration/services/outbox-polling.coordinator.spec.ts +90 -0
- package/src/integration/services/outbox-polling.coordinator.ts +62 -40
- package/src/integration/services/outbox.service.spec.ts +8 -0
- package/src/integration/services/outbox.service.ts +19 -13
- package/src/integration-profile/dto/test.dto.ts +19 -0
- package/src/integration-profile/integration-profile.controller.ts +10 -1
- package/src/integration-profile/integration-profile.module.spec.ts +51 -0
- package/src/integration-profile/integration-profile.module.ts +23 -4
- package/src/integration-profile/integration-profile.secrets.ts +12 -1
- package/src/integration-profile/integration-profile.service.spec.ts +279 -0
- package/src/integration-profile/integration-profile.service.ts +120 -124
- package/src/integration-profile/integration-profile.utils.spec.ts +22 -0
- package/src/integration-profile/integration-profile.utils.ts +78 -3
- package/src/integration-profile/testers/ai.testers.ts +165 -0
- package/src/integration-profile/testers/captcha.testers.spec.ts +92 -0
- package/src/integration-profile/testers/captcha.testers.ts +139 -0
- package/src/integration-profile/testers/email.testers.ts +194 -0
- package/src/integration-profile/testers/http-probe.spec.ts +153 -0
- package/src/integration-profile/testers/http-probe.ts +171 -0
- package/src/integration-profile/testers/index.ts +30 -0
- package/src/integration-profile/testers/infrastructure.testers.ts +122 -0
- package/src/integration-profile/testers/integration-tester.registry.spec.ts +75 -0
- package/src/integration-profile/testers/integration-tester.registry.ts +43 -0
- package/src/integration-profile/testers/integration-tester.types.ts +61 -0
- package/src/integration-profile/testers/messaging.testers.ts +102 -0
- package/src/integration-profile/testers/oauth.testers.spec.ts +220 -0
- package/src/integration-profile/testers/oauth.testers.ts +305 -0
- package/src/integration-profile/testers/payment.testers.ts +185 -0
- package/src/integration-profile/testers/remaining.testers.spec.ts +401 -0
- package/src/integration-profile/testers/storage.testers.spec.ts +185 -0
- package/src/integration-profile/testers/storage.testers.ts +226 -0
- package/src/integration-profile/testers/tester-coverage.spec.ts +58 -0
- package/src/language/en.json +15 -2
- package/src/language/pt.json +15 -2
- package/src/leaked-password/README.md +83 -0
- package/src/leaked-password/leaked-password.controller.ts +52 -0
- package/src/leaked-password/leaked-password.module.ts +18 -0
- package/src/leaked-password/leaked-password.service.ts +242 -0
- package/src/leaked-password/seed/build-seed-sql.mjs +180 -0
- package/src/leaked-password/seed/common-passwords.txt +335 -0
- package/src/mail/dto/preview.dto.ts +50 -0
- package/src/mail/dto/send.dto.ts +58 -1
- package/src/mail/mail-template.spec.ts +274 -0
- package/src/mail/mail.controller.ts +9 -2
- package/src/mail/mail.module.ts +2 -0
- package/src/mail/mail.service.spec.ts +422 -6
- package/src/mail/mail.service.ts +337 -34
- package/src/mail-delivery/mail-delivery-provision.service.ts +66 -0
- package/src/mail-delivery/mail-delivery.constants.ts +31 -0
- package/src/mail-delivery/mail-delivery.controller.ts +38 -0
- package/src/mail-delivery/mail-delivery.module.ts +23 -0
- package/src/mail-delivery/mail-delivery.service.spec.ts +136 -0
- package/src/mail-delivery/mail-delivery.service.ts +152 -0
- package/src/mail-delivery/ses-event.parser.spec.ts +140 -0
- package/src/mail-delivery/ses-event.parser.ts +191 -0
- package/src/mail-delivery/ses-webhook.service.spec.ts +170 -0
- package/src/mail-delivery/ses-webhook.service.ts +240 -0
- package/src/mail-delivery/sns-message.util.spec.ts +163 -0
- package/src/mail-delivery/sns-message.util.ts +125 -0
- package/src/mail-layout/dto/update.dto.ts +19 -0
- package/src/mail-layout/mail-layout.controller.ts +47 -0
- package/src/mail-layout/mail-layout.module.ts +22 -0
- package/src/mail-layout/mail-layout.service.ts +94 -0
- package/src/mail-sent/dto/query-mail-sent-list.dto.ts +15 -0
- package/src/mail-sent/mail-sent.service.ts +46 -2
- package/src/mailbox/mailbox-fetcher.registry.ts +132 -0
- package/src/mailbox/mailbox.module.ts +14 -0
- package/src/mcp-chat/mcp-chat.service.spec.ts +236 -0
- package/src/mcp-chat/mcp-chat.service.ts +122 -26
- package/src/meeting/meeting-provider.registry.ts +193 -0
- package/src/meeting/meeting.constants.ts +53 -0
- package/src/meeting/meeting.module.ts +13 -0
- package/src/middlewares/locale-injection.middleware.ts +25 -6
- package/src/oauth/oauth-token-broker.service.spec.ts +172 -0
- package/src/oauth/oauth-token-broker.service.ts +363 -0
- package/src/oauth/oauth.module.ts +3 -1
- package/src/oauth/oauth.service.ts +8 -2
- package/src/oauth/providers/google.provider.ts +49 -15
- package/src/observability/monitored-cron.spec.ts +102 -0
- package/src/observability/monitored-cron.ts +110 -0
- package/src/pairing/dto/approve-reverse-pairing.dto.ts +20 -0
- package/src/pairing/dto/claim-pairing.dto.ts +19 -0
- package/src/pairing/dto/confirm-pairing.dto.ts +14 -0
- package/src/pairing/dto/poll-reverse-pairing.dto.ts +9 -0
- package/src/pairing/dto/start-pairing.dto.ts +19 -0
- package/src/pairing/dto/start-reverse-pairing.dto.ts +45 -0
- package/src/pairing/pairing.controller.ts +246 -0
- package/src/pairing/pairing.module.ts +27 -0
- package/src/pairing/pairing.service.spec.ts +462 -0
- package/src/pairing/pairing.service.ts +614 -0
- package/src/pdf/pdf.service.ts +81 -24
- package/src/presence/presence.controller.ts +29 -0
- package/src/presence/presence.listener.ts +53 -0
- package/src/presence/presence.module.ts +19 -0
- package/src/presence/presence.service.spec.ts +97 -0
- package/src/presence/presence.service.ts +160 -0
- package/src/profile/dto/delete-account.dto.ts +11 -0
- package/src/profile/events/profile-account-deleted.event.ts +13 -0
- package/src/profile/profile.controller.ts +46 -34
- package/src/profile/profile.service.ts +164 -46
- package/src/realtime/realtime.gateway.ts +138 -0
- package/src/realtime/realtime.module.ts +16 -0
- package/src/realtime/realtime.service.spec.ts +50 -0
- package/src/realtime/realtime.service.ts +187 -0
- package/src/redis/redis-pubsub.ts +190 -0
- package/src/role/guards/role.guard.spec.ts +75 -0
- package/src/role/guards/role.guard.ts +64 -46
- package/src/session/session.service.spec.ts +81 -0
- package/src/session/session.service.ts +93 -6
- package/src/setting/brand-asset.service.ts +137 -0
- package/src/setting/dto/create.dto.ts +13 -2
- package/src/setting/setting.module.ts +3 -2
- package/src/setting/setting.service.spec.ts +135 -1
- package/src/setting/setting.service.ts +138 -2
- package/src/token/token.service.spec.ts +62 -0
- package/src/token/token.service.ts +57 -3
- package/src/user/dto/create-with-email-and-password.dto.ts +6 -1
- package/src/user/dto/query-user-mail-list.dto.ts +10 -0
- package/src/user/user-credential.util.ts +35 -0
- package/src/user/user.controller.ts +17 -2
- package/src/user/user.service.spec.ts +186 -2
- package/src/user/user.service.ts +361 -16
- package/src/user-device/user-device.controller.ts +77 -0
- package/src/user-device/user-device.module.ts +13 -0
- package/src/user-device/user-device.service.spec.ts +234 -0
- package/src/user-device/user-device.service.ts +168 -0
- package/src/utils/device-key.spec.ts +57 -0
- package/src/utils/device-key.ts +32 -0
- package/src/utils/geo-ip.spec.ts +134 -0
- package/src/utils/geo-ip.ts +93 -0
- package/src/utils/locale-context.spec.ts +27 -1
- package/src/utils/locale-context.ts +15 -12
- package/src/utils/security-event-vars.spec.ts +161 -0
- package/src/utils/security-event-vars.ts +153 -0
- package/src/utils/user-agent.spec.ts +37 -0
- package/src/utils/user-agent.ts +46 -0
- package/src/validators/is-strong-password-with-settings.validator.ts +12 -0
- package/src/validators/service-locator.ts +15 -0
- package/src/webhook-integration/webhook-integration.service.ts +57 -3
- package/src/webhook-integration/webhook-protocol.registry.ts +6 -0
- package/src/whatsapp-sender/whatsapp-sender.module.ts +10 -0
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
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
|
-
|
|
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 = (
|
|
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.
|
|
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.
|
|
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
|
-
|
|
658
|
-
|
|
659
|
-
|
|
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
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
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
|